Две истории как ANKI може да ви помогне да научите чужд език и да се подготвите за интервю

Винаги съм смятал, че мързеливият програмист е добър програмист. Защо? Защото ако помолите усърдния да направи нещо, той ще отиде и ще го направи. А мързеливият програмист ще прекара 2-3 пъти повече време, но ще напише скрипт, който ще го прави вместо него. Може би първият път ще бъде похарчено неоправдано много време, но при положение на повтарящи се задачи, този подход бързо се изплаща. Смятам себе си за мързелив програмист. Това беше преамбула, а сега да преминем към същината.

История първа

Преди няколко години се замислих как да подобря английския си. Нищо по-добро от четенето на литература не ми дойде наум. Купих електронен ридер, качих книги и започнах да чета. По време на четенето постоянно се срещаха непознати думи. Веднага ги превеждах с вградените в читалката речници, но забелязах една особеност: думите не искаха да се запомнят. Когато след няколко страници отново срещах тази дума, с 90% вероятност отново се нуждаех от превод, и така всеки път. Напрашиваше се извода, че малко е просто да се превеждат непознатите думи по време на четене, нужно е да се прави нещо още. Идеалният вариант би бил да се въведе в употреба и да започна да я използвам, но не живея в англоговоряща страна и това е малко вероятно. Тогава си спомних, че някога съм чел за Интервални повторения.

Какво е това и с какво се яде? Ако да кажем накратко, съществува такава крива на забравяне, по-нататък цитат от Уикипедия:

Вече през първия час се забравя до 60% от цялата получена информация; 10 часа след запаметяване в паметта остава 35% от изученото. След това процесът на забравяне протича бавно, и след 6 дни в паметта остава около 20% от общия брой първоначално усвоени слогове, същото остава в паметта и след месец.

И изводът оттук

Изводите, които могат да се направят на основата на тази крива, са, че за ефективно запомняне е необходимо повторение на запомнения материал.

Така стигнахме до идеята за интервално повторение.

АNKI Това е абсолютно безплатна програма с отворен код, която реализира идеята за интервално повторение. Накратко, компютъризирани флаш карти, от една страна е въпрос, от другата отговор. Тъй като можете да създавате въпроси/отговори с помощта на обикновен html/css/javascript, може да се каже, че тя притежава наистина неограничени възможности. Освен това, тя е разширяема със специални плагини, и един от тях ще бъде много полезен за нас по-късно.

Създаването на карти на ръка е дълго, скучно и с голяма вероятност след известно време ще се откажете от това, затова в един момент си зададох въпроса, дали това може да се автоматизира. Отговорът е - да, може. И аз го направих. Да кажа направо, това е повече POC (доказателство за концепция), но с който може да се работи. Ако има интерес от страна на потребителите и се присъединят други разработчици, можем да го доведем до завършен продукт, с който дори технически неграмотни потребители могат да ползват. В момента, употребата на моята утилита предполага известни познания в програмирането.

Чета книги с помощта на програмата AIReader. Тя има възможност за свързване на външни речници, а също така при превод на дума, тя запазва думата, за която извиквате превода, в текстов файл. Остава само да преведа тези думи и да създам ANKI карти.

Първоначално се опитвах да използвам за превод Google Translate, Lingvo API и т.н. Но с безплатните услуги нещата не потръгнаха. Изчерпах безплатния лимит още по време на разработката, освен това, по условията на лиценза, нямах право да кеширам думи. В един момент осъзнах, че трябва да превеждам думите сам. В крайна сметка написах модул dsl2html , към който могат да се свързват DSL речници и който може да ги конвертира в HTML формат.

Ето как изглежда речниковата статия в *.html, моята версия в сравнение с версията GoldenDict

Две истории как ANKI може да ви помогне да научите чужд език и да се подготвите за интервю

Преди да търся дума в свързаните речници, я преобразувам в речникова форма (лема) с помощта на библиотеката Stanford CoreNLP. Всъщност, заради тази библиотека започнах да пиша на Java и първоначалният план беше да напиша всичко на Java, но в процеса намерих библиотеката node-java с помощта на която може относително лесно да се изпълнява Java код от nodejs и част от кода е написана на JavaScript. Ако бях намерил тази библиотека по-рано, на Java нямаше да бъде написано нищо. Още един страничен проект, който се роди в процеса, е създаването на репозитория с DSL документация която беше намерена в мрежата във формат *.chm, конвертирана и приведена в човешки вид. Ако авторът на оригиналния файл, потребител с ник yozhic вижда тази статия, то голямо благодаря за свършената работа, без неговата документация вероятно нямаше да успея.

И така, имам дума на английски, нейния речников запис във формат *.html, остава само да свържа всичко в едно, да създам ANKI статии от списък с думи и да ги внеса в базата данни ANKI. За тази цел беше създаден следният проект data2anki. Той може да приема списък с думи, да ги превежда, да създава ANKI *.html статии и да ги запазва в базата данни ANKI. В края на статията има инструкция как да се ползва. За сега обаче, история втора, където интервалните повторения могат да бъдат полезни.

История втора.

Всеки, който търси по-/по-малко квалифицирана специалност, включително и програмисти, се сблъсква с необходимостта да се подготви за интервю. Много концепти, които питат на интервю, не се използват в ежедневната практика и забравят. При поредната подготовка за интервю, преглеждайки бележки, книга или справочник, се сблъсках с факта, че отделя много време и внимание, за да отсея информацията, която вече знам, защото не винаги е очевидна и трябва да се вглеждам, за да разбера, че е нерелевантна. Когато обаче стигнете до тема, която наистина трябва да повторите, много често се оказва, че вече сте уморени и качеството на подготовката страда. В определен момент си помислих, защо да не използвам ANKI карти и за това? Например, при записване на някаква тема, веднага да създам бележка под формата на въпрос-отговор, а след това при повторение веднага да знаете, дали познавате или не отговора на този въпрос.

Проблемата възникна само в това, че въвеждането на въпросите е много бавно и мъчително. За да облекча процеса, в data2anki проекта добавих функционалността да конвертирам markdown текст в ANKI картите. Всичко, от което се нуждаете, е да напишете един голям файл, в който въпросите и отговорите ще бъдат обозначени с предварително уговорена последователност от символи, по която парсерът ще разбере къде е въпросът и къде е отговорът.

След като файлът бъде създаден, стартирате data2anki и той създава ANKI карти. Оригиналният файл е лесен за редактиране и споделяне, трябва само да изтриете съответната карта(и) и отново да стартирате програмата, и нов вариант ще бъде създаден.

Инсталация и употреба

  1. Инсталация на ANKI + AnkiConnect

    1. Сваляте ANKI оттук: https://apps.ankiweb.net/
    2. Инсталирате AnkiConnect плъгин: https://ankiweb.net/shared/info/2055492159

  2. Инсталиране на data2anki

    1. Сваляте data2anki от репозитория на github
      git clone https://github.com/anatoly314/data2anki
    2. Инсталирате зависимостите
      cd data2anki && npm install
    3. Сваляте java зависимостите https://github.com/anatoly314/data2anki/releases/download/0.1.0/jar-dependencies.zip
    4. Разархивирате jar-dependencies.zip и поставяте съдържанието му в data2anki/java/jars

  3. Използване за превод на думи:

    1. В файла data2anki/config.json:

      • в ключа mode вписвате стойността dsl2anki

      • в ключа modules.dsl.anki.deckName и modules.dsl.anki.modelName вписвате съответно, Deck Name и Model Name (трябва да бъдат създадени преди създаването на картите). В момента се поддържа само модел от тип Basic:

        Има предна и задна част, и ще създава една карта. Текстът, който въведете в предната част, ще се появи на лицето на картата, а текстът, който въведете в задната част, ще се появи на гърба на картата.

        където оригиналната дума е Front field, а преводът ще бъде в Back field.

        Няма проблем да добавите поддръжка Basic (и обратна карта), където за думата и превода ще се създаде и обратна карта, където по превода трябва да си спомните оригиналната дума. Нужно е само наличие на време и желание.

      • в ключа modules.dsl.dictionariesPath вписвате масив с включените *.dsl речници. Всеки включен речник е директория, в която се намират файловете на речника съгласно формата: Структура на речника DSL

      • в ключа modules.dsl.wordToTranslatePath вписвате пътя до списъка с думи, които искате да преведете.

    2. Стартирате при работещо ANKI приложение
      node data2ankiindex.js
    3. ПЕЧАЛБА!!!

  4. Използване за създаване на карти от markdown

    1. В файла data2anki/config.json:

      • в ключа mode вписвате стойността markdown2anki
      • в ключа modules.markdown.anki.deckName и modules.dsl.anki.modelName вписвате съответно, Deck Name и Model Name (трябва да бъдат създадени преди създаването на картите). За markdown2anki mode се поддържа само модел от тип Basic.
      • в ключа modules.markdown.selectors.startQuestionSelectors и modules.markdown.selectors.startAnswerSelectors вписвате селекторите, с които обозначавате началото на въпроса и отговора съответно. Самият ред със селектора няма да бъде парсиран и в картата няма да попадне, парсерът ще започне работа от следващия ред.

        Например, следната карта въпрос/отговор:

        Две истории как ANKI може да ви помогне да научите чужд език и да се подготвите за интервю

        Ще изглежда в markdown по следния начин:
        #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 function
        

        Примерът е взет оттук: 123-JavaScript-Interview-Questions

        Все още има файл с примери в папката на проекта examples/markdown2anki-example.md

      • в ключа modules.markdown.pathToFile
        уписвате, пътя към файла, където се намира *.md файл с въпроси/отговори

    2. Стартирате при работещо ANKI приложение
      node data2ankiindex.js
    3. ПЕЧАЛБА!!!

Ето как изглежда на мобилен телефон:

Пуснете видеото

Резултат

Получените на desktop версия на ANKI карти без проблеми се синхронизират с ANKI облака (безплатно до 100mb), а след това можете да ги използвате навсякъде. Има клиенти за Android и iPhone, също така можете да го ползвате и в браузър. В резултат, ако имате време, което не знаете как да оползотворите, то вместо да прелиствате безцелно Facebook или да гледате котки в Instagram, можете да научите нещо ново.

Епилог

Както вече споменах, това по-скоро е работещ POC, който може да се използва, отколкото завършен продукт. Някакви 30% от стандарта на DSL парсера не са имплементирани и затова, например не всички лексикални статии, които са налични в речниците, могат да бъдат намерени, също така имам идея да го пренапиша на JavaScript, тъй като ми се иска "консистентност", а освен това, сега е написан не особено оптимално. В момента парсерът строи дърво, а това според мен е излишно и усложнява кода. В markdown2anki режим картинките не се парсват. Ще се опитам да го подобрявам постепенно, но тъй като в момента пиша за себе си, първо ще решавам тези проблеми, на които сам ще попадам, но ако някой иска да помогне, е добре дошъл. Ако имате въпроси относно програмата, ще се радвам да помогна чрез откритите issues в съответните проекти. Останалата критика и предложения пишете тук. Надявам се, този проект да бъде полезен за някого.

P.S. Ако забележите грешки (а те, за съжаление, са), пишете ми на лични, всичко ще поправя.

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster