ATaskREADOS
10/07/13, 04:48:12
Con autorización expresa del autor, este artículo es una traducción del original ubicado en
http://www.pocketables.com/2012/10/beginners-guide-to-tasker-part-7-variable-arrays.html (http://www.pocketables.com/2012/10/beginners-guide-to-tasker-part-7-variable-arrays.html)
Beguinners guide to Tasker, by Andreas Ødegård
Original Copyright @ 2006-2012 CrowdGather. All rights reserved
Guía del principiante a Tasker. Lección 7: las matrices de variables
332327
En la lección 5 de esta guía (http://www.htcmania.com/showthread.php?p=8821039 (http://www.htcmania.com/showthread.php?p=8821039)) mencioné brevemente las matrices. En ese momento no era oportuno entrar en muchos detalles, pero ahora es el momento de explorar a fondo estas variables de Tasker.
¿Qué es una matriz?
Las matrices son comunes en muchas áreas, desde las matemáticas a la programación. En Tasker, una matriz puede ser descrita como una variable de base que tiene varias variables hijas. Cuando se utiliza Separar-variable sobre la variable %Hola, obtienes un montón de variables hijo %Hola1, %Hola2, %Hola3, etc. %Hola es entonces una matriz con varios elementos, y cada elemento es una variable en sí misma.
Hasta aquí nada nuevo, quizás con la excepción de la terminología, porque ya hemos estado utilizando variables hijo a lo largo de la guía. Cada elemento de una matriz es una variable, por lo que puede ser utilizado como una variable independiente, que es la forma en que hemos estado utilizando matrices anteriormente. Pero lo que hace especial a las matrices son algunas cosas que se pueden hacer únicamente con ellas, además de todo lo que se puede hacer con cualquier variable. Dado que las variables de una matriz están dispuestas en una forma que pueden ser fácilmente referenciadas, ahora tenemos un nuevo conjunto de herramientas que podemos utilizar para manipular las variables a nivel de matriz, en lugar de tratarlas como simples variables individuales.
Para utilizar matrices, hay que abandonar el concepto de variables como entidades únicas. Cuando se hace referencia a una matriz, es común referirse a ella de dos formas: por su variable de base (como %Hola) o en el formato %Hola(). El primer método es usado para configurar acciones específicas en Tasker, algunas de las cuales veremos más adelante. Por otro lado, %Hola() incluye los contenidos de cada variable de la matriz, separados por una coma.
Si tenemos la variable %ingredientes = azucar.leche.harina y le aplicamos la acción Separar-variable usando el punto como separador, obtenedremos una variable matriz %ingredientes que contiene %ingredientes1 = azucar
%ingredientes2 = leche
%ingredientes3 = harina
En este momento, usar una acción Flash para ver %ingredientes nos mostrará azucar.leche.harina, con puntos intermedios como al principio. Pero una acción Flash sobre %ingredientes() mostrará el valor de cada variable hija, separándolas con una coma, por lo que verás azúcar,leche,harina. Si se borra la variable %ingredientes y luego se repiten ambas acciones Flash, se obtendría un %ingredientes vacío en la primera, y el mismo resultado azúcar,leche,harina en la segunda. Esto se debe a que la matriz se mantiene a pesar de que se borre la variable que se usó para crear la matriz. Por el contrario, si se borran las variables de la matriz %ingredientes, la primera acción Flash no se vería afectada, mientras que la segunda solo mostraría variables vacías.
Esto resulta confuso, porque %ingredientes puede hacer referencia a la variable individual %ingredientes o a los elementos de la matriz %ingredientes. Cuando manejamos matrices, éste es el error más común: hacer referencia a uno cuando te quieres referir a lo otro.
Haciendo referencia a las matrices
Dado que las matrices numeran listas de variables, esto permite nuevas maneras para referirse a ellas. La lista de estas opciones está disponible en la versión inglesa de la Guía de Usuario, en la sección Variable Arrays (http://tasker.dinglisch.net/userguide_summary.html (http://tasker.dinglisch.net/userguide_summary.html)), y voy a citarlas aquí: Si las cuatro variables %matriz1, %matriz2, %matriz3 y %matriz4 contienen respectivamente a, b, c, d,entonces tenemos una matriz con 4 elementos. Estas variables se pueden utilizar como cualquier otra, pero también es posible acceder a ellas de manera especial. Veamos algunos ejemplos:
%matriz(#)
El número de elementos de una matriz (4 en este caso).
%matriz(#>)
El índice del primer elemento de una matriz definida, o 0 si la matriz no está definida (1 en este caso).
%matriz(#<)
El índice del último elemento de una matriz definida, o 0 si la matriz no está definida (4).
%matriz(#?b/c)
Una lista separada por comas de los índices de matriz (de menor a mayor) con valores coincidentes con los indicados, o 0 si no coincide ninguno (2,3 en el ejemplo).[Editado: esta opción está mucho mejor explicada en http://www.htcmania.com/showthread.php?t=1371677 ]
%matriz(>)
El contenido del primer elemento de la matriz (a).
%matriz(<)
El contenido del último elemento de la matriz (d).
%matriz() o también %matriz(:)
Todos los elementos de la matriz separados por comas (a,b,c,d)
%matriz(2) o simplemente %matriz2
El contenido de elemento con el índice 2 (b)
%matriz(2:4)
El contenido de los elementos con índices 2 a 4 (b,c,d)
%matriz(:3)
Todos los elementos con índices de hasta 3 (a,b,c)
%matriz(3:)
Todos los elementos con índices a partir de 3 (c,d)
Un buen observador puede haber reconocido la primera de ellas, %matriz(#). Esto se debe a que la usamos en un ejemplo en la parte 5 de la guía (http://www.htcmania.com/showthread.php?p=9315037) , para contar el número de líneas en un archivo de texto. Lo que realmente se hizo fue que se copió el contenido de un archivo de texto a una matriz, haciendo que cada línea fuese un nuevo elemento de la matriz. El uso de (#) detrás de la variable de base hace que Tasker cuente el número de elementos en la matriz, que en aquel caso conicidía con el número de líneas del texto.
Por supuesto, Usted también reconoce aquí %matriz(), que es lo mismo de que lo que acabamos de hablar anteriormente. Estos métodos antes mencionados nos muestran diferentes formas de referirse a las matrices, lo que nos permite, por ejemplo, referirnos al último elemento de una matriz sin saber qué número es.
Uno de los métodos que falta aquí (porque no es exclusivo de las matrices) es el formato %matriz(%variable). Asumiendo que tiene una %variable con un valor numérico, puede hacer referencia al elemento de matriz en ese punto de la matriz mediante el uso de este formato.
Cómo se crean las matrices
En cuanto a la forma de generar las matrices, ya he citado la acción Separar-variable. Voy a citar una vez más la guía de usuario oficial sobre esto, ya que lo tiene casi clavado: 1. Usando Separar-variable:
Establecer-variable %matriz a,b,c,d
Separar-variable%matriz ,
Si alguno de sus datos incluye una coma, se podría usar otro separador menos frecuente como por ejemplo la arroba @, recordando utilizar ese mismo carácter en la acción Separar-variable.
2. Mediante la asignación de elementos individuales con Establecer-variable:
Establecer-variable, %matriz3 c
3. Con Array-push para agregar un elemento inicial.
4. Algunas otras acciones también crean matrices en sus resultados, por ejemplo, Listar-archivos.Separar-variable es quizás la forma más común de generar matrices, aunque algunas otras acciones, como Listar-Archivos recién mencionada, también permite crearlas. Aparte de eso, también puede crearlas manualmente con Establecer-variable o con Array-push.
Bucles For
En Tasker, las acciones For y End-For se encuentran juntas con Si(If), Else y End-If. Al igual que Si(If)/End-If , For/End-For crean un grupo de acciones fácilmente distinguible dentro de la tarea. Inicialmente, esta acción For puede parecer confusa pero pronto te das cuenta de su potencia. Se aplica sobre una variable, con una lista de elementos o ítems separados por comas. Todo el conjunto de acciones del grupo se ejecutará una vez para cada elemento de la lista, y en cada ejecución la variable tendrá el valor de ese ítem concreto. Por ejemplo: For Variable: %itemaflash, Items: hola, mundo, cómo, estás? Flash: %itemaflash
End-For
En este caso el grupo solo tiene una acción Flash que se ejecutaría una vez por cada elemento de la lista, en este caso 4 veces. Cada vez, la variable %itemaflash se actualizará con el siguiente elemento de la lista, comenzando con un "hola", terminando con "estás?". O sea que aparecen 4 mensajes flash, cada uno con uno de los elementos de la lista.
La ventaja de este sistema es que se puede especificar un conjunto de acciones y luego ejecutar un montón de valores a través de ellas sin necesidad de duplicar las acciones. Se necesita algún tiempo para acostumbrarse con los detalles e implicaciones; por ejemplo, si el grupo incluye alguna acción que grabe un archivo conviene asegurarse de que el nombre del archivo sea único para cada ítem.
Ejemplo: lista TODO V2 Nota del traductor: la expresión TODO se refiere a To-Do, que viene a significar por-hacer, pendiente o simplemente lista-de-tareas.
332328
Recientemente decidí rehacer mi sistema lista de tareas TODO (que se describe en la parte tercera de esta guía (http://www.htcmania.com/showthread.php?t=614108) ) para darle un mejor rendimiento y más características. Decidí utilizar matrices en su núcleo, y es bastante más eficaz que el sistema anterior. También he añadido una nueva lista genérica TODO que no activa ninguna alarma, además de rehacer mis tres listas para situaciones específicas. Voy a mostrar la lista genérica aquí ya que las tres listas concretas añaden un poco de complejidad adicional.
El primer sistema de lista TODO que había creado utilizaba métodos que no eran ideales. La función de agregar a la lista fue hecha guardando un archivo de texto, un archivo que se leía en una sola variable y se mostraba en un campo de texto. La ventaja de esto era que la lista se formateaba para su lectura en el archivo de texto directamente, cada línea está separada por un cambio de línea, y así no era necesario utilizar un divisor más específico. El único inconveniente era que la lista entera se convirtió en una sola entidad, lo que hace imposible algunas cosas como seleccionar separadamente alguno de los elementos o líneas.
La nueva lista se basa en matrices. La lista aún se guarda en un archivo de texto, pero el archivo de texto es más una función de copia de seguridad y ya no es el almacenamiento principal de los elementos. Los elementos se almacenan en una matriz global, que es directamente compatible con el archivo escribiendo %Array() al archivo de texto (escribir el valor de cada elemento de la matriz, separados por una coma), y leerlo de nuevo en un variable que luego se divide por la coma (recuperando de nuevo la forma de matriz).
De esta forma, la matriz puede ser utilizada como la fuente para un elemento de menú de escena. Además, se pueden añadir elementos fácilmente mediante la acción Menú, que rellena automáticamente una escena con ese elemento. De esta forma, se puede utilizar un elemento por sí solo, y usando una matriz como fuente, se crea una lista en la que cada elemento de la matriz se convierte en un elemento de la lista. Los elementos de la lista pueden ser seleccionados y/o utilizados individualmente, lo que significa que ahora tenemos las herramientas necesarias para hacer que esta lista TODO se parezca un poco más a una aplicación bien afinada.
Tarea de activación
332329
La tarea de disparo es bastante sencilla. Se parece a esto:
Leer-archivo, Archivo:gentodo.txt a Variable:%Gentodo (lee el archivo de texto de mi lista GENérica TODO en una variable)
Separar-variable %Gentodo, Separador:,
Establecer-variable %Gtselectedd a 0 (restablece una variable utilizada más tarde. La doble D final no es un error tipográfico)
Array Pop %Gentodo, Posición 1, si %Gentodo no coincide con ++ (se elimina la primera entrada en la lista si está en blanco. Francamente no recuerdo la circunstancia en la que se necesitaba, pero estoy seguro de que tenía un razón para ello cuando lo hice)
Mostrar Escena Generic Todo
La escena: el elemento de menú
El elemento de menú es el corazón de la escena, ocupando la mayor parte de ella. Aquí es donde se establece la fuente como variable-matriz, y la variable es %Gentodo. Tenga en cuenta que, dado que la fuente es una matriz, el campo de la variable hace referencia a la variable de base de la matriz con el fin de conocer también todos los detalles de la matriz. El modo de selección se establece a múltiple, para que se puedan seleccionar varios elementos.
332330
Tenga en cuenta que los elementos del menú de escena tienen escenas internas. Por ejemplo, la opción de formato de ítem tiene una escena sobre la que se puede hacer clic y editar. Esto establece cómo se ve cada ítem, y es pre-rellenada con un campo de texto dinámico y un campo de icono dinámico. Esto se rellenará con los datos de la fuente del elemento de menú, pero todavía se puede utilizar esta opción para elegir el aspecto que tendrá. Mi lista genérica TODO tiene una imagen estática de una chincheta ante el campo de texto, y termina pareciéndose a una viñeta cuando el elemento de menú está totalmente relleno. Aparte de tener una serie de elementos predeterminados, esta escena interna es la misma que las escenas a las que estamos acostumbrados.
332331
La pulsación del ítem activa una tarea que contiene lo siguiente:
Establecer-variable %Gtselected a %select_indices
Separar-variable %Gtselected, Separador:,
Establecer-variable %Gtselectedd a %Gtselected(#)
%Select_indices es una variable generada automáticamente (una de cuatro, las otras tres son %select_labels, %tap_label y %tap_index) que Tasker establece cuando interactuamos con el elemento de menú de escena. Contiene una lista separada por comas con los números de los elementos seleccionados, a partir de 0. Nota del traductor: El artículo original añade al final (1) una actualización en la que se explica que el inicio de este índice está cambiado a partir de Tasker 1.3.2: ya no comienza por 0 sino por 1. Por ese motivo, la frase siguiente y otras posteriores están caducadas, pues se escribieron antes de que Tasker corrigiese este problema. Se muestran en color atenuado para resaltar que están obsoletas.
Por lo tanto, si seleccionamos los ítems 1, 3, 5 en la lista, %select_indices contendrá 0,2,4.
%Gtselected(#) cuenta el número de elementos de la matriz %Gtselected, que luego se ponen en %Gtselectedd. En resumen, %Gtselectedd contiene el número de artículos seleccionados.
Así que, cuando has seleccionado algo en el elemento de menú escena, usted tiene una matriz con los números de los artículos, así como una variable con el número de elementos seleccionados. Esto nos lleva a la función de eliminación.
Advertencia: Actualmente hay un error por el cual %select_indices no se actualiza al des-seleccionar el último elemento. No hay forma directa de resolver este problema. Por ahora, hay que actualizar toda la escena para anular correctamente el último elemento. Nota del traductor: La advertencia previa también ha quedado desfasada a partir de Tasker 1.3.2, que también corrigió ese problema (1).
La escena: el botón de eliminar
332332
En mi escena, el botón (X) de eliminar tiene dos funciones: cancela la escena, y elimina elementos. La primera función es realizada por una pulsación breve mediante la acción Destruir-escena. Eliminar elementos es más complicado, y se hace manteniendo una pulsación larga sobre el botón. En la pestaña de la pulsación larga, las acciones son las siguientes:
Si %Gtselectedd> 0
Menú, Título: Eliminar elementos %Gtselectedd, ítem 1: Sí (Establecer-variable Gtcd a 1), ítem 2: No (*nada*)
Si %Gtcd coincide con 1
For Variable:%gendelete, ítems:%Gtselected(
Sumar-a-variable, nombre: %gendelete, valor: 1
Restar-de-variable, Nombre: %gendelete, Valor: %shuffle, si %shuffle no coincide con *shuffle*
Array Pop, Variable: %Gentodo, Posición: %gendelete
Sumar-a-variable, nombre: %shuffle, valor: 1
End-For
Escribir-archivo, Archivo: gentodo.txt, Texto: %Gentodo()
End If
End If
Establecer-variable: %Gtcd a 0
Limpiar-variable: %shuffle
Establecer-variable: %Gtselectedd a 0
Como se puede ver, hay un puñado de cosas anidadas aquí. El primer Si(If) se asegura de que hay elementos seleccionados antes de intentar ejecutar acciones para eliminarlos. Te habrás dado cuenta de que hay una acción que reajusta %Gtselectedd, pero no hay acción que limpie la variable %Gtselected. Esto quiere decir que los últimos valores de la matriz %Gtselected persisten, porque en la tarea de borrado todo está anidado en un bucle For %Gtselectedd (que se repone cada vez); así ya no volveremos a tener una situación en la que accidentalmente se borren elementos que hubieran sido seleccionados en el pasado. Además de eso, se desactiva eficazmente la tarea asociada a la pulsación larga, si no hay nada seleccionado.
La acción Menú que está como la primera acción en el grupo For no debe confundirse con el elemento de menú de escena que he mencionado muchas veces. Esta acción Menú genera un cuadro emergente con una pregunta y respuestas de tipo estándar, en este caso con Sí y No, creando un sencillo cuadro de diálogo de confirmación. Al hacer clic en Sí se establece una variable que es condición para la siguiente acción Si(If) del grupo. Esta variable también se restablece al final de la tarea, por lo que siempre es 0 a menos que haga clic en Sí para confirmar la eliminación.
A continuación tenemos nuestro bucle For. Se ejecutan de forma secuencial las cuatro acciones anidadas y eso se hace para cada elemento de la matriz %Gtselected. En la configuración de la acción For , el campo de ítems requiere una lista separada por comas, y no necesariamente una matriz, por lo que la escribimos con el formato %Gtselected(). Para cada elemento de la matriz %Gtselected, el valor de dicho elemento se copiará en %gendelete, que se utiliza en las siguientes cuatro acciones, y luego continúa con el siguiente elemento, poniendo su valor en %gendelete, y así sucesivamente.
En cuanto a las cuatro acciones anidadas, la primera simplemente resuelve un despiste cerebral del desarrollador. Ahora mismo, los elementos de menú comienzan en 0, mientras que los elementos de matriz empiezan en 1. Así, el valor de elemento de matriz 1 es el mismo que el elemento de menú 0. Este problema se solucionará pronto de acuerdo con el desarrollador Tasker: Se corregirá para que sea el mismo que los índices obviamente. Esto va a causar problemas en las escenas de algunas personas, pero es demasiado tonto para dejar así.
Mediante la adición de 1 a %gendelete, que a su vez contiene el número del elemento de menú seleccionado, traemos ese número hasta el nivel de la matriz, de manera que elemento de menú 1 es el mismo como elemento de la matriz 1.
Cuando los dos coinciden, se hace muy fácil quitar cosas de la matriz, usando la tercera acción del bucle For. Basta con utilizar Array-pop con %gendelete como posición para que Tasker saque de la matriz el elemento que ocupa esa posición. Los otros elementos superiores de la matriz son movidos hacia abajo de modo que si se elimina el elemento tercero de una matriz que tenía cinco elementos, el número cuatro se convierte en el número tres.
Espera, te has saltado una acción! Sí, en efecto. La segunda acción en el bucle For, combinada con la cuarta, corrige un problema inherente a este sistema. La primera vez que el bucle se ejecuta, los números de elementos de matriz coinciden con los números de elementos de menú, una vez que se han añadido 1 para compensar la diferencia en la posición inicial. Sin embargo, debido a que todos los elementos de la matriz son empujados hacia abajo cuando eliminamos un elemento, los números no coinciden después de la eliminación!
Digamos que tenemos 10 elementos en la lista/matriz, y seleccionamos los números 3 y 5. %Select_indices entonces mostrará 3,5 (siempre en orden, no importa cuál seleccione primero). A continuación, el bucle For comienza borrando el elemento 3 de la matriz, lo que nos deja con 9 elementos, donde el anterior número 5 es ahora el número 4. Si el bucle For continuara normalmente, borraría el número 5, que era el número 6 cuando se seleccionaron los elementos.
Para solucionar este problema, añadí 1 a %shuffle al final de cada bucle. %shuffle representa el número de veces que la lista se ha encogido. En el grupo de acciones, la acción segunda Restar-de-variable resta este número del número del elemento que va a eliminar, pero sólo si %shuffle tiene realmente un valor (la condición Si(If) se encarga de verificarlo). Si borramos 5 elementos, entonces el número del elemento quinto tendrá que ser ajustado hacia abajo 4 veces para mantener la coincidencia.
Cuando se finaliza el bucle For, es el momento para escribir los cambios en el archivo. A diferencia de la primera versión de la lista de tareas, aquí se sobreescribe el archivo completo, porque tenemos toda la información en la matriz y el archivo está des-actualizado. Al escribir %Gentodo() al archivo, se escribe una lista de elementos separados por comas. La próxima vez que se abra la escena, leemos de nuevo el archivo a una variable, y luego se divide en una matriz, separando por la coma.
En este punto terminamos los grupos de acciones y continuamos con tres acciones que se ejecutan siempre, aunque sólo sea para dar garantías. Esencialmente se trata de limpiar las variables %Gtcd, %shuffle, y %Gtselectedd, que quedan preparadas para la próxima vez. Parecería que no es necesario limpiar %shuffle ya que es una variable local, pero si se mantiene la escena y hay que borrar algo en varios lotes, %shuffle seguiría contando con el último valor y por eso conviene borrarla.
La escena: el indicador de ítems seleccionados
Hay un campo de texto en la parte inferior de la escena que muestra "%Gtselectedd ítems seleccionados". Es tan simple como eso.
La escena: botón nuevo ítem
332333
El botón para añadir un nuevo elemento no es muy complicado. La tarea es la siguiente:
Consulta-de-variable Título:Elemento nuevo, variable:%gentoadd
Si %gentoadd no coincide con *gentoadd*
Array-push, nombre:%Gentoadd, Posición 9001, Valor:%gentoadd
Escribir-archivo, Archivo:gentodo.txt, Texto:%Gentodo()
End If
Esta tarea es simple. Se inicia mediante la acción Consulta-de-variable para preguntar al usuario por el elemento a añadir. A continuación, chequea si realmente se introdujo algo en la variable. Si es así, usa Array-push para añadirlo a la matriz. Al especificar una posición muy alta (superior a 9000), queda casi garantizado que la matriz sea menor que eso, y en esos casos, simplemente se añade en la posición siguiente del último elemento que la matriz tuviera. Por lo tanto, si usted tiene una matriz de 10 elementos y agrega un nuevo elemento, se convertirá realmente en el número 11, y no en el número 9001. Después de eso, se escribe la matriz en el fichero.
Un efecto secundario interesante de la utilización de matrices es que cuando el contenido del archivo se lee en la variable, una coma que hubiera dentro de alguno de los elementos recibirá el mismo tratamiento que una coma que separa los elementos de matriz original. Esto le permite agregar varios elementos de una sola vez escribiendo varios elementos separados por comas, con el formato 1,2,3,4,5. Una vez añadido, se mostrará como un elemento con varios números separados por comas, pero cuando la lista se actualiza (escena destruida, y relanzada) cada uno de los elementos separados por una coma se convertirá en un elemento independiente. El inconveniente es que no se pueden utilizar las comas dentro de un elemento de texto, pero creo que compensa por la ventaja de poder añadir varios elementos de una sola vez, en la misma escritura.
La escena: el botón actualizar
Alertas
Lo que he mostrado hasta ahora es mi nueva lista TODO genérica, que es nueva (antes yo solía usar una app indpendiente con widget). Pero tengo otras tres otras listas específicas (casa, comprar, por la mañana) que también utilizan este sistema de matrices. El concepto básico es el mismo, sólo ligeramente diferente para acomodar tres listas en la misma escena.
Las tres listas tienen diferentes alertas, por lo que tendría que asumir los necesarios cambios, pero en realidad no hace falta. Todas ellas trabajan mediante la lectura de los contenidos del archivo, la comprobación para ver si hay algo en el archivo, y luego actuar basado en eso. Los productos están separados por una coma en lugar de cambio de línea, pero eso no afecta a los sistemas de alerta.
Integración con AutoRemote
En todas estas listas de tareas ahora se pueden agregar elementos de forma remota, desde AutoRemote (http://www.pocketables.com/2012/10/adding-items-to-my-custom-todo-list-system-from-anywhere-with-autoremote.html) . Este sistema tuvo que ser cambiado cuando reconstruí el sistema TODO. El formato para la adición es el mismo, es decir, "Todo tag=:=nombre del elemento", sólo con la adición de una etiqueta de lista genérica/universal. Al recibir un mensaje en este formato se activa una tarea que tiene cuatro grupos de acciones idénticos a excepción de las variables y las identificaciones de archivos, que están adaptadas a cada lista. La condición Si(If) de cada grupo es la coincidencia con la etiqueta apropiada. Para la lista universal, el grupo es el siguiente:
Si %arpar2 coincide con genérico/universal
Leer-archivo, Archivo:gentodo.txt a Var:%Gentodo (lee el archivo de mi lista genérica TODO en una variable)
Separar-variable %Gentodo, Separador:,
Array-push, nombre:%Gentoadd, Posición 9001, Valor:%arcomm
Escribir-archivo, Archivo:gentodo.txt, Texto:%Gentodo()
End If
A estas alturas ya se sabe lo que hacen todas estas acciones, porque ya han sido explicadas antes. La única diferencia es que a la matriz se añade %arcomm en lugar de %gentoadd. Como he dicho, hay cuatro grupos de este tipo en la misma tarea, una para cada uno de mis cuatro listas. Después de los cuatro grupos Si(If), al final la tarea añade una última acción que es la siguiente:
Decir "Producto añadido a la lista %arpar2"
Integración AutoRemote Chrome
332334
Hasta ahora sólo he utilizado el plugin AutoRemote (http://www.pocketables.com/tag/autoremote) de Chrome para copiar texto desde el explorador a mi teléfono (http://www.pocketables.com/2012/09/beginners-guide-to-tasker-part-6-autoremote.html) . Pensé que sería más fácil para agregar elementos a mi lista, así que he añadido unas cuantas reglas para el plugin de Chrome. Cada regla tiene un nombre que en realidad no importa, y un comando como "Compras pendientes". Esto me permite seleccionar texto en Chrome, hacer clic derecho en el ratón y enviarlo a mi tarea de listas (que he indicado antes). Es una opción muy útil, que incluso me permite ir a cualquier campo de búsqueda (como en google.com), escribir algo, seleccionarlo y enviarlo a cualquiera de mis listas.
http://www.youtube.com/watch?v=kM_YWA_tFUQ
(1) Actualización: Tasker beta 1.3.2b2 y siguientes
Ha sido solucionado el problema de discrepancia numérica entre las matrices y el menú de escena, y también el problema de des-seleccionar el último elemento. Ambos se han resuelto en la última versión beta de Tasker, lo que implica que la próxima versión también incorporará esas correcciones. El cambio en la lista TODO es que ya no hay que agregar 1 a %gendelete, y la tarea de la solapa Tap en el elemento de menú de escena debe quedar así:
Si %select_indices no coincide *select*
Establecer-variable %Gtselected a %select_indices
Separar-variable %Gtselected, Separador:,
Establecer-variable %Gtselectedd a %Gtselected(#)
Else
Establecer-variable %Gtselectedd a 0
End If
En conclusión
Las matrices y bucles For permiten ahorrar mucho trabajo. Hay algún problema con las matrices globales y los elementos de menú de escena, donde todo se ralentiza significativamente debido a que las variables globales tienen que estar establecidas todo el tiempo. Eso apenas importa en una pequeña lista de tareas, pero en un artículo posterior voy a mostrar cómo hacer un explorador de archivos basado en Tasker, donde sí que importa. Originalmente había hecho un navegador utilizando matrices y su funcionamiento era demasiado lento, y después de un poco de ayuda de otro usuario de Tasker, resultó que las matrices eran extremadamente ineficientes en esa situación particular. Esto podría ser un problema grave, pero ya sabemos varias formas de acelerarlo. Aun así, la iteración actual funciona muy bien, al menos para mi uso.
-------------------------------------- Con autorización expresa del autor, este artículo es una traducción del original ubicado en
http://www.pocketables.com/2012/10/beginners-guide-to-tasker-part-7-variable-arrays.html (http://www.pocketables.com/2012/10/beginners-guide-to-tasker-part-7-variable-arrays.html)
Beguinners guide to Tasker, by Andreas Ødegård
Original Copyright @ 2006-2012 CrowdGather. All rights reserved
--------------------------------------
Firmado: Caravantes
http://www.pocketables.com/2012/10/beginners-guide-to-tasker-part-7-variable-arrays.html (http://www.pocketables.com/2012/10/beginners-guide-to-tasker-part-7-variable-arrays.html)
Beguinners guide to Tasker, by Andreas Ødegård
Original Copyright @ 2006-2012 CrowdGather. All rights reserved
Guía del principiante a Tasker. Lección 7: las matrices de variables
332327
En la lección 5 de esta guía (http://www.htcmania.com/showthread.php?p=8821039 (http://www.htcmania.com/showthread.php?p=8821039)) mencioné brevemente las matrices. En ese momento no era oportuno entrar en muchos detalles, pero ahora es el momento de explorar a fondo estas variables de Tasker.
¿Qué es una matriz?
Las matrices son comunes en muchas áreas, desde las matemáticas a la programación. En Tasker, una matriz puede ser descrita como una variable de base que tiene varias variables hijas. Cuando se utiliza Separar-variable sobre la variable %Hola, obtienes un montón de variables hijo %Hola1, %Hola2, %Hola3, etc. %Hola es entonces una matriz con varios elementos, y cada elemento es una variable en sí misma.
Hasta aquí nada nuevo, quizás con la excepción de la terminología, porque ya hemos estado utilizando variables hijo a lo largo de la guía. Cada elemento de una matriz es una variable, por lo que puede ser utilizado como una variable independiente, que es la forma en que hemos estado utilizando matrices anteriormente. Pero lo que hace especial a las matrices son algunas cosas que se pueden hacer únicamente con ellas, además de todo lo que se puede hacer con cualquier variable. Dado que las variables de una matriz están dispuestas en una forma que pueden ser fácilmente referenciadas, ahora tenemos un nuevo conjunto de herramientas que podemos utilizar para manipular las variables a nivel de matriz, en lugar de tratarlas como simples variables individuales.
Para utilizar matrices, hay que abandonar el concepto de variables como entidades únicas. Cuando se hace referencia a una matriz, es común referirse a ella de dos formas: por su variable de base (como %Hola) o en el formato %Hola(). El primer método es usado para configurar acciones específicas en Tasker, algunas de las cuales veremos más adelante. Por otro lado, %Hola() incluye los contenidos de cada variable de la matriz, separados por una coma.
Si tenemos la variable %ingredientes = azucar.leche.harina y le aplicamos la acción Separar-variable usando el punto como separador, obtenedremos una variable matriz %ingredientes que contiene %ingredientes1 = azucar
%ingredientes2 = leche
%ingredientes3 = harina
En este momento, usar una acción Flash para ver %ingredientes nos mostrará azucar.leche.harina, con puntos intermedios como al principio. Pero una acción Flash sobre %ingredientes() mostrará el valor de cada variable hija, separándolas con una coma, por lo que verás azúcar,leche,harina. Si se borra la variable %ingredientes y luego se repiten ambas acciones Flash, se obtendría un %ingredientes vacío en la primera, y el mismo resultado azúcar,leche,harina en la segunda. Esto se debe a que la matriz se mantiene a pesar de que se borre la variable que se usó para crear la matriz. Por el contrario, si se borran las variables de la matriz %ingredientes, la primera acción Flash no se vería afectada, mientras que la segunda solo mostraría variables vacías.
Esto resulta confuso, porque %ingredientes puede hacer referencia a la variable individual %ingredientes o a los elementos de la matriz %ingredientes. Cuando manejamos matrices, éste es el error más común: hacer referencia a uno cuando te quieres referir a lo otro.
Haciendo referencia a las matrices
Dado que las matrices numeran listas de variables, esto permite nuevas maneras para referirse a ellas. La lista de estas opciones está disponible en la versión inglesa de la Guía de Usuario, en la sección Variable Arrays (http://tasker.dinglisch.net/userguide_summary.html (http://tasker.dinglisch.net/userguide_summary.html)), y voy a citarlas aquí: Si las cuatro variables %matriz1, %matriz2, %matriz3 y %matriz4 contienen respectivamente a, b, c, d,entonces tenemos una matriz con 4 elementos. Estas variables se pueden utilizar como cualquier otra, pero también es posible acceder a ellas de manera especial. Veamos algunos ejemplos:
%matriz(#)
El número de elementos de una matriz (4 en este caso).
%matriz(#>)
El índice del primer elemento de una matriz definida, o 0 si la matriz no está definida (1 en este caso).
%matriz(#<)
El índice del último elemento de una matriz definida, o 0 si la matriz no está definida (4).
%matriz(#?b/c)
Una lista separada por comas de los índices de matriz (de menor a mayor) con valores coincidentes con los indicados, o 0 si no coincide ninguno (2,3 en el ejemplo).[Editado: esta opción está mucho mejor explicada en http://www.htcmania.com/showthread.php?t=1371677 ]
%matriz(>)
El contenido del primer elemento de la matriz (a).
%matriz(<)
El contenido del último elemento de la matriz (d).
%matriz() o también %matriz(:)
Todos los elementos de la matriz separados por comas (a,b,c,d)
%matriz(2) o simplemente %matriz2
El contenido de elemento con el índice 2 (b)
%matriz(2:4)
El contenido de los elementos con índices 2 a 4 (b,c,d)
%matriz(:3)
Todos los elementos con índices de hasta 3 (a,b,c)
%matriz(3:)
Todos los elementos con índices a partir de 3 (c,d)
Un buen observador puede haber reconocido la primera de ellas, %matriz(#). Esto se debe a que la usamos en un ejemplo en la parte 5 de la guía (http://www.htcmania.com/showthread.php?p=9315037) , para contar el número de líneas en un archivo de texto. Lo que realmente se hizo fue que se copió el contenido de un archivo de texto a una matriz, haciendo que cada línea fuese un nuevo elemento de la matriz. El uso de (#) detrás de la variable de base hace que Tasker cuente el número de elementos en la matriz, que en aquel caso conicidía con el número de líneas del texto.
Por supuesto, Usted también reconoce aquí %matriz(), que es lo mismo de que lo que acabamos de hablar anteriormente. Estos métodos antes mencionados nos muestran diferentes formas de referirse a las matrices, lo que nos permite, por ejemplo, referirnos al último elemento de una matriz sin saber qué número es.
Uno de los métodos que falta aquí (porque no es exclusivo de las matrices) es el formato %matriz(%variable). Asumiendo que tiene una %variable con un valor numérico, puede hacer referencia al elemento de matriz en ese punto de la matriz mediante el uso de este formato.
Cómo se crean las matrices
En cuanto a la forma de generar las matrices, ya he citado la acción Separar-variable. Voy a citar una vez más la guía de usuario oficial sobre esto, ya que lo tiene casi clavado: 1. Usando Separar-variable:
Establecer-variable %matriz a,b,c,d
Separar-variable%matriz ,
Si alguno de sus datos incluye una coma, se podría usar otro separador menos frecuente como por ejemplo la arroba @, recordando utilizar ese mismo carácter en la acción Separar-variable.
2. Mediante la asignación de elementos individuales con Establecer-variable:
Establecer-variable, %matriz3 c
3. Con Array-push para agregar un elemento inicial.
4. Algunas otras acciones también crean matrices en sus resultados, por ejemplo, Listar-archivos.Separar-variable es quizás la forma más común de generar matrices, aunque algunas otras acciones, como Listar-Archivos recién mencionada, también permite crearlas. Aparte de eso, también puede crearlas manualmente con Establecer-variable o con Array-push.
Bucles For
En Tasker, las acciones For y End-For se encuentran juntas con Si(If), Else y End-If. Al igual que Si(If)/End-If , For/End-For crean un grupo de acciones fácilmente distinguible dentro de la tarea. Inicialmente, esta acción For puede parecer confusa pero pronto te das cuenta de su potencia. Se aplica sobre una variable, con una lista de elementos o ítems separados por comas. Todo el conjunto de acciones del grupo se ejecutará una vez para cada elemento de la lista, y en cada ejecución la variable tendrá el valor de ese ítem concreto. Por ejemplo: For Variable: %itemaflash, Items: hola, mundo, cómo, estás? Flash: %itemaflash
End-For
En este caso el grupo solo tiene una acción Flash que se ejecutaría una vez por cada elemento de la lista, en este caso 4 veces. Cada vez, la variable %itemaflash se actualizará con el siguiente elemento de la lista, comenzando con un "hola", terminando con "estás?". O sea que aparecen 4 mensajes flash, cada uno con uno de los elementos de la lista.
La ventaja de este sistema es que se puede especificar un conjunto de acciones y luego ejecutar un montón de valores a través de ellas sin necesidad de duplicar las acciones. Se necesita algún tiempo para acostumbrarse con los detalles e implicaciones; por ejemplo, si el grupo incluye alguna acción que grabe un archivo conviene asegurarse de que el nombre del archivo sea único para cada ítem.
Ejemplo: lista TODO V2 Nota del traductor: la expresión TODO se refiere a To-Do, que viene a significar por-hacer, pendiente o simplemente lista-de-tareas.
332328
Recientemente decidí rehacer mi sistema lista de tareas TODO (que se describe en la parte tercera de esta guía (http://www.htcmania.com/showthread.php?t=614108) ) para darle un mejor rendimiento y más características. Decidí utilizar matrices en su núcleo, y es bastante más eficaz que el sistema anterior. También he añadido una nueva lista genérica TODO que no activa ninguna alarma, además de rehacer mis tres listas para situaciones específicas. Voy a mostrar la lista genérica aquí ya que las tres listas concretas añaden un poco de complejidad adicional.
El primer sistema de lista TODO que había creado utilizaba métodos que no eran ideales. La función de agregar a la lista fue hecha guardando un archivo de texto, un archivo que se leía en una sola variable y se mostraba en un campo de texto. La ventaja de esto era que la lista se formateaba para su lectura en el archivo de texto directamente, cada línea está separada por un cambio de línea, y así no era necesario utilizar un divisor más específico. El único inconveniente era que la lista entera se convirtió en una sola entidad, lo que hace imposible algunas cosas como seleccionar separadamente alguno de los elementos o líneas.
La nueva lista se basa en matrices. La lista aún se guarda en un archivo de texto, pero el archivo de texto es más una función de copia de seguridad y ya no es el almacenamiento principal de los elementos. Los elementos se almacenan en una matriz global, que es directamente compatible con el archivo escribiendo %Array() al archivo de texto (escribir el valor de cada elemento de la matriz, separados por una coma), y leerlo de nuevo en un variable que luego se divide por la coma (recuperando de nuevo la forma de matriz).
De esta forma, la matriz puede ser utilizada como la fuente para un elemento de menú de escena. Además, se pueden añadir elementos fácilmente mediante la acción Menú, que rellena automáticamente una escena con ese elemento. De esta forma, se puede utilizar un elemento por sí solo, y usando una matriz como fuente, se crea una lista en la que cada elemento de la matriz se convierte en un elemento de la lista. Los elementos de la lista pueden ser seleccionados y/o utilizados individualmente, lo que significa que ahora tenemos las herramientas necesarias para hacer que esta lista TODO se parezca un poco más a una aplicación bien afinada.
Tarea de activación
332329
La tarea de disparo es bastante sencilla. Se parece a esto:
Leer-archivo, Archivo:gentodo.txt a Variable:%Gentodo (lee el archivo de texto de mi lista GENérica TODO en una variable)
Separar-variable %Gentodo, Separador:,
Establecer-variable %Gtselectedd a 0 (restablece una variable utilizada más tarde. La doble D final no es un error tipográfico)
Array Pop %Gentodo, Posición 1, si %Gentodo no coincide con ++ (se elimina la primera entrada en la lista si está en blanco. Francamente no recuerdo la circunstancia en la que se necesitaba, pero estoy seguro de que tenía un razón para ello cuando lo hice)
Mostrar Escena Generic Todo
La escena: el elemento de menú
El elemento de menú es el corazón de la escena, ocupando la mayor parte de ella. Aquí es donde se establece la fuente como variable-matriz, y la variable es %Gentodo. Tenga en cuenta que, dado que la fuente es una matriz, el campo de la variable hace referencia a la variable de base de la matriz con el fin de conocer también todos los detalles de la matriz. El modo de selección se establece a múltiple, para que se puedan seleccionar varios elementos.
332330
Tenga en cuenta que los elementos del menú de escena tienen escenas internas. Por ejemplo, la opción de formato de ítem tiene una escena sobre la que se puede hacer clic y editar. Esto establece cómo se ve cada ítem, y es pre-rellenada con un campo de texto dinámico y un campo de icono dinámico. Esto se rellenará con los datos de la fuente del elemento de menú, pero todavía se puede utilizar esta opción para elegir el aspecto que tendrá. Mi lista genérica TODO tiene una imagen estática de una chincheta ante el campo de texto, y termina pareciéndose a una viñeta cuando el elemento de menú está totalmente relleno. Aparte de tener una serie de elementos predeterminados, esta escena interna es la misma que las escenas a las que estamos acostumbrados.
332331
La pulsación del ítem activa una tarea que contiene lo siguiente:
Establecer-variable %Gtselected a %select_indices
Separar-variable %Gtselected, Separador:,
Establecer-variable %Gtselectedd a %Gtselected(#)
%Select_indices es una variable generada automáticamente (una de cuatro, las otras tres son %select_labels, %tap_label y %tap_index) que Tasker establece cuando interactuamos con el elemento de menú de escena. Contiene una lista separada por comas con los números de los elementos seleccionados, a partir de 0. Nota del traductor: El artículo original añade al final (1) una actualización en la que se explica que el inicio de este índice está cambiado a partir de Tasker 1.3.2: ya no comienza por 0 sino por 1. Por ese motivo, la frase siguiente y otras posteriores están caducadas, pues se escribieron antes de que Tasker corrigiese este problema. Se muestran en color atenuado para resaltar que están obsoletas.
Por lo tanto, si seleccionamos los ítems 1, 3, 5 en la lista, %select_indices contendrá 0,2,4.
%Gtselected(#) cuenta el número de elementos de la matriz %Gtselected, que luego se ponen en %Gtselectedd. En resumen, %Gtselectedd contiene el número de artículos seleccionados.
Así que, cuando has seleccionado algo en el elemento de menú escena, usted tiene una matriz con los números de los artículos, así como una variable con el número de elementos seleccionados. Esto nos lleva a la función de eliminación.
Advertencia: Actualmente hay un error por el cual %select_indices no se actualiza al des-seleccionar el último elemento. No hay forma directa de resolver este problema. Por ahora, hay que actualizar toda la escena para anular correctamente el último elemento. Nota del traductor: La advertencia previa también ha quedado desfasada a partir de Tasker 1.3.2, que también corrigió ese problema (1).
La escena: el botón de eliminar
332332
En mi escena, el botón (X) de eliminar tiene dos funciones: cancela la escena, y elimina elementos. La primera función es realizada por una pulsación breve mediante la acción Destruir-escena. Eliminar elementos es más complicado, y se hace manteniendo una pulsación larga sobre el botón. En la pestaña de la pulsación larga, las acciones son las siguientes:
Si %Gtselectedd> 0
Menú, Título: Eliminar elementos %Gtselectedd, ítem 1: Sí (Establecer-variable Gtcd a 1), ítem 2: No (*nada*)
Si %Gtcd coincide con 1
For Variable:%gendelete, ítems:%Gtselected(
Sumar-a-variable, nombre: %gendelete, valor: 1
Restar-de-variable, Nombre: %gendelete, Valor: %shuffle, si %shuffle no coincide con *shuffle*
Array Pop, Variable: %Gentodo, Posición: %gendelete
Sumar-a-variable, nombre: %shuffle, valor: 1
End-For
Escribir-archivo, Archivo: gentodo.txt, Texto: %Gentodo()
End If
End If
Establecer-variable: %Gtcd a 0
Limpiar-variable: %shuffle
Establecer-variable: %Gtselectedd a 0
Como se puede ver, hay un puñado de cosas anidadas aquí. El primer Si(If) se asegura de que hay elementos seleccionados antes de intentar ejecutar acciones para eliminarlos. Te habrás dado cuenta de que hay una acción que reajusta %Gtselectedd, pero no hay acción que limpie la variable %Gtselected. Esto quiere decir que los últimos valores de la matriz %Gtselected persisten, porque en la tarea de borrado todo está anidado en un bucle For %Gtselectedd (que se repone cada vez); así ya no volveremos a tener una situación en la que accidentalmente se borren elementos que hubieran sido seleccionados en el pasado. Además de eso, se desactiva eficazmente la tarea asociada a la pulsación larga, si no hay nada seleccionado.
La acción Menú que está como la primera acción en el grupo For no debe confundirse con el elemento de menú de escena que he mencionado muchas veces. Esta acción Menú genera un cuadro emergente con una pregunta y respuestas de tipo estándar, en este caso con Sí y No, creando un sencillo cuadro de diálogo de confirmación. Al hacer clic en Sí se establece una variable que es condición para la siguiente acción Si(If) del grupo. Esta variable también se restablece al final de la tarea, por lo que siempre es 0 a menos que haga clic en Sí para confirmar la eliminación.
A continuación tenemos nuestro bucle For. Se ejecutan de forma secuencial las cuatro acciones anidadas y eso se hace para cada elemento de la matriz %Gtselected. En la configuración de la acción For , el campo de ítems requiere una lista separada por comas, y no necesariamente una matriz, por lo que la escribimos con el formato %Gtselected(). Para cada elemento de la matriz %Gtselected, el valor de dicho elemento se copiará en %gendelete, que se utiliza en las siguientes cuatro acciones, y luego continúa con el siguiente elemento, poniendo su valor en %gendelete, y así sucesivamente.
En cuanto a las cuatro acciones anidadas, la primera simplemente resuelve un despiste cerebral del desarrollador. Ahora mismo, los elementos de menú comienzan en 0, mientras que los elementos de matriz empiezan en 1. Así, el valor de elemento de matriz 1 es el mismo que el elemento de menú 0. Este problema se solucionará pronto de acuerdo con el desarrollador Tasker: Se corregirá para que sea el mismo que los índices obviamente. Esto va a causar problemas en las escenas de algunas personas, pero es demasiado tonto para dejar así.
Mediante la adición de 1 a %gendelete, que a su vez contiene el número del elemento de menú seleccionado, traemos ese número hasta el nivel de la matriz, de manera que elemento de menú 1 es el mismo como elemento de la matriz 1.
Cuando los dos coinciden, se hace muy fácil quitar cosas de la matriz, usando la tercera acción del bucle For. Basta con utilizar Array-pop con %gendelete como posición para que Tasker saque de la matriz el elemento que ocupa esa posición. Los otros elementos superiores de la matriz son movidos hacia abajo de modo que si se elimina el elemento tercero de una matriz que tenía cinco elementos, el número cuatro se convierte en el número tres.
Espera, te has saltado una acción! Sí, en efecto. La segunda acción en el bucle For, combinada con la cuarta, corrige un problema inherente a este sistema. La primera vez que el bucle se ejecuta, los números de elementos de matriz coinciden con los números de elementos de menú, una vez que se han añadido 1 para compensar la diferencia en la posición inicial. Sin embargo, debido a que todos los elementos de la matriz son empujados hacia abajo cuando eliminamos un elemento, los números no coinciden después de la eliminación!
Digamos que tenemos 10 elementos en la lista/matriz, y seleccionamos los números 3 y 5. %Select_indices entonces mostrará 3,5 (siempre en orden, no importa cuál seleccione primero). A continuación, el bucle For comienza borrando el elemento 3 de la matriz, lo que nos deja con 9 elementos, donde el anterior número 5 es ahora el número 4. Si el bucle For continuara normalmente, borraría el número 5, que era el número 6 cuando se seleccionaron los elementos.
Para solucionar este problema, añadí 1 a %shuffle al final de cada bucle. %shuffle representa el número de veces que la lista se ha encogido. En el grupo de acciones, la acción segunda Restar-de-variable resta este número del número del elemento que va a eliminar, pero sólo si %shuffle tiene realmente un valor (la condición Si(If) se encarga de verificarlo). Si borramos 5 elementos, entonces el número del elemento quinto tendrá que ser ajustado hacia abajo 4 veces para mantener la coincidencia.
Cuando se finaliza el bucle For, es el momento para escribir los cambios en el archivo. A diferencia de la primera versión de la lista de tareas, aquí se sobreescribe el archivo completo, porque tenemos toda la información en la matriz y el archivo está des-actualizado. Al escribir %Gentodo() al archivo, se escribe una lista de elementos separados por comas. La próxima vez que se abra la escena, leemos de nuevo el archivo a una variable, y luego se divide en una matriz, separando por la coma.
En este punto terminamos los grupos de acciones y continuamos con tres acciones que se ejecutan siempre, aunque sólo sea para dar garantías. Esencialmente se trata de limpiar las variables %Gtcd, %shuffle, y %Gtselectedd, que quedan preparadas para la próxima vez. Parecería que no es necesario limpiar %shuffle ya que es una variable local, pero si se mantiene la escena y hay que borrar algo en varios lotes, %shuffle seguiría contando con el último valor y por eso conviene borrarla.
La escena: el indicador de ítems seleccionados
Hay un campo de texto en la parte inferior de la escena que muestra "%Gtselectedd ítems seleccionados". Es tan simple como eso.
La escena: botón nuevo ítem
332333
El botón para añadir un nuevo elemento no es muy complicado. La tarea es la siguiente:
Consulta-de-variable Título:Elemento nuevo, variable:%gentoadd
Si %gentoadd no coincide con *gentoadd*
Array-push, nombre:%Gentoadd, Posición 9001, Valor:%gentoadd
Escribir-archivo, Archivo:gentodo.txt, Texto:%Gentodo()
End If
Esta tarea es simple. Se inicia mediante la acción Consulta-de-variable para preguntar al usuario por el elemento a añadir. A continuación, chequea si realmente se introdujo algo en la variable. Si es así, usa Array-push para añadirlo a la matriz. Al especificar una posición muy alta (superior a 9000), queda casi garantizado que la matriz sea menor que eso, y en esos casos, simplemente se añade en la posición siguiente del último elemento que la matriz tuviera. Por lo tanto, si usted tiene una matriz de 10 elementos y agrega un nuevo elemento, se convertirá realmente en el número 11, y no en el número 9001. Después de eso, se escribe la matriz en el fichero.
Un efecto secundario interesante de la utilización de matrices es que cuando el contenido del archivo se lee en la variable, una coma que hubiera dentro de alguno de los elementos recibirá el mismo tratamiento que una coma que separa los elementos de matriz original. Esto le permite agregar varios elementos de una sola vez escribiendo varios elementos separados por comas, con el formato 1,2,3,4,5. Una vez añadido, se mostrará como un elemento con varios números separados por comas, pero cuando la lista se actualiza (escena destruida, y relanzada) cada uno de los elementos separados por una coma se convertirá en un elemento independiente. El inconveniente es que no se pueden utilizar las comas dentro de un elemento de texto, pero creo que compensa por la ventaja de poder añadir varios elementos de una sola vez, en la misma escritura.
La escena: el botón actualizar
Alertas
Lo que he mostrado hasta ahora es mi nueva lista TODO genérica, que es nueva (antes yo solía usar una app indpendiente con widget). Pero tengo otras tres otras listas específicas (casa, comprar, por la mañana) que también utilizan este sistema de matrices. El concepto básico es el mismo, sólo ligeramente diferente para acomodar tres listas en la misma escena.
Las tres listas tienen diferentes alertas, por lo que tendría que asumir los necesarios cambios, pero en realidad no hace falta. Todas ellas trabajan mediante la lectura de los contenidos del archivo, la comprobación para ver si hay algo en el archivo, y luego actuar basado en eso. Los productos están separados por una coma en lugar de cambio de línea, pero eso no afecta a los sistemas de alerta.
Integración con AutoRemote
En todas estas listas de tareas ahora se pueden agregar elementos de forma remota, desde AutoRemote (http://www.pocketables.com/2012/10/adding-items-to-my-custom-todo-list-system-from-anywhere-with-autoremote.html) . Este sistema tuvo que ser cambiado cuando reconstruí el sistema TODO. El formato para la adición es el mismo, es decir, "Todo tag=:=nombre del elemento", sólo con la adición de una etiqueta de lista genérica/universal. Al recibir un mensaje en este formato se activa una tarea que tiene cuatro grupos de acciones idénticos a excepción de las variables y las identificaciones de archivos, que están adaptadas a cada lista. La condición Si(If) de cada grupo es la coincidencia con la etiqueta apropiada. Para la lista universal, el grupo es el siguiente:
Si %arpar2 coincide con genérico/universal
Leer-archivo, Archivo:gentodo.txt a Var:%Gentodo (lee el archivo de mi lista genérica TODO en una variable)
Separar-variable %Gentodo, Separador:,
Array-push, nombre:%Gentoadd, Posición 9001, Valor:%arcomm
Escribir-archivo, Archivo:gentodo.txt, Texto:%Gentodo()
End If
A estas alturas ya se sabe lo que hacen todas estas acciones, porque ya han sido explicadas antes. La única diferencia es que a la matriz se añade %arcomm en lugar de %gentoadd. Como he dicho, hay cuatro grupos de este tipo en la misma tarea, una para cada uno de mis cuatro listas. Después de los cuatro grupos Si(If), al final la tarea añade una última acción que es la siguiente:
Decir "Producto añadido a la lista %arpar2"
Integración AutoRemote Chrome
332334
Hasta ahora sólo he utilizado el plugin AutoRemote (http://www.pocketables.com/tag/autoremote) de Chrome para copiar texto desde el explorador a mi teléfono (http://www.pocketables.com/2012/09/beginners-guide-to-tasker-part-6-autoremote.html) . Pensé que sería más fácil para agregar elementos a mi lista, así que he añadido unas cuantas reglas para el plugin de Chrome. Cada regla tiene un nombre que en realidad no importa, y un comando como "Compras pendientes". Esto me permite seleccionar texto en Chrome, hacer clic derecho en el ratón y enviarlo a mi tarea de listas (que he indicado antes). Es una opción muy útil, que incluso me permite ir a cualquier campo de búsqueda (como en google.com), escribir algo, seleccionarlo y enviarlo a cualquiera de mis listas.
http://www.youtube.com/watch?v=kM_YWA_tFUQ
(1) Actualización: Tasker beta 1.3.2b2 y siguientes
Ha sido solucionado el problema de discrepancia numérica entre las matrices y el menú de escena, y también el problema de des-seleccionar el último elemento. Ambos se han resuelto en la última versión beta de Tasker, lo que implica que la próxima versión también incorporará esas correcciones. El cambio en la lista TODO es que ya no hay que agregar 1 a %gendelete, y la tarea de la solapa Tap en el elemento de menú de escena debe quedar así:
Si %select_indices no coincide *select*
Establecer-variable %Gtselected a %select_indices
Separar-variable %Gtselected, Separador:,
Establecer-variable %Gtselectedd a %Gtselected(#)
Else
Establecer-variable %Gtselectedd a 0
End If
En conclusión
Las matrices y bucles For permiten ahorrar mucho trabajo. Hay algún problema con las matrices globales y los elementos de menú de escena, donde todo se ralentiza significativamente debido a que las variables globales tienen que estar establecidas todo el tiempo. Eso apenas importa en una pequeña lista de tareas, pero en un artículo posterior voy a mostrar cómo hacer un explorador de archivos basado en Tasker, donde sí que importa. Originalmente había hecho un navegador utilizando matrices y su funcionamiento era demasiado lento, y después de un poco de ayuda de otro usuario de Tasker, resultó que las matrices eran extremadamente ineficientes en esa situación particular. Esto podría ser un problema grave, pero ya sabemos varias formas de acelerarlo. Aun así, la iteración actual funciona muy bien, al menos para mi uso.
-------------------------------------- Con autorización expresa del autor, este artículo es una traducción del original ubicado en
http://www.pocketables.com/2012/10/beginners-guide-to-tasker-part-7-variable-arrays.html (http://www.pocketables.com/2012/10/beginners-guide-to-tasker-part-7-variable-arrays.html)
Beguinners guide to Tasker, by Andreas Ødegård
Original Copyright @ 2006-2012 CrowdGather. All rights reserved
--------------------------------------
Firmado: Caravantes