Ho sempre ritenuto che un programmatore pigro sia un buon programmatore. Perché? Perché se chiedi a un programmatore diligente di fare qualcosa, lui andrà e lo farà. Ma un programmatore pigro investirà 2-3 volte più tempo, ma scriverà uno script che farà — questo per lui. Forse, la prima volta questo richiederà un tempo ingiustificato, ma nel caso di compiti ripetitivi, questo approccio si ripaga molto rapidamente. Mi considero un programmatore pigro. Questa era una premessa, ora passiamo al sodo.
Storia prima
Qualche anno fa, ho riflettuto su come migliorare il mio inglese. Non c'era niente di meglio della lettura di un buon libro. Ho acquistato un lettore elettronico, ho caricato dei libri e ho iniziato a leggere. Durante la lettura, mi trovavo sempre di fronte a parole sconosciute. Le traducevo subito grazie ai dizionari integrati nel lettore, ma ho notato una particolarità: le parole non volevano rimanere impresse nella mia memoria. Quando, dopo alcune pagine, incontravo di nuovo quella parola, avevo il 90% di probabilità di aver bisogno di tradurla di nuovo, ogni volta. La conclusione che ne traevamo era che non bastava tradurre le parole sconosciute durante la lettura, bisognava fare qualcosa di più. L'ideale sarebbe stato introdurle nel mio vocabolario e iniziare ad usarle, ma non vivo in un paese di lingua inglese, quindi ciò è poco praticabile. A questo punto mi è tornato in mente che un tempo avevo letto riguardo a .
Che cos'è e come funziona? In breve, esiste una , successivamente citazione da Wikipedia:
Già nel primo ora si dimentica fino al 60% di tutte le informazioni ricevute, dopo 10 ore dalla memorizzazione rimane nel ricordo il 35% di ciò che è stato studiato. Successivamente, il processo di dimenticanza avviene lentamente, e dopo 6 giorni rimane nella memoria circa il 20% del numero totale di sillabe inizialmente apprese, la stessa quantità rimane in memoria anche dopo un mese.
E la conclusione da qui
Le conclusioni che si possono trarre da questa curva sono che per una memorizzazione efficace è necessaria la ripetizione del materiale appreso.
Ecco che siamo giunti all'idea .
è un programma completamente gratuito e open source che realizza l'idea della ripetizione intervallata. In parole povere, è come utilizzare delle flash card informatizzate, con una domanda da un lato e una risposta dall'altro. Poiché puoi creare domande/risposte utilizzando semplice html/css/javascript, si può dire che ha possibilità veramente illimitate. Inoltre, è estensibile con appositi , e uno di essi ci sarà molto utile in futuro.
Creare manualmente schede è un processo lungo, noioso e c'è una grande probabilità che, dopo qualche tempo, tu stia per abbandonare tutto. Così, a un certo punto, mi sono chiesto se fosse possibile automatizzare questa attività. La risposta è sì, ed è quello che ho fatto. Dico subito che è più , ma utilizzabile. Se ci sarà interesse da parte degli utenti e arriveranno altri sviluppatori, si potrà portare a termine un prodotto finito, che potrà essere utilizzato anche da utenti con scarse conoscenze tecniche. Attualmente, l'uso della mia utility richiede alcune conoscenze di programmazione.
Leggo libri utilizzando il programma . Ha la possibilità di connettere dizionari esterni e, durante la traduzione di una parola, salva la parola per la quale hai richiesto la traduzione in un file di testo. Adesso resta da tradurre queste parole e creare le schede ANKI.
Inizialmente ho cercato di utilizzare per la traduzione , e così via. Ma con i servizi gratuiti non è andata. Ho esaurito il limite gratuito già durante lo sviluppo, inoltre, a causa delle condizioni della licenza, non avevo il diritto di memorizzare le parole. A un certo punto ho capito che dovevo tradurre le parole da solo. Alla fine, ho scritto un modulo a cui posso collegare e che è in grado di convertire in HTML formato.
Ecco come appare un articolo del dizionario in *.html, la mia versione in confronto alla versione

Prima di cercare una parola nei dizionari collegati la riduco alla utilizzando la libreria . In realtà, a causa di questa libreria ho iniziato a scrivere in Java e il piano iniziale era di scrivere tutto in Java, ma durante il processo ho trovato la libreria , che permette di eseguire codice Java da nodejs in modo relativamente semplice, e parte del codice è scritta in JavaScript. Se avessi trovato questa libreria prima, non avrei scritto nemmeno una riga in Java. Un altro progetto secondario nato nel processo è la creazione di che è stata trovata online in formato *.chm, convertito e sistemato. Se l'autore del file originale è l'utente con il nickname yozhic vede questo articolo, gli sono molto grato per il lavoro svolto; senza la sua documentazione, probabilmente non ce l'avrei fatta.
Quindi, ho una parola in inglese, il suo articolo di dizionario in formato *.html, resta da mettere tutto insieme, creare articoli ANKI da un elenco di parole e inserirli nel database ANKI. A tal fine, è stato creato il seguente progetto . È in grado di prendere in input un elenco di parole, tradurle, creare articoli ANKI *.html e registrarli nel database ANKI. Alla fine dell'articolo ci sono istruzioni su come usarlo. Per ora, però, è la seconda storia in cui le ripetizioni intermittenti possono essere utili.
Seconda storia.
Tutte le persone in cerca di una professione più o meno qualificata, inclusi i programmatori, si trovano di fronte alla necessità di prepararsi per un colloquio. Molti dei concetti che vengono discussi durante un colloquio non sono utilizzati nella pratica quotidiana e tendono ad essere dimenticati. Durante la mia preparazione per un colloquio, sfogliando appunti, libri e guide, ho notato che molto tempo e attenzione vengono spesi nell'eliminare informazioni che già conosco, poiché non sono sempre evidenti e devo leggere attentamente per capire che sono irrilevanti. Quando poi ci si avvicina a un argomento che richiede davvero di essere ripassato, spesso si è già stanchi e la qualità della preparazione ne risente. A un certo punto ho pensato: perché non usare anche le schede ANKI per questo? Per esempio, durante il riassunto di un argomento, si potrebbe creare immediatamente un riassunto sotto forma di domanda e risposta, così durante il ripasso saprete subito se conoscete o meno la risposta a quella domanda.
Il problema è sorto solo per il fatto che inserire le domande richiede molto tempo e può essere noioso. Per facilitare il processo, in ho aggiunto la funzionalità per convertire testo nella scheda ANKI. Tutto ciò che devi fare è scrivere un grande file in cui le domande e le risposte sono contrassegnate da una sequenza di simboli prestabilita, che il parser utilizzerà per comprendere dove si trova la domanda e dove la risposta.
Dopo aver creato questo file, esegui data2anki e verranno generate le schede ANKI. È facile modificare il file originale e condividerlo: basta eliminare la scheda o le schede corrispondenti e ripetere il programma, e verrà creata una nuova versione.
Installazione e uso
Installazione di ANKI + AnkiConnect
- Scarica ANKI da qui:
- Installa il plugin AnkiConnect:
Installazione
- Scarica dal repository github
git clone https://github.com/anatoly314/data2anki - Installa le dipendenze
cd data2anki && npm install - Scarica le dipendenze java
- Estrai jar-dependencies.zip e posiziona il suo contenuto in data2anki/java/jars
- Scarica dal repository github
Uso per la traduzione delle parole:
Nel file data2anki/config.json:
nell'opzione mode definisci il valore dsl2anki
nell'opzione modules.dsl.anki.deckName e modules.dsl.anki.modelName definisci, rispettivamente, e (devono già essere creati prima di creare le schede). Attualmente è supportato solo il modello di tipo Basic:
Ha campi Front e Back, e creerà una scheda. Il testo che inserisci in Front apparirà sul davanti della scheda, e il testo che inserisci in Back apparirà sul retro della scheda.
dove la parola originale è Campo frontale, e la traduzione sarà in Campo posteriore.
Non ci sono problemi ad aggiungere supporto Base (e scheda inversa), dove per ogni parola e traduzione verrà creata anche una scheda inversa, in cui dovrai ricordare la parola originale in base alla traduzione. Serve solo un po’ di tempo e voglia.
nell'opzione modules.dsl.dictionariesPath scrivi un array con i dizionari connessi *.dsl Ogni dizionario connesso è una directory in cui si trovano i file del dizionario secondo il formato:
nell'opzione modules.dsl.wordToTranslatePath indichi il percorso dell'elenco di parole che desideri tradurre.
- Avvia l'app ANKI in funzione
node data2ankiindex.js - PROFITTO!!!
Utilizzo per la creazione di schede da markdown
Nel file data2anki/config.json:
- nell'opzione mode definisci il valore markdown2anki
- nell'opzione modules.markdown.anki.deckName e modules.dsl.anki.modelName definisci, rispettivamente, e (dovrebbero già essere stati creati prima di creare le schede). Per markdown2anki mode è supportato solo il modello di tipo Basic.
nell'opzione modules.markdown.selectors.startQuestionSelectors e modules.markdown.selectors.startAnswerSelectors indicare i selettori che contrassegnano l'inizio della domanda e della risposta rispettivamente. La stringa con il selettore non sarà analizzata e non entrerà nella scheda; il parser inizierà a lavorare dalla riga successiva.
Ad esempio, questa scheda domanda/risposta:

Si presenterà in markdown nel seguente modo:
#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 functionEsempio tratto da qui:
C'è anche un file con esempi nella cartella del progetto
examples/markdown2anki-example.md- nell'opzione modules.markdown.pathToFile
indicate, il percorso del file dove si trova *.md file con domande/risposte
- Avvia l'app ANKI in funzione
node data2ankiindex.js - PROFITTO!!!
Ecco come appare su un telefono cellulare:

Risultato
Le schede ANKI ottenute dalla versione desktop si sincronizzano senza problemi con il cloud ANKI (gratuito fino a 100 MB), e in seguito puoi usarle ovunque. Ci sono client per Android e iPhone, e puoi anche utilizzarle nel browser. Pertanto, se hai del tempo da spendere, invece di scorrere senza meta su Facebook o su gatti su Instagram, puoi imparare qualcosa di nuovo.
Epilogo
Come ho già menzionato, questo è più un POC funzionale da usare piuttosto che un prodotto finito. Circa il 30% dello standard del parser DSL non è implementato, e quindi, , c'è anche l'idea di riscriverlo in JavaScript, poiché si desidera una «consistenza», e inoltre, attualmente è scritto non in modo molto ottimale. Attualmente, il parser costruisce un albero, e a mio avviso è superfluo e complica il codice. In markdown2anki In modalità immagine non vengono elaborati. Cercherò di andare avanti lentamente, ma poiché sto scrivendo per me stesso, prima risolverò i problemi su cui inciampo. Se qualcuno vuole aiutare, è il benvenuto. Se avete domande sui programmi, sarò felice di aiutare tramite issue aperti nei progetti pertinenti. Per l'altra critica e suggerimenti, scrivete qui. Spero che questo progetto possa essere utile per qualcuno.
P.S. Se notate errori (e purtroppo ci sono), scrivete in privato, correggerò tutto.
Fonte: habr.com

