اعتقدت دائما أن مبرمج كسول هو مبرمج جيد. لماذا؟ لأن اطلب من المجتهد القيام بشيء ما ، فسوف يذهب ويفعل ذلك. سيقضي مبرمج كسول وقتًا إضافيًا 2-3 مرات ، لكن يكتب نصًا سينفذ ذلك من أجله. ربما لأول مرة سيتم إنفاقه بشكل غير معقول الكثير من الوقت ، ولكن مع مراعاة المهام المتكررة ، فإن هذا النهج يؤتي ثماره بسرعة كبيرة. أنا أعتبر نفسي مبرمج كسول. كانت ديباجة ، والآن دعنا نبدأ العمل.
القصة الأولى
قبل بضع سنوات تساءلت كيف يمكنني تحسين لغتي الإنجليزية. لا شيء أفضل من قراءة الأدب جاء إلى الذهن. تم شراء قارئ إلكتروني ، وتم تنزيل الكتب ، وبدأت القراءة. في عملية قراءة الكلمات غير المألوفة جاء باستمرار عبر. قمت بترجمتها على الفور باستخدام القواميس المدمجة ، لكنني لاحظت ميزة واحدة: الكلمات لا تريد أن تتذكرها. عندما صادفت هذه الكلمة مرة أخرى بعد بضع صفحات ، ثم مع احتمال 90 ٪ كنت بحاجة مرة أخرى إلى ترجمة ، وذلك في كل مرة. الاستنتاج هو أنه لم يكن مجرد ترجمة كلمات غير مألوفة في عملية القراءة ، بل عليك القيام بشيء آخر. سيكون الخيار المثالي هو إدخاله في الحياة اليومية والبدء في استخدامه ، لكنني لا أعيش في بلد ناطق باللغة الإنجليزية وهذا غير ممكن. ثم تذكرت أنني قد قرأت مرة واحدة عن التكرار الفاصل .
ما هو وماذا يأكل مع؟ باختصار ، هناك منحنى النسيان ، ثم اقتباس من ويكيبيديا:
بالفعل خلال الساعة الأولى ، يتم نسيان ما يصل إلى 60٪ من جميع المعلومات المستلمة ، بعد 10 ساعات من الحفظ ، 35٪ من المعلومات التي تمت دراستها تبقى في الذاكرة. علاوة على ذلك ، فإن عملية النسيان بطيئة ، وبعد 6 أيام ، لا يزال حوالي 20٪ من إجمالي عدد المقاطع التي تم تعلمها أصلاً في الذاكرة ، ويظل نفس المبلغ في الذاكرة بعد شهر.
والنتيجة هي من هنا
الاستنتاجات التي يمكن استخلاصها على أساس هذا المنحنى هي أنه من أجل الحفظ الفعال ، من الضروري تكرار المواد المستفادة.
لذلك توصلنا إلى فكرة التكرار الفاصل .
ANKI هو برنامج مجاني مفتوح المصدر مطبق ينفذ فكرة التكرار الفاصل. ببساطة ، بطاقات الفلاش المحوسبة هي على جانب واحد سؤال ، من ناحية أخرى هي الإجابة. نظرًا لأنه يمكنك إجراء أسئلة / إجابات باستخدام html / css / javascript المعتاد ، يمكنك القول أن لديها إمكانيات غير محدودة حقًا. بالإضافة إلى ذلك ، يمكن توسيعه باستخدام مكونات إضافية خاصة ، وسيكون أحدها مفيدًا جدًا لنا في المستقبل.
إن إنشاء البطاقات يدويًا هو مهمة طويلة ومملة ، ومن المحتمل جدًا أنه بعد فترة من الوقت ستهزم هذا العمل وبالتالي سألت نفسي في مرحلة ما ما إذا كان يمكن أتمتة هذا العمل. الجواب نعم ، يمكنك ذلك. وفعلت ذلك. سأقول على الفور أن هذا هو أكثر POC (إثبات الفكرة) ، ولكن التي يمكن استخدامها. إذا كان هناك اهتمام من جانب المستخدمين والمطورين الآخرين باللحاق بالركب ، فيمكن توصيله إلى منتج نهائي يمكن للمستخدمين الأميين تقنياً استخدامه. الآن ، استخدام أداة بلدي ينطوي على بعض المعرفة البرمجة.
قرأت الكتب باستخدام AIReader . لديها القدرة على توصيل القواميس الخارجية ، وعند ترجمة الكلمة ، فإنها تحفظ الكلمة التي تسمى الترجمة في ملف نصي. الشيء الوحيد المتبقي هو ترجمة هذه الكلمات وإنشاء بطاقات ANKI.
في البداية حاولت استخدام الترجمة من Google و Lingvo API وما إلى ذلك للترجمة. لكنها لم تعمل مع الخدمات المجانية. لقد استنفدت الحد المجاني أثناء عملية التطوير ، بالإضافة إلى ذلك ، وبموجب شروط الترخيص ، لم يكن لي الحق في تخزين الكلمات مؤقتًا. في مرحلة ما ، أدركت أنني بحاجة إلى ترجمة الكلمات بنفسي. نتيجة لذلك ، تمت كتابة الوحدة النمطية dsl2html والتي يمكن من خلالها ربط قواميس DSL والتي يمكن تحويلها إلى تنسيق HTML .
هذه هي الطريقة التي يبدو بها إدخال القاموس في * .html ، إصداري بالمقارنة مع متغير GoldenDict

قبل البحث عن كلمة في القواميس المتصلة ، أحملها إلى نموذج قاموس ( lemma ) باستخدام مكتبة Stanford CoreNLP . في الواقع ، بسبب هذه المكتبة ، بدأت في الكتابة بلغة Java وكانت الخطة الأولية هي كتابة كل شيء في Java ، ولكن في هذه العملية وجدت مكتبة nava -java التي يمكنك من خلالها بسهولة تنفيذ تعليمات Java البرمجية من nodejs وجزء من التعليمات البرمجية مكتوب في JavaScript. إذا وجدت هذه المكتبة من قبل ، فلن يكون هناك سطر واحد مكتوب بلغة جافا. مشروع جانبي آخر تم إنشاؤه في هذه العملية هو إنشاء مستودع به مستندات DSL تم العثور عليه على الشبكة بتنسيق * .chm وتم تحويله وإحضاره إلى شكل إلهي. إذا كان مؤلف الملف الأصلي ، المستخدم الذي يحمل الاسم المستعار yozhic ، يرى هذه المقالة ، فأشكره جزيل الشكر على العمل المنجز ، وبدون توثيقه كنت سأفشل على الأرجح.
لذلك ، لدي كلمة باللغة الإنجليزية ، وإدخال القاموس في تنسيق * .html ، يبقى تجميع كل شيء معًا ، وإنشاء مقالات ANKI من قائمة الكلمات وإضافتها إلى قاعدة بيانات ANKI. تم إنشاء مشروع data2anki التالي لهذا الغرض. إنه يعرف كيفية أخذ قائمة بالكلمات وترجمة وإنشاء مقالات ANKI * .html وكتابتها في قاعدة بيانات ANKI. في نهاية المقال ، هناك تعليمات حول كيفية استخدامه. في غضون ذلك ، القصة الثانية حيث التكرار الفاصل يمكن أن يكون مفيدا.
القصة الثانية.
يواجه جميع الأشخاص الذين يبحثون عن مهنة مؤهلة أكثر / أقل ، بما في ذلك المبرمجون ، الحاجة إلى التحضير للمقابلة. لا تستخدم العديد من المفاهيم التي يتم طرحها في مقابلة في الممارسة اليومية ويتم نسيانها. في التحضير التالي للمقابلة ، بالتمرير خلال الخلاصة ، الكتاب ، المرجع ، صادفت حقيقة أن الأمر يتطلب الكثير من الوقت والاهتمام لتصفية المعلومات التي تعرفها بالفعل لأنها غير واضحة دائمًا وعليك قراءتها حتى تفهم ما هي غير ذي صلة. عندما تتوصل إلى موضوع يحتاج إلى تكرار فعليًا ، غالبًا ما يحدث ذلك أنك متعب بالفعل ونوعية الإعداد. في مرحلة ما ، فكرت ، لماذا لا تستخدم بطاقات ANKI لهذا الغرض؟ على سبيل المثال ، عند تدوين ملاحظات حول موضوع ما ، قم بإنشاء ملخص على الفور في شكل سؤال - إجابة ، ثم عند تكرار ذلك ، ستعرف فورًا ما إذا كنت تعرف الإجابة على هذا السؤال أم لا.
نشأت المشكلة فقط لأنها كانت طويلة ومملة لملء الأسئلة. لتسهيل العملية ، أضفت وظيفة في مشروع data2anki لتحويل نص تخفيض السعر إلى بطاقات ANKI. كل ما عليك فعله هو كتابة ملف واحد كبير يتم فيه تمييز الأسئلة والأجوبة بتسلسل محدد مسبقًا من الأحرف ، والذي من خلاله سوف يفهم المحلل اللغوي مكان السؤال ومكان الإجابة.
بعد إنشاء هذا الملف ، يمكنك بدء data2anki وإنشاء بطاقات ANKI. الملف الأصلي سهل التحرير والمشاركة ، كل ما تحتاجه هو محو البطاقة (البطاقات) المناظرة وتشغيل البرنامج مرة أخرى ، وسيتم إنشاء نسخة جديدة.
التثبيت والاستخدام
تثبيت ANKI + AnkiConnect
- تنزيل ANKI من هنا: https://apps.ankiweb.net/
- قم بتثبيت البرنامج المساعد AnkiConnect: https://ankiweb.net/shared/info/2055492159
تثبيت data2anki
- قم بتنزيل data2anki من مستودع جيثب
git clone https://github.com/anatoly314/data2anki
- تثبيت التبعيات
cd data2anki && npm install
- تنزيل تبعيات جافا https://github.com/anatoly314/data2anki/releases/download/0.1.0/jar-dependencies.zip
- فك jar-dependencies.zip ووضع محتوياته في data2anki / java / jars
استخدم لترجمة الكلمات:
في ملف data2anki / config.json :
في مفتاح الوضع ، اكتب القيمة dsl2anki
في modules.dsl.anki.deckName الرئيسية و modules.dsl.anki.modelName ، على التوالي ، اكتب اسم الطابق واسم الطراز (يجب إنشاءهما بالفعل قبل إنشاء البطاقات). الآن فقط طراز من النوع الأساسي مدعوم:
يحتوي على حقول أمامية وخلفية ، وسوف ينشئ بطاقة واحدة. سيظهر النص الذي تدخله في المقدمة في مقدمة البطاقة ، وسيظهر النص الذي تدخله في الخلف على ظهر البطاقة.
حيث تكون الكلمة المصدر هي الحقل الأمامي وستكون الترجمة في حقل الخلف .
لا توجد مشكلة في إضافة دعم Basic (وبطاقة معكوسة) ، حيث سيتم إنشاء بطاقة عكسية للكلمة والترجمة ، حيث ستحتاج الترجمة إلى تذكر الكلمة الأصلية. هناك حاجة فقط إلى وجود الوقت والرغبة.
في مفتاح modules.dsl.dictionariesPath ، تقوم بتسجيل صفيف مع قواميس * .dsl متصلة. كل قاموس متصل هو دليل توجد فيه ملفات القاموس وفقًا للتنسيق: بنية قاموس DSL
في modules.dsl.wordToTranslatePath الأساسية ، حدد المسار إلى قائمة الكلمات التي تريد ترجمتها.
- تشغيل عند العمل تطبيق ANKI
node data2anki\index.js
- الربح!
يستخدم لإنشاء بطاقات من تخفيض السعر
في ملف data2anki / config.json :
- في مفتاح الوضع ، اكتب القيمة markdown2anki
- في modules.markdown.anki.deckName الرئيسية و modules.dsl.anki.modelName تكتب ، على التوالي ، اسم الطابق واسم النموذج (يجب أن يتم إنشاؤه بالفعل قبل إنشاء البطاقات). لوضع markdown2anki ، يتم دعم نموذج النوع الأساسي فقط.
في modules.markdown.selectors.startQuestionSelectors الرئيسية و modules.markdown.selectors.startAnswerSelectors ، قم بتسجيل المُحددات التي تحدد بها بداية السؤال والإجابة ، على التوالي. لن يتم تحليل الخط مع المحدد نفسه ولن يدخل في البطاقة ، سيبدأ المحلل في العمل من السطر التالي.
على سبيل المثال ، بطاقة السؤال / الإجابة هذه:

سوف ننظر في تخفيض السعر على النحو التالي:
# سؤال #
## السؤال 5. اكتب وظيفة mul التي ستعمل بشكل صحيح عند استدعاء بناء الجملة التالي.
جافا سكريبت
console.log (mul (2) (3) (4)) ؛ // الإخراج: 24
console.log (mul (4) (3) (4)) ؛ // الإخراج: 48
`` ``
# الإجابة
يوجد أدناه الكود الذي يتبعه شرح كيفية عمله:
جافا سكريبت
وظيفة مول (س) {
دالة الإرجاع (ص) {// وظيفة مجهولة
دالة الإرجاع (z) {// وظيفة مجهولة
إرجاع x * y * z ؛
}؛
}؛
}
`` ``
في هذه الحالة ، تقبل الدالة mul الوسيطة الأولى وتُرجع الدالة المجهولة التي تأخذ المعلمة الثانية وتُرجع الدالة المجهولة التي تأخذ المعلمة الثالثة وتُرجع مضاعفة الحجج التي يتم تمريرها على التوالي
في وظيفة Javascript المعرّفة في الداخل ، لها حق الوصول إلى متغير الوظيفة الخارجية ، والوظيفة هي كائن الفئة الأولى ، بحيث يمكن إرجاعها بواسطة الوظيفة أيضًا وتمريرها كوسيطة في دالة أخرى.
- الوظيفة هي مثيل لنوع الكائن
- يمكن أن يكون للوظيفة خصائص ولها رابط إلى طريقة المنشئ
- وظيفة يمكن تخزينها كمتغير
- يمكن تمرير وظيفة كمعلمة لوظيفة أخرى
- يمكن إرجاع وظيفة من وظيفة أخرى
يتم أخذ مثال من هنا: 123-JavaScript-Interview-Questions
يوجد أيضًا ملف به أمثلة في examples/markdown2anki-example.md
مجلد المشروع examples/markdown2anki-example.md
- في modules.markdown.pathToFile الرئيسية
يصف ، المسار إلى الملف حيث يكمن ملف * .md مع الأسئلة / الإجابات
- تشغيل عند العمل تطبيق ANKI
node data2anki\index.js
- الربح!
هكذا يبدو على الهاتف المحمول:
يؤدي
يمكن مزامنة البطاقات التي تم استلامها على إصدار سطح المكتب من ANKI بسهولة مع سحابة ANKI (حتى 100 ميجابايت) ، وبعد ذلك يمكنك استخدامها في كل مكان. هناك عملاء لأجهزة Android و iPhone ، ويمكنك أيضًا استخدامه في المستعرض. نتيجة لذلك ، إذا كان لديك وقت لا تملك شيئًا تنفقه عليه ، فبدلاً من التقليب بدون هدف عبر Facebook أو الأختام على Instagram ، يمكنك تعلم شيء جديد.
خاتمة
كما ذكرت ، هذا هو أكثر من POC العاملة التي يمكنك استخدامها من المنتج النهائي. في مكان ما ، لا يتم تطبيق حوالي 30٪ من معيار محلل DSL ، وبالتالي ، على سبيل المثال ، لا يمكن العثور على جميع إدخالات القاموس الموجودة في القواميس ، هناك أيضًا فكرة لإعادة كتابتها في JavaScript ، لأنك تريد "الاتساق" ، وإلى جانب ذلك ، يتم كتابتها الآن ليس الأمثل للغاية. الآن المحلل اللغوي يبني شجرة ، وهذا غير ضروري لإزالة الألغام ولا يحتاج إلى تعقيد الكود. في وضع markdown2anki ، لا يتم تحليل الصور. سأحاول أن أرى ببطء ، ولكن طالما أني أكتب لنفسي ، فسأقوم أولاً وقبل كل شيء بحل أشعل النار التي سأهاجمها بنفسي ، لكن إذا أراد شخص ما المساعدة ، فنحن نرحب بذلك. إذا كانت لديك أسئلة حول البرنامج ، فسيسعدني تقديم المساعدة من خلال المشكلات المفتوحة في المشاريع ذات الصلة. اكتب بقية النقد والاقتراحات هنا. آمل أن يجد شخص ما هذا المشروع مفيدًا.
ملاحظة: إذا لاحظت وجود أخطاء (وهم ، لسوء الحظ ،) ، اكتب رسالة شخصية ، وسأصلح كل شيء.