Siempre pensé que un programador perezoso es un buen programador. Por qué Porque pedirle al trabajador que haga algo, él irá y lo hará. Un programador perezoso pasará 2-3 veces más tiempo, pero escribe un guión que lo hará por él. Quizás por primera vez se pasará demasiado tiempo sin razón, pero sujeto a tareas repetitivas, este enfoque vale la pena muy rápidamente. Me considero un programador perezoso. Fue un preámbulo, y ahora vamos al grano.
Primera historia
Hace unos años me pregunté cómo podría mejorar mi inglés. Nada mejor que leer literatura me vino a la mente. Se compró un lector electrónico, se descargaron libros y comencé a leer. En el proceso de leer, constantemente aparecían palabras desconocidas. Inmediatamente los traduje usando los diccionarios incorporados, pero noté una característica: las palabras no querían ser recordadas. Cuando volví a encontrar esta palabra después de unas pocas páginas, luego con un 90% de probabilidad, nuevamente necesitaba una traducción, y así siempre. La conclusión fue que no fue suficiente solo para traducir palabras desconocidas en el proceso de lectura, sino que debe hacer algo más. Una opción ideal sería introducirlo en la vida cotidiana y comenzar a usarlo, pero no vivo en un país de habla inglesa y esto no es posible. Entonces recordé que una vez había leído sobre repeticiones de intervalos .
¿Qué es y con qué come? En resumen, existe una curva de olvido , luego una cita de Wikipedia:
Ya dentro de la primera hora, se olvida hasta el 60% de toda la información recibida, 10 horas después de la memorización, el 35% de la información estudiada permanece en la memoria. Además, el proceso de olvido es lento, y después de 6 días, aproximadamente el 20% del número total de sílabas que se aprendieron originalmente permanece en la memoria, la misma cantidad permanece en la memoria después de un mes.
Y la conclusión es de aquí
Las conclusiones que se pueden extraer sobre la base de esta curva son que, para una memorización efectiva, es necesario repetir el material aprendido.
Entonces llegamos a la idea de la repetición de intervalos .
ANKI es un programa de código abierto gratuito que implementa la idea de la repetición de intervalos. En pocas palabras, las tarjetas de memoria informatizadas son, por un lado, una pregunta y, por el otro, la respuesta. Como puede hacer preguntas / respuestas utilizando el html / css / javascript habitual, puede decir que tiene posibilidades realmente ilimitadas. Además, es extensible con complementos especiales, y uno de ellos nos será muy útil en el futuro.
Crear tarjetas manualmente es una tarea larga y tediosa, y es muy probable que después de un tiempo elimines este negocio y, por lo tanto, en algún momento me pregunté si este negocio puede automatizarse. La respuesta es sí, puedes. Y lo hice Diré de inmediato que esto es más POC (Prueba de concepto) , pero que se puede usar. Si hay interés de los usuarios y otros desarrolladores para ponerse al día, entonces se puede llevar a un producto terminado que incluso los usuarios técnicamente analfabetos pueden usar. Ahora, usar mi utilidad implica algunos conocimientos de programación.
Leo libros usando AIReader . Tiene la capacidad de conectar diccionarios externos, y cuando traduce una palabra, guarda la palabra que llamó la traducción en un archivo de texto. Lo único que queda es traducir estas palabras y crear tarjetas ANKI.
Al principio traté de usar Google Translate , Lingvo API , etc. para traducir. Pero no funcionó con servicios gratuitos. Usé el límite libre durante el proceso de desarrollo, además, según los términos de la licencia, no tenía derecho a almacenar en caché las palabras. En algún momento, me di cuenta de que necesitaba traducir las palabras yo mismo. Como resultado, se escribió el módulo dsl2html al que se pueden conectar los diccionarios DSL y que pueden convertirlos al formato HTML .
Así es como se ve la entrada del diccionario en * .html , mi versión en comparación con la variante GoldenDict

Antes de buscar una palabra en diccionarios conectados, la llevo a un formulario de diccionario (lema) usando la biblioteca Stanford CoreNLP . En realidad, debido a esta biblioteca, comencé a escribir en Java y el plan inicial era escribir todo en Java, pero en el proceso encontré la biblioteca node-java con la que puedes ejecutar relativamente fácilmente el código Java desde nodejs y parte del código está escrito en JavaScript. Si hubiera encontrado esta biblioteca antes, entonces no se habría escrito una sola línea en Java. Otro proyecto paralelo que nació en el proceso es la creación de un repositorio con documentación DSL que se encontró en la red en formato * .chm , convertido y llevado a una forma divina. Si el autor del archivo original, un usuario con el sobrenombre de yozhic, ve este artículo, le agradezco mucho el trabajo realizado, sin su documentación probablemente habría fallado.
Entonces, tengo una palabra en inglés, su entrada del diccionario en formato * .html , queda por reunir todo, crear artículos ANKI de la lista de palabras y agregarlos a la base de datos ANKI. El siguiente proyecto data2anki fue creado para este propósito. Él sabe cómo tomar una lista de palabras, traducir, crear artículos ANKI * .html y escribirlos en la base de datos ANKI. Al final del artículo, hay instrucciones sobre cómo usarlo. Mientras tanto, la segunda historia donde la repetición de intervalos puede ser útil.
La segunda historia.
Todas las personas que buscan una profesión más / menos calificada, incluidos los programadores, se enfrentan a la necesidad de prepararse para una entrevista. No utiliza muchos conceptos que se le piden en una entrevista en la práctica diaria y se olvidan. En la siguiente preparación para la entrevista, desplazándome por el compendio, libro, libro de referencia, me encontré con el hecho de que lleva mucho tiempo y atención filtrar la información que ya conoces porque no siempre es obvia y tienes que leerla para comprender qué es. irrelevante Cuando se trata de un tema que realmente necesita repetirse, a menudo sucede que ya está cansado y la calidad de la preparación se ve afectada. En algún momento, pensé, ¿por qué no usar tarjetas ANKI para esto? Por ejemplo, al tomar notas sobre un tema, cree inmediatamente un resumen en forma de una pregunta-respuesta, y luego, cuando lo repita, sabrá de inmediato si sabe o no la respuesta a esta pregunta.
El problema surgió solo porque era muy largo y tedioso responder preguntas. Para facilitar el proceso, en el proyecto data2anki agregué funcionalidad para convertir texto de rebajas a tarjetas ANKI. Todo lo que necesita hacer es escribir un archivo grande en el que las preguntas y respuestas se marcarán con una secuencia predeterminada de caracteres, mediante la cual el analizador comprenderá dónde está la pregunta y dónde está la respuesta.
Después de crear este archivo, inicia data2anki y crea tarjetas ANKI. El archivo original es fácil de editar y compartir, solo necesita borrar las tarjetas correspondientes y ejecutar el programa nuevamente, y se creará una nueva versión.
Instalación y uso
Instalar ANKI + AnkiConnect
- Descarga ANKI desde aquí: https://apps.ankiweb.net/
- Instale el complemento AnkiConnect: https://ankiweb.net/shared/info/2055492159
Instalar data2anki
- Descargar data2anki del repositorio de github
git clone https://github.com/anatoly314/data2anki
- Instalar dependencias
cd data2anki && npm install
- Descargue las dependencias de Java https://github.com/anatoly314/data2anki/releases/download/0.1.0/jar-dependencies.zip
- Desempaquete jar-dependencies.zip y coloque su contenido en data2anki / java / jars
Uso para traducir palabras:
En el archivo data2anki / config.json :
en la tecla de modo , escriba el valor dsl2anki
En la clave modules.dsl.anki.deckName y modules.dsl.anki.modelName , respectivamente, escriba el nombre del mazo y el nombre del modelo (ya debe estar creado antes de crear las tarjetas). Ahora solo se admite un modelo de tipo Basic :
Tiene campos frontal y posterior, y creará una tarjeta. El texto que ingrese en el frente aparecerá en el frente de la tarjeta, y el texto que ingrese en el reverso aparecerá en la parte posterior de la tarjeta.
donde la palabra fuente es el campo Frontal y la traducción estará en el campo Atrás .
No hay ningún problema al agregar soporte para Basic (y tarjeta invertida) , donde se creará una tarjeta inversa para la palabra y la traducción, donde la traducción deberá recuperar la palabra original. Solo se necesita la presencia del tiempo y el deseo.
en la clave modules.dsl.dictionariesPath , registra una matriz con los diccionarios * .dsl conectados. Cada diccionario conectado es un directorio en el que los archivos del diccionario se encuentran de acuerdo con el formato: estructura del diccionario DSL
En la clave modules.dsl.wordToTranslatePath, especifique la ruta a la lista de palabras que desea traducir.
- Ejecutar cuando se trabaja la aplicación ANKI
node data2anki\index.js
- BENEFICIO !!!
Usos para crear tarjetas de descuento
En el archivo data2anki / config.json :
- en la tecla de modo , escriba el valor markdown2anki
- en la clave modules.markdown.anki.deckName y modules.dsl.anki.modelName que escriba, respectivamente, Deck Name y Model Name (ya deben crearse antes de crear tarjetas). Para el modo markdown2anki , solo se admite un modelo de tipo básico .
en la clave modules.markdown.selectors.startQuestionSelectors y modules.markdown.selectors.startAnswerSelectors registran los selectores con los que marca el comienzo de la pregunta y la respuesta, respectivamente. La línea con el selector en sí no se analizará y no entrará en la tarjeta, el analizador comenzará a funcionar desde la siguiente línea.
Por ejemplo, esta tarjeta de preguntas / respuestas:

Se verá en rebaja de la siguiente manera:
# PREGUNTA #
## Pregunta 5. Escriba una función mul que funcionará correctamente cuando se invoque con la siguiente sintaxis.
`` `javascript
console.log (mul (2) (3) (4)); // salida: 24
console.log (mul (4) (3) (4)); // salida: 48
`` ``
# RESPUESTA #
A continuación se muestra el código seguido de la explicación de cómo funciona:
`` `javascript
función mul (x) {
función de retorno (y) {// función anónima
función de retorno (z) {// función anónima
devuelve x * y * z;
};
};
}
`` ``
Aquí la función `mul` acepta el primer argumento y devuelve la función anónima que toma el segundo parámetro y devuelve la función anónima que toma el tercer parámetro y devuelve la multiplicación de argumentos que se pasan sucesivamente
En Javascript, la función definida en el interior tiene acceso a la variable de función externa y la función es el objeto de primera clase, por lo que la función también puede devolverla y pasarla como argumento en otra función.
- Una función es una instancia del tipo de objeto
- Una función puede tener propiedades y tiene un enlace a su método constructor
- Una función se puede almacenar como variable
- Una función se puede pasar como parámetro a otra función
- Una función puede ser devuelta desde otra función
Se toma un ejemplo de aquí: 123-JavaScript-Interview-Questions
También hay un archivo con ejemplos en la carpeta del proyecto examples/markdown2anki-example.md
- en la clave modules.markdown.pathToFile
prescriba, la ruta al archivo donde se encuentra el archivo * .md con preguntas / respuestas
- Ejecutar cuando se trabaja la aplicación ANKI
node data2anki\index.js
- BENEFICIO !!!
Así es como se ve en un teléfono móvil:
Resultado
Las tarjetas recibidas en la versión de escritorio de ANKI se pueden sincronizar fácilmente con la nube ANKI (gratis hasta 100mb), y luego puede usarlas en todas partes. Hay clientes para Android y iPhone, también puedes usarlo en un navegador. Como resultado, si tiene tiempo en el que no tiene nada que gastar, en lugar de hojear sin rumbo a través de Facebook o sellos en Instagram, puede aprender algo nuevo.
Epílogo
Como mencioné, este es más un POC funcional que puede usar que un producto terminado. En algún lugar no se implementa alrededor del 30% del estándar del analizador DSL y, por lo tanto, por ejemplo, no se pueden encontrar todas las entradas del diccionario que se encuentran en los diccionarios , también existe la idea de reescribirlo en JavaScript , porque desea "coherencia", y además, ahora está escrito No muy óptimo. Ahora el analizador está construyendo un árbol, y esto es innecesario para el mío y no necesita complicar el código. En el modo markdown2anki , las imágenes no se analizan. Trataré de ver lentamente, pero, mientras escriba para mí, primero resolveré el rastrillo que atacaré yo mismo, pero si alguien quiere ayudar, de nada. Si tiene preguntas sobre el programa, estaré encantado de ayudarlo a resolver problemas abiertos en los proyectos relevantes. Escriba el resto de las críticas y sugerencias aquí. Espero que alguien encuentre útil este proyecto.
PD: si observa errores (y, desafortunadamente, lo son), escriba un mensaje personal, lo arreglaré todo.