Ver la Versión Completa : [ TUTORIAL ] Creación, uso y manipulación de variables con javascript
maid450
19/06/13, 09:08:35
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í (http://www.htcmania.com/showthread.php?p=7990372) 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:
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:
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:
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 (http://www.htcmania.com/showthread.php?t=571609) 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:
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í (http://www.w3schools.com/jsref/jsref_obj_math.asp) 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 (http://www.htcmania.com/showpost.php?p=8025383&postcount=5), 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:
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í (http://www.htcmania.com/showthread.php?p=9099161) 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:
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
var texto = "prueba " + 5 + 4;generará "prueba 54". Esto se puede cambiar poniendo la suma numerica entre paréntesis
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:
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:
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í:
"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:
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:
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!
Me guardo la entrada en Pocket para leerla más tarde, pero respecto a Javascript, hay una página muy buena CodeAcademy (www.codecademy.com/) en la que se pueden aprender variedad de lenguajes con una lecciones muy sencillas y paso a paso.
un saludo
maid450
19/06/13, 14:34:07
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! :ok:
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.
Muy buen apunte para los interesados! :ok:
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
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.
maid450
24/06/13, 08:24:28
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.
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!
Caravantes
25/06/13, 01:50:53
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:
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.
maid450
25/06/13, 09:23:14
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í:
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: 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í:
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.
ATaskREADOS
10/11/13, 21:50:20
Subido al recopilatorio este genial tutorial. Gracias como siempre Maid450.
:campeon:
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.
maid450
30/01/14, 08:22:07
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.
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í:
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í:
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
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.
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.
maid450
13/12/14, 21:13:03
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 ;-)
maid450
13/12/14, 21:19:27
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...
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.
maid450
14/12/14, 00:18:32
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]
cace0353
12/02/16, 13:38:00
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
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 (http://www.htcmania.com/member.php?u=184834) 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?
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
cace0353
14/02/16, 22:50:45
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
Hola mlesir, gracias por tu interés.
El error no està en las acciones "normales" de la tarea. La aplicación me funciona bién tal como la he puesto en el recuadro de texto.
El problema està al pretender substituir todo el bucle que extrae los distintos datos de cada linea de la matriz %dades por una llamada a JavaScript.
He puesto el código que he copiado en mi post anterior en una acción JavaScriplet y el error que me da (lo he copiado también arriba) està en la ejecución del script. Intrerpreto que es un error de sintaxis.
Como puedo meter este control del error DENTRO del código en JS?
Enviat des del meu SM-T550 usant Tapatalk
Yo me referia a la acción de codigo de javascript no las normales.
Lo tengo un poco oxidado lo siento, esa accion a diferencia de la de consola no tiene un parametro para q te meta en una variable el error.
En cualquier caso puedes utilizar esto:
"flash (variable);" sin las comillas. Esto funciona como el flash de tasker. Sin comillas (variable) te muestra la variable: variable. Con comillas simple ,('variable') te muestra el texto variable.
Unespected token normalmente se refiere a que hay un signo para el que previamente no se ha preparado. Por ejemplo poner un "}" sin antes abrirlo ( "{" ).
La verdad es que javascript es muy util pero muy puñetero. Primero con el flash me aseguraría de que todas las variables que utilizas están disponibles en el script.
Te dejo una copia de un script q utilizo por si te sirve de ejemplo:
//Declaramos arrays
var tarea = [];
var parametro = [];
var splitvoz = [];
//Preparamos variables necesarias
tasc = global('TasC');
splitasc = tasc.split("|#|");
tas = global('Tas');
splitas = tas.split("|#|");
//Separamos los comandos de voz y las tareas
var pat_a = "("+(tasc)+")"+".*?((?= "+"("+(tasc)+"))|$)";
var patrona = new RegExp (pat_a,"gi");
splitvoz = fora.match(patrona);
//FOR del array splitvoz
for ( a= 0; a < splitvoz.length; a++)
{
//FOR del array splitasc
for ( b = 0; b < splitasc.length; b++)
{
var pat_b = splitasc[b]+"\\w*(\\s|$)";
var patronb = new RegExp (pat_b,"gi");
if (patronb.test(splitvoz[a]))
{
var pat_c = splitasc[b];
var patronc = new RegExp (pat_c,"gi");
coinci = splitvoz[a].match(patronc);
if (pardos === undefined )
{
var pardos = coinci
}
else
{
var pardos = pardos+","+coinci;
};
var pat_p = "("+splitasc[b]+")"+"(\\w)* ";
var patronp = new RegExp (pat_p,"i");
parametro[a] = splitvoz[a].replace(patronp,"");
tarea.push(splitas[b]);
break;
}
}
};
var param = [];
var param = pardos;
var param = param.split(",");
// Explicacion del regex: Busca todo lo que contiene la variable tasc, seguido de cualquier carácter ( .) repetido una o mas veces (*) pero que la coincidencia mas corta posible (?, se le llama non greedy) y seguido espacio (\s) y seguido de cualquier cosa que se contenga en la variable tasc o que sea el final de la frase (|$) pero todo esto sin incluirlo en el patrón ( por eso empleo lo que se llama un look around assertion)
Enviado desde mi T1-701u mediante Tapatalk
WillyWeb
15/02/16, 08:40:37
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?
En lo que tenga un momento lo escribo en mi Tasker y compruebo lo que sale, pero yo empezaría cambiando un par de cosas...
El "var" del inicio de bucle no es necesario. Debería quedarse así ... For (i=0 ; i=apunts; i++).
El "var" de la segunda línea también lo puedes quitar. La instrucción "var" sólo es necesario si quieres que la variable que estás definiendo pase a Tasker, y yo diría que la variable "planta" la usas de forma temporal. :rolleyes:
Tienes que cambiar todos los (i+1) por [i+1]. En JS los índices de un array se referencian con corchetes, igual que has hecho con los valores de planta[x].
Y deberías añadir un ; después de cada línea dentro del FOR igual que has hecho en la primera.
Si tienes dudas con la sintaxis de JS mira aquí ... http://www.w3schools.com/js/default.asp
cace0353
15/02/16, 11:10:45
En cualquier caso puedes utilizar esto: "flash (variable);" sin las comillas. Esto funciona como el flash de tasker. Sin comillas (variable) te muestra la variable: variable. Con comillas simple ,('variable') te muestra el texto variable. Unespected token normalmente se refiere a que hay un signo para el que previamente no se ha preparado. Por ejemplo poner un "}" sin antes abrirlo ( "{" ).
Bueno mlesir gracias por tu aporte, te cuento lo que he probado:
Primero he añadido al principio del código la declaración de todas los arrays que usaré más adelante (planta, cientific, vulgar, floracio, sol,...) con la notación que usas tú:
var cientific = [];
var vulgar = [];
-----
Cuando testeo el código con el botón de la flecha (arriba a la derecha en la pantalla de edición del Script), me suelta un OK!. (En alguna ocasión me he dejado un símbolo y me indicaba el error)
Es al ejecutar la tarea que contiene el JavaScriptlet donde el punyetero me suelta:
JavaScriptlet: line 1: Uncaught SyntaxError: Unnexpected token ILLEGAL
He añadido también una instrucción "flash" para ver si me ha cargado la matriz %dades, pero como el error ya està (según indica el mensaje) en la linea 1, pues nada, no sirve....:loco:
cace0353
15/02/16, 11:30:01
En lo que tenga un momento lo escribo en mi Tasker y compruebo lo que sale, pero yo empezaría cambiando un par de cosas... El "var" del inicio de bucle no es necesario. Debería quedarse así ... For (i=0 ; i=apunts; i++). El "var" de la segunda línea también lo puedes quitar. La instrucción "var" sólo es necesario si quieres que la variable que estás definiendo pase a Tasker, y yo diría que la variable "planta" la usas de forma temporal. Tienes que cambiar todos los (i+1) por [i+1]. En JS los índices de un array se referencian con corchetes, igual que has hecho con los valores de planta[x]. Y deberías añadir un ; después de cada línea dentro del FOR igual que has hecho en la primera. Si tienes dudas con la sintaxis de JS mira aquí ... http://www.w3schools.com/js/default.asp
Muchas gracias por tu interés @WillyWeb (http://www.htcmania.com/member.php?u=68214),
He hecho los cambios sugeridos (si pongo el For en mayúscula me da error en el testeo dentro de la página del editor del JavaScriptlet, he de poner for, en minúsculas) y estamos en las mismas (el mismo error en line 1)
Queda pendiente aprender Javascript p.e. desde el enlace que sugieres. Hace algún tiempo ya usé un Script copiado del foro en otra aplicación. Pero hice una transcripción pura, me limité a copiar el código. También compré el libro que me parece que recomendó @mlesir (http://www.htcmania.com/member.php?u=763408) de la editorial Anaya (Guia Práctica de Javascript Edición 2012) en algún post, pero ahí està...
.
Veo, y por esto me he metido en este berenjenal, que la ejecución desde Javascript es mucho más rápida. Para tareas de Tasker en la que hay acciones que manejan bases de datos extensas (en mi caso matrices generadas a partir de hojas de Excel en formato CSV) me està resultando imprescindible.
Creo que voy a meterme un poco con JS porqué la verdad es que programando lo paso "pipa". Además ahora estoy jubilado y tengo tiempo...
Repito mis agradecimientos a vosotros, luz y guia del foro, por vuestra colaboración.
Saludos!
Este hilo se pone interesante, a ver si saco un poco de tiempo y vuelvo por aquí, a ver si aprendo algo. Siempre he pensado que lo único que le falta a este foro, es profundizar un poco mas en las funciones de Java y JavaScript.
WillyWeb
15/02/16, 17:41:35
Me he pasado más de una hora probando cosas y viendo siempre el mismo error. :cry:
Como no conseguía nada he probado a cargar un simple archivo de texto en una variable de Tasker y mostrar el contenido de esa variable desde JS y me he quedado de piedra al ver que también salía ese error.
No entiendo el motivo, pero esta línea...
A5: Leer Archivo [ Archivo:Plantes.txt A la variable:%dades ]
...tiene efectos secundarios mortales en JS. :oh:
En definitiva, he cambiado la acción "Leer archivo" por "Leer párrafo" y fin del problema. :D
cace0353
15/02/16, 19:12:04
Gracias WillyWeb por tu tiempo.
Efectivamente, usando "Leer parrafo" no da error.
Pero, en mi caso no sirve. La acción "Leer parrafo" de Tasker lee el archivo hasta el primer punto solamente y guarda el resultado en %dades. En mi caso el archivo contiene más de 150 filas (una por planta) con 10 datos distintos cada una. En cada linea tengo varios puntos (en las URL de los web donde puedo ampliar la información desde la ficha de cada planta en el programa). Lo que ocurre entonces es que Tasker lee hasta el primer punto que encuentra. Si especifico la frase nº 2 lee entre el primer y segundo puntos... No sirve :cry:
Por esto divido primero la variable %dades (que almacena "todo" el archivo) por los saltos de linea en Tasker y luego paso la matriz resultante %dades() a Javascript para que divida de nuevo en el bucle cada %dades(i) por los ";" (el separador de valores por columna que dan los CSV) y me haga el trabajo más pesado (acciones A9-A22 del código en Tasker simple).
Enfin, espero que el creador del hilo @maid450 (http://www.htcmania.com/member.php?u=184834) se pase por aquí y nos aclare el problema.
Gracias de todos modos:ok:
cace0353
15/02/16, 19:26:27
He probado con un bucle FOR dividir por lineas en lugar de hacerlo por saltos de línea como está ahora (accion "leer linea" en Tasker) y construir así %dades(). Pero tampoco funciona...
Parece como si no se pasaran de Tasker a JS los arrays...
WillyWeb
15/02/16, 19:37:09
Efectivamente, usando "Leer parrafo" no da error.
Pero, en mi caso no sirve. La acción "Leer parrafo" de Tasker lee el archivo hasta el primer punto solamente...
No. Esa acción lee hasta encontrar una línea en blanco o un código de fin de línea.
En mis pruebas he usado un archivo con datos que contenían puntos y comas, y lo he podido leer de una tacada sin problemas con "Leer párrafo".
Revisa tu archivo de datos por si contiene algo de eso.
cace0353
15/02/16, 21:47:54
Bueno, tema resuelto siguiendo las indicaciones de @WillyWeb (http://www.htcmania.com/member.php?u=68214) :platano::platano::platano:
He modificado la tarea en Tasker para tratar toda la variable %dades (resultado de Leer parrafo) dentro de JS.
Para ello, como el archivo de texto tiene los saltos de línea que salen del CSV, en la propia tarea, con Buscar y Reemplazar, substituyo los saltos de linea "\n" por un carácter "|". El resultado es una variable %dades que contiene los separadores "|" y ";" (pero no tiene ni puntos-aparte ni saltos de línea) y que luego utilizararemos en JS para generar las matrices con la instrucción "split".
Ya en el Script y después de declarar las variables-array, hago un split sobre la variable dades para obtener tantas "hijas" como plantas. Inmediatamente después y mediante el bucle saco los distintos datos de cada planta....
Como estoy muy verde aún en JS, es possible que sobre alguna declaración de variable, pero así ya va. En las primeras pruebas me funcionaba una vez sí y otra no (????), la vez que no funcionaba me mostraba, como única salida "EOF", es decir End Of File (fin de archivo). He supuesto que esto era así porque no habia definido el nº de pàrrafo en la acción "Leer parrafo" y Tasker leia el primero y en la siguiente ejecución el segundo y último. Poniendo un 1 en lugar de dejar el campo vacio se ha resuelto el problema.
Transcripción de la tarea en Tasker:
Plantes JS (314)
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: Establecer variable [ Nombre:%texte A:Espera, llegint la base de dades de plantes… Calcular:Apagado Añadir:Apagado ]
A5: 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 ]
A6: Leer párrafo [ Archivo:Plantes.txt Párrafo:1 A la variable:%dades ]
A7: 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:| ]
A8: JavaScriptlet [ Código:var cientific = [];
var vulgar = []; < Declaración de variables-array
var floracio = [];
var sol = [];
var temperatura = [];
var reg = [];
var adob = [];
var imatge = [];
var link= [];
var comentaris = [];
dades = (dades.split("|")); < Obtención de los datos de las distintas plantas (lo que antes hacia en Tasker mediante "Separar variable con |)
for (i=0 ; i <dades.length; i++) < Obtención de los datos de cada planta (nombre científico, nombre vulgar, floración, sol,...)
{
planta = (dades[i].split(";"));
cientific[i] = planta[0];
vulgar[i] = planta[1];
floracio[i] = planta[2];
sol[i] = planta[3];
temperatura[i] = planta[4];
reg[i] = planta[5];
adob[i] = planta[6];
imatge[i] = "Pictures/Plantes/"+ planta[7]; Aquí añado el PATH donde tengo las imágenes de las plantas
link[i] = planta[8];
comentaris[i] = planta[9];
} Librerías: Salida Automática:Encendido Cuenta atrás (segundos):45 ]
A9: 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 ]
A10: Destruir Escena [ Nombre:Espera Plantes Continuar Tarea Tras Error:Encendido ] El dato imatge[i] lo construyo añadiendo delante del nombre de la foto el PATH, /Pictures/Plantes en mi caso. Así me ahorro escribir siempre este valor en el campo correpondiente al nombre de la foto.
Sin vuestra ayuda no lo habria sacado, muchíiiisssimas gracias de nuevo.
Observación final:
Tiempo de ejecución de la Tarea con Tasker solamente = aprox. 12 segundos.
Tiempo de ejecución de la Tarea incluyendo el Scriplet = aprox. 4 segundos. :gracias:
WillyWeb
15/02/16, 22:04:37
Estupendo :ok:
Se me pasó decirte lo del EOF y que se podía solucionar añadiendo un 1 en el número de párrafo, pero veo que lo has solucionado perfectamente.
La mejora de tiempo de ejecución es muy buena, y puede que si ahora generas un APK todavía mejore un poco más. Es cosa de probar. :silbando:
cace0353
16/02/16, 10:59:39
Estupendo :ok:
Se me pasó decirte lo del EOF y que se podía solucionar añadiendo un 1 en el número de párrafo, pero veo que lo has solucionado perfectamente.
La mejora de tiempo de ejecución es muy buena, y puede que si ahora generas un APK todavía mejore un poco más. Es cosa de probar. :silbando:
La tarea principal, al generar el APK, no se ejecuta mucho más rápido (quizás ahora lo hace en 3 seg. en lugar de 4...). En cambio tengo otra tarea que uso para ordenar las plantas por su nombre vulgar, releyendo el archivo, generando una nueva matriz ordenada por la segunda columna (mediante una acción Procesar Array, orden alfabético) y creando un nuevo archivo Plantes_vulgar.txt (que contiene los nombres vulgares de las plantas y el índice que tenian en la matriz %dades) cada vez que añado lineas a la base de datos. En esta tarea el uso de la acción JavaScriptlet ha reducido el tiempo de ejecución de unos 10 ó 12 seg. a 3 seg.!
Estoy realmente satisfecho. Habrá que profundizar el estudio de JS para ir incorporando este tipo de código en mis programas...
Lo que si és evidente es que el pasar la aplicación de Tasker a APK la mejora ya no és tan impactante como lo era antes.
Me he subscrito al hilo para ver como evoluciona esto, a ver si le damos vas "vidilla"...
WillyWeb
16/02/16, 21:57:09
Lo que si és evidente es que el pasar la aplicación de Tasker a APK la mejora ya no és tan impactante como lo era antes.
La verdad es que, después de pensarlo un poco, tiene su lógica que mejore algo la velocidad de ejecución de una APK basada en acciones puras de Tasker y que no lo haga en la misma medida si está basada en JS. :rolleyes:
Supongo que las acciones de Tasker, en la versión APK, son algo más rápidas porque el interprete es más ligero al no tener que arrastrar su entorno de desarrollo. En cambio, el código JS siempre se ejecuta/interpreta igual. :rolleyes:
Y ahora que me fijo mejor en tu tarea...
Puedes eliminar la acción A7 (la de cambiar \n por |) y dentro del código JS cambiar la línea ...
dades = (dades.split("|"));
...por...
dades = dades.split("\n");
Eso lo mismo reduce el tiempo de ejecución otro medio segundo. :silbando:
cace0353
16/02/16, 22:16:50
… /…
Y ahora que me fijo mejor en tu tarea...
Puedes eliminar la acción A7 (la de cambiar \n por |) y dentro del código JS cambiar la línea ...
dades = (dades.split("|"));
...por...
dades = dades.split("\n");
Eso lo mismo reduce el tiempo de ejecución otro medio segundo. :silbando:
Tienes toda la razón, WillyWeb. En Tasker no puedo usar "\n" para dividir una variable, por eso debo substituir previamente el salto de línea por otro símbolo.
Lo he hecho como tu dices directamente en JS, "et voilà… ", funciona.
Me he ahorrado una línea y el código queda mas limpio, pero en tiempo de ejecución no aprecio diferencia. En realidad, y según esté de "cargada" la RAM, la duración de ejecución varia ligeramente.
Cada vez me gusta más esto del JavaScript… 👌
Enviat des del meu SM-T550 usant Tapatalk
WillyWeb
16/02/16, 22:23:43
... En Tasker no puedo usar "\n" para dividir una variable, por eso debo substituir previamente el salto de línea por otro símbolo.
En este caso ya lo tienes resuelto, pero para otra ocasión prueba con esto...
-Crea una variable (%newline) y como valor no metas nada. Simplemente pulsa el enter para meter una línea en blanco.
-Usa la acción de "Separar variable" como haces siempre y en el campo "Separador" usa la variable de antes (%newline).
Con eso te ahorras lo de cambiar \n por | y luego separar por |. :-)
cace0353
16/02/16, 22:37:03
Buen truco! Pero vaya, ahora que he descubierto como hacerlo en JS creo que siempre que deba procesar muchos datos ya sé como hacerlo con más velocidad, je, je... .
Incluso creo que para mis programillas voy a prescindir de convertirlos a APK con el App Factory ya que, al ejecutarlos una vez, siempre se quedan "en ejecución" ocupando RAM …
Enviat des del meu SM-T550 usant Tapatalk
maid450
10/03/16, 09:36:34
Hola @cace0353 (http://www.htcmania.com/member.php?u=304484), perdona pero entro al foro muy de uvas a peras...
Justo acabo de ver el problema que tenías y venía a responder, pero veo que ya lo has solucionado ;-)
En cualquier caso me alegro que consiguieras resolverlo con la ayuda de @WillyWeb (http://www.htcmania.com/member.php?u=68214)
A ver si me activo las alertas para enterarme mejor de menciones y MPs y empiezo a entrar más al foro de nuevo!
cace0353
10/03/16, 09:49:43
Hola @cace0353, perdona haber tardado tanto en contestar, pero entro al foro muy de uvas a peras... Me he pasado casi una hora redactando una respuesta super currada explicando todo paso a paso y en detalle para que la respuesta fuera más didáctica y por un error de navegador se ha perdido así que sintiendolo mucho, voy a poner directamente como escribiría yo el código para emular la tarea de Tasker (al menos el trozo problemático) y ya si tienes alguna duda concreta me preguntas... (a ver si activo que me lleguen notificaciones del foro al correo porque en parte por eso no me había enterado antes de esto...)
Muchas gracias por tu interés maid450, pero ya he resuelto el tema como he puesto unos posts más arriba...
Veo que lo que tú propones es utilizar el comando push para meter el dato en los arrays (cientific, vulgar, floracio...) en lugar de asignarlo por el indice... Tomo nota para la próxima. Poco a poco se hicieron la catedrales, pero ahí están!
Te estábamos encontrando a faltar ya! :ok:
maid450
10/03/16, 09:58:36
Mi navegador estaba un poco tonto esta mañana (motivo por el que he perdido mi respuesta inicial) y me salía como si no te hubieran contestado, por eso lo he escrito, y al publicarlo ya me ha salido la retahila con el tema solucionado, por eso he editado mi respuesta... jejeje
mhp1976
23/02/19, 16:13:41
Hola. No sé muy bien donde preguntar esta duda que tengo. Soy bastante desconocedora de los temas tecnológicos. Os cuento mi caso, a ver si podéis ayudarme (de forma sencilla, por favor):
Tengo un temario de oposición que sólo puedo leer online, sin posibilidad de descargarlo. Queria usar alguna aplicación de las que pasan texto a voz, para poder escuchar los temas mientras hago otras cosas.
He probado varias aplicaciones de playstore, y, cuando voy a usarlas, todas me dicen que tengo que activar javascript en el navegador, pero lo tengo activado, así que no sé dónde está el problema, si es que hago algo mal, o tengo que descargar algo más, o yo que sé.
Tengo un Huawei P20 pro con versión android Pie, y como navegador utilizo Chrome.
En el navegador, en el apartado de ajustes-configuracion-javascript, lo tengo activado, pero con las tres o cuatro aplicaciones que he probado de texto a voz, siempre me dice que active javascript. Qué lío!!!!.
Os agradecería si alguien pudiera ayudarme.
WillyWeb
23/02/19, 16:45:43
Os agradecería si alguien pudiera ayudarme.
Tal como lo planteas parece que tu "problema" tiene muy poco que con Tasker, que es el tema principal de este foro. :rolleyes:
De todas formas, que no se diga que un Taskero no acepta un reto, aunque para poder ayudarte faltan unas aclaraciones importantes...
¿Qué páginas son esas?
¿Qué tipo de documento intentas leer?
¿Qué aplicaciones has usado?
Por cierto, si se trata de algo que requiera un usuario y una contraseña no lo hagas público. Valora si quieres dar esa información y hazlo de forma privada.
mhp1976
23/02/19, 18:30:46
Bueno, pues gracias por aceptar mi reto-problema.
A ver, es un temario de oposición, al cual hay que entrar con usuario y contraseña, por supuesto, y se puede leer online, pero no descargar. Adjunto algunas capturas de pantalla, para que veas la "pinta" que tiene el temario.
Las aplicaciones que he usado son : Tts reader, T2S, y voz a texto texto a voz. Todas las he descargado de playstore.
Como veras, tengo javascript activado, pero nada, que no hay forma de conseguir que ninguna aplicación me lea el texto, porque "tengo que activar javascript".:estrellas:
En fin, perdón por el rollo, y gracias por molestarte en responderme, aunque creo que me metí a preguntar donde no correspondía, lo cual también te puede dar una idea de lo perdida que estoy con la tecnología.:pensando:
WillyWeb
23/02/19, 20:51:20
Como veras, tengo javascript activado, pero nada, que no hay forma de conseguir que ninguna aplicación me lea el texto, porque "tengo que activar javascript". :estrellas:
He estado curioseando un rato en la plataforma que contiene ese temario (https://es.calameo.com/) y me temo que no lo tienes nada fácil. :rolleyes:
Los documentos se muestran en un visor propietario y el autor de la publicación tiene un potente control (https://developer.calameo.com/) sobre lo que permite hacer al lector. Vamos, que no se trata del típico enlace a un PDF que podría estar más o menos escondido en el código HTML de una web. :silbando:
Y esas aplicaciones pueden estar fallando precisamente por la protección que aporta la plataforma a los documentos. No creo que realmente se trate de un problema de JavaScript. Seguramente funcionarán en cualquier otra web (prueba en este mismo foro y lo confirmas).
Me temo que, esta vez, el problema no se puede solucionar con Tasker. :maburro:
mhp1976
23/02/19, 21:56:25
Vaya, pues efectivamente, sólo tengo problema en esa página, así que tendré que seguir utilizando el método tradicional de estudio basado en dejarme la vista y gastar codos :cry::cry:
Te agradezco enormemente tu ayuda. Si puedo ayudarte yo en algo (medicina o enfermería, que es lo que domino), sólo tienes que decirlo, aunque creo que eso sí que no es tema de este foro.
En serio, muchas gracias.
WillyWeb
23/02/19, 22:04:11
Si puedo ayudarte yo en algo (medicina o enfermería, que es lo que domino), sólo tienes que decirlo...
Te agradezco el ofrecimiento. Lo tendré presente si me pongo malito. :cry:
Suerte con tu oposición. :ok:
Excelente tutorial sobre todo para los que somos principiantes. Destacar la importancia del último párrafo del punto 2, lo de multiplicar una variable de texto por1 para convertirla a numérica... genial.
Caravantes
23/02/19, 23:18:19
Queria usar alguna aplicación de las que pasan texto a voz, para poder escuchar los temas mientras hago otras cosas
Supongo que no funcionará, pero por probar que no quede: Los smartphones modernos tienen incorporados distintos sistemas de ayuda para personas con problemas visuales y de otros tipos. Uno de ellos es "Text to speech" o "Texto a voz", y creo que ese sistema es totalmente independiente de JavaScript. En los ajustes, eso suele estar en un apartado de ACCESIBILIDAD. Más detalles en las dos páginas siguientes:
Salida de texto a voz https://support.google.com/accessibility/android/answer/6006983?hl=es-419
Huawei nos recuerda las opciones de accesibilidad que traen los equipos Android https://www.todotech.com/huawei/noticias/n41403/Huawei-opciones-accesibilidad-equipos-Android.html
Mucha suerte.
mhp1976
24/02/19, 12:21:49
Supongo que no funcionará, pero por probar que no quede: Los smartphones modernos tienen incorporados distintos sistemas de ayuda para personas con problemas visuales y de otros tipos. Uno de ellos es "Text to speech" o "Texto a voz", y creo que ese sistema es totalmente independiente de JavaScript. En los ajustes, eso suele estar en un apartado de ACCESIBILIDAD. Más detalles en las dos páginas siguientes:
Salida de texto a voz https://support.google.com/accessibility/android/answer/6006983?hl=es-419
Huawei nos recuerda las opciones de accesibilidad que traen los equipos Android https://www.todotech.com/huawei/noticias/n41403/Huawei-opciones-accesibilidad-equipos-Android.html
Mucha suerte.
Eso también lo he probado, y en este caso, tampoco me funciona. Gracias de todas formas.
vBulletin® v3.8.1, Copyright ©2000-2026, Jelsoft Enterprises Ltd.