Siempre he creído que un programador perezoso es un buen programador. ¿Por qué? Porque si le pides a un programador trabajador que haga algo, simplemente lo hará. Pero un programador perezoso gastará de 2 a 3 veces más tiempo, pero escribirá un script que hará esto por él. Puede que la primera vez le cueste injustificadamente mucho tiempo, pero en tareas repetitivas este enfoque se amortiza muy rápidamente. Me considero un programador perezoso. Esa fue la introducción, ahora pasemos al grano.
Historia primera
Hace unos años, me pregunté cómo podría mejorar mi inglés. No se me ocurrió nada mejor que leer literatura. Compré un lector de libros electrónicos, descargué libros y comencé a leer. Durante la lectura, constantemente me encontraba con palabras desconocidas. Las traducía al instante usando los diccionarios integrados en el lector, pero noté una particularidad: las palabras no parecían quedarme grabadas. Cuando encontraba la misma palabra unas páginas después, con un 90% de probabilidad necesitaba traducirla de nuevo, y así cada vez. La conclusión era clara: no es suficiente con solo traducir palabras desconocidas durante la lectura, hay que hacer algo más. Lo ideal sería incorporarlas en el uso diario y comenzar a utilizarlas, pero como no vivo en un país de habla inglesa, eso es poco probable. Entonces recordé que alguna vez leí sobre .
¿Qué es y para qué se usa? En breve, hay una , a continuación una cita de Wikipedia:
En la primera hora se olvida hasta un 60% de toda la información recibida, a las 10 horas después de aprender, permanece en la memoria un 35% de lo estudiado. Luego el proceso de olvido progresa lentamente, y después de 6 días queda alrededor del 20% del número total de sílabas originalmente aprendidas, la misma cantidad permanece en la memoria después de un mes.
Y la conclusión es clara
Las conclusiones que se pueden extraer de esta curva son que para un recuerdo efectivo es necesario repetir el material aprendido.
Así que llegamos a la idea de .
es un programa completamente gratuito y de código abierto que implementa la idea de repetición espaciada. En otras palabras, son tarjetas de memoria digitalizadas, con una pregunta en un lado y la respuesta en el otro. Como puedes crear preguntas/respuestas utilizando el común html/css/javascript, se puede decir que tiene verdaderamente posibilidades ilimitadas. Además, es extensible con plugins especiales , y uno de ellos será muy útil más adelante.
Crear tarjetas manualmente es lento, tedioso y hay una gran probabilidad de que con el tiempo te desanimes y dejes de hacerlo, así que en algún momento me pregunté si se podía automatizar esta tarea. La respuesta es sí, se puede. Y lo hice. Te diré que esto es más , pero que ya se puede usar. Si hay interés por parte de los usuarios y otros desarrolladores se involucran, se puede llevar a un producto terminado que incluso usuarios sin conocimientos técnicos puedan utilizar. Sin embargo, en este momento el uso de mi herramienta supone ciertos conocimientos en programación.
Leo libros usando el programa . Tiene la capacidad de conectar diccionarios externos y, además, al traducir una palabra, guarda la palabra para la cual activaste la traducción en un archivo de texto. Solo queda traducir esas palabras y crear tarjetas ANKI.
Primero intenté usar para traducción , etc. Pero con los servicios gratuitos no funcionó. Excedí el límite gratuito aún durante el desarrollo, además, por las condiciones de la licencia, no tenía derecho a almacenar en caché las palabras. En algún momento comprendí que necesitaba traducir las palabras por mí mismo. Al final, se escribió un módulo al que se pueden conectar que pueden convertirlos a HTML formato.
Así es como se ve un artículo de diccionario en *.html, mi versión en comparación con la versión de

Antes de buscar una palabra en los diccionarios conectados, la traigo a usando la biblioteca . De hecho, debido a esta biblioteca comencé a programar en Java y el plan inicial era escribir todo en Java, pero en el proceso encontré la biblioteca con la cual se puede ejecutar código Java desde nodejs de forma relativamente sencilla y parte del código está escrito en JavaScript. Si hubiera encontrado esta biblioteca antes, no habría escrito ni una línea en Java. Otro proyecto secundario que nació en el proceso es la creación que se encontró en línea en formato *.chm, que fue convertida y presentada de manera legible. Si el autor del archivo original, el usuario conocido como yozhic ve este artículo, le agradezco mucho por el trabajo realizado; sin su documentación, probablemente no habría logrado nada.
Entonces, tengo una palabra en inglés, su entrada de diccionario en formato *.html, solo queda unificar todo, crear artículos ANKI de la lista de palabras y añadirlos a la base de datos ANKI. Para este propósito se creó el siguiente proyecto . Puede recibir una lista de palabras, traducirlas, crear artículos ANKI *.html y registrarlos en la base de datos ANKI. Al final del artículo hay una instrucción sobre cómo utilizarlos. Hasta ahora, esta es la segunda historia donde las repeticiones espaciadas pueden ser útiles.
La segunda historia.
Todas las personas en busca de una especialidad más o menos calificada, incluidos los programadores, se enfrentan a la necesidad de prepararse para entrevistas. Muchos conceptos que se preguntan en entrevistas no se utilizan en la práctica diaria y se olvidan. En la preparación para una entrevista, al revisar apuntes, libros o manuales, me di cuenta de que se requiere mucho tiempo y atención para filtrar la información que ya conoces, porque no siempre es obvio y a veces hay que leer con atención para comprender que no es relevante. Cuando llegas al tema que realmente necesitas repasar, a menudo sucede que ya estás cansado y la calidad de la preparación se ve afectada. En un momento pensé, ¿por qué no utilizar tarjetas ANKI para esto? Por ejemplo, al tomar apuntes sobre un tema, crear de inmediato un resumen en forma de pregunta-respuesta, y luego al repasar, sabrás inmediatamente si conoces o no la respuesta a esa pregunta.
El único problema surgió en que escribir las preguntas es muy lento y tedioso. Para facilitar el proceso, en el proyecto añadí funcionalidad para convertir Texto en la tarjeta ANKI. Todo lo que necesita hacer es escribir un solo archivo grande en el que las preguntas y respuestas estén marcadas con una secuencia de caracteres acordada de antemano, que permitirá al parser entender dónde está la pregunta y dónde la respuesta.
Después de que se haya creado este archivo, ejecuta data2anki y él creará las tarjetas ANKI. El archivo original es fácil de modificar y compartir, solo tienes que borrar la tarjeta(s) correspondiente(s) y ejecutar el programa nuevamente, y se generará una nueva versión.
Instalación y uso
Instalación de ANKI + AnkiConnect
- Descargas ANKI desde aquí:
- Instalas el plugin AnkiConnect:
Instalación
- Descargas del repositorio de github
git clone https://github.com/anatoly314/data2anki - Instalas las dependencias
cd data2anki && npm install - Descargas las dependencias de java
- Descomprimis jar-dependencies.zip y colocas su contenido en data2anki/java/jars
- Descargas del repositorio de github
Uso para la traducción de palabras:
En el archivo data2anki/config.json:
en la clave modo escribes el valor dsl2anki
en la clave modules.dsl.anki.deckName y modules.dsl.anki.modelName escribes, respectivamente, y (deben estar creados antes de crear las tarjetas). Actualmente solo se admite el modelo tipo Basic:
tiene campos Front y Back, y creará una tarjeta. El texto que ingreses en Front aparecerá en el frente de la tarjeta, y el texto que ingreses en Back aparecerá en la parte posterior de la tarjeta.
donde la palabra original es Front field, y la traducción estará en Back field.
No hay ningún problema en añadir soporte para Basic (y tarjeta invertida), donde se creará una tarjeta inversa para la palabra y la traducción, en la que deberás recordar la palabra original a partir de la traducción. Solo se requiere tener tiempo y ganas.
en la clave modules.dsl.dictionariesPath escribes un array con los diccionarios *.dsl conectados. Cada diccionario conectado es un directorio donde se encuentran los archivos del diccionario de acuerdo con el formato:
en la clave modules.dsl.wordToTranslatePath escribes la ruta a la lista de palabras que deseas traducir.
- Ejecutas con la aplicación ANKI funcionando
node data2ankiindex.js - ¡GANANCIA!!!
Uso para crear tarjetas a partir de markdown
En el archivo data2anki/config.json:
- en la clave modo escribes el valor markdown2anki
- en la clave modules.markdown.anki.deckName y modules.dsl.anki.modelName escribes, respectivamente, y (deben estar creados antes de crear las tarjetas). Para markdown2anki mode solo se admite el modelo tipo Basic.
en la clave modules.markdown.selectors.startQuestionSelectors y modules.markdown.selectors.startAnswerSelectors escribes los selectores que usas para marcar el inicio de las preguntas y respuestas respectivamente. La línea con el selector no será analizada y no aparecerá en la tarjeta, el parser comenzará a trabajar a partir de la siguiente línea.
Por ejemplo, esta tarjeta pregunta/respuesta:

Se verá en markdown de la siguiente manera:
#QUESTION# ## Question 5. Write a mul function which will work properly when invoked with following syntax. ```javascript console.log(mul(2)(3)(4)); // output : 24 console.log(mul(4)(3)(4)); // output : 48 ``` #ANSWER# Below is the code followed by the explanation of how it works: ```javascript function mul (x) { return function (y) { // anonymous function return function (z) { // anonymous function return x * y * z; }; }; } ``` Here the `mul` function accepts the first argument and returns the anonymous function which takes the second parameter and returns the anonymous function which takes the third parameter and returns the multiplication of arguments which is being passed in successive In Javascript function defined inside has access to outer function variable and function is the first class object so it can be returned by the function as well and passed as an argument in another function. - A function is an instance of the Object type - A function can have properties and has a link back to its constructor method - A function can be stored as variable - A function can be pass as a parameter to another function - A function can be returned from another functionEjemplo tomado de aquí:
También hay un archivo con ejemplos en la carpeta del proyecto
examples/markdown2anki-example.md- en la clave modules.markdown.pathToFile
especifica la ruta al archivo donde se encuentra *.md archivo con preguntas/respuestas
- Ejecutas con la aplicación ANKI funcionando
node data2ankiindex.js - ¡GANANCIA!!!
Así es como se ve en un teléfono móvil:

Resultado
Las tarjetas de ANKI obtenidas en la versión de escritorio se sincronizan sin problemas con la nube de ANKI (gratis hasta 100mb), y después puedes usarlas en cualquier lugar. Hay clientes para Android e iPhone, y también se puede usar en el navegador. Por lo tanto, si tienes tiempo que no sabes cómo aprovechar, en lugar de perderte mirando Facebook o gatos en Instagram, puedes aprender algo nuevo.
Epílogo
Como mencioné antes, esto es más un POC funcional que un producto terminado. Alrededor del 30% del estándar del analizador DSL no está implementado, por lo que , además hay una idea de reescribirlo en JavaScript, ya que se busca la «consistencia», además de que actualmente está escrito de manera no muy óptima. Ahora, el analizador construye un árbol, lo que creo que es innecesario y complica el código. En markdown2anki el modo imagen no se analizan. Trataré de trabajar poco a poco, pero, como actualmente escribo para mí mismo, primero resolveré los problemas que yo mismo encuentre, pero si alguien quiere ayudar, será bienvenido. Si hay preguntas sobre el programa, estaré encantado de ayudar a través de issues abiertos en los proyectos correspondientes. Para cualquier otra crítica y sugerencias, escríbanme aquí. Espero que este proyecto sea útil para alguien.
P.D. Si encuentras errores (que, desafortunadamente, existen), escríbeme en privado, los corregiré.
Fuente: habr.com

