Sempre acreditei que um programador preguiçoso é um bom programador. Por quê? Porque se você pede a um trabalhador esforçado para fazer algo, ele vai e faz. Mas um programador preguiçoso vai gastar 2 a 3 vezes mais tempo, mas vai escrever um script que fará isso por ele. Pode ser que, na primeira vez, isso consuma um tempo injustificadamente grande, mas, considerando tarefas repetitivas, essa abordagem logo compensa. Eu me considero um programador preguiçoso. Essa foi uma introdução, agora vamos ao ponto.
Primeira história
Alguns anos atrás, comecei a pensar em como melhorar meu inglês. Não me ocorreu nada melhor do que a leitura de literatura. Comprei um leitor de e-books, baixei livros e comecei a ler. Durante a leitura, frequentemente encontrava palavras desconhecidas. Eu as traduzia imediatamente com os dicionários embutidos no leitor, mas notei uma particularidade: as palavras não queriam ser lembradas. Quando eu encontrava essa palavra novamente algumas páginas depois, havia 90% de probabilidade de que eu precisasse traduzir novamente, e assim por diante a cada vez. A conclusão que se impunha era que não bastava apenas traduzir as palavras desconhecidas durante a leitura; era preciso fazer algo mais. A solução ideal seria incorporá-las no dia a dia e começar a usá-las, mas eu não vivo em um país de língua inglesa, o que torna isso pouco provável. Então, lembrei-me que um dia li sobre .
O que é isso e para que serve? Em resumo, existe uma , a seguir uma citação da Wikipédia:
Já na primeira hora, até 60% de toda informação recebida é esquecida; após 10 horas de memorização, 35% do que foi estudado permanece na memória. Depois, o processo de esquecimento ocorre lentamente, e após 6 dias, cerca de 20% do total de sílabas inicialmente aprendidas permanece na memória; a mesma quantidade permanece na memória após um mês.
E a conclusão aqui
As conclusões que podem ser tiradas com base nesta curva são que para uma memorização eficaz é necessário repetir o material aprendido.
Chegamos então à ideia de .
este é um programa absolutamente gratuito e de código aberto que implementa a ideia de repetição espaçada. Em termos simples, são cartões de flash computadorizados, de um lado uma pergunta, do outro a resposta. Como você pode fazer perguntas/respostas usando apenas html/css/javascript, pode-se dizer que ele possui verdadeiramente possibilidades ilimitadas. Além disso, é extensível com plugins específicos , e um deles será muito útil para nós mais adiante.
Criar cartões manualmente é demorado, tedioso, e com uma grande probabilidade de que, após um tempo, você desista — por isso, em algum momento me perguntei se seria possível automatizar esse processo. A resposta é sim, é possível. E eu fiz isso. Direi de imediato, é mais , mas que pode ser usado. Se houver interesse por parte dos usuários e outros desenvolvedores se juntarem, isso pode ser transformado em um produto acabado, que até usuários tecnicamente leigos poderão utilizar. No entanto, a utilização da minha ferramenta requer certo conhecimento em programação.
Eu leio livros com a ajuda do programa . Ele tem a possibilidade de conectar dicionários externos e, ao traduzir uma palavra, salva a palavra que você chamou para tradução em um arquivo de texto. Agora, resta apenas traduzir essas palavras e criar cartões ANKI.
Inicialmente, tentei usar para tradução , etc. Mas os serviços gratuitos não deram certo. Eu esgotei o limite gratuito ainda durante o processo de desenvolvimento e, além disso, de acordo com os termos da licença, não tinha permissão para armazenar palavras. Em algum momento, percebi que precisava traduzir as palavras por conta própria. No final, um módulo foi escrito que pode conectar e que sabe como convertê-los em HTML formato.
Aqui está como um artigo de dicionário aparece em *.html, minha versão em comparação com a versão

Antes de procurar a palavra nos dicionários conectados, eu a levo à usando a biblioteca . Na verdade, foi por causa dessa biblioteca que comecei a programar em Java e o plano inicial era escrever tudo em Java, mas durante o processo encontrei a biblioteca com a qual é relativamente simples executar código Java a partir do nodejs, e parte do código está escrita em JavaScript. Se eu tivesse encontrado esta biblioteca antes, não teria escrito uma única linha em Java. Outro projeto secundário que surgiu durante o processo foi a criação que foi encontrada na internet no formato *.chm, convertida e apresentada de forma legível. Se o autor do arquivo original, conhecido pelo apelido yozhic estiver vendo este artigo, um grande obrigado pelo trabalho realizado; sem sua documentação, provavelmente, nada teria funcionado.
Então, eu tenho uma palavra em inglês, seu artigo de dicionário no formato *.html, é necessário consolidar tudo, criar artigos ANKI a partir da lista de palavras e inseri-los no banco de dados ANKI. Para isso, foi criado o seguinte projeto . Ele é capaz de receber uma lista de palavras como entrada, traduzir, criar artigos ANKI *.html e gravá-los no banco de dados ANKI. No final do artigo, há instruções sobre como usá-lo. Por enquanto, aqui está a segunda história onde repetições espaçadas podem ser úteis.
História dois.
Todas as pessoas em busca de uma especialidade mais ou menos qualificada, incluindo programadores, enfrentam a necessidade de se preparar para entrevistas. Muitos conceitos que perguntam nas entrevistas você não utiliza na prática diária e acabam sendo esquecidos. Ao me preparar para mais uma entrevista, folheando anotações, livros e guias, percebi que muito tempo e atenção eram gastos filtrando informações que já conhecia, pois nem sempre é óbvio, e é necessário ler atentamente para entender o que é irrelevante. Quando você chega ao tópico que realmente precisa revisar, muitas vezes já está cansado e a qualidade da preparação sofre. Em algum momento pensei, por que não usar cartões ANKI para isso? Por exemplo, ao fazer anotações sobre um determinado tema, criar imediatamente um resumo no formato de pergunta-resposta, e então, na revisão, você saberá imediatamente se conhece ou não a resposta para aquela pergunta.
O problema surgiu apenas na questão de que digitar perguntas é muito demorado e tedioso. Para facilitar o processo, eu adicionei ao projeto a funcionalidade de converter Texto no cartão ANKI. Tudo o que você precisa fazer é escrever um único arquivo grande, no qual perguntas e respostas serão marcadas com uma sequência de símbolos previamente acordada, de modo que o parser entenda onde está a pergunta e onde está a resposta.
Depois que este arquivo for criado, você executa o data2anki e ele cria os cartões ANKI. O arquivo original é fácil de editar e compartilhar, basta excluir o cartão correspondente(s) e executar o programa novamente, e uma nova versão será criada.
Instalação e uso
Instalação do ANKI + AnkiConnect
- Baixe o ANKI aqui:
- Instale o plugin AnkiConnect:
Instalação
- Baixe do repositório github
git clone https://github.com/anatoly314/data2anki - Instale as dependências
cd data2anki && npm install - Baixe as dependências java
- Extraia jar-dependencies.zip e coloque seu conteúdo em data2anki/java/jars
- Baixe do repositório github
Uso para tradução de palavras:
No arquivo data2anki/config.json:
na chave modo escreva o valor dsl2anki
na chave modules.dsl.anki.deckName e modules.dsl.anki.modelName escreva, respectivamente, e (já devem estar criados antes de criar os cartões). Atualmente, apenas o modelo do tipo Basic:
Possui campos Front e Back, e criará um cartão. O texto que você inserir no Front aparecerá na frente do cartão, e o texto que você inserir no Back aparecerá na parte de trás do cartão.
onde a palavra original é Front field, e a tradução estará em Back field.
Não há nenhum problema em adicionar suporte Basic (e cartão reverso), onde tanto a palavra quanto a tradução terão um cartão reverso, onde pela tradução será necessário lembrar a palavra original. Só é necessário ter tempo e vontade.
na chave modules.dsl.dictionariesPath escreva um array com os *.dsl dicionários conectados. Cada dicionário conectado é um diretório contendo os arquivos do dicionário de acordo com o formato:
na chave modules.dsl.wordToTranslatePath escreva o caminho para a lista de palavras que você deseja traduzir.
- Execute com o aplicativo ANKI em funcionamento
node data2ankiindex.js - PROFIT!!!
Uso para criação de cartões a partir de markdown
No arquivo data2anki/config.json:
- na chave modo escreva o valor markdown2anki
- na chave modules.markdown.anki.deckName e modules.dsl.anki.modelName escreva, respectivamente, e (já devem estar criados antes de criar os cartões). Para markdown2anki modo, apenas o modelo do tipo é suportado Basic.
na chave modules.markdown.selectors.startQuestionSelectors e modules.markdown.selectors.startAnswerSelectors escreva os seletores que você usa para marcar o início da pergunta e resposta, respectivamente. A própria linha com o seletor não será analisada e não aparecerá no cartão; o parser começará a trabalhar na próxima linha.
Por exemplo, este cartão pergunta/resposta:

Aparecerá no markdown da seguinte forma:
#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 functionExemplo retirado de aqui:
Ainda há um arquivo com exemplos na pasta do projeto
examples/markdown2anki-example.md- na chave modules.markdown.pathToFile
insira o caminho para o arquivo onde está *.md arquivo com perguntas/respostas
- Execute com o aplicativo ANKI em funcionamento
node data2ankiindex.js - PROFIT!!!
Assim é como aparece no celular:

Resultado
Os cartões ANKI gerados na versão desktop sincronizam perfeitamente com a nuvem ANKI (gratuito até 100mb), depois disso, você pode usá-los em qualquer lugar. Existem clientes para Android e iPhone, além de poder acessá-los no navegador. Portanto, se você tem tempo livre, em vez de rolar sem destino no Facebook ou ver gatos no Instagram, pode aprender algo novo.
Epílogo
Como já mencionei, isso é mais um POC funcional do que um produto finalizado. Aproximadamente 30% do padrão do parser DSL não está implementado, e portanto, , também há a ideia de reescrevê-lo em JavaScript, pois busco 'consistência', e além disso, atualmente está escrito de forma não otimizada. O parser agora constrói uma árvore, o que parece desnecessário e complica o código. No markdown2anki modo de imagem, não são analisados. Vou tentar ir desenvolvendo aos poucos, mas como estou escrevendo para mim mesmo, vou priorizar resolver as coisas que achar problemáticas, mas se alguém quiser ajudar, fica à vontade. Se houver perguntas sobre o programa, ficarei feliz em ajudar através de questões abertas nos projetos correspondentes. Outras críticas e sugestões podem ser deixadas aqui. Espero que este projeto seja útil para alguém.
P.S. Se notar erros (que, infelizmente, existem), entre em contato, eu corrigirei tudo.
Fonte: habr.com

