|
||
|
|
|
|||||||
| Tasker Para hablar de todo lo relacionado con la aplicación tasker |
![]() |
|
|
Herramientas |
|
#21
|
||||
|
||||
|
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
__________________
Me apasiona volar, pero con los pies en el suelo...
|
|
|
|
#22
|
||||
|
||||
|
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
__________________
Fdo: Mlesir. Miembro del equipo que promueve el foro y el recopilatorio de Tasker http://www.htcmania.com/forumdisplay.php?f=969
|
| Los siguientes 3 usuarios han agradecido a mlesir su comentario: | ||
|
#23
|
||||
|
||||
|
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? ![]() 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
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
| Los siguientes 3 usuarios han agradecido a WillyWeb su comentario: | ||
|
#24
|
||||
|
||||
|
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 ( "{" ).
![]() 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....
__________________
Me apasiona volar, pero con los pies en el suelo...
|
|
#25
|
||||
|
||||
|
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
![]() 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 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!
__________________
Me apasiona volar, pero con los pies en el suelo...
Última edición por cace0353 Día 15/02/16 a las 12:56:20. Razón: Rectificar el nombre de la editorial del libro |
| Gracias de parte de: | ||
|
#26
|
||||
|
||||
|
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.
|
| Los siguientes 3 usuarios han agradecido a Rsc su comentario: | ||
|
#27
|
||||
|
||||
|
Me he pasado más de una hora probando cosas y viendo siempre el mismo error.
![]() 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... Código:
A5: Leer Archivo [ Archivo:Plantes.txt A la variable:%dades ] En definitiva, he cambiado la acción "Leer archivo" por "Leer párrafo" y fin del problema.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
| Los siguientes 2 usuarios han agradecido a WillyWeb su comentario: | ||
|
#28
|
||||
|
||||
|
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 ![]() 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 se pase por aquí y nos aclare el problema. Gracias de todos modos
__________________
Me apasiona volar, pero con los pies en el suelo...
Última edición por cace0353 Día 15/02/16 a las 19:35:04. |
| Gracias de parte de: | ||
|
#29
|
||||
|
||||
|
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...
__________________
Me apasiona volar, pero con los pies en el suelo...
Última edición por cace0353 Día 15/02/16 a las 19:34:17. |
|
#30
|
||||
|
||||
|
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.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
| Gracias de parte de: | ||
|
#31
|
||||
|
||||
|
Bueno, tema resuelto siguiendo las indicaciones de @WillyWeb
![]() ![]() ![]() 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: Código:
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 ]
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.
__________________
Me apasiona volar, pero con los pies en el suelo...
Última edición por cace0353 Día 15/02/16 a las 21:57:07. |
| Los siguientes 2 usuarios han agradecido a cace0353 su comentario: | ||
|
#32
|
||||
|
||||
|
Estupendo
![]() 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.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
| Los siguientes 2 usuarios han agradecido a WillyWeb su comentario: | ||
|
#33
|
||||
|
||||
|
Estupendo
![]() 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. ![]() ![]() 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"...
__________________
Me apasiona volar, pero con los pies en el suelo...
|
| Gracias de parte de: | ||
|
#34
|
||||
|
||||
![]() 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. ![]() 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.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
| Gracias de parte de: | ||
|
#35
|
||||
|
||||
|
… /…
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. ![]() ![]() 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
__________________
Me apasiona volar, pero con los pies en el suelo...
|
|
#36
|
||||
|
||||
|
-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 |.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
| Gracias de parte de: | ||
|
#37
|
||||
|
||||
|
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
__________________
Me apasiona volar, pero con los pies en el suelo...
|
|
#38
|
||||
|
||||
|
Hola @cace0353, 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 A ver si me activo las alertas para enterarme mejor de menciones y MPs y empiezo a entrar más al foro de nuevo! Última edición por maid450 Día 10/03/16 a las 09:41:23. |
|
#39
|
||||
|
||||
|
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...)
![]() 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!
__________________
Me apasiona volar, pero con los pies en el suelo...
|
| Gracias de parte de: | ||
|
|
|
#40
|
||||
|
||||
|
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
|
| Los siguientes 2 usuarios han agradecido a maid450 su comentario: | ||
![]() |
Estás aquí
|
||||||
|
||||||