Zawsze uważałem, że leniwy programista to dobry programista. Dlaczego? Ponieważ jeśli poprosisz pracowitego o zrobienie czegoś, pójdzie i to zrobi. A leniwy programista spędzi 2-3 razy więcej czasu, ale napisze skrypt, który będzie to robił za niego. Może za pierwszym razem zajmie to nieuzasadnioną ilość czasu, ale przy powtarzających się zadaniach takie podejście bardzo szybko się opłaca. Uważam się za leniwego programistę. To była wstępna uwaga, a teraz przejdźmy do rzeczy.
Pierwsza historia
Kilka lat temu pomyślałem, jak mogę poprawić swój angielski. Nic lepszego nie przyszło mi do głowy niż czytanie literatury. Kupiłem czytnik elektroniczny, załadowałem książki i zacząłem czytać. Podczas czytania ciągle natrafiałem na nieznane słowa. Od razu je tłumaczyłem za pomocą wbudowanych w czytnik słowników, ale zauważyłem jedną szczególność: słowa nie chciały się zapamiętywać. Kiedy po kilku stronach znowu spotykałem to słowo, z 90% prawdopodobieństwem potrzebowałem ponownie tłumaczenia, i tak za każdym razem. Nasunął się wniosek, że samo tłumaczenie nieznanych słów podczas czytania to za mało, trzeba zrobić coś więcej. Idealnym rozwiązaniem byłoby wprowadzenie go do użycia i zaczęcie korzystania, ale nie mieszkam w anglojęzycznym kraju i to mało możliwe. Przypomniałem sobie, że kiedyś czytałem o .
Czym to jest i z czym to się je? Mówiąc krótko, jest taka , oto cytat z Wikipedii:
Już w ciągu pierwszej godziny zapomina się do 60% całej przyswojonej informacji, a po 10 godzinach od zapamiętania w pamięci pozostaje 35% przyswojonego materiału. Proces zapominania następnie przebiega wolno, i po 6 dniach w pamięci pozostaje około 20% z ogólnej liczby początkowo zapamiętanych słów, a tyle samo pozostaje w pamięci po miesiącu.
I stąd wniosek
Wnioski, które można uczynić na podstawie tej krzywej, mówią, iż do efektywnego zapamiętywania konieczne jest powtarzanie przyswojonego materiału.
I oto doszliśmy do idei .
To jest całkowicie darmowy program z otwartym źródłem, który realizuje ideę powtórzeń interwałowych. Mówiąc prościej, są to komputerowe fiszki, z pytaniem po jednej stronie, a odpowiedzią po drugiej. Możliwość tworzenia pytań/odpowiedzi za pomocą zwykłych html/css/javascript, co można powiedzieć, że ma naprawdę nieograniczone możliwości. Ponadto, jest rozszerzalny za pomocą specjalnych , a jedna z nich będzie nam w przyszłości bardzo przydatna.
Tworzenie fiszek ręcznie jest czasochłonne, nużące i z dużym prawdopodobieństwem z czasem zrezygnujesz z tego, dlatego w pewnym momencie zadałem sobie pytanie, czy można to zautomatyzować. Odpowiedź brzmi — tak, można. I to zrobiłem. Powiem od razu, to bardziej , ale którym można się posługiwać. Jeśli będzie zainteresowanie ze strony użytkowników i dołączą inni deweloperzy, można to doprowadzić do gotowego produktu, którym będą mogli się posługiwać nawet użytkownicy o niskich umiejętnościach technicznych. Na razie użycie mojego narzędzia wymaga pewnej wiedzy z zakresu programowania.
Czytam książki za pomocą programu . Ma on możliwość podłączania zewnętrznych słowników, a także podczas tłumaczenia słowa zapisuje słowo, dla którego wywołano tłumaczenie, do pliku tekstowego. Zostało tylko jedno, przetłumaczyć te słowa i stworzyć fiszki ANKI.
Na początku próbowałem używać do tłumaczenia , itd. Ale z darmowymi usługami nie poszło. Wykorzystałem darmowy limit jeszcze w trakcie rozwoju, ponadto, zgodnie z warunkami licencji, nie miałem prawa do cache'owania słów. W pewnym momencie zrozumiałem, że muszę tłumaczyć słowa sam. W rezultacie napisano moduł , do którego można podłączać i który potrafi konwertować je do HTML formatu.
Tak wygląda artykuł w słowniku w *.html, moja wersja w porównaniu do wersji

Przed wyszukaniem słowa w podłączonych słownikach sprowadzam je do za pomocą biblioteki . W rzeczywistości to dzięki tej bibliotece zacząłem pisać w Javie, a początkowy plan polegał na tym, aby napisać wszystko w Javie, ale w trakcie znalazłem bibliotekę za pomocą której stosunkowo łatwo można uruchamiać kod Java z nodejs, a część kodu napisana jest w JavaScript. Gdybym znalazł tę bibliotekę wcześniej, nie napisałbym ani jednej linijki w Javie. Kolejnym pobocznym projektem, który powstał w tym procesie, jest stworzenie która została znaleziona w sieci w formacie *.chm, skonwertowana i przekształcona w przyjemniejszą formę. Jeśli autor oryginalnego pliku, użytkownik o nicku yozhic widzi ten artykuł, to serdeczne dzięki za wykonaną pracę, bez jego dokumentacji prawdopodobnie nic by mi się nie udało.
Więc mam słowo w języku angielskim, jego artykuł słownikowy w formacie *.html, pozostaje zintegrować wszystko w całość, stworzyć artykuły ANKI z listy słów i wprowadzić je do bazy danych ANKI. W tym celu powstał następujący projekt . Potrafi przyjąć listę słów, tłumaczyć je, tworzyć artykuły ANKI *.html i zapisywać je w bazie danych ANKI. Na końcu artykułu znajduje się instrukcja, jak z niego korzystać. Tymczasem oto druga historia, w której powtórzenia interwałowe mogą być przydatne.
Druga historia.
Wszyscy ludzie w poszukiwaniu bardziej lub mniej wykwalifikowanej specjalności, w tym programiści, stają przed koniecznością przygotowania się do rozmowy kwalifikacyjnej. Wiele koncepcji, które są pytane podczas wywiadu, nie jest używanych w codziennej praktyce, przez co się zapomina. Przy kolejnym przygotowaniu do rozmowy, przeglądając notatki, książkę, przewodnik, natknąłem się na to, że poświęca się bardzo dużo czasu i uwagi na filtrowanie informacji, które już znasz, ponieważ nie zawsze są one oczywiste, co sprawia, że trzeba się wgłębiać, aby zrozumieć, że są to nieistotne informacje. Kiedy jednak podchodzisz do tematu, który naprawdę musisz powtórzyć, bardzo często okazuje się, że jesteś już zmęczony, a jakość przygotowań cierpi. W pewnym momencie pomyślałem, a czemu by nie wykorzystać kart ANKI do tego? Na przykład, przy sporządzaniu notatek z jakiegoś tematu, od razu tworzyć notatkę w formie pytania-odpowiedzi, a później podczas powtórki od razu wiedzieć, czy znasz odpowiedź na to pytanie.
Problem pojawił się tylko w tym, że wpisywanie pytań zajmuje bardzo dużo czasu i jest nużące. Aby ułatwić proces, do projektu dodałem funkcjonalność do konwertowania Tekst na kartach ANKI. Wszystko, co musisz zrobić, to napisać jeden duży plik, w którym pytania i odpowiedzi będą oznaczone wcześniej ustaloną sekwencją symboli, według której parser zrozumie, gdzie jest pytanie, a gdzie odpowiedź.
Po utworzeniu tego pliku uruchamiasz data2anki, a on tworzy karty ANKI. Oryginalny plik można łatwo edytować i udostępniać, wystarczy usunąć odpowiednią kartę(y) i ponownie uruchomić program, a nowa wersja zostanie stworzona.
Instalacja i użytkowanie
Instalacja ANKI + AnkiConnect
- Pobierasz ANKI stąd:
- Instalujesz wtyczkę AnkiConnect:
Instalacja
- Pobierasz z repozytorium github
git clone https://github.com/anatoly314/data2anki - Instalujesz zależności
cd data2anki && npm install - Pobierasz zależności Java
- Wypakowujesz jar-dependencies.zip i umieszczasz jego zawartość w data2anki/java/jars
- Pobierasz z repozytorium github
Używanie do tłumaczenia słów:
W pliku data2anki/config.json:
w kluczu tryb wpisujesz wartość dsl2anki
w kluczu modules.dsl.anki.deckName i modules.dsl.anki.modelName wpisujesz, odpowiednio, i (powinny być już utworzone przed stworzeniem kart). Obecnie wspierany jest tylko model typu Podstawowy:
Ma pola Front i Back i tworzy jedną kartę. Tekst, który wprowadzasz w Front, pojawi się z przodu karty, a tekst, który wprowadzasz w Back, pojawi się z tyłu karty.
gdzie oryginalne słowo znajduje się w Pola Front, a tłumaczenie będzie w Pola Back.
Nie ma problemu z dodaniem wsparcia dla Podstawowy (i odwrócona karta), gdzie do słowa i tłumaczenia będzie tworzona również odwrócona karta, na której według tłumaczenia należy przypomnieć sobie oryginalne słowo. Wymagana jest tylko chęć i czas.
w kluczu modules.dsl.dictionariesPath wpisujesz tablicę z połączonymi *.dsl słownikami. Każdy podłączony słownik to katalog, w którym znajdują się pliki słownika zgodnie z formatem:
w kluczu modules.dsl.wordToTranslatePath wpisujesz ścieżkę do listy słów, które chcesz przetłumaczyć.
- Uruchamiasz przy działającej aplikacji ANKI
node data2ankiindex.js - ZYSK!!!
Używanie do tworzenia kart z markdown
W pliku data2anki/config.json:
- w kluczu tryb wpisujesz wartość markdown2anki
- w kluczu modules.markdown.anki.deckName i modules.dsl.anki.modelName wpisujesz, odpowiednio, i (powinny być już utworzone przed stworzeniem kart). Dla markdown2anki trybu wspierany jest tylko model typu Podstawowy.
w kluczu modules.markdown.selectors.startQuestionSelectors i modules.markdown.selectors.startAnswerSelectors wpisujesz selektory, którymi oznaczasz początek pytania i odpowiedzi odpowiednio. Sam ciąg z selektorem nie zostanie sparsowany i nie trafi na kartę, parser zacznie pracę od następnego wiersza.
Na przykład ta karta pytanie/odpowiedź:

Będzie wyglądała w markdown następująco:
#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 functionPrzykład wzięty stąd:
W projekcie znajduje się również plik z przykładami
examples/markdown2anki-example.md- w kluczu modules.markdown.pathToFile
proszę wpisać ścieżkę do pliku, w którym znajduje się *.md plik z pytaniami/odpowiedziami
- Uruchamiasz przy działającej aplikacji ANKI
node data2ankiindex.js - ZYSK!!!
Oto jak to wygląda na telefonie komórkowym:

Wynik
Karty ANKI uzyskane w wersji desktopowej synchronizują się bez problemu z chmurą ANKI (darmowo do 100MB), a dalej możesz korzystać z nich wszędzie. Istnieją aplikacje na Androida i iPhone'a, można też używać ich w przeglądarce. W rezultacie, jeśli masz czas, którego nie masz co wydawać, zamiast bez celu przeglądać Facebooka lub koty na Instagramie, możesz uczyć się czegoś nowego.
Epilog
Jak już wspomniałem, to raczej roboczy POC, z którego można korzystać, niż gotowy produkt. Jakoś 30% standardu parsera DSL nie zostało zaimplementowane i dlatego, , jest także pomysł, aby przepisać go na JavaScript, ponieważ zależy mi na "spójności", a poza tym, jest teraz napisany dość nieoptymalnie. Obecnie parser buduje drzewo, co moim zdaniem jest zbędne i komplikuje kod. W markdown2anki trybie obrazków nie są one parsowane. Postaram się powoli nad tym pracować, ale ponieważ piszę to na własne potrzeby, to w pierwszej kolejności zajmę się problemami, na które sam natrafię, a jeśli ktoś chciałby pomóc, to serdecznie zapraszam. Jeśli masz pytania dotyczące programu, chętnie pomogę poprzez otwarte zgłoszenia w odpowiednich projektach. Pozostałą krytykę i propozycje pisz tutaj. Mam nadzieję, że ten projekt będzie komuś pomocny.
P.S. Jeśli zauważyłeś błędy (a niestety są), pisz do mnie prywatnie, wszystko poprawię.
Źródło: habr.com

