תמיד האמנתי שמתכנת עצלן הוא מתכנת טוב. למה? כי תבקש מעובד קשה לעשות משהו, הוא ילך ויעשה את זה. ומתכנת עצלן יבלה פי 2-3 יותר זמן, אבל יכתוב תסריט שיעשה את זה בשבילו. זה עשוי לקחת זמן לא סביר לעשות זאת בפעם הראשונה, אבל עם משימות חוזרות ונשנות הגישה הזו תשתלם מהר מאוד. אני מחשיב את עצמי כמתכנת עצלן. זו הייתה ההקדמה, עכשיו בואו ניגש לעניינים.
סיפור ראשון
לפני כמה שנים תהיתי איך אני יכול לשפר את האנגלית שלי. שום דבר לא עלה בדעתי יותר מקריאת ספרות. רכשתי קורא אלקטרוני, הורדתי ספרים והתחלתי לקרוא. במהלך הקריאה נתקלתי כל הזמן במילים לא מוכרות. מיד תרגמתי אותם באמצעות המילונים המובנים בקורא, אבל שמתי לב לתכונה אחת: המילים לא רצו להיזכר. כשנתקלתי במילה הזו שוב כמה עמודים מאוחר יותר, בסבירות של 90% שוב נזקקתי לתרגום, וזה קרה בכל פעם. המסקנה הייתה שלא מספיק פשוט לתרגם מילים לא מוכרות בזמן הקריאה, צריך לעשות משהו אחר. האפשרות האידיאלית תהיה להכניס אותו לחיי היומיום ולהתחיל להשתמש בו, אבל אני לא גר במדינה דוברת אנגלית וזה לא סביר. ואז נזכרתי שקראתי פעם על .
מה זה ועם מה אוכלים אותו? בקיצור, יש את זה , ציטוט נוסף מויקיפדיה:
כבר בשעה הראשונה, עד 60% מכל המידע המתקבל נשכח, 10 שעות לאחר השינון, 35% ממה שנלמד נשאר בזיכרון. ואז תהליך השכחה ממשיך לאט, ולאחר 6 ימים נשאר בזיכרון כ-20% מסך ההברות שנלמדו בתחילה, ואותו כמות נשארת בזיכרון לאחר חודש.
והמסקנה מכאן
המסקנות שניתן להסיק על סמך עקומה זו הן שלצורך שינון יעיל יש צורך לחזור על החומר המשונן.
אז הגענו לרעיון .
היא תוכנת קוד פתוח וחינמית לחלוטין המיישמת את הרעיון של חזרה מרווחת. במילים פשוטות, לכרטיסי פלאש ממוחשבים יש שאלה בצד אחד ותשובה בצד השני. מכיוון שאתה יכול לעשות שאלות/תשובות באמצעות רגיל html/css/javascript, אז אנחנו יכולים לומר שיש לו באמת אפשרויות בלתי מוגבלות. בנוסף, זה ניתן להרחבה עם מיוחד , ואחד מהם יהיה שימושי מאוד עבורנו בעתיד.
יצירה ידנית של קלפים היא ארוכה, מייגעת, ועם סבירות גבוהה, לאחר זמן מה תשכחו מהמשימה הזו, ולכן בשלב מסוים שאלתי את עצמי את השאלה, האם ניתן לבצע אוטומציה של המשימה הזו. התשובה היא כן, אתה יכול. ואני עשיתי את זה. אני אגיד מיד, זה יותר , אך ניתן להשתמש בהם. אם יש עניין של משתמשים ומפתחים אחרים מעורבים, אז אפשר להביא אותו למוצר מוגמר שאפילו משתמשים שאינם יודעים קרוא וכתוב מבחינה טכנית יכולים להשתמש בו. כעת, השימוש בכלי השירות שלי דורש ידע מסוים בתכנות.
קראתי ספרים באמצעות התוכנה . יש לו יכולת לחבר מילונים חיצוניים, וכאשר אתה מתרגם מילה, הוא שומר את המילה שקראת לתרגום לקובץ טקסט. כל מה שנותר הוא לתרגם את המילים הללו וליצור כרטיסי ANKI.
בהתחלה ניסיתי להשתמש לתרגום , וכו ' אבל דברים לא הסתדרו עם שירותים בחינם. מיציתי את מגבלת החופש במהלך תהליך הפיתוח, בנוסף, על פי תנאי הרישיון, לא הייתה לי הזכות לאחסן מילים במטמון. בשלב מסוים הבנתי שאני צריך לתרגם את המילים בעצמי. כתוצאה מכך, נכתב מודול שאליו אתה יכול להתחבר ומי יודע להמיר אותם HTML פוּרמָט.
כך נראה ערך במילון ב-*Html., האופציה שלי לעומת האופציה

לפני שאני מחפש מילה במילונים מחוברים, אני מביא אותה באמצעות הספרייה . למעשה, בגלל הספרייה הזו, התחלתי לכתוב בג'אווה והתכנון המקורי היה לכתוב הכל בג'אווה, אבל תוך כדי כך מצאתי את הספרייה בעזרתו ניתן לבצע בקלות יחסית קוד Java מ-nodejs וחלק מהקוד כתוב ב-JavaScript. אם הייתי מוצא את הספרייה הזו קודם לכן, אף שורה אחת לא הייתה נכתבת בג'אווה. פרויקט צדדי נוסף שנולד בתהליך הוא היצירה אשר נמצא ברשת בפורמט *.chm, הומר והובא לצורה אלוהית. אם המחבר של הקובץ המקורי הוא משתמש לפי כינוי יוז'יק כשהוא רואה את המאמר הזה, אני מודה לו מאוד על העבודה שהוא עשה, ללא התיעוד שלו, סביר להניח שלא הייתי מצליח.
אז, יש לי מילה באנגלית, הערך שלה במילון בפורמט *Html., כל שנותר הוא לחבר הכל ביחד, ליצור מאמרי ANKI מרשימת המילים ולהכניס אותם למאגר המידע של ANKI. לשם כך נוצר הפרויקט הבא . זה יכול לקחת רשימה של מילים כקלט, לתרגם, ליצור ANKI *Html. מאמרים ולתעד אותם במאגר המידע של ANKI. בסוף המאמר יש הוראות כיצד להשתמש בו. בינתיים, הסיפור השני הוא המקום שבו חזרות מרווחות יכולות להיות שימושיות.
הסיפור השני.
כל האנשים שמחפשים התמחות מוסמכת יותר/פחות, כולל מתכנתים, מתמודדים עם הצורך להתכונן לראיון. רבים מהמושגים שנשאלים בראיונות אינך משתמש בתרגול היומיומי והם נשכחים. בהכנות לראיון, דפדוף בפתקים, ספר, ספר עיון, נתקלתי בעובדה שלוקח הרבה זמן ותשומת לב לנפות מידע שאתה כבר יודע כי זה לא תמיד ברור וצריך קרא אותו בעיון כדי להבין מה זה. לא רלוונטי. כשמגיעים לנושא שבאמת צריך לחזור עליו, קורה לא פעם שכבר עייפים ואיכות ההכנה נפגעת. בשלב מסוים חשבתי, למה לא להשתמש גם בכרטיסי ANKI בשביל זה? לדוגמה, כאשר רושמים הערות על נושא, צור מיד הערה בצורת שאלה ותשובה, ולאחר מכן כשתחזור עליה, תדע מיד אם אתה יודע את התשובה לשאלה זו או לא.
הבעיה היחידה שהתעוררה הייתה שהקלדת שאלות הייתה מאוד ארוכה ומייגעת. כדי להקל על התהליך, פרויקט הוספתי פונקציונליות המרה טקסט בכרטיסי ANKI. כל מה שצריך זה לכתוב קובץ אחד גדול שבו שאלות ותשובות יסומנו ברצף קבוע מראש של תווים, שבאמצעותו המנתח יבין היכן השאלה ואיפה התשובה.
ברגע שקובץ זה נוצר, אתה מפעיל את data2anki והוא יוצר כרטיסי ANKI. קל לערוך ולשתף את הקובץ המקורי, אתה רק צריך למחוק את הכרטיס(ים) המתאימים ולהפעיל את התוכנית שוב, ותיווצר גרסה חדשה.
התקנה ושימוש
התקנת ANKI + AnkiConnect
- הורד את ANKI מכאן:
- התקן את התוסף AnkiConnect:
התקנה
- הורד ממאגר github
git clone https://github.com/anatoly314/data2anki - התקנת תלות
cd data2anki && npm install - הורד תלויות ב-Java
- מפרקים jar-dependencies.zip ולהכניס את תוכנו data2anki/java/jars
- הורד ממאגר github
השתמש לתרגום מילים:
בקובץ data2anki/config.json:
במפתח מצב הזן את הערך dsl2anki
במפתח modules.dsl.anki.deckName и modules.dsl.anki.modelName לכתוב בהתאם и (יש ליצור כבר לפני יצירת כרטיסים). כרגע רק סוג הדגם נתמך בסיסי:
יש שדות קדמיים ואחוריים, וייצור כרטיס אחד. טקסט שתזין מקדימה יופיע בחזית הכרטיס, וטקסט שתזין בגב יופיע בגב הכרטיס.
איפה המילה המקורית שדה קדמי, והתרגום יהיה ב שדה אחורי.
אין בעיה להוסיף תמיכה כרטיס בסיסי (והפוך), שבו ייווצר קלף הפוך למילה ולתרגום, כאשר על סמך התרגום תצטרך לזכור את המילה המקורית. כל מה שאתה צריך זה זמן ורצון.
במפתח modules.dsl.dictionariesPath לרשום מערך עם מחובר *.dsl מילונים. כל מילון מחובר הוא ספרייה שבה ממוקמים קבצי המילון בהתאם לפורמט:
במפתח modules.dsl.wordToTranslatePath הזן את הנתיב לרשימת המילים שברצונך לתרגם.
- הפעל כאשר אפליקציית ANKI פועלת
node data2ankiindex.js - רווח!
משמש ליצירת כרטיסים מ-markdown
בקובץ data2anki/config.json:
- במפתח מצב הזן את הערך markdown2anki
- במפתח modules.markdown.anki.deckName и modules.dsl.anki.modelName לכתוב בהתאם и (יש ליצור כבר לפני יצירת כרטיסים). ל markdown2anki מצב רק סוג הדגם נתמך בסיסי.
במפתח modules.markdown.selectors.startQuestionSelectors и modules.markdown.selectors.startAnswerSelectors אתה כותב סלקטורים איתם אתה מסמן את תחילת השאלה והתשובה, בהתאמה. השורה עם הבורר עצמו לא תנתח ולא תגיע לכרטיס; המנתח יתחיל לעבוד מהשורה הבאה.
לדוגמה, כרטיס שאלה/תשובה זה:

זה ייראה כך ב-markdown:
#QUESTION# ## שאלה 5. כתוב פונקציית mul שתעבוד כראוי כשהיא מופעלת עם התחביר הבא. ```javascript console.log(mul(2)(3)(4)); // פלט : 24 console.log(mul(4)(3)(4)); // פלט : 48 ``` #ANSWER# להלן הקוד ואחריו הסבר כיצד זה עובד: ``` javascript function mul (x) { return function (y) { // anonymous function return function (z) { // פונקציה אנונימית מחזירה x * y * z; }; }; } ``` כאן הפונקציה `mul` מקבלת את הארגומנט הראשון ומחזירה את הפונקציה האנונימית שלוקחת את הפרמטר השני ומחזירה את הפונקציה האנונימית שלוקחת את הפרמטר השלישי ומחזירה את הכפל של הארגומנטים שמועברים ברצף בפונקציה Javascript מוגדרת ל- inside יש גישה למשתנה הפונקציה החיצונית והפונקציה היא אובייקט המחלקה הראשונה כך שניתן להחזיר אותו גם על ידי הפונקציה ולהעביר אותו כארגומנט בפונקציה אחרת. - פונקציה היא מופע מסוג Object - פונקציה יכולה להיות בעלת מאפיינים ויש לה קישור חזרה לשיטת הבנאי שלה - פונקציה יכולה להיות מאוחסנת כמשתנה - פונקציה יכולה לעבור כפרמטר לפונקציה אחרת - פונקציה יכולה להיות חזר מפונקציה אחרתדוגמה שנלקחה מכאן:
יש גם קובץ עם דוגמאות בתיקיית הפרויקט
examples/markdown2anki-example.md- במפתח modules.markdown.pathToFile
רשום את הנתיב לקובץ שבו *.md קובץ שאלות/תשובות
- הפעל כאשר אפליקציית ANKI פועלת
node data2ankiindex.js - רווח!
כך זה נראה בטלפון נייד:

תוצאה
Полученные на desktop версии ANKI карточки без проблем синхронизируются с ANKI облаком (бесплатно до 100mb), а дальше вы можете пользоваться ими уже везде. Есть клиенты под Android и iPhone, также можно пользоваться и в браузере. В результате, если у вас есть время, которое не на что потратить, то вместо того, чтобы бесцельно пролистывать фейсбук или котиков в инстаграм, можно учить что-то новое.
אפילוג
כפי שציינתי, זה יותר POC עובד שאתה יכול להשתמש בו מאשר מוצר מוגמר. כ-30% מתקן מנתח DSL אינו מיושם, ולכן, , יש גם רעיון לכתוב אותו מחדש JavaScript, כי אני רוצה "עקביות", וחוץ מזה, עכשיו זה לא כתוב בצורה הכי אופטימלית. עכשיו הפרסר בונה עץ, אבל לדעתי זה מיותר ולא צריך לסבך את הקוד. IN markdown2anki במצב, התמונות אינן מנותחות. אנסה לחתוך לאט לאט, אבל מכיוון שאני כותב לעצמי, אני קודם כל אפתור את הבעיות שאני בעצמי אדרוך עליהן, אבל אם מישהו רוצה לעזור, אז אתה מוזמן. אם יש לכם שאלות לגבי התכנית, אשמח לעזור בבעיות פתוחות בפרויקטים הרלוונטיים. כתוב כאן ביקורת והצעות אחרות. אני מקווה שהפרויקט הזה יהיה שימושי למישהו.
נ.ב. אם אתה מבחין בשגיאות כלשהן (ולצערי, יש כאלה), כתוב לי בהודעה אישית, אני אתקן הכל.
מקור: www.habr.com

