Tasker Para hablar de todo lo relacionado con la aplicación tasker


 
Herramientas
  #1  
Viejo 19/06/13, 09:08:35
Avatar de maid450
maid450 maid450 no está en línea
Miembro del foro
Mensajes: 450
 
Fecha de registro: sep 2009
Localización: Valencia
Mensajes: 450
Modelo de smartphone: Nexus 5 / Nexus 7
Versión de Radio: Cualquiera que ponga buen Rock
Tu operador: Yoigo
Mencionado: 15 comentarios
Tagged: 0 hilos
Creación, uso y manipulación de variables con javascript

Buenas, mientras preparo un tutorial sobre el uso de javascript con tasker se me ha ocurrido separar y adelantar la parte de las variables ya que, aunque no es lo más potente que se puede hacer, si que me parece de lo más util ya que puede servir tanto a gente que le interese aprender algo de programación como a los que no.

Todo aquel que ya entienda el concepto de variables (para los que no este tutorial no es para vosotros aún, pasaros por aquí y luego volveis ) probablemente tenga algunas tareas con largas sucesiones de "establecer variable", "establecer variable haciendo calculos matemáticos", "dividir variable" etc... os suena el escenario? Pues bien, con la acción "Script -> JavaScriptlet" se puede hacer toda esa serie de cosas (e incluso más potentes) de forma bastante facil, condensadas en una unica acción (quedando todo más limpio) y que se ejecuta de forma más eficiente!
Para los que os haya interesado, comenzamos!

1. Introducción a la acción
Para ejecutar código javascript hay que utilizar la acción "Script->JavaScriptlet".
Está acción permite escribir en un campo de texto el código a ejecutar.
La sección "Librerias" es ya algo avanzado y no lo vamos a usar, dejarlo siempre en blanco.
Conviene dejar marcado el check de "Salida automática" que lo unico que hace es que cuando acabe de ejecutarse el código pase a la siguiente acción, y la "cuenta atrás" se puede dejar en el valor por defecto (45)

2. Declaración y uso de variables
Lo interesante de esta acción en Tasker es que las variables se "traspasan" de forma más o menos transparente entre tasker y javascript, de forma que las variables que se crean o modifican desde el código serán accesibles desde otras acciones de tasker y viceversa.
Habría que distinguir de todas formas entre las variables locales (todo el nombre en minúscula) y globales (al menos una letra mayúscula).

Variables locales
Estas si que se traspasan de forma totalmente transparente al usuario simplemente quitando o añadiendo el '%' al principio.
Es decir, que si tenemos definida en tasker una variable %valor estará directamente disponible desde javascript con el nombre valor y si definimos en javascript una variable mivariable estará disponible en las siguientes acciones de tasker con el nombre %mivariable.

Veamos un ejemplo, creemos una acción javascriptlet con este código:
Código:
var nombre = "Pepe";
var edad = 25;
edad = edad + 5;
y despues una acción Alerta->Flash con el texto "Hola, me llamo %nombre y tengo %edad años" sin las comillas.

Si ejecutamos la tarea, como habréis imaginado se mostrará el texto "Hola, me llamo Pepe y tengo 30 años".

Y así hemos definido 2 variables y modificado el valor de una de un plumazo en una sola acción (y podríamos haber definido todas las variables y hecho todas las operaciones que quisieramos).

Cosas a tener en cuenta:
- las variables se definen cuando no existen aún con la expresión var nombrevariable = valor
- se accede a las variables ya existentes directamente por el nombre sin el var
- las expresiones acaban con ";"
- los valores de texto deben ir entre comillas, los números no.

Variables globales

Crear y acceder a las variables globales no es tan directo como con las locales, pero no es demasiado complicado tampoco (a las variables incorporadas se accede como las globales pero no se puede alterar su valor manualmente)
Esto se hace mediante las funciones global() y setGlobal(), en el tutorial de javascript explicaré lo que son las funciones, por ahora solo explicaré como usar algunas de ellas.

Veamos el mismo ejemplo que antes usando variables globales en vez de locales para el nombre y la edad:

Código:
setGlobal("NOMBRE", "Pepe");
setGlobal("EDAD", 25);
setGlobal("EDAD", global("EDAD")*1 + 5);
Si despues creamos una acción Alerta->Flash con el texto "Hola, me llamo %NOMBRE y tengo %EDAD años" sin las comillas mostrará el mismo texto que antes y las variables %NOMBRE y %EDAD al ser globales quedarán definidas en la pestaña "Variables" de Tasker.

Primero que nada vemos que en el caso de las variables globales no hay que hacer distinciones cuando las definimos por primera vez o si ya existen como con el operador var con las locales, se hace todo mediante la funcion setGlobal().
Se llama a la función poniendo primero el nombre de la variable global como texto (por tanto entre comillas como hemos visto antes) y sin el "%", y luego, ponemos una coma y pasamos el valor que queremos dar a la variable.
La función global() se llama pasándole el nombre de la variable como texto (entre comillas) sin el "%" y devuelve el valor actual de dicha variable.

Visto esto se puede analizar la ultima expresión:
Código:
setGlobal("EDAD", global("EDAD")*1 + 5)
Lo que hace es establecer la variable %EDAD dándole como valor lo que vale actualmente (global("EDAD")) y sumándole 5.
Nota: el "*1" que hay después de global("EDAD") es porque esta función devuelve el valor de la variable como texto, y como veremos despues, si en una suma uno de los elementos está considerado como texto concatena ambos textos.
El "*1" lo que hace el multiplicar un texto por 1, convirtiéndolo a un número, de forma que la suma se ejecuta correctamente.
Si ejecutásemos el ejemplo sin el "*1" la edad sería 255.
Hay que hacer esto siempre que queramos hacer sumas con una variable global numérica.

3. Manipulación de variables numéricas (expresiones matemáticas)
Ya hemos visto como hacer sumas: simplemente hay que usar el operador "+" entre dos o más números o variables numéricas.
De la misma forma se pueden usar los operadores aritméticos habituales: resta -> "-", división -> "/", multiplicación -> "*" y módulo -> "%".
Se pueden hacer operaciones compuestas usando los paréntesis de forma habitual.

Para los que sepáis ya como usar matemáticas en tasker vereis que es más o menos lo mismo solo que para usar las variables se hace como he explicado anteriormente, pero echaréis en falta el operador "^" para calcular potencias que no existe en javascript y la serie de constantes y funciones para trigonometría, redondeos, etc...
Para esto javascript incorpora la clase Math. No voy a explicar aquí que es una clase, pero su uso es muy sencillo, veámoslo con un ejemplo:
Código:
var redondeo = Math.round(8 / 5);
Esto creará la variable local %redondeo con valor 2 (8 / 5 = 1.6 que se redondea a 2).
Del mismo modo se puede usar por ejemplo la constante Math.PI para el valor del número Pi y más cosas.
Aquí hay una referencia completa de las constantes y funciones disponibles en el objeto Math.
Es en inglés, pero con tiempo lo traduciré y lo incluiré aquí, no es demasiado dificil de entender y se parece a como se hace en Tasker directamente.

La principal ventaja de hacer calculos desde javascript en lugar de desde acciones tasker es que si se están definiendo varias variables desde una acción javascript y una o varias de ellas se obtiene mediante cálculos o incluso a partir de otras variables se puede hacer todo en una misma acción, además se pueden realizar cálculos encadenados en una unica acción dejando la tarea más limpia.

Pongamos el ejemplo que aparece al final de este post, hay mejores formas de hacer esto, pero sirve muy bien como ejemplo. Desde Tasker requeriría múltiples acciones pero se podría resumir en un único javascriptlet:
Código:
var segundos = global("TIMES");
var dias = Math.floor(segundos / 86400);
segundos = segundos - (dias * 86400);
var horas = Math.floor(segundos / 3600);
segundos = segundos - (horas * 3600);
var minutos = Math.floor(segundos / 60);
segundos = segundos - (minutos * 60);

4. Manipulación de variables de texto
Aquí viene donde esto se pone más interesante ya que en la manipulación de textos es donde se suelen acumular más acciones troceando, procesando y concatenando para obtener el texto deseado.
Una introducción a como manipular variables en Tasker se puede ver aquí aunque en este aspecto javascript provee de más métodos y permite hacer más cosas y más complejas.

Concatenar textos
Para concatenar (unir) varios trozos de texto / variables en uno basta con usar el operador "+" como si sumasemos los textos. Por ejemplo:
Código:
var nombre = "Pepe";
var saludo = "Hola " + nombre;
Ahora la variable %saludo contendrá el texto "Hola Pepe".
Nota: en caso de una suma en la que intervengan textos y números estos se tratarán como textos y se concatenaran en vez de sumarse
Código:
var texto = "prueba " + 5 + 4;
generará "prueba 54". Esto se puede cambiar poniendo la suma numerica entre paréntesis
Código:
var texto = "prueba " + (5 + 4);
Que generará "prueba 9".

Dividir textos
Igual que con la acción "Dividir variable" de Tasker, puedes "trocear" un texto dividiendo por un carácter o grupo de carácteres con la función "split". Ejemplo:
Código:
var aficiones = "fútbol,hockey,natación";
aficiones = aficiones.split(",");
Este código en un primer momento crea la variable %aficiones con el texto "fútbol,hockey,natación" y luego hace la separación y sobreescribe la variable sustituyendo su valor por un array que contiene los elementos "fútbol", "hockey" y "natación" por separado.

nota: en tasker se puede acceder a partir de este momento a los elementos como un array de tasker normal (%aficiones1, %aficiones2... o %aficiones(1), %aficiones(2)...) pero en javascript los arrays son "puros" (tasker usa "pseudo-arrays"), los indices empiezan a contar desde 0, y se accedería a estos elementos desde javascript así: aficiones[0], aficiones[1] y aficiones[2].

No es necesario almacenar previamente el texto en una variable y luego sobreescribir su valor, las funciones que se pueden aplicar sobre las variables de texto se pueden aplicar al texto en si, asi:

Código:
var aficiones = "fútbol,hockey,natación".split(",");
Textos como arrays de carácteres
Las propias variables de texto se consideran en javascript como arrays de carácteres donde el primer carácter está en la posición 0, el siguiente en posición 1 y así.
Se pueden hacer por tanto estas cosas:
  • "hola".charAt(2) devuelve el caracter en la posición 2 ("l"). Como son arrays en el fondo también se podría hacer así: "hola"[2].
  • "prueba".length devuelve la longitud (numero de carácteres) de la cadena: 6. (es una propiedad, no una función, por eso no lleva parentesis)
  • "texto de prueba".indexOf("e") devuelve la primera posición de la cadena en que hay una "e": 1
  • "texto de prueba".lastIndexOf("e") devuelve la ultima posición de la cadena en que hay una "e": 12
  • "texto de prueba".indexOf("ue") devuelve la primera posición de la cadena en que aparece "ue": 11
Sección de textos
Hay varias formas de quedarse con una porción de un texto, la más parecida a la estandar de Tasker "Sección de variable" es la función substr que se usa así:
Código:
"Hola mundo".substr(2, 4);
Esto cogería 4 (segundo parámetro) carácteres empezando desde la posición 2 (primer parámetro), con lo que devolvería "la m".


Por otro lado está la función substring, se le pasa tambien como primer parámetro la "posición inicial", y el segundo parámetro, que es opcional, es la "posición final" en lugar de un número de carácteres a coger. En caso de no poner nada devuelve desde la posición inicial hasta el final de la cadena.
Ejemplo:
Código:
var texto = "Hola mundo";
var cacho1 = texto.substring(3, 6);
var cacho2 = texto.substring(5);
Partiendo de un mismo texto, las variables cacho1 y cacho2 contendrían "a mu" y "mundo" respectivamente.


Reemplazar en textos
Para reemplazar textos en cadenas tenemos la funcion replace. Se le pasan 2 parámetros, el texto a reemplazar y el texto por el que remplazarlo. Ejemplo:
Código:
var love = "Me encanta iOS".replace("iOS", "Android");
love valdrá como podéis imaginar "Me encanta Android"

Bueno, pues eso es todo.
He tratado de explicarme lo más claramente posible, pero es facil que algunas cosas no queden muy claras, espero vuestros comentarios para ir completándolo y mejorándolo!

Última edición por maid450 Día 25/06/13 a las 12:16:48
Responder Con Cita
Los siguientes 10 usuarios han agradecido a maid450 su comentario:
[ Mostrar/Ocultar listado de agradecimientos ]


  #2  
Viejo 19/06/13, 14:19:38
Avatar de fus
fus fus no está en línea
Usuario muy activo
Mensajes: 1,503
 
Fecha de registro: dic 2010
Localización: Polsovia
Mensajes: 1,503
Modelo de smartphone: Samsung Galaxy Nexus
Versión de ROM: Jelly Bean!
Versión de Radio: De válvulas de vacío
Tu operador: Vodafone
Mencionado: 7 comentarios
Tagged: 0 hilos
Me guardo la entrada en Pocket para leerla más tarde, pero respecto a Javascript, hay una página muy buena CodeAcademy en la que se pueden aprender variedad de lenguajes con una lecciones muy sencillas y paso a paso.

un saludo
Responder Con Cita
Los siguientes 2 usuarios han agradecido a fus su comentario:
  #3  
Viejo 19/06/13, 14:34:07
Avatar de maid450
maid450 maid450 no está en línea
Miembro del foro
Mensajes: 450
 
Fecha de registro: sep 2009
Localización: Valencia
Mensajes: 450
Modelo de smartphone: Nexus 5 / Nexus 7
Versión de Radio: Cualquiera que ponga buen Rock
Tu operador: Yoigo
Mencionado: 15 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por fus Ver Mensaje
hay una página muy buena CodeAcademy en la que se pueden aprender variedad de lenguajes con una lecciones muy sencillas y paso a paso.
Muy buen apunte para los interesados!

Realmente este tutorial y otro que estoy preparando están pensados más en "como hacer cosas en Tasker usando javascript" que en "aprende javascript" pero claro, tengo que explicar un poco del lenguaje para que se entienda algo . La idea es que todos los interesados en aprender a programar lo hagan con recursos como este que comentas y estos tutoriales expliquen como aprovechar el lenguaje para hacer cosas específicas de Tasker.
Responder Con Cita
Los siguientes 3 usuarios han agradecido a maid450 su comentario:
[ Mostrar/Ocultar listado de agradecimientos ]
  #4  
Viejo 19/06/13, 15:32:28
Avatar de fus
fus fus no está en línea
Usuario muy activo
Mensajes: 1,503
 
Fecha de registro: dic 2010
Localización: Polsovia
Mensajes: 1,503
Modelo de smartphone: Samsung Galaxy Nexus
Versión de ROM: Jelly Bean!
Versión de Radio: De válvulas de vacío
Tu operador: Vodafone
Mencionado: 7 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por maid450 Ver Mensaje
Muy buen apunte para los interesados!

Realmente este tutorial y otro que estoy preparando están pensados más en "como hacer cosas en Tasker usando javascript" que en "aprende javascript" pero claro, tengo que explicar un poco del lenguaje para que se entienda algo . La idea es que todos los interesados en aprender a programar lo hagan con recursos como este que comentas y estos tutoriales expliquen como aprovechar el lenguaje para hacer cosas específicas de Tasker.
No era para quitarte mérito jaja, era para los impacientes :P
Responder Con Cita
  #5  
Viejo 23/06/13, 06:16:23
Avatar de mlesir
mlesir mlesir no está en línea
Usuario muy activo
Mensajes: 2,263
 
Fecha de registro: abr 2012
Mensajes: 2,263
Modelo de smartphone: OnePlus One,BQ Edison1, GoogleChrome,
Versión de ROM: 4.4 Cyanogen
Tu operador: Pepephone
Mencionado: 36 comentarios
Tagged: 2 hilos
Entiendo entonces maid q una de las ventajas es que utilizar javascript es más rápido que tasker no?
Muchas gracias maid por la currada. Todavía tengo pendiente ponerme con el javascript no se me olvida. Ya tengo varios libros. Con esto todavía me entran más ganas.
Responder Con Cita
Gracias de parte de:
  #6  
Viejo 24/06/13, 08:24:28
Avatar de maid450
maid450 maid450 no está en línea
Miembro del foro
Mensajes: 450
 
Fecha de registro: sep 2009
Localización: Valencia
Mensajes: 450
Modelo de smartphone: Nexus 5 / Nexus 7
Versión de Radio: Cualquiera que ponga buen Rock
Tu operador: Yoigo
Mencionado: 15 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por mlesir Ver Mensaje
Entiendo entonces maid q una de las ventajas es que utilizar javascript es más rápido que tasker no?
La verdad es que en efectos prácticos la diferencia de velocidad es inapreciable, pero en tareas largas y complejas o en determinadas situaciones pienso que si que puede haber una diferencia notable.

Para que te hagas una idea, hice un pequeño test estableciendo 8 variables (%aaa, %bbb, %ccc...) al valor 1, y tardó 50 milisegundos en ejecutar las 8 acciones.
50 milisegundos es nada, 0.05 segundos, inapreciable.
Pero ejecutar la acción equivalente en un javascriptlet estableciendo las variables (aaa, bbb, ccc...) también a 1 tardó 1 milisegundo en hacerlo todo.
A efectos prácticos se puede decir que ambas formas son igual de instantáneas, pero en realidad el javascriptlet ha tardado 50 veces menos.

Como digo para este ejemplo la diferencia práctica es pequeña, pero imágina lo mismo en tareas complicadas que en vez de establecer a 1 variables empieces a hacer calculos complejos, dividir y concatenar bastantes variables... puede empezar a ser una diferencia significativa.

Y en lo que no es tan facil de calcular pero pienso que habrá bastante diferencia es en ciclos de procesador, es decir en la cantidad de operaciones que debe realizar el procesador para hacer cosas, cada acción de tasker hace que el procesador tenga que hacer bastantes cosas, mientras que con un javascriptlet puedes hacer muchas cosas en una unica acción de tasker, y si tienes varios procesos en el telefono haciendo tareas y tienes el procesador muy cargado en un momento dado, ejecutar una tarea con muchas acciones pienso que se notará más el ralentizamiento que con una sola acción javascript.

Pero bueno, como digo, en situaciones normales la "velocidad" no cambia tanto, por eso en mi post digo más bien que lo hace de forma "más eficiente", y las grandes ventajas, al menos para mi, siguen siendo que puedes mantener más limpias las tareas comprimiendo muchas acciones de trabajo de variables en una sola y que javascript da mucha más potencia y flexibilidad a la hora de hacer calculos, trabajar con cadenas de texto y sobretodo con arrays.

Última edición por maid450 Día 24/06/13 a las 08:29:12
Responder Con Cita
Gracias de parte de:
  #7  
Viejo 24/06/13, 19:09:20
Avatar de mlesir
mlesir mlesir no está en línea
Usuario muy activo
Mensajes: 2,263
 
Fecha de registro: abr 2012
Mensajes: 2,263
Modelo de smartphone: OnePlus One,BQ Edison1, GoogleChrome,
Versión de ROM: 4.4 Cyanogen
Tu operador: Pepephone
Mencionado: 36 comentarios
Tagged: 2 hilos
Gracias maid. Efectivamente lo de la velocidad puede ser un aspecto menor, excepto... cuando estas creando una aplicación y a lo mejor tienes q hacer 40 operaciones solo con variables más luego otras.
Lo de la claridad estoy totalmente de acuerdo. Dímelo a mi que a veces tengo una tarea con 30 y pico acciones!
Responder Con Cita
  #8  
Viejo 25/06/13, 01:50:53
Avatar de Caravantes
Caravantes Caravantes no está en línea
Usuario muy activo
Mensajes: 2,200
Compra y venta: (1)
 
Fecha de registro: feb 2011
Mensajes: 2,200
Modelo de smartphone: Samsung Galaxy S9
Versión de ROM: Android 8
Tu operador: Lowi
Mencionado: 59 comentarios
Tagged: 4 hilos
Cita:
Originalmente Escrito por maid450 Ver Mensaje
mientras preparo un tutorial sobre el uso de javascript con tasker se me ha ocurrido separar y adelantar la parte de las variables
Excelente lección, muchas gracias, Maid.
Temía una mayor complejidad y por eso había pospuesto esta lectura hasta encontrar el mejor momento, sin prisas y sin distracciones. Pero la lección ha sido bastante llevadera, muy comprensible, te explicas realmente bien. Y es muy interesante porque abre muchas posibilidades, sobre todo para abreviar esas tareas en las que manejamos pesadamente las variables de Tasker.

Cuando comience a practicar supongo que surgirán más dudas, de momento solo tengo dudas relativas al punto más flojo de Tasker, me refiero a la chapuza de los pseudoarrays:

Cita:
Originalmente Escrito por maid450 Ver Mensaje
en tasker se puede acceder a partir de este momento a los elementos como un array de tasker normal (%aficiones1, %aficiones2... o %aficiones(1), %aficiones(2)...) pero en javascript los arrays son "puros" (tasker usa "pseudo-arrays"), los indices empiezan a contar desde 0, y se accedería a estos elementos desde javascript así: aficiones[0], aficiones[1] y aficiones[2].
1 ¿Esto significa que %aficiones1 de Tasker equivale directamente a aficiones[0] de Javascript? ¿Se pueden usar indistintamente? ¿Se puede crear el array en un ambiente y consultar los datos en el otro?

2 ¿Se pueden usar variables como índices, en los arrays de Javascript? Por ejemplo aficiones[index]

3 Sin usar la función split, ¿Cómo se define o crea un array de Javascript?

4 y última: ¿Javascript tiene arrays de dos o más dimensiones? aficiones[2,6] o algo parecido.

Gracias nuevamente. Espero con interés la siguiente lección sobre Javascript aplicado a Tasker.
Responder Con Cita
  #9  
Viejo 25/06/13, 09:23:14
Avatar de maid450
maid450 maid450 no está en línea
Miembro del foro
Mensajes: 450
 
Fecha de registro: sep 2009
Localización: Valencia
Mensajes: 450
Modelo de smartphone: Nexus 5 / Nexus 7
Versión de Radio: Cualquiera que ponga buen Rock
Tu operador: Yoigo
Mencionado: 15 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por Caravantes Ver Mensaje
Cuando comience a practicar supongo que surgirán más dudas, de momento solo tengo dudas relativas al punto más flojo de Tasker, me refiero a la chapuza de los pseudoarrays.

1 ¿Esto significa que %aficiones1 de Tasker equivale directamente a aficiones[0] de Javascript? ¿Se pueden usar indistintamente? ¿Se puede crear el array en un ambiente y consultar los datos en el otro?
2 ¿Se pueden usar variables como índices, en los arrays de Javascript? Por ejemplo aficiones[index]
3 Sin usar la función split, ¿Cómo se define o crea un array de Javascript?
4 y última: ¿Javascript tiene arrays de dos o más dimensiones? aficiones[2,6] o algo parecido.

Gracias nuevamente. Espero con interés la siguiente lección sobre Javascript aplicado a Tasker.
Primero que nada me alegra que te haya gustado y resultado ameno el tutorial .

La parte sobre los arrays en detalle tengo pendiente añadirla cuando tenga algo de tiempo, y estoy pensando incluso en ir añadiendo cosas al post original y que se convierta en el tutorial "completo" del uso de javascript en Tasker, no sé muy bien si hacerlo así o en otro aparte...

Enfin, por lo pronto voy a ir resolviendo tus dudas:

1 - En efecto, en el caso de arrays locales se pueden crear/usar indistintamente desde cualquier "ambiente".
Tasker traslada las variables y arrays existentes en el entorno tasker a javascript cuando ejecuta el codigo, y al acabar transfiere de nuevo las variables como estén después de la ejecución al entorno de Tasker nuevamente.
El caso de arrays globales es un poco más rollo, ya que habría que hacer algo así:
Código:
setGlobal("MIARRAY1", 1);
setGlobal("MIARRAY2", 2);
setGlobal("MIARRAY3", 3);
para conseguir el pseudo-array %MIARRAY con los valores "1", "2", "3"

2 - Si que se pueden usar variables como indice, pero las variables tienen que ser numéricas si se quiere que se transfieran bien a Tasker (javascript admite arrays con indices textuales, pero en ese caso no se transferirían a Tasker).

3 - se pueden definir usando esta notación:
Código:
var fruta = ["pera", "manzana", "platano"];
4 - Si, se puede decir que son arrays de arrays (de arrays, de arrays...), y se pueden definir/acceder así:
Código:
var arraybidimensional = [[1, 2, 3], ["pera", "manzana", "platano"]];
var platano = arraybidimensional[1][2];
para acceder a "platano" se accede al array en la 2ª posición (indice 1) y dentro de el está en la 3ª posicion (indice 2).
No sé que tal gestionará tasker estos arrays multidimensionales al pasarlos a pseudo-arrays, en teoría debería funcionar.
Responder Con Cita
Gracias de parte de:
  #10  
Viejo 10/11/13, 21:50:20
Avatar de ATaskREADOS
ATaskREADOS ATaskREADOS no está en línea
Miembro del foro
Mensajes: 180
 
Fecha de registro: ene 2013
Mensajes: 180
Tu operador: Otra
Mencionado: 0 comentarios
Tagged: 1 hilos
Subido al recopilatorio este genial tutorial. Gracias como siempre Maid450.

Responder Con Cita
Gracias de parte de:
  #11  
Viejo 30/01/14, 03:45:15
Avatar de mlesir
mlesir mlesir no está en línea
Usuario muy activo
Mensajes: 2,263
 
Fecha de registro: abr 2012
Mensajes: 2,263
Modelo de smartphone: OnePlus One,BQ Edison1, GoogleChrome,
Versión de ROM: 4.4 Cyanogen
Tu operador: Pepephone
Mencionado: 36 comentarios
Tagged: 2 hilos
Maid para poder construir una simple base de datos bidimensional y que se guarden los datos es posible hacerlo con javascript o mejor me pongo con sqlite?
Por cierto lei un comentario de Pent que para manejar los arrays lo que hacia era:
Tasker: %Var (que es igual a 1,2,3,4,5) a %var
Ya en Js: split (como separar en Tasker) %var (ya tenemos el array en Js)
Después de hacer lo que queramos en Js....
Join %var (como concatenar en Tasker) asi reconstruimos el array
En Tasker Otra vez: %var a %Var y asi se queda guardado.

Es que aparte de que veo que no voy a poder utilizar los arrays multidimensionales de Js en Tasker es que otro problema es el de guardar la información de JS. No se si se podrá guardar en un documento o con algo que he leido por ahi de html5 y una nueva funcion?? que trae,localStorage.
Es que lo de que no sean accesibles las variables globales y los arrays lo veo una limitación enorme a la hora de usar Js.
Responder Con Cita
  #12  
Viejo 30/01/14, 08:22:07
Avatar de maid450
maid450 maid450 no está en línea
Miembro del foro
Mensajes: 450
 
Fecha de registro: sep 2009
Localización: Valencia
Mensajes: 450
Modelo de smartphone: Nexus 5 / Nexus 7
Versión de Radio: Cualquiera que ponga buen Rock
Tu operador: Yoigo
Mencionado: 15 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por mlesir Ver Mensaje
Maid para poder construir una simple base de datos bidimensional y que se guarden los datos es posible hacerlo con javascript o mejor me pongo con sqlite?
Depende de la cantidad/complejidad de los datos que necesites guardar y de si necesitarás siempre recuperarlos todos o tendrás que filtrar/ordenar los resultados a menudo, con muchos datos, o si necesitas ordenarlos y filtrar de formas "raras" lo mejor es sqlite. LocalStorage lo he leido por ahí, pero no he trasteado y no sé muy bien de que va.

Cita:
Originalmente Escrito por mlesir Ver Mensaje
Es que aparte de que veo que no voy a poder utilizar los arrays multidimensionales de Js en Tasker es que otro problema es el de guardar la información de JS. No se si se podrá guardar en un documento o con algo que he leido por ahi de html5 y una nueva funcion?? que trae,localStorage.
Es que lo de que no sean accesibles las variables globales y los arrays lo veo una limitación enorme a la hora de usar Js.
En javascript si que se tiene acceso a las variables globales, solo que no directamente, tienes que usar la funcion global('VARIABLE') para leer la variable %VARIABLE y setGlobal('VARIABLE', valor) para cambiarle el valor.

A la hora de almacenar las variables creadas en js hay varias opciones:

Con la funcion setGlobal puedes trasladar el array js a un array global en tasker convirtiendo sus valores uno a uno así:
Código:
for(var i=0; i<miarrayjs.length; i++) {
  for(var j=0; j<miarrayjs[i].length; j++) {
    setGlobal('ARR_TASKER'+(i+1)+(j+1), miarrayjs[i][j]);
  }
}
Eso iría recorriendo el array en js y creando las variables globales ARR_TASKER11, ARR_TASKER12... que luego tasker interpreta como arrays (el apaño de (i+1)+(j+1) es porque los arrays en tasker empiezan en 1 y en js empiezan en 0).

Si solo quieres almacenar el array para leerlo luego de nuevo desde js puedes usar la función JSON.stringify(miarray) que lo que hace es convertir el array/objeto/lo que sea en su representación como texto, con lo que tasker lo gardará como un texto, que luego usando JSON.parse(texto) lo puedes reconvertir en los datos originales.

Puedes escribir los datos en un fichero, yo para un array bidimensional usaría una estructura de archivo guardando cada subarray en una linea, y sus elementos separados por algún caracter como "|", podrías hacerlo así:
Código:
for(var i=0; i<miarrayjs.length; i++) {
  writeFile('/ruta/al/archivo.txt', miarrayjs[i].join('|')."\n", true);
}
Lo que hace es, para cada elemento del array de primer nivel, concatena sus subelementos con "|", le añade "\n" al final (el caracter de salto de linea, no estoy seguro de si hace falta) y lo añade al final del archivo. Tal vez quieras vaciar (o borrar) el archivo antes de hacer el guardado para asegurarte de que se guardan los datos actuales y no se duplican las cosas.

Puedes probar tambien mediante comandos "sqlite3" crearte tu propia base de datos donde insertar y recuperar los elemento

Última edición por maid450 Día 30/01/14 a las 08:42:17
Responder Con Cita
Los siguientes 2 usuarios han agradecido a maid450 su comentario:
  #13  
Viejo 30/01/14, 17:22:29
Avatar de mlesir
mlesir mlesir no está en línea
Usuario muy activo
Mensajes: 2,263
 
Fecha de registro: abr 2012
Mensajes: 2,263
Modelo de smartphone: OnePlus One,BQ Edison1, GoogleChrome,
Versión de ROM: 4.4 Cyanogen
Tu operador: Pepephone
Mencionado: 36 comentarios
Tagged: 2 hilos
Gracias por la respuesta Maid , bueno con lo que has explicado me quedo mas tranquilo, en el sentido de q JS parece mas eficaz o util de lo q pensaba ayer.
Despues de tanto leer cosas por alli y por aca, al final lo que me queda es la sensacion de que si nos quejamos de la fragmentacion de android eso no es nada comparado con la que hay en los lenguajes de programacion! Menudo jaleo! Tropecientos lenguajes pero es que luego encima cada uno con su version y para colmo que si parches! Total q me siento como un español con su ingles "medio" metido en una fiesta de interpretes de la ONU.
Al final me he tirado por sql3, es verdad que es mas complicado quzas pero resulta q con tanta base de datos de whatsapp al final no me parece tan inasequible.
Responder Con Cita
  #14  
Viejo 13/12/14, 09:59:03
Avatar de geek1
geek1 geek1 no está en línea
Miembro del foro
Mensajes: 144
 
Fecha de registro: ago 2011
Mensajes: 144
Modelo de smartphone: iphone 6s
Tu operador: Vodafone
Mencionado: 0 comentarios
Tagged: 0 hilos
Gracias, excelente tutorial para iniciarse en la parte de javascript.
Yo me he puesto a ello, pero tengo un problema.
tengo las siguientes variables en tasker %Ahorro %Gasoil siendo variables globales y la variable local %get2
Creo una tarea javascriptlet con el siguiente script
ahorro = global("Ahorro");
gasoil = global("Gasoil);
ahorro = ahorro + ((gasoil - get2)*50;

Esto me devuelve un error que falla en la tercera instrucción, si modifico el script por:
ahorro = global("Ahorro");
gasoil = global("Gasoil);
ahorro = get2;
Este script también me devuelve un error, sin embargo el siguiente script no me devuelve error

ahorro = global("Ahorro");
gasoil = global("Gasoil);

Resumiendo, el error lo tengo al recuperar el valor de una variable local

¿alguien me puede ayudar?

Venga, estoy haciendo una tarea, que me diga, que día tengo que poner gasolina y me acumule cuando ahorro me está generando, va a ser legen... wait it for... dary!

Gracias y saludos.
Responder Con Cita
  #15  
Viejo 13/12/14, 21:13:03
Avatar de maid450
maid450 maid450 no está en línea
Miembro del foro
Mensajes: 450
 
Fecha de registro: sep 2009
Localización: Valencia
Mensajes: 450
Modelo de smartphone: Nexus 5 / Nexus 7
Versión de Radio: Cualquiera que ponga buen Rock
Tu operador: Yoigo
Mencionado: 15 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por geek1 Ver Mensaje
Gracias, excelente tutorial para iniciarse en la parte de javascript.
Yo me he puesto a ello, pero tengo un problema.
tengo las siguientes variables en tasker %Ahorro %Gasoil siendo variables globales y la variable local %get2
Creo una tarea javascriptlet con el siguiente script
ahorro = global("Ahorro");
gasoil = global("Gasoil);
ahorro = ahorro + ((gasoil - get2)*50;

Esto me devuelve un error que falla en la tercera instrucción, si modifico el script por:
ahorro = global("Ahorro");
gasoil = global("Gasoil);
ahorro = get2;
Este script también me devuelve un error, sin embargo el siguiente script no me devuelve error

ahorro = global("Ahorro");
gasoil = global("Gasoil);

Resumiendo, el error lo tengo al recuperar el valor de una variable local

¿alguien me puede ayudar?

Venga, estoy haciendo una tarea, que me diga, que día tengo que poner gasolina y me acumule cuando ahorro me está generando, va a ser legen... wait it for... dary!

Gracias y saludos.
Ánimo con esa tarea!
En principio el código pinta bien, de me ocurre que pueda ser un bug en tasker por usar una variable con un número, debería funcionar porque parece correcto, pero tal vez sea por eso, prueba usar otro nombre para la variable que no tenga un número y cuentas qué tal
Responder Con Cita
  #16  
Viejo 13/12/14, 21:19:27
Avatar de maid450
maid450 maid450 no está en línea
Miembro del foro
Mensajes: 450
 
Fecha de registro: sep 2009
Localización: Valencia
Mensajes: 450
Modelo de smartphone: Nexus 5 / Nexus 7
Versión de Radio: Cualquiera que ponga buen Rock
Tu operador: Yoigo
Mencionado: 15 comentarios
Tagged: 0 hilos
Justo acabo de releer el código y he encontrado una errata en cada una de tus pruebas...
En la primera abres 2 paréntesis y sólo cierras 1, y en la segunda abres las comillas en gasoil pero no las cierras, tal vez sea eso o simplemente te has colado al copiarlo aquí y es lo que he dicho en el post anterior...
Responder Con Cita
  #17  
Viejo 13/12/14, 23:54:47
Avatar de geek1
geek1 geek1 no está en línea
Miembro del foro
Mensajes: 144
 
Fecha de registro: ago 2011
Mensajes: 144
Modelo de smartphone: iphone 6s
Tu operador: Vodafone
Mencionado: 0 comentarios
Tagged: 0 hilos
lo he resuelto creando una variable en tasker, get2 es una de estas variables que te hace un "separar variable" así que creando una variable precio con el valor de get2, ya he podido trabajar en el script con la variable precio sin problemas.
Gracias y saludos.
Responder Con Cita
Gracias de parte de:
  #18  
Viejo 14/12/14, 00:18:32
Avatar de maid450
maid450 maid450 no está en línea
Miembro del foro
Mensajes: 450
 
Fecha de registro: sep 2009
Localización: Valencia
Mensajes: 450
Modelo de smartphone: Nexus 5 / Nexus 7
Versión de Radio: Cualquiera que ponga buen Rock
Tu operador: Yoigo
Mencionado: 15 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por geek1 Ver Mensaje
lo he resuelto creando una variable en tasker, get2 es una de estas variables que te hace un "separar variable" así que creando una variable precio con el valor de get2, ya he podido trabajar en el script con la variable precio sin problemas.
Gracias y saludos.
Ah amigo!
El separar variable te devuelve un array, que me parece que no lo trato en el tuto porque ya es más complejo.
El caso es que tasker trata los arrays como variables separadas, de forma que el primer elemento del array get lo llama %get1, el segundo %get2, etc...
En JavaScript sin embargo solo existiría la variable get y puedes acceder a sus elementos como get[0], get[1]... (a diferencia de tasker empieza a contar desde 0, no desde 1).
Conclusión, en tu caso, a %get2 se accedería desde javascript como get[1]
Responder Con Cita
  #19  
Viejo 12/02/16, 13:38:00
Avatar de cace0353
cace0353 cace0353 no está en línea
Usuario muy activo
Mensajes: 504
 
Fecha de registro: may 2010
Localización: Arenys de Mar (B)
Mensajes: 504
Modelo de smartphone: Pixel 8 Pro - 256 Gb.
Versión de ROM: Stock
Versión de Radio: Stock
Tu operador: Jazztel
Mencionado: 11 comentarios
Tagged: 0 hilos
Novato en Javascript con problemas...

Hola a todos.

Estoy haciendo una aplicación de uso propio que maneja una base de datos de plantas hecha a partir de una hoja de càlculo. Hay unas 150 filas y 10 columnas y contiene datos numéricos, de texto, direcciones donde se guardan las imágenes de cada planta y el link a una pàgina web donse se dan detalles de cada planta en cuestión.

Ejecutando la tarea en Tasker se tardan unos 12 segundos en mostrar la pantalla donde se muestra el listado de las plantas (bufff...). Convirtiéndola en aplicación con el AppFactory la carga de la base de datos dura menos, unos 5 seg., pero me gustaria que fuera más rápido el proceso de separar la variable inicial y el bucle para extraer los datos de cada fila.

Esta es la tarea

Código:
Plantes (274)
A1: Destruir Escena [ Nombre:Detall Planta Continuar Tarea Tras Error:Encendido ]
A2: Destruir Escena [ Nombre:Llistat Cientific Continuar Tarea Tras Error:Encendido ]
A3: Destruir Escena [ Nombre:Llistat Vulgar Continuar Tarea Tras Error:Encendido ]
A4: Mostrar Escena [ Nombre:Espera Plantes Mostrar como:Actividad, Ventana Completa, Sin Título Posición Horizontal:100 Posición Vertical:100 Animación:Sistema Mostrar Botón Salida:Apagado Continuar tarea inmediatamente:Encendido ]
A5: Leer Archivo [ Archivo:Plantes.txt A la variable:%dades ]
A6: Buscar y Reemplazar Contenido de Variable [ Variable:%dades Buscar:\n Ignorar Caso:Apagado Multilínea:Apagado Una sola coincidencia:Apagado Almacenar Coincidencias En: Reemplazar Coincidencias:Encendido Reemplazar Con:| ]
A7: Separar variable [ Nombre:%dades Separador:| Eliminar base:Apagado ]
A8: Establecer variable [ Nombre:%apunts A:%dades(#) Calcular:Apagado Añadir:Apagado ]
A9: For [ Variable:%cont Ítems:1:%apunts ]
A10: Establecer variable [ Nombre:%planta A:%dades(%cont) Calcular:Apagado Añadir:Apagado ]
A11: Separar variable [ Nombre:%planta Separador:; Eliminar base:Apagado ]
A12: Establecer variable [ Nombre:%cientific(%cont) A:%planta1 Calcular:Apagado Añadir:Apagado ]
A13: Establecer variable [ Nombre:%vulgar(%cont) A:%planta2 Calcular:Apagado Añadir:Apagado ]
A14: Establecer variable [ Nombre:%floracio(%cont) A:%planta3 Calcular:Apagado Añadir:Apagado ]
A15: Establecer variable [ Nombre:%sol(%cont) A:%planta4 Calcular:Apagado Añadir:Apagado ]
A16: Establecer variable [ Nombre:%temperatura(%cont) A:%planta5 Calcular:Apagado Añadir:Apagado ]
A17: Establecer variable [ Nombre:%reg(%cont) A:%planta6 Calcular:Apagado Añadir:Apagado ]
A18: Establecer variable [ Nombre:%adob(%cont) A:%planta7 Calcular:Apagado Añadir:Apagado ]
A19: Establecer variable [ Nombre:%imatge(%cont) A:Pictures/Plantes/%planta8 Calcular:Apagado Añadir:Apagado ]
A20: Establecer variable [ Nombre:%link(%cont) A:%planta9 Calcular:Apagado Añadir:Apagado ]
A21: Establecer variable [ Nombre:%comentaris(%cont) A:%planta10 Calcular:Apagado Añadir:Apagado ]
A22: End For
A23: Mostrar Escena [ Nombre:Llistat Cientific Mostrar como:Actividad, Ventana Completa, Sin Título Posición Horizontal:100 Posición Vertical:100 Animación:Sistema Mostrar Botón Salida:Apagado Continuar tarea inmediatamente:Encendido ]
A24: Destruir Escena [ Nombre:Espera Plantes Continuar Tarea Tras Error:Encendido ]
Rebuscando en el foro he encontrado este tutorial de @maid450 que ya habia leido y tenia "en reserva" Por esto me he planteado acelerar la ejecución de la parte más "laboriosa" de la tarea (acciones A9 a A22) recurriendo a JavaScript para substituir el bucle FOR-End For (soy neófito total en este lenguaje), insertando una acción JavaScriptlet que contiene:

For (var i=0 ; i=apunts; i++) {
var planta = dades(i+1).split(";");
var cientific(i+1) = planta[1]
var vulgar(i+1) = planta[2]
var floracio(i+1) = planta[3]
var sol(i+1) = planta[4]
var temperatura(i+1) = planta[5]
var reg(i+1) = planta[6]
var adob(i+1) = planta[7]
var imatge(i+1) = planta[8]
var link(i+1) = planta[9]
var comentaris(i+1) = planta[10]
}

Pero me da el error: Uncaught sintax error: Unexpected token ILLEGAL.

Lo he probado también substituyendo los (i+1) por [i+1] y tampoco me funciona...

Qué hago mal?

Última edición por cace0353 Día 12/02/16 a las 13:41:31
Responder Con Cita
Gracias de parte de:


  #20  
Viejo 14/02/16, 22:00:29
Avatar de mlesir
mlesir mlesir no está en línea
Usuario muy activo
Mensajes: 2,263
 
Fecha de registro: abr 2012
Mensajes: 2,263
Modelo de smartphone: OnePlus One,BQ Edison1, GoogleChrome,
Versión de ROM: 4.4 Cyanogen
Tu operador: Pepephone
Mencionado: 36 comentarios
Tagged: 2 hilos
No te dice tasker en qué linea falla? Le puedes meter una variable en el parametro error o marcar "seguir tras error" y usar la variable interna %err.
Otra usar un flash para ir viendo que valor cogen las variables.

Enviado desde mi T1-701u mediante Tapatalk
Responder Con Cita
Respuesta

Estás aquí
Regresar   HTCMania > Todo sobre Android > Otro software para Android > Tasker


Reglas de Mensajes
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Las caritas están On
Código [IMG] está On
Código HTML está Off

Saltar a Foro



Hora actual: 10:18:57 (GMT +2)

Cookies settings
Powered by vBulletin™
Copyright © vBulletin Solutions, Inc. All rights reserved.
 
HTCMania: líderes desde el 2007