[{"id":"vite","term":"Vite","definition":"أداة بناء وخادم تطوير لمشاريع الواجهات الأمامية. يقدّم ملفات المصدر مع تحديثات فورية أثناء التطوير، ويجمّعها في ملفات ثابتة محسّنة داخل dist/ للإنتاج.","lesson":"l-rf-1-2","course":"react-fundamentals"},{"id":"strict-mode","term":"StrictMode","definition":"component غلاف في React يضيف فحوصًا خاصة بالتطوير، مثل رسم الـ components مرتين وتشغيل الـ effects مرتين، ليكشف الكود غير النقي ودوال التنظيف المفقودة. لا تأثير له في الإنتاج.","lesson":"l-rf-1-2","course":"react-fundamentals"},{"id":"component","term":"المكوّن (component)","definition":"دالة JavaScript يبدأ اسمها بحرف كبير وتُرجع JSX. تستخدمها كوسم، وتستدعيها React لتعرف ما الذي يجب عرضه.","lesson":"l-rf-1-3","course":"react-fundamentals"},{"id":"fragment","term":"Fragment","definition":"غلاف يُكتب بالشكل &lt;&gt;…&lt;/&gt; أو <Fragment> يجمع عدّة عناصر من دون إضافة عقدة إلى الـ DOM، فيستطيع الـ component إرجاع عناصر متجاورة كجذر واحد.","lesson":"l-rf-1-3","course":"react-fundamentals"},{"id":"jsx","term":"JSX","definition":"امتداد لصياغة JavaScript يتيح لك كتابة markup شبيه بـ HTML داخل JavaScript. يحوّل المترجم كل وسم إلى استدعاء دالة يُنشئ عنصر React.","lesson":"l-rf-1-4","course":"react-fundamentals"},{"id":"react-element","term":"عنصر React (React element)","definition":"كائن JavaScript عادي ينشئه JSX ويصف ما يجب أن يظهر على الشاشة: نوعًا مثل “h2” أو component، إضافةً إلى الـ props الخاصة به. وتحوّل React هذه العناصر إلى DOM.","lesson":"l-rf-1-4","course":"react-fundamentals"},{"id":"derived-value","term":"القيمة المشتقّة (derived value)","definition":"بيانات تُحسب أثناء الـ render من الـ props أو الـ state، مثل عدد أو قائمة مصفّاة. لا تُخزَّن أبدًا في الـ state، فلا يمكن أن تخرج عن التزامن مع مصدرها.","lesson":"l-rf-2-1","course":"react-fundamentals"},{"id":"props","term":"Props","definition":"المدخلات التي يمرّرها الأب إلى component كخصائص، وتصل إليه ككائن واحد. الـ props للقراءة فقط: لا يغيّرها الـ component أبدًا، بل يستقبل props جديدة حين يعيد الأب الـ render.","lesson":"l-rf-2-2","course":"react-fundamentals"},{"id":"children-prop","term":"children","definition":"الـ prop الذي يحمل كل ما يوضع بين وسمي الفتح والإغلاق لـ component. عرض {children} يتيح للـ component أن يغلّف محتوى لا يعرف عنه شيئًا.","lesson":"l-rf-2-3","course":"react-fundamentals"},{"id":"slot","term":"Slot prop","definition":"prop يقبل JSX، مثل actions={<button>Shuffle</button>}، فيقرّر المستدعي ما الذي يظهر، ويقرّر الـ component أين يظهر.","lesson":"l-rf-2-3","course":"react-fundamentals"},{"id":"prop-drilling","term":"Prop drilling","definition":"تمرير prop عبر عدّة components لا تستخدمه، فقط لإيصاله إلى component متداخل في العمق. وكثيرًا ما يزيله التركيب بالعناصر أو الـ context.","lesson":"l-rf-2-3","course":"react-fundamentals"},{"id":"conditional-rendering","term":"العرض الشرطي (conditional rendering)","definition":"اختيار ما يُخرجه الـ component بحسب البيانات، باستخدام return مبكر أو المعامل الثلاثي أو &amp;&amp; داخل JSX. وإرجاع null لا يعرض شيئًا.","lesson":"l-rf-2-4","course":"react-fundamentals"},{"id":"unmount","term":"إلغاء التركيب (unmount)","definition":"حين تزيل React الـ component من الشجرة، فتهدم الـ DOM والـ state الخاصين به. والـ component المعروض شرطيًا يُلغى تركيبه حين يصبح شرطه false.","lesson":"l-rf-2-4","course":"react-fundamentals"},{"id":"key","term":"المفتاح (key)","definition":"prop خاص على عناصر القوائم يُخبر React بهوية كل عنصر بين مرّات الـ render. يجب أن يكون فريدًا بين الإخوة وثابتًا، وهو عادةً معرّف من البيانات.","lesson":"l-rf-2-5","course":"react-fundamentals"},{"id":"state","term":"State","definition":"بيانات يتذكّرها الـ component بين مرّات الـ render، ويُعلَن عنها باستخدام useState. استدعاء الـ setter الخاص بها يخزّن قيمة جديدة ويجعل React تعيد رسم الـ component.","lesson":"l-rf-3-1","course":"react-fundamentals"},{"id":"hook","term":"Hook","definition":"دالة يبدأ اسمها بـ “use”، مثل useState أو useEffect، تتيح للـ component استخدام ميزات React. ويجب استدعاء الـ hooks في المستوى الأعلى من الـ component.","lesson":"l-rf-3-1","course":"react-fundamentals"},{"id":"state-snapshot","term":"لقطة الـ state (state snapshot)","definition":"مجموعة قيم الـ state الثابتة التي يراها render واحد. ضبط الـ state لا يغيّر المتغيّرات الحالية، بل يجدول render جديدًا بقيم جديدة.","lesson":"l-rf-3-1","course":"react-fundamentals"},{"id":"updater-function","term":"دالة التحديث (updater function)","definition":"دالة تُمرَّر إلى setter الـ state، مثل setCount(© =&gt; c + 1). تستدعيها React بأحدث قيمة منتظرة، فتتراكم التحديثات المتتالية بشكل صحيح.","lesson":"l-rf-3-1","course":"react-fundamentals"},{"id":"immutable-update","term":"التحديث بلا تعديل مباشر (immutable update)","definition":"تغيير الـ state بإنشاء مصفوفات أو كائنات جديدة (باستخدام spread أو map أو filter) بدل تعديل الموجودة، حتى تستطيع React اكتشاف التغيير.","lesson":"l-rf-3-1","course":"react-fundamentals"},{"id":"event-handler","term":"معالج الحدث (event handler)","definition":"دالة تُمرَّر إلى prop مثل onClick أو onSubmit، تستدعيها React حين يقع الحدث. والمعالجات هي مكان الآثار الجانبية الناتجة عن إجراءات المستخدم.","lesson":"l-rf-3-2","course":"react-fundamentals"},{"id":"event-bubbling","term":"انتشار الحدث (event bubbling)","definition":"الطريقة التي ينتقل بها الحدث من العنصر الذي وقع عليه صعودًا عبر أسلافه، فيُطلق معالجاتهم أيضًا. والدالة e.stopPropagation() توقفه.","lesson":"l-rf-3-2","course":"react-fundamentals"},{"id":"controlled-input","term":"الحقل المتحكَّم به (controlled input)","definition":"حقل نموذج تأتي قيمته من الـ state في React، ويحدّث معالج onChange الخاص به ذلك الـ state، فيكون الـ state المصدر الوحيد للحقيقة لما يعرضه الحقل.","lesson":"l-rf-3-3","course":"react-fundamentals"},{"id":"form-action","term":"Form action","definition":"ميزة في React 19 تستقبل فيها دالة ممرَّرة إلى الخاصية action في النموذج كائن FormData المُرسَل. وتمنع React إعادة تحميل الصفحة وتعيد ضبط الحقول غير المتحكَّم بها بعد ذلك.","lesson":"l-rf-3-3","course":"react-fundamentals"},{"id":"use-action-state","term":"useActionState","definition":"hook في React 19 يغلّف دالة action ويُرجع آخر نتيجة أنتجتها، ودالة إرسال تمرّرها إلى النموذج، ومؤشّر isPending.","lesson":"l-rf-3-3","course":"react-fundamentals"},{"id":"lifting-state-up","term":"رفع الـ state للأعلى (lifting state up)","definition":"نقل الـ state من component إلى أقرب أب مشترك لكل الـ components التي تحتاجه، ثم تمرير القيمة ومعالجات التغيير إلى الأسفل كـ props.","lesson":"l-rf-3-4","course":"react-fundamentals"},{"id":"effect","term":"Effect","definition":"كود يُمرَّر إلى useEffect ويعمل بعد أن تحدّث React الشاشة، ويُستخدم للتزامن مع شيء خارج React، مثل عنوان المستند أو التخزين أو المؤقّتات أو الاشتراكات.","lesson":"l-rf-3-5","course":"react-fundamentals"},{"id":"dependency-array","term":"مصفوفة الاعتماديات (dependency array)","definition":"الوسيط الثاني لـ useEffect، ويسرد كل قيمة يقرؤها الـ effect. ولا تعيد React تشغيل الـ effect إلا حين تتغيّر إحدى هذه القيم منذ الـ render السابق.","lesson":"l-rf-3-5","course":"react-fundamentals"},{"id":"cleanup-function","term":"دالة التنظيف (cleanup function)","definition":"دالة يُرجعها الـ effect لتلغي ما فعله، مثل إزالة مستمع أو إيقاف مؤقّت. وتشغّلها React قبل أن يعمل الـ effect مجددًا وعند إلغاء التركيب.","lesson":"l-rf-3-5","course":"react-fundamentals"},{"id":"utility-class","term":"Utility class","definition":"class صغير في CSS يفعل شيئًا واحدًا، مثل p-4 للحشو أو text-slate-600 للون. ويولّد Tailwind CSS الـ utilities التي تستخدمها ملفاتك.","lesson":"l-rf-4-2","course":"react-fundamentals"},{"id":"preview-deployment","term":"نسخة المعاينة (preview deployment)","definition":"deployment لـ branch غير الإنتاج أو لـ pull request على رابط فريد خاص به، حتى يمكن فحص التغييرات قبل دمجها ووصولها إلى موقع الإنتاج.","lesson":"l-rf-4-3","course":"react-fundamentals"},{"id":"structural-typing","term":"التنميط البنيوي (Structural typing)","definition":"قاعدة TypeScript التي تجعل القيمة متوافقة مع نوع ما حين تملك الشكل المطلوب، أيًّا كان اسم ذلك النوع. فالنوعان المختلفان في الاسم المتطابقان في الخصائص قابلان للتبادل.","lesson":"l-at-1-2","course":"advanced-typescript"},{"id":"assignability","term":"قابلية الإسناد (Assignability)","definition":"إمكانية استخدام قيمة من نوع ما حيث يُنتظر نوع آخر. تعمل مثل علاقة الاحتواء بين المجموعات: المجموعة الأضيق من القيم تقع داخل المجموعة الأوسع.","lesson":"l-at-1-2","course":"advanced-typescript"},{"id":"excess-property-check","term":"فحص الخصائص الزائدة (Excess property check)","definition":"فحص يعلّم الخصائص المجهولة في كائن حرفي طازج مكتوب مباشرة حيث يُنتظر نوع. يلتقط الأخطاء الإملائية، لكن القيم الممرَّرة عبر متغيّر تتخطّاه.","lesson":"l-at-1-2","course":"advanced-typescript"},{"id":"control-flow-analysis","term":"تحليل تدفّق التحكّم (Control-flow analysis)","definition":"طريقة TypeScript في تتبّع نوع المتغيّر عبر الفروع وجمل العودة والإسنادات، بحيث يكون للاسم نفسه نوع أضيق بعد الفحص مما كان عليه قبله.","lesson":"l-at-1-3","course":"advanced-typescript"},{"id":"narrowing","term":"Narrowing","definition":"تضييق نوع واسع إلى نوع أكثر تحديدًا بفحص وقت التشغيل، مثل <code dir=\"ltr\">typeof</code> أو <code dir=\"ltr\">===</code> أو <code dir=\"ltr\">in</code> أو <code dir=\"ltr\">instanceof</code> أو type predicate.","lesson":"l-at-1-3","course":"advanced-typescript"},{"id":"discriminated-union","term":"Discriminated union","definition":"union من أنواع كائنات تتشارك خاصية بقيمة حرفية مختلفة في كل عضو، مثل <code dir=\"ltr\">status</code>. وفحص تلك الخاصية يضيّق الكائن كله إلى عضو واحد.","lesson":"l-at-1-4","course":"advanced-typescript"},{"id":"const-assertion","term":"as const","definition":"تأكيد const يستنتج أضيق نوع ممكن للقيمة: القيم الحرفية تبقى حرفية، والمصفوفات تصبح tuples للقراءة فقط، والخصائص تصبح للقراءة فقط.","lesson":"l-at-1-5","course":"advanced-typescript"},{"id":"satisfies","term":"satisfies","definition":"عامل (operator) يفحص قيمة مقابل نوع دون أن يستبدل النوع المستنتَج للقيمة، فتحصل على التحقّق وتحتفظ في الوقت نفسه بالمفاتيح والقيم الحرفية الدقيقة.","lesson":"l-at-1-5","course":"advanced-typescript"},{"id":"type-parameter","term":"معامل النوع (Type parameter)","definition":"نوع نائب في دالة أو نوع generic، مثل <code dir=\"ltr\">T</code>، يربط المدخلات بالمخرجات. ويجب أن يظهر مرتين على الأقل كي يضيف أمانًا حقيقيًا في الأنواع.","lesson":"l-at-2-1","course":"advanced-typescript"},{"id":"generic-constraint","term":"قيد الـ generic (Generic constraint)","definition":"جملة <code dir=\"ltr\">extends</code> على معامل نوع تحدّ من الأنواع التي يقبلها، مثل <code dir=\"ltr\">T extends { id: number }</code>، وتجعل تلك الخصائص قابلة للاستخدام داخل الدالة أيضًا.","lesson":"l-at-2-1","course":"advanced-typescript"},{"id":"inference-site","term":"موقع الاستنتاج (Inference site)","definition":"موضع في نوع معامل يظهر فيه معامل نوع. عند الاستدعاء، يجمع TypeScript مرشّحًا من كل موقع ليقرّر ما هو معامل النوع.","lesson":"l-at-2-2","course":"advanced-typescript"},{"id":"const-type-parameter","term":"معامل النوع const (const type parameter)","definition":"معامل نوع معرَّف بـ <code dir=\"ltr\">const</code> (منذ TypeScript 5.0)، يستنتج الوسائط كأن المستدعي كتب <code dir=\"ltr\">as const</code>، فيحتفظ بالقيم الحرفية والـ tuples للقراءة فقط.","lesson":"l-at-2-2","course":"advanced-typescript"},{"id":"noinfer","term":"NoInfer","definition":"نوع مدمج (منذ TypeScript 5.4) يجعل موضعًا ما للفحص فقط، فيُتحقَّق منه مقابل معامل نوع لكنه لا يساهم أبدًا بمرشّح في الاستنتاج.","lesson":"l-at-2-3","course":"advanced-typescript"},{"id":"indexed-access-type","term":"نوع الوصول بالفهرس (Indexed access type)","definition":"نوع مثل <code dir=\"ltr\">Order['status']</code> أو <code dir=\"ltr\">T[number]</code> يبحث عن نوع خاصية ما، أو عن نوع عناصر مصفوفة، باستخدام صياغة الأقواس المربّعة.","lesson":"l-at-3-1","course":"advanced-typescript"},{"id":"mapped-type","term":"Mapped type","definition":"نوع يمرّ على union من المفاتيح ويبني خاصية واحدة لكل مفتاح، كما في <code dir=\"ltr\">{ [K in keyof T]?: T[K] }</code>، وهو تعريف <code dir=\"ltr\">Partial</code>.","lesson":"l-at-3-2","course":"advanced-typescript"},{"id":"key-remapping","term":"إعادة تسمية المفاتيح (Key remapping)","definition":"جملة <code dir=\"ltr\">as</code> في mapped type تعيد تسمية كل مفتاح، غالبًا بـ template literal. وتحويل مفتاح إلى <code dir=\"ltr\">never</code> يحذفه، وهكذا يعمل <code dir=\"ltr\">Omit</code>.","lesson":"l-at-3-2","course":"advanced-typescript"},{"id":"conditional-type","term":"Conditional type","definition":"نوع بالشكل <code dir=\"ltr\">T extends U ? X : Y</code> يختار بين نوعين بحسب ما إذا كان <code dir=\"ltr\">T</code> قابلًا للإسناد إلى <code dir=\"ltr\">U</code>، ويُسمّى أيضًا النوع الشرطي.","lesson":"l-at-3-3","course":"advanced-typescript"},{"id":"distributive-conditional-type","term":"النوع الشرطي التوزيعي (Distributive conditional type)","definition":"conditional type يكون النوع المفحوص فيه معامل نوع مجرّدًا. حين يُعطى union يُنفَّذ مرة لكل عضو ويجمع النتائج؛ وتغليف الطرفين بأقواس مربّعة يوقف ذلك.","lesson":"l-at-3-3","course":"advanced-typescript"},{"id":"infer","term":"infer","definition":"كلمة مفتاحية تُستخدم داخل جملة <code dir=\"ltr\">extends</code> في conditional type لالتقاط جزء من النوع المطابق، كما في <code dir=\"ltr\">ReturnType</code> الذي يلتقط نوع إرجاع الدالة.","lesson":"l-at-3-3","course":"advanced-typescript"},{"id":"template-literal-type","term":"Template literal type","definition":"نوع نصي يُبنى بصياغة علامات الاقتباس المائلة من أنواع أخرى، مثل <code dir=\"ltr\">`order.${OrderStatus}`</code>. والـ unions داخله تتوسّع إلى كل التركيبات الممكنة.","lesson":"l-at-3-4","course":"advanced-typescript"},{"id":"branded-type","term":"Branded type","definition":"تقاطع (intersection) بين نوع أولي وخاصية لا وجود لها إلا في نظام الأنواع، مثل <code dir=\"ltr\">number &amp; { readonly [brand]: 'OrderId' }</code>، فتتوقّف القيم ذات النوع نفسه وقت التشغيل عن التبادل.","lesson":"l-at-4-1","course":"advanced-typescript"},{"id":"smart-constructor","term":"المُنشئ الذكي (Smart constructor)","definition":"دالة تتحقّق من قيمة خام ثم تُعيدها كـ branded type. وهي المكان الوحيد الذي يجب أن يظهر فيه تحويل إلى ذلك الوسم.","lesson":"l-at-4-1","course":"advanced-typescript"},{"id":"exhaustiveness-check","term":"فحص الشمول (Exhaustiveness check)","definition":"ضمانة وقت الترجمة بأن كل عضو في union قد عولج، وتتحقّق عادةً بتمرير القيمة المتبقّية إلى معامل من نوع <code dir=\"ltr\">never</code> في فرع <code dir=\"ltr\">default</code>.","lesson":"l-at-4-1","course":"advanced-typescript"},{"id":"result-type","term":"نوع Result (Result type)","definition":"discriminated union مثل <code dir=\"ltr\">{ ok: true; value: T } | { ok: false; error: E }</code> يُعيد الإخفاقات المتوقَّعة كقيم، فيُضطر المستدعون إلى معالجتها بدل نسيانها.","lesson":"l-at-4-2","course":"advanced-typescript"},{"id":"type-predicate","term":"Type predicate","definition":"نوع إرجاع دالة بالشكل <code dir=\"ltr\">value is T</code>. حين تُعيد الدالة true يضيق الوسيط إلى <code dir=\"ltr\">T</code> في موضع الاستدعاء؛ أما جسم الدالة نفسه فلا يُتحقَّق منه.","lesson":"l-at-4-3","course":"advanced-typescript"},{"id":"assertion-function","term":"دالة التأكيد (Assertion function)","definition":"دالة نوع إرجاعها <code dir=\"ltr\">asserts value is T</code>. ترمي خطأً حين يفشل الفحص، وحين تعود بشكل طبيعي تضيّق القيمة لبقية النطاق.","lesson":"l-at-4-3","course":"advanced-typescript"},{"id":"using-declaration","term":"تصريح using (using declaration)","definition":"تصريح يستدعي <code dir=\"ltr\">[Symbol.dispose]()</code> على القيمة حين تنتهي كتلته، بالعودة أو بالرمي، ويحرّر الموارد المتعددة بترتيب معكوس لترتيب تصريحها.","lesson":"l-at-5-2","course":"advanced-typescript"},{"id":"declaration-merging","term":"دمج التصريحات (Declaration merging)","definition":"القاعدة التي تجعل عدة تصريحات بالاسم نفسه، مثل تصريحَي interface، تتّحد في تصريح واحد. وهي طريقة توسيع أنواع الـ lib والـ interfaces الخاصة بالمكتبات.","lesson":"l-at-5-3","course":"advanced-typescript"},{"id":"module-augmentation","term":"توسيع الوحدات (Module augmentation)","definition":"الإضافة إلى الأنواع داخل وحدة باستخدام <code dir=\"ltr\">declare module 'name' { … }</code> من ملف هو نفسه وحدة، مثلًا لتوسيع interface في مكتبة ما.","lesson":"l-at-5-3","course":"advanced-typescript"},{"id":"project-references","term":"مراجع المشاريع (Project references)","definition":"ميزة في tsconfig تقسم قاعدة الكود إلى مشاريع تُبنى منفصلة (<code dir=\"ltr\">composite: true</code>، وتُبنى بـ <code dir=\"ltr\">tsc -b</code>)، فلا يُعاد فحص الأجزاء التي لم تتغيّر.","lesson":"l-at-5-4","course":"advanced-typescript"},{"id":"cascade","term":"Cascade","definition":"الخوارزمية التي يستخدمها المتصفّح لاختيار قيمة واحدة حين تستهدف عدّة تصريحات الخاصية نفسها على العنصر نفسه: المصدر والأهمية، ثم الأنماط المضمّنة، ثم الـ layers، ثم الـ specificity، ثم ترتيب الظهور.","lesson":"l-css-1-1","course":"css-mastery"},{"id":"inheritance","term":"الوراثة (Inheritance)","definition":"حين لا يستهدف أيّ تصريح خاصيةً موروثة مثل <code dir=\"ltr\">color</code> أو <code dir=\"ltr\">font-family</code>، يأخذ العنصر القيمة المحسوبة لعنصره الأب؛ أما الخصائص غير الموروثة فترجع إلى قيمتها الابتدائية.","lesson":"l-css-1-1","course":"css-mastery"},{"id":"specificity","term":"Specificity","definition":"وزن الـ selector، ويُحسب ثلاثة أعداد منفصلة (الـ IDs؛ ثم الـ classes والسمات والـ pseudo-classes؛ ثم الأنواع والـ pseudo-elements) تُقارَن عمودًا بعمود، ولا تُجمع معًا أبدًا.","lesson":"l-css-1-2","course":"css-mastery"},{"id":"where-pseudo-class","term":":where()","definition":"pseudo-class تطابق كما تطابق <code dir=\"ltr\">:is()</code> لكن الـ specificity فيها صفر دائمًا، ما يجعلها مثالية لأنماط إعادة الضبط والأنماط الأساسية التي يجب أن تتجاوزها الـ components بسهولة.","lesson":"l-css-1-2","course":"css-mastery"},{"id":"is-pseudo-class","term":":is()","definition":"pseudo-class تطابق أيّ selector في قائمتها وتأخذ specificity أدقّ وسيط فيها؛ وتستخدم قائمة selectors متسامحة، فلا يُسقط وسيط واحد غير صالح القاعدة كلها.","lesson":"l-css-1-2","course":"css-mastery"},{"id":"cascade-layer","term":"طبقة الـ cascade (Cascade layer)","definition":"مجموعة مسمّاة من القواعد تُنشأ بـ <code dir=\"ltr\">@layer</code>. الـ layers المُعلنة لاحقًا تتغلّب على السابقة قبل مقارنة الـ specificity، والأنماط خارج الـ layers تتغلّب على كل الـ layers في التصريحات العادية.","lesson":"l-css-1-3","course":"css-mastery"},{"id":"custom-property","term":"Custom property","definition":"خاصية يبدأ اسمها بشرطتين، مثل <code dir=\"ltr\">--track-color</code>، وتُقرأ بـ <code dir=\"ltr\">var()</code>. وهي موروثة افتراضيًا، وتُستبدل حيث تُستخدم، في وقت حساب القيمة.","lesson":"l-css-1-4","course":"css-mastery"},{"id":"invalid-at-computed-value-time","term":"غير صالح في وقت حساب القيمة (Invalid at computed-value time)","definition":"ما يحدث حين يُنتج الاستبدال في <code dir=\"ltr\">var()</code> قيمة لا تستطيع الخاصية استخدامها: تتصرّف الخاصية كأنها غير مضبوطة، فتأخذ قيمتها الموروثة أو الابتدائية بدل تصريح سابق.","lesson":"l-css-1-4","course":"css-mastery"},{"id":"at-property","term":"@property","definition":"قاعدة at-rule تسجّل custom property بصيغة وعلامة للوراثة وقيمة ابتدائية، فيستطيع المتصفّح فحص صحّتها والانتقال بين قيمها تدريجيًا في الـ transitions والحركات.","lesson":"l-css-1-4","course":"css-mastery"},{"id":"css-nesting","term":"CSS nesting","definition":"صيغة أصلية لكتابة القواعد داخل قواعد أخرى، حيث تمثّل <code dir=\"ltr\">&amp;</code> الـ selector الأب. وهي تعمل على الـ selectors لا على النص، فلا تستطيع بناء أسماء classes على طريقة BEM كما يفعل Sass.","lesson":"l-css-1-5","course":"css-mastery"},{"id":"has-pseudo-class","term":":has()","definition":"pseudo-class علائقية تطابق العنصر حين يجد الـ selector النسبي بداخلها تطابقًا، فتتيح تنسيق عنصر أب أو شقيق سابق بحسب أبنائه أو أشقّائه اللاحقين.","lesson":"l-css-1-5","course":"css-mastery"},{"id":"flex-basis","term":"flex-basis","definition":"الحجم الذي يبدأ منه عنصر flex على امتداد المحور الرئيسي، قبل أن تتقاسم <code dir=\"ltr\">flex-grow</code> المساحة المتبقية أو تستردّ <code dir=\"ltr\">flex-shrink</code> النقص.","lesson":"l-css-2-1","course":"css-mastery"},{"id":"automatic-minimum-size","term":"الحجم الأدنى التلقائي (Automatic minimum size)","definition":"القيمة الافتراضية <code dir=\"ltr\">min-width: auto</code> لعناصر flex وgrid، التي تمنعها من التقلّص تحت حجم محتواها. وضبط <code dir=\"ltr\">min-width: 0</code> يتيح للنص الطويل أن يُقتطع بدل أن يفيض.","lesson":"l-css-2-1","course":"css-mastery"},{"id":"grid-template-areas","term":"grid-template-areas","definition":"خاصية grid تسمّي مناطق الشبكة بسلاسل نصية، سلسلة لكل صف، فتستطيع وضع العناصر بأسمائها وإعادة ترتيب التخطيط بإعادة رسم السلاسل.","lesson":"l-css-2-2","course":"css-mastery"},{"id":"auto-fit","term":"auto-fit","definition":"كلمة مفتاحية لـ <code dir=\"ltr\">repeat()</code> تنشئ أكبر عدد من الـ tracks يتّسع وتطوي الفارغة منها، فتتمدّد العناصر القليلة لتملأ الصف؛ أما <code dir=\"ltr\">auto-fill</code> فتحتفظ بالـ tracks الفارغة.","lesson":"l-css-2-2","course":"css-mastery"},{"id":"subgrid","term":"Subgrid","definition":"القيمة <code dir=\"ltr\">subgrid</code> لـ <code dir=\"ltr\">grid-template-rows</code> أو <code dir=\"ltr\">grid-template-columns</code>، التي تجعل الشبكة المتداخلة تستخدم tracks الأب التي تمتدّ عليها، فيصطفّ المحتوى عبر الـ components الشقيقة.","lesson":"l-css-2-3","course":"css-mastery"},{"id":"fit-content","term":"fit-content","definition":"كلمة مفتاحية للتحجيم الذاتي تجعل حجم العنصر بعرض max-content الخاص به، محدودًا بالمساحة المتاحة، فتستطيع الكتلة أن تحتضن محتواها دون أن تفيض.","lesson":"l-css-2-4","course":"css-mastery"},{"id":"clamp","term":"clamp()","definition":"دالة رياضية تُرجع قيمة مفضّلة محصورة بين حدّ أدنى وحدّ أقصى، وتُكتب <code dir=\"ltr\">clamp(MIN, PREFERRED, MAX)</code>. وهي تساوي <code dir=\"ltr\">max(MIN, min(PREFERRED, MAX))</code>.","lesson":"l-css-2-4","course":"css-mastery"},{"id":"container-query","term":"Container query","definition":"قاعدة <code dir=\"ltr\">@container</code> تطبّق الأنماط بحسب حجم حاوية من الأسلاف أو نمطها بدل الـ viewport، فيتكيّف الـ component مع الخانة التي يجلس فيها.","lesson":"l-css-2-5","course":"css-mastery"},{"id":"container-units","term":"وحدات الحاوية (Container query units)","definition":"وحدات مثل <code dir=\"ltr\">cqi</code> و<code dir=\"ltr\">cqb</code> تساوي 1% من الحجم الأفقي أو الرأسي لأقرب حاوية حجم، وترجع إلى وحدات الـ viewport الصغيرة حين لا توجد حاوية.","lesson":"l-css-2-5","course":"css-mastery"},{"id":"fluid-type","term":"الخطوط المرنة (Fluid type)","definition":"أحجام خطوط تتغيّر باستمرار مع العرض المتاح، وتُكتب عادةً بـ <code dir=\"ltr\">clamp()</code> مع حدّ أدنى بـ rem، وقيمة مفضّلة خطية تجمع rem مع <code dir=\"ltr\">vw</code> أو <code dir=\"ltr\">cqi</code>، وحدّ أقصى بـ rem.","lesson":"l-css-3-1","course":"css-mastery"},{"id":"logical-properties","term":"الخصائص المنطقية (Logical properties)","definition":"خصائص مسمّاة بحسب سير النص لا بحسب الجهات الفيزيائية، مثل <code dir=\"ltr\">margin-inline-start</code> و<code dir=\"ltr\">inline-size</code>، فتنعكس التخطيطات بشكل صحيح في اللغات التي تُكتب من اليمين إلى اليسار مثل العربية.","lesson":"l-css-3-2","course":"css-mastery"},{"id":"oklch","term":"oklch()","definition":"دالة ألوان تستخدم الإضاءة والتشبّع ودرجة اللون الإدراكية، فتبدو الألوان المتساوية في الإضاءة متساوية في السطوع. وتستطيع أيضًا التعبير عن ألوان خارج نطاق sRGB.","lesson":"l-css-3-3","course":"css-mastery"},{"id":"relative-color-syntax","term":"صيغة الألوان النسبية (Relative color syntax)","definition":"طريقة لاشتقاق لون من آخر بفكّ قنواته باستخدام <code dir=\"ltr\">from</code>، كما في <code dir=\"ltr\">oklch(from var(--brand) calc(l - 0.1) c h)</code>، وتغيير ما تحتاج إليه فقط.","lesson":"l-css-3-3","course":"css-mastery"},{"id":"light-dark","term":"light-dark()","definition":"دالة ألوان تُرجع قيمتها الأولى حين يكون النظام اللوني المستخدم في العنصر فاتحًا، والثانية حين يكون داكنًا. وتحتاج إلى أن تسمح <code dir=\"ltr\">color-scheme</code> بالداكن.","lesson":"l-css-3-4","course":"css-mastery"},{"id":"focus-visible","term":":focus-visible","definition":"pseudo-class تطابق العنصر الذي عليه الـ focus فقط حين يرى المتصفّح أن مؤشّر الـ focus مفيد، مثل focus لوحة المفاتيح أو أيّ حقل نصي، لا عند نقرة فأرة على زر.","lesson":"l-css-3-5","course":"css-mastery"},{"id":"starting-style","term":"@starting-style","definition":"قاعدة at-rule تحدّد الأنماط التي ينطلق منها العنصر في الـ transition حين يُرسم أول مرة أو ينتقل من <code dir=\"ltr\">display: none</code> إلى الظهور، فتتيح حركات الدخول بـ CSS وحدها.","lesson":"l-css-4-1","course":"css-mastery"},{"id":"view-transition","term":"View transition","definition":"حركة تُنشئها <code dir=\"ltr\">document.startViewTransition()</code>: يلتقط المتصفّح صورتين للحالتين القديمة والجديدة في تحديث الـ DOM، ويحرّك الانتقال بينهما عبر pseudo-elements تستطيع تنسيقها.","lesson":"l-css-4-2","course":"css-mastery"},{"id":"scroll-driven-animation","term":"الحركة المرتبطة بالتمرير (Scroll-driven animation)","definition":"حركة CSS يتبع تقدّمها خط زمن للتمرير، يُضبط بـ <code dir=\"ltr\">animation-timeline: scroll()</code> أو <code dir=\"ltr\">view()</code>، بدل الزمن المنقضي.","lesson":"l-css-4-3","course":"css-mastery"},{"id":"compositing","term":"التركيب (Compositing)","definition":"المرحلة الأخيرة من الرسم، حيث تُجمَّع الطبقات المرسومة على الـ GPU. وكثيرًا ما يمكن معالجة تغييرات <code dir=\"ltr\">transform</code> و<code dir=\"ltr\">opacity</code> هنا وحدها، بتخطّي التخطيط والرسم.","lesson":"l-css-4-5","course":"css-mastery"},{"id":"variable","term":"المتغيّر (variable)","definition":"اسم يُربط بقيمة باستخدام <code dir=\"ltr\">=</code>، مثل <code dir=\"ltr\">unit_price = 39</code>، كي يمكن استخدام القيمة لاحقًا؛ يُحسب الطرف الأيمن أولًا، ثم يشير الاسم إلى النتيجة.","lesson":"l-pda-1-2","course":"python-data-analysis"},{"id":"dtype","term":"dtype","definition":"نوع البيانات المشترك بين كل القيم في عمود pandas، مثل <code dir=\"ltr\">int64</code> أو <code dir=\"ltr\">float64</code> أو <code dir=\"ltr\">object</code> (نص) أو <code dir=\"ltr\">bool</code> أو <code dir=\"ltr\">datetime64</code>؛ والنوع الخاطئ وراء كثير من أخطاء البيانات.","lesson":"l-pda-2-1","course":"python-data-analysis"},{"id":"dictionary","term":"القاموس (dictionary)","definition":"حاوية في Python من أزواج المفتاح والقيمة، مثل اسم منتج مربوط بسعره؛ تبحث عن القيم بالمفتاح باستخدام <code dir=\"ltr\">d[key]</code> أو <code dir=\"ltr\">d.get(key, default)</code>.","lesson":"l-pda-1-3","course":"python-data-analysis"},{"id":"list-comprehension","term":"List comprehension","definition":"طريقة لبناء قائمة في سطر واحد، <code dir=\"ltr\">[expr for x in items if condition]</code>، تطبّق تعبيرًا على كل عنصر، وتصفّي اختياريًا العناصر التي يُحتفظ بها.","lesson":"l-pda-1-4","course":"python-data-analysis"},{"id":"f-string","term":"f-string","definition":"نص يسبقه الحرف <code dir=\"ltr\">f</code> ويضع القيم بين أقواس معقوفة مع تنسيق اختياري، مثل <code dir=\"ltr\">f&quot;{revenue:,.2f}&quot;</code> لتعطي 1,234.50 أو <code dir=\"ltr\">f&quot;{share:.1%}&quot;</code> لتعطي 12.5%.","lesson":"l-pda-1-5","course":"python-data-analysis"},{"id":"traceback","term":"Traceback","definition":"التقرير الذي تطبعه Python حين يوقف استثناءٌ البرنامج؛ اقرأه من الأسفل، حيث يسمّي السطر الأخير نوع الخطأ ورسالته، ثم اصعد إلى السطر الذي فشل.","lesson":"l-pda-1-5","course":"python-data-analysis"},{"id":"series","term":"Series","definition":"مصفوفة أحادية البعد من القيم في pandas مع فهرس من التسميات؛ والعمود الواحد في الـ DataFrame هو Series.","lesson":"l-pda-2-1","course":"python-data-analysis"},{"id":"dataframe","term":"DataFrame","definition":"جدول pandas: أعمدة من نوع Series تتشارك فهرس صفوف واحدًا، مع methods لتحميل البيانات واختيارها وتصفيتها وتجميعها ودمجها وإعادة تشكيلها.","lesson":"l-pda-2-1","course":"python-data-analysis"},{"id":"index-alignment","term":"محاذاة الفهرس (index alignment)","definition":"قاعدة pandas التي تجعل العمليات بين Series أو DataFrame وآخر تطابق القيم بحسب تسمية الفهرس لا بحسب الموقع؛ والتسميات الموجودة في طرف واحد فقط تنتج NaN.","lesson":"l-pda-2-1","course":"python-data-analysis"},{"id":"loc-iloc","term":"loc و iloc","definition":"أداتا الاختيار الدقيقتان في pandas: <code dir=\"ltr\">.loc[rows, columns]</code> تختار بالتسمية وتشمل نهاية الشريحة، بينما <code dir=\"ltr\">.iloc</code> تختار بالموقع العددي وتستبعدها.","lesson":"l-pda-2-3","course":"python-data-analysis"},{"id":"boolean-mask","term":"القناع المنطقي (boolean mask)","definition":"Series من قيم True و False، تأتي عادةً من مقارنة، وتُستخدم لاختيار الصفوف بـ <code dir=\"ltr\">df[mask]</code>؛ مجموعها يعدّ المطابقات ومتوسطها يعطي حصتها.","lesson":"l-pda-2-4","course":"python-data-analysis"},{"id":"chained-assignment","term":"الإسناد المتسلسل (chained assignment)","definition":"الإسناد عبر عمليتي اختيار، مثل <code dir=\"ltr\">df[&quot;col&quot;][mask] = value</code>؛ قد يغيّر نسخة مؤقتة بدلًا من الـ DataFrame، فاستخدم بدلًا منه استدعاءً واحدًا لـ <code dir=\"ltr\">.loc</code>.","lesson":"l-pda-2-5","course":"python-data-analysis"},{"id":"copy-on-write","term":"Copy-on-Write","definition":"سلوك في pandas، افتراضي منذ الإصدار 3.0 واختياري في 2.x، تتصرّف فيه كل عملية اختيار كنسخة، فتكون الطريقة الوحيدة لتغيير DataFrame هي الإسناد إليه مباشرة.","lesson":"l-pda-2-5","course":"python-data-analysis"},{"id":"nan","term":"NaN","definition":"اختصار لعبارة “ليس رقمًا” (not a number): العلامة الكلاسيكية في pandas للقيمة المفقودة في الأعمدة العشرية؛ لا تساوي أي شيء، فافحص وجودها بـ <code dir=\"ltr\">isna()</code>.","lesson":"l-pda-3-1","course":"python-data-analysis"},{"id":"nullable-dtype","term":"النوع القابل للقيم المفقودة (nullable dtype)","definition":"نوع في pandas مثل <code dir=\"ltr\">Int64</code> أو <code dir=\"ltr\">Float64</code> أو <code dir=\"ltr\">boolean</code> أو <code dir=\"ltr\">string</code> يخزّن القيم المفقودة على هيئة <code dir=\"ltr\">pd.NA</code>، فتبقى الأعمدة الصحيحة أعدادًا صحيحة حتى مع وجود فجوات.","lesson":"l-pda-3-1","course":"python-data-analysis"},{"id":"str-accessor","term":"الـ accessor المسمّى str","definition":"الخاصية <code dir=\"ltr\">.str</code> في Series نصية، وتطبّق methods النصوص مثل <code dir=\"ltr\">strip</code> و<code dir=\"ltr\">title</code> و<code dir=\"ltr\">replace</code> و<code dir=\"ltr\">split</code> و<code dir=\"ltr\">contains</code> على كل القيم دفعة واحدة.","lesson":"l-pda-3-2","course":"python-data-analysis"},{"id":"regular-expression","term":"التعبير النمطي (regular expression)","definition":"لغة أنماط للنصوص تحمل فيها حروف مثل <code dir=\"ltr\">$</code> و<code dir=\"ltr\">.</code> معاني خاصة؛ مرّر <code dir=\"ltr\">regex=False</code> لمعاملتها كحروف عادية.","lesson":"l-pda-3-3","course":"python-data-analysis"},{"id":"ambiguous-date","term":"التاريخ الملتبس (ambiguous date)","definition":"نص تاريخ مثل 05/08/2025 يكون صالحًا وفق قراءة اليوم أولًا وقراءة الشهر أولًا معًا؛ ووحدها المعلومات الخارجية تحسم أيّهما الصحيح.","lesson":"l-pda-3-4","course":"python-data-analysis"},{"id":"assertion","term":"Assertion","definition":"جملة <code dir=\"ltr\">assert condition, message</code> لا تفعل شيئًا حين يتحقّق الشرط، وتوقف البرنامج بالرسالة حين يفشل؛ تُستخدم لتحديد ما يجب أن تبدو عليه البيانات النظيفة.","lesson":"l-pda-3-5","course":"python-data-analysis"},{"id":"groupby","term":"التجميع (groupby)","definition":"عملية pandas التي تقسم الصفوف إلى مجموعات بحسب مفتاح، وتطبّق حسابًا على كل مجموعة، وتضمّ النتائج في جدول واحد (split-apply-combine).","lesson":"l-pda-4-1","course":"python-data-analysis"},{"id":"named-aggregation","term":"الحسابات التجميعية المسمّاة (named aggregation)","definition":"صيغة من <code dir=\"ltr\">agg</code> تسمّي فيها كل كلمة مفتاحية عمودًا ناتجًا، وقيمتها زوج (عمود، دالة)، مثل <code dir=\"ltr\">revenue=(&quot;revenue&quot;, &quot;sum&quot;)</code>.","lesson":"l-pda-4-1","course":"python-data-analysis"},{"id":"merge","term":"الدمج (merge)","definition":"method في pandas تدمج جدولين جنبًا إلى جنب بمطابقة قيم المفتاح؛ و<code dir=\"ltr\">how</code> تحدّد نوع الربط، و<code dir=\"ltr\">validate</code> تتحقّق من علاقة المفاتيح المتوقّعة.","lesson":"l-pda-4-2","course":"python-data-analysis"},{"id":"join-type","term":"نوع الربط (join type)","definition":"القاعدة الخاصة بالمفاتيح غير المطابقة في عملية الدمج: inner يحتفظ بالمفاتيح الموجودة في الطرفين، و left بكل صف أيسر، و right بكل صف أيمن، و outer بكل المفاتيح.","lesson":"l-pda-4-2","course":"python-data-analysis"},{"id":"long-wide","term":"البيانات الطويلة والعريضة (long and wide)","definition":"شكلان للبيانات نفسها: الطويلة فيها صف لكل ملاحظة، والعريضة تنشر متغيّرًا واحدًا عبر الأعمدة؛ تنقل <code dir=\"ltr\">pivot_table</code> من الطويل إلى العريض، وتعيد <code dir=\"ltr\">melt</code> العكس.","lesson":"l-pda-4-3","course":"python-data-analysis"},{"id":"resample","term":"resample","definition":"method في pandas تجمّع الصفوف ذات فهرس التواريخ في فترات منتظمة مثل الأيام أو الأسابيع (<code dir=\"ltr\">W</code>) أو نهايات الأشهر (<code dir=\"ltr\">ME</code>) أو نهايات الأرباع (<code dir=\"ltr\">QE</code>)، بما في ذلك الفترات الفارغة.","lesson":"l-pda-4-4","course":"python-data-analysis"},{"id":"year-over-year","term":"النمو السنوي (year-over-year)","definition":"التغيّر مقارنةً بالفترة نفسها قبل سنة، مثل <code dir=\"ltr\">pct_change(4)</code> على البيانات الفصلية؛ وهو يزيل الأنماط الموسمية من المقارنة.","lesson":"l-pda-4-4","course":"python-data-analysis"},{"id":"qcut","term":"qcut","definition":"دالة في pandas تقسم القيم إلى مجموعات متساوية الحجم تقريبًا عند المئينات، مثل الرُّبيعات، بخلاف <code dir=\"ltr\">cut</code> التي تستخدم حدودًا تختارها أنت.","lesson":"l-pda-4-5","course":"python-data-analysis"},{"id":"median","term":"الوسيط (median)","definition":"القيمة الوسطى في عمود مرتّب، ونصف القيم أقل منها؛ وفي البيانات الملتوية مثل قيم الطلبات تصف القيمة النموذجية أفضل من المتوسط.","lesson":"l-pda-5-1","course":"python-data-analysis"},{"id":"correlation","term":"الارتباط (correlation)","definition":"رقم بين ‎-1 و1 يقيس مدى قوة تحرّك عمودين رقميين معًا في نمط خطي؛ وهو يدلّ على علاقة مصاحبة، لا على سبب.","lesson":"l-pda-5-1","course":"python-data-analysis"},{"id":"reproducible-analysis","term":"التحليل القابل لإعادة الإنتاج (reproducible analysis)","definition":"تحليل يستطيع أيّ شخص إعادة تشغيله من الملفات الخام، من الأعلى إلى الأسفل، دون خطوات يدوية، ويحصل على النتائج نفسها، باستخدام المُعامِلات والدوال والـ assertions.","lesson":"l-pda-5-4","course":"python-data-analysis"},{"id":"grain","term":"مستوى التفصيل (grain)","definition":"ما يمثّله الصف الواحد في جدول أو في نتيجة query، مثل صف لكل طلب أو صف لكل دولة في كل شهر. تحديده قبل كتابة GROUP BY يمنع معظم أخطاء التجميع.","lesson":"l-sql-2-1","course":"sql-for-analysts"},{"id":"operator-precedence","term":"أولوية المعاملات (AND قبل OR)","definition":"القاعدة التي يقيّم بها SQL المعامل AND قبل OR، فيجمّع الشرط الذي يخلط بينهما الشروط بطريقة غير متوقعة ما لم توضع كل مجموعة OR بين قوسين.","lesson":"l-sql-1-2","course":"sql-for-analysts"},{"id":"three-valued-logic","term":"المنطق ثلاثي القيم (three-valued logic)","definition":"منطق SQL الذي يكون فيه الشرط TRUE أو FALSE أو NULL (غير معروف). أي مقارنة مع NULL نتيجتها غير معروفة، وWHERE لا يُبقي إلا الصفوف التي يكون شرطها TRUE.","lesson":"l-sql-1-3","course":"sql-for-analysts"},{"id":"is-distinct-from","term":"IS DISTINCT FROM","definition":"مقارنة آمنة مع NULL تعامل NULL كقيمة عادية، فلا تُسقط الصفوف التي فيها NULL بصمت كما يفعل معامل «لا يساوي» العادي.","lesson":"l-sql-1-3","course":"sql-for-analysts"},{"id":"coalesce","term":"COALESCE","definition":"دالة تعيد أول وسيط قيمته ليست NULL، وتُستخدم لإعطاء القيم المفقودة قيمة افتراضية عند العرض مثل ‘none’. أما استبدال NULL بصفر في المتوسطات فيشوّه النتائج.","lesson":"l-sql-1-3","course":"sql-for-analysts"},{"id":"case-expression","term":"تعبير CASE","definition":"تعبير يعيد نتيجة أول شرط WHEN قيمته TRUE، أو قيمة ELSE؛ وبدون ELSE تحصل الصفوف غير المطابقة على NULL.","lesson":"l-sql-1-3","course":"sql-for-analysts"},{"id":"iso-date-text","term":"نص التاريخ بصيغة ISO-8601","definition":"تواريخ مخزّنة كنص بالشكل ‘YYYY-MM-DD HH:MM:SS’. لأن الوحدة الأكبر تأتي أولًا، يطابق الترتيب الأبجدي الترتيب الزمني، فتعمل مقارنة النصوص كشرط على التاريخ.","lesson":"l-sql-1-4","course":"sql-for-analysts"},{"id":"half-open-range","term":"نطاق التاريخ نصف المفتوح (half-open range)","definition":"شرط على فترة يشمل بدايتها ويستبعد بداية الفترة التالية، مثل order_date &gt;= ‘2025-11-01’ AND order_date &lt; ‘2025-12-01’، فلا يُقتطع اليوم الأخير أبدًا.","lesson":"l-sql-1-4","course":"sql-for-analysts"},{"id":"julianday","term":"julianday()","definition":"دالة في SQLite تحوّل التاريخ إلى عدد من الأيام مع كسوره. طرح قيمتين منها يعطي مدة بالأيام، وضرب الناتج في 24 يعطي الساعات.","lesson":"l-sql-1-4","course":"sql-for-analysts"},{"id":"having","term":"HAVING","definition":"العبارة التي تصفّي المجموعات بعد التجميع، فتستطيع اختبار قيم مثل COUNT(*) أو SUM(revenue). أما الشروط على الصفوف فمكانها WHERE، الذي يعمل قبل التجميع.","lesson":"l-sql-2-1","course":"sql-for-analysts"},{"id":"bare-column","term":"العمود المجرّد (bare column)","definition":"عمود مختار ليس ضمن التجميع ولا داخل دالة تجميع. يسمح به SQLite ويملؤه من صف اعتباطي في كل مجموعة، بينما يرفض PostgreSQL الـ query.","lesson":"l-sql-2-1","course":"sql-for-analysts"},{"id":"filter-clause","term":"عبارة FILTER","definition":"إضافة قياسية في SQL إلى دالة التجميع، كما في COUNT(*) FILTER (WHERE channel = ‘web’)، تقصر دالة التجميع تلك وحدها على الصفوف المطابقة داخل كل مجموعة.","lesson":"l-sql-2-1","course":"sql-for-analysts"},{"id":"left-join","term":"LEFT JOIN","definition":"ربط يُبقي كل صف من الجدول الأيسر ويملأ أعمدة الجدول الأيمن بـ NULL حيث لا يوجد تطابق. الشروط على الجدول الأيمن مكانها عبارة ON الخاصة به.","lesson":"l-sql-2-2","course":"sql-for-analysts"},{"id":"fan-out","term":"الـ fan-out (تضاعف الصفوف)","definition":"تضاعف الصفوف الذي يحدث حين يتبع الـ JOIN علاقة واحد-إلى-متعدد. القيم المخزّنة في جانب «الواحد» تتكرّر مرة لكل تطابق، فيؤدي جمعها إلى تضخيم المجاميع.","lesson":"l-sql-2-3","course":"sql-for-analysts"},{"id":"derived-table","term":"الجدول المشتق (derived table)","definition":"subquery داخل عبارة FROM يتصرّف كجدول مؤقت بمستوى تفصيل خاص به، ويُستخدم غالبًا لتجميع جدول تفصيلي قبل ربطه.","lesson":"l-sql-2-3","course":"sql-for-analysts"},{"id":"self-join","term":"الـ self-join","definition":"ربط جدول بنفسه باستخدام اسمين مستعارين لدورين مختلفين، مثل الموظف والمدير، لتتبّع رابط مخزّن داخل الجدول نفسه.","lesson":"l-sql-2-4","course":"sql-for-analysts"},{"id":"semi-join","term":"الـ semi-join","definition":"شرط يُبقي الصفوف التي لها تطابق واحد على الأقل في جدول آخر، ويُكتب بـ EXISTS أو IN (subquery). وعلى عكس الـ JOIN، لا يكرّر الصفوف أبدًا.","lesson":"l-sql-2-4","course":"sql-for-analysts"},{"id":"anti-join","term":"الـ anti-join","definition":"شرط يُبقي الصفوف التي لا تطابق لها في جدول آخر، ويُكتب بـ NOT EXISTS أو LEFT JOIN … WHERE right_key IS NULL. أما NOT IN فيفشل حين يحتوي الـ subquery على NULL.","lesson":"l-sql-2-4","course":"sql-for-analysts"},{"id":"scalar-subquery","term":"scalar subquery","definition":"subquery يعيد صفًا واحدًا وعمودًا واحدًا بالضبط، مثل متوسط عام، ويمكن استخدامه في أي مكان يُسمح فيه بقيمة واحدة.","lesson":"l-sql-3-1","course":"sql-for-analysts"},{"id":"cte","term":"الـ CTE (common table expression)","definition":"نتيجة وسيطة مسمّاة تُعرَّف بـ WITH name AS (…). تجعل الـ CTEs التحليل الطويل يُقرأ كخطوات مرتّبة، يمكن تشغيل كلٍّ منها وفحصها وحدها.","lesson":"l-sql-3-1","course":"sql-for-analysts"},{"id":"recursive-cte","term":"الـ CTE التكراري (recursive CTE)","definition":"CTE فيه query ارتكاز، ثم UNION ALL، ثم خطوة ترتبط بالـ CTE نفسه، ويتكرّر حتى لا تظهر صفوف جديدة. يُستخدم لتتبّع التسلسلات الهرمية بأي عمق.","lesson":"l-sql-3-1","course":"sql-for-analysts"},{"id":"window-function","term":"دالة النافذة (window function)","definition":"دالة يتبعها OVER (…) تحسب قيمة من مجموعة صفوف مترابطة مع إبقاء كل صف، على عكس GROUP BY الذي يضغطها في صف واحد.","lesson":"l-sql-3-2","course":"sql-for-analysts"},{"id":"partition-by","term":"PARTITION BY","definition":"الجزء من تعريف النافذة الذي يقسم الصفوف إلى مجموعات، فيبدأ حساب النافذة، مثل الترتيب أو المجموع التراكمي، من جديد لكل مجموعة.","lesson":"l-sql-3-2","course":"sql-for-analysts"},{"id":"lag-lead","term":"LAG وLEAD","definition":"دالتا نافذة تعيدان قيمة من الصف السابق (LAG) أو التالي (LEAD) بترتيب النافذة، وتُستخدمان للمقارنة بين فترة والفترة التي قبلها.","lesson":"l-sql-3-3","course":"sql-for-analysts"},{"id":"window-frame","term":"إطار النافذة (window frame)","definition":"نطاق الصفوف حول الصف الحالي الذي تراه دالة التجميع كدالة نافذة، مثل ROWS BETWEEN 6 PRECEDING AND CURRENT ROW لمتوسط متحرك على 7 صفوف.","lesson":"l-sql-3-3","course":"sql-for-analysts"},{"id":"funnel","term":"القمع (funnel)","definition":"سلسلة من الخطوات، مثل الجلسة ثم الإضافة إلى السلة ثم الشراء، تُعرض كأعداد ومعدلات تحويل من خطوة إلى التي تليها لإظهار أين يتسرّب الناس.","lesson":"l-sql-3-4","course":"sql-for-analysts"},{"id":"cohort-retention","term":"معدل الاحتفاظ (retention) لكل cohort","definition":"نسبة العملاء من مجموعة بدأت في الفترة نفسها، مثل شهر الطلب الأول، الذين عادوا نشطين بعد عدد معيّن من الفترات.","lesson":"l-sql-3-4","course":"sql-for-analysts"},{"id":"data-quality-check","term":"فحص جودة البيانات (data-quality check)","definition":"query يعيد الصفوف التي تخالف قاعدة محدّدة، مثل المراجع اليتيمة أو التواريخ المستحيلة، فتعني النتيجة الفارغة أن القاعدة صامدة.","lesson":"l-sql-4-1","course":"sql-for-analysts"},{"id":"query-plan","term":"خطة التنفيذ (query plan)","definition":"وصف قاعدة البيانات لطريقة تنفيذها query ما، ويُعرض في SQLite بـ EXPLAIN QUERY PLAN. تعني SEARCH أن index ضيّق العمل، وتعني SCAN أن كل صف قد قُرئ.","lesson":"l-sql-4-2","course":"sql-for-analysts"},{"id":"sargable","term":"Sargable","definition":"وصف لشرط تستطيع قاعدة البيانات الإجابة عنه باستخدام index، وهو عادةً عمود مجرّد يُقارَن بثابت. إحاطة العمود بدالة تجعل الشرط في الغالب غير sargable.","lesson":"l-sql-4-2","course":"sql-for-analysts"},{"id":"visual-hierarchy","term":"التسلسل البصري (Visual hierarchy)","definition":"الترتيب الذي يلاحظ به الناس عناصر الشاشة، ويُصنع عن قصد بالحجم والوزن واللون والموضع والمساحة حتى يُرى المحتوى الأهم أولًا.","lesson":"l-fig-1-2","course":"figma-ui-design"},{"id":"proximity","term":"القُرب (Proximity)","definition":"مبدأ من مبادئ الجشطالت يقول إن العناصر المتقاربة تُرى مترابطة. وفي تصميم الواجهات يعني أن المسافة داخل المجموعة يجب أن تكون أصغر من المسافة بين المجموعات.","lesson":"l-fig-1-2","course":"figma-ui-design"},{"id":"type-scale","term":"سلّم أحجام الخط (Type scale)","definition":"قائمة قصيرة وثابتة من أحجام النص، كل حجم مقترن بارتفاع سطر ووزن وله وظيفة مسمّاة مثل Title أو Body أو Caption، وتُستخدم باتّساق في كل الشاشات.","lesson":"l-fig-1-3","course":"figma-ui-design"},{"id":"contrast-ratio","term":"نسبة التباين (Contrast ratio)","definition":"مقياس للفرق في السطوع بين لونين، من 1:1 إلى 21:1. يتطلّب المستوى AA في WCAG نسبة 4.5:1 للنص العادي و3:1 للنص الكبير والعناصر غير النصية الأساسية.","lesson":"l-fig-1-3","course":"figma-ui-design"},{"id":"frame","term":"Frame","definition":"حاوية في Figma لها حجمها وتعبئتها وقصّها والـ constraints الخاصة بها، ويمكن أن تحمل Auto layout أو Layout guides. الشاشات والصفوف والأزرار والبطاقات كلها تُبنى من frames.","lesson":"l-fig-1-4","course":"figma-ui-design"},{"id":"group","term":"Group","definition":"حزمة من الطبقات يُشتقّ حجمها من أبنائها. ليس لها تعبئة ولا padding ولا Auto layout خاص بها، لذا تناسب التجمّعات البصرية الحرّة لا أجزاء الواجهة.","lesson":"l-fig-1-4","course":"figma-ui-design"},{"id":"constraints","term":"Constraints","definition":"قواعد على ابن داخل frame عادي تحدّد كيف يتحرّك أو يتمدّد حين يتغيّر حجم الـ frame، مثل Left and right أو Bottom أو Center أو Scale.","lesson":"l-fig-1-4","course":"figma-ui-design"},{"id":"auto-layout","term":"Auto layout","definition":"إعداد في الـ frame يرتّب أبناءه تلقائيًا في flow عمودي أو أفقي أو شبكي، مع gap محدّد بينها وpadding حولها، ويعيد الترتيب كلما تغيّر المحتوى.","lesson":"l-fig-2-1","course":"figma-ui-design"},{"id":"gap-padding","term":"Gap وPadding","definition":"في الـ Auto layout، الـ gap هو المسافة بين الأبناء الإخوة، والـ padding هو المسافة بين الأبناء وحوافّ الـ frame الأب. وكلاهما يخصّ الأب.","lesson":"l-fig-2-1","course":"figma-ui-design"},{"id":"hug-fill-fixed","term":"Hug وFill وFixed","definition":"خيارات تحديد الحجم في الـ Auto layout. ‏Hug contents يجعل الـ frame بحجم أبنائه، وFill container يأخذ المساحة المتاحة في الأب، وFixed يحافظ على حجم دقيق مهما كان المحتوى.","lesson":"l-fig-2-2","course":"figma-ui-design"},{"id":"wrap","term":"Wrap","definition":"خيار في الـ Auto layout للـ flow الأفقي والعمودي ينقل الأبناء إلى سطر جديد حين لا يعود السطر الحالي يتّسع لها، وهو مفيد للشرائح والوسوم في الشاشات الضيّقة.","lesson":"l-fig-2-2","course":"figma-ui-design"},{"id":"ignore-auto-layout","term":"Ignore auto layout","definition":"إعداد كان اسمه absolute position، يخرج ابنًا واحدًا من الـ flow الخاص بالـ Auto layout فيُحدَّد موضعه بالـ constraints، مثل شارة على زاوية أيقونة.","lesson":"l-fig-2-2","course":"figma-ui-design"},{"id":"layout-guide","term":"Layout guide","definition":"أداة بصرية مساعدة مرتبطة بالـ frame، كانت تُسمّى layout grid، على شكل أعمدة أو صفوف أو شبكة منتظمة، وتُعرَّف بالعدد والهامش والـ gutter. لا تحرّك الطبقات من تلقاء نفسها أبدًا.","lesson":"l-fig-2-3","course":"figma-ui-design"},{"id":"eight-point-system","term":"نظام الـ 8 نقاط (8-point system)","definition":"اصطلاح للمسافات تكون فيه الأحجام والمسافات من مضاعفات 8، مع 4 كنصف خطوة، فتتدرّج القيم بسلاسة عبر كثافات الشاشات وتختار الفرق من قائمة قصيرة.","lesson":"l-fig-2-3","course":"figma-ui-design"},{"id":"breakpoint","term":"Breakpoint","definition":"عرض يغيّر عنده التخطيط بنيته، مثل شبكة إحصاءات تنتقل من عمودين إلى أربعة. الـ breakpoints الجيدة تأتي من النقطة التي يتوقّف فيها المحتوى عن العمل، لا من قوائم الأجهزة.","lesson":"l-fig-2-4","course":"figma-ui-design"},{"id":"main-component","term":"Main component","definition":"التعريف المصدر لعنصر قابل لإعادة الاستخدام في Figma. تتدفّق تغييراته إلى كل instance مرتبطة به، باستثناء الخصائص التي طبّقت عليها الـ instance ‏override.","lesson":"l-fig-3-1","course":"figma-ui-design"},{"id":"instance","term":"Instance","definition":"نسخة مرتبطة من main component. يمكنها تطبيق overrides على المحتوى والمظهر مثل النص والتعبئة والظهور والـ instances المتداخلة، لكنها لا تستطيع تغيير بنية طبقاتها.","lesson":"l-fig-3-1","course":"figma-ui-design"},{"id":"variant","term":"Variant","definition":"نسخة واحدة من component داخل component set، تصفها variant properties مثل State=Done، وتُستخدم للاختلافات التي تعيد تنسيق عدّة طبقات معًا.","lesson":"l-fig-3-2","course":"figma-ui-design"},{"id":"component-property","term":"Component property","definition":"مفتاح في الـ component تستطيع الـ instances تغييره دون variants جديدة: boolean للظهور، وtext للنصوص القابلة للتعديل، وinstance swap للـ components المتداخلة، وslots لمناطق المحتوى المرنة.","lesson":"l-fig-3-2","course":"figma-ui-design"},{"id":"variable","term":"Variable","definition":"قيمة مفردة مسمّاة في Figma، مثل لون أو رقم أو نص أو boolean، يمكن ربطها بخصائص الطبقات، وأن تكون alias لـ variable آخر، وأن تحمل قيمًا مختلفة لكل mode.","lesson":"l-fig-3-3","course":"figma-ui-design"},{"id":"semantic-token","term":"الـ token الدلالي (Semantic token)","definition":"variable يُسمّى بحسب دوره، مثل color/action/primary، وهو alias لقيمة خام من لوحة الألوان. ترتبط الـ components بالـ tokens الدلالية، فيبقى تغيير الثيم أو لوحة الألوان تعديلًا واحدًا.","lesson":"l-fig-3-3","course":"figma-ui-design"},{"id":"style","term":"Style","definition":"مركّب مسمّى وقابل لإعادة الاستخدام من الخصائص البصرية في Figma، مثل text style يضمّ نوع الخط وحجمه ووزنه وارتفاع السطر، أو effect style يحمل ظلالًا متراكبة.","lesson":"l-fig-3-3","course":"figma-ui-design"},{"id":"variable-mode","term":"Variable mode","definition":"عمود واحد من القيم في collection من الـ variables، مثل Light أو Dark. ضبط mode على frame أو صفحة يستبدل كل قيمة مرتبطة دفعة واحدة، ويرثه الأبناء.","lesson":"l-fig-3-4","course":"figma-ui-design"},{"id":"library","term":"المكتبة (Library)","definition":"ملف Figma منشور تستطيع الملفات الأخرى استخدام الـ components والـ styles والـ variables فيه. وتُبلَّغ الملفات التي تستخدمه بالتحديثات، فتختار متى تقبلها.","lesson":"l-fig-3-5","course":"figma-ui-design"},{"id":"interactive-component","term":"Interactive component","definition":"component set فيه تفاعلات prototype بين الـ variants الخاصة به، مثل On tap مع Change to ‏Done، فتستجيب كل instance في الـ prototypes دون شاشات إضافية.","lesson":"l-fig-4-1","course":"figma-ui-design"},{"id":"smart-animate","term":"Smart animate","definition":"حركة في الـ prototype تطابق الطبقات ذات الاسم والتسلسل الهرمي نفسيهما في frame-ين، وتحرّك الاختلافات في الموضع والحجم والدوران والشفافية والتعبئة.","lesson":"l-fig-4-1","course":"figma-ui-design"},{"id":"target-size","term":"حجم الهدف (Target size)","definition":"مساحة النقر في العنصر التفاعلي. يتطلّب المستوى AA في WCAG 2.2 ما لا يقلّ عن 24 × 24 CSS pixels؛ وتوصي Apple بـ 44 نقطة، ويوصي Material بـ 48 dp.","lesson":"l-fig-4-2","course":"figma-ui-design"},{"id":"ready-for-dev","term":"Ready for dev","definition":"حالة في Dev Mode توضع على الـ sections أو الـ frames أو الـ components لتشير إلى أن التصميم مستقرّ بما يكفي لبنائه. وأي تعديل لاحق يغيّر الحالة تلقائيًا إلى Changed.","lesson":"l-fig-4-3","course":"figma-ui-design"},{"id":"design-critique","term":"النقد التصميمي (Design critique)","definition":"جلسة منظّمة يقيّم فيها الناس تصميمًا مقابل أهدافه المعلنة، فيقدّمون ملاحظات، وما يترتّب عليها، وأسئلة بدل التفضيلات الشخصية أو الموافقة.","lesson":"l-fig-4-4","course":"figma-ui-design"},{"id":"design-system","term":"نظام التصميم (Design system)","definition":"المجموعة المشتركة من الـ tokens والمكوّنات والأنماط والتوثيق، ومعها الناس والعمليات التي تُبقيها محدَّثة، حتى تبني فرق كثيرة واجهات متّسقة دون إعادة التفكير في كل قرار من الصفر.","lesson":"l-ds-1-1","course":"design-systems"},{"id":"interface-inventory","term":"جرد الواجهة (Interface inventory)","definition":"تدقيق يجمع كل نسخة من كل عنصر في واجهات المنتجات مجمّعة حسب النوع، ليصبح التكرار مرئيًا، ولتحديد ما يجب أن يملكه نظام التصميم أولًا.","lesson":"l-ds-1-2","course":"design-systems"},{"id":"design-principle","term":"مبدأ التصميم (Design principle)","definition":"عبارة قصيرة تنحاز إلى طرف في مفاضلة حقيقية، مثل «إمكانية الوصول قبل الجمال»، حتى تستطيع حسم خلافات التصميم دون اجتماع طويل.","lesson":"l-ds-1-3","course":"design-systems"},{"id":"hybrid-team-model","term":"نموذج الفريق الهجين (Hybrid team model)","definition":"طريقة لإدارة نظام التصميم تملك فيها نواة صغيرة متفرّغة الـ tokens والمراجعات والإصدارات، بينما تساهم فرق المنتجات بمكوّنات وإصلاحات عبر عملية محدّدة.","lesson":"l-ds-1-3","course":"design-systems"},{"id":"design-token","term":"Design token","definition":"قرار تصميم له اسم، مثل لون أو قيمة مسافة أو حجم خط، يُخزَّن مرة واحدة وتشير إليه أدوات التصميم والكود باسمه بدل تكرار القيم الخام.","lesson":"l-ds-2-1","course":"design-systems"},{"id":"primitive-token","term":"Primitive token","definition":"token يسمّي قيمة خامًا بحسب ما هي، مثل <code dir=\"ltr\">--nw-blue-600</code>، دون أن يقول أين تُستخدم. والـ primitives تشكّل لوحة ألوان النظام وسلالمه.","lesson":"l-ds-2-1","course":"design-systems"},{"id":"semantic-token","term":"Semantic token","definition":"token يسمّي نيّة، مثل <code dir=\"ltr\">--nw-color-action-bg</code>، ويشير إلى primitive. والـ themes والعلامات تغيّر الـ primitive الذي يشير إليه كل semantic token.","lesson":"l-ds-2-1","course":"design-systems"},{"id":"component-token","term":"Component token","definition":"token خاص بمكوّن واحد، مثل <code dir=\"ltr\">--nw-button-bg</code>، يشير إلى semantic token ويسمح بتعديل ذلك المكوّن دون التأثير في المكوّنات الأخرى.","lesson":"l-ds-2-1","course":"design-systems"},{"id":"naming-grammar","term":"قواعد تسمية الـ tokens (Token naming grammar)","definition":"ترتيب ثابت لأجزاء الاسم، مثل الفئة والمفهوم والخاصية والـ variant والحالة، يجعل أسماء الـ tokens سهلة التخمين والترتيب، وقابلة للفحص بقاعدة lint.","lesson":"l-ds-2-2","course":"design-systems"},{"id":"theme","term":"Theme","definition":"إعادة ربط للـ semantic tokens بـ primitives مختلفة، مثل الـ theme الداكن، تُطبَّق بـ selector مثل <code dir=\"ltr\">[data-theme=&quot;dark&quot;]</code> بينما تبقى المكوّنات بلا تغيير.","lesson":"l-ds-2-3","course":"design-systems"},{"id":"mode-axis","term":"محور الـ mode (Mode axis)","definition":"بُعد مستقل من أبعاد الـ theming، مثل نظام الألوان أو العلامة أو الكثافة، يملك مجموعة tokens خاصة به، فتتركّب التركيبات دون ملف منفصل لكل منها.","lesson":"l-ds-2-3","course":"design-systems"},{"id":"dtcg-format","term":"صيغة DTCG (DTCG format)","definition":"صيغة JSON للـ design tokens حدّدتها مجموعة Design Tokens Community Group التابعة لـ W3C، وأول إصدار مستقر منها، 2025.10، يغطّي الـ tokens والأنواع والمجموعات والأسماء المستعارة والألوان.","lesson":"l-ds-2-4","course":"design-systems"},{"id":"alias","term":"الاسم المستعار (Alias)","definition":"token تشير قيمته إلى token آخر بمساره بين أقواس معقوفة، مثل <code dir=\"ltr\">{color.blue.600}</code>. ويجب أن يشير إلى token، لا إلى مجموعة أبدًا.","lesson":"l-ds-2-4","course":"design-systems"},{"id":"token-pipeline","term":"خط إنتاج الـ tokens (Token pipeline)","definition":"خطوة بناء تحلّل ملفات الـ tokens، وتحلّ الأسماء المستعارة، وتحوّل الأسماء والقيم لكل منصّة، وتكتب صيغًا مثل CSS custom properties وSwift وKotlin.","lesson":"l-ds-2-5","course":"design-systems"},{"id":"output-references","term":"Output references","definition":"إعداد في خط الإنتاج يُبقي الأسماء المستعارة مراجع <code dir=\"ltr\">var()</code> في الـ CSS المولَّد بدل القيم المحلولة، فتصل طبقات الـ tokens والتخصيصات وقت التشغيل إلى المتصفّح سليمة.","lesson":"l-ds-2-5","course":"design-systems"},{"id":"variant","term":"Variant","definition":"واحد من مجموعة ثابتة من الأنماط المتنافية لمكوّن ما، مثل primary أو secondary أو danger، ويُعبَّر عنه أفضل بـ prop واحد من نوع enum بدل قيم منطقية منفصلة.","lesson":"l-ds-3-1","course":"design-systems"},{"id":"slot","term":"Slot","definition":"مكان في المكوّن يمرّر فيه المستخدم محتوى، مثل <code dir=\"ltr\">children</code> أو عنصر <code dir=\"ltr\">startIcon</code>، بدل ضبط ذلك المحتوى عبر مزيد من الـ props.","lesson":"l-ds-3-1","course":"design-systems"},{"id":"compound-component","term":"المكوّن المركّب (Compound component)","definition":"مكوّن مؤلّف من قطع متعاونة، مثل <code dir=\"ltr\">Tabs.List</code> و<code dir=\"ltr\">Tabs.Trigger</code>، يرتّبها المستخدم بحرية بينما تتشارك القطع الحالة عبر الـ context.","lesson":"l-ds-3-2","course":"design-systems"},{"id":"state-matrix","term":"مصفوفة الحالات (State matrix)","definition":"شبكة تقابل كل variant بكل حالة تفاعل، مثل الـ hover والتركيز المرئي والتعطيل والتحميل والضغط، وتُستخدم لتصميم المكوّن وبنائه واختباره بالكامل.","lesson":"l-ds-3-3","course":"design-systems"},{"id":"focus-visible","term":":focus-visible","definition":"pseudo-class في CSS يتطابق حين يقرّر المتصفّح أن التركيز يجب أن يكون مرئيًا، وعادةً بعد التنقّل بلوحة المفاتيح، ويُستخدم لإظهار حلقات التركيز دون إظهارها مع معظم نقرات الفأرة.","lesson":"l-ds-3-3","course":"design-systems"},{"id":"figma-variable-mode","term":"الـ mode في Figma variables (Figma variable mode)","definition":"واحدة من عدّة مجموعات قيم لمتغيّرات collection في Figma، مثل Light وDark، تُطبَّق على الإطارات كما تُطبَّق selectors الـ theme على أقسام الصفحة.","lesson":"l-ds-4-1","course":"design-systems"},{"id":"semver","term":"الترقيم الدلالي للإصدارات (Semantic versioning)","definition":"نظام ترقيم بالشكل MAJOR.MINOR.PATCH، تُصلح فيه الـ patches الأخطاء، وتضيف الـ minors ميزات متوافقة مع ما سبق، وتحتوي الـ majors تغييرات قد تكسر الاستخدام الحالي.","lesson":"l-ds-4-2","course":"design-systems"},{"id":"changeset","term":"Changeset","definition":"ملف صغير يُضاف إلى الـ pull request يذكر رفع الإصدار الذي يحتاجه التغيير وملخّصًا موجّهًا للمستخدمين، ويُجمَع لاحقًا في رقم الإصدار والـ changelog.","lesson":"l-ds-4-2","course":"design-systems"},{"id":"deprecation","term":"Deprecation","definition":"تعليم API أو token أو مكوّن بأنه مُقرَّر حذفه بينما ما زال يعمل، مع ذكر بديله وإصدار حذفه، حتى تنتقل الفرق قبل أن يختفي.","lesson":"l-ds-4-3","course":"design-systems"},{"id":"codemod","term":"Codemod","definition":"سكربت يعيد كتابة الكود المصدري آليًا، مثل إعادة تسمية prop مُهمَل عبر مستودع كامل، فتصبح عمليات الانتقال مراجعات بدل عمل يدوي.","lesson":"l-ds-4-3","course":"design-systems"},{"id":"visual-regression-test","term":"اختبار الانحدار البصري (Visual regression test)","definition":"اختبار يلتقط صورة لحالة مكوّن ويقارنها بصورة مرجعية معتمدة، ويفشل عند وجود فروق يقبلها إنسان بعد ذلك كتغيير مقصود أو يرفضها كخلل.","lesson":"l-ds-4-4","course":"design-systems"},{"id":"rfc","term":"RFC (طلب تعليقات)","definition":"اقتراح مكتوب لتغيير كبير، مثل مكوّن جديد، يعرض المشكلة والأدلّة ومسوّدة الـ API وخطة إمكانية الوصول، لمراجعة علنية قبل البناء.","lesson":"l-ds-5-1","course":"design-systems"},{"id":"brand-tier","term":"طبقة العلامة (Brand tier)","definition":"طبقة صغيرة من الـ tokens بين الـ primitives والـ semantic tokens، مثل تدرّج الألوان والخطوط وأنصاف الأقطار، تربطها كل علامة تجارية بقيمها الخاصة.","lesson":"l-ds-5-2","course":"design-systems"},{"id":"adoption-rate","term":"معدّل التبنّي (Adoption rate)","definition":"نسبة عناصر الواجهة في منتج ما التي تعرضها مكوّنات نظام التصميم الحقيقية، وتُقاس بإشارات لا تنتجها إلا تلك المكوّنات، وتُتابَع كاتّجاه عبر الزمن.","lesson":"l-ds-5-3","course":"design-systems"},{"id":"native-view","term":"Native view","definition":"عنصر واجهة من المنصّة، مثل UIView على iOS أو android.view.View على Android، ينشئه React Native ويحدّثه انطلاقًا من الـ components الخاصة بك بدلًا من رسم HTML.","lesson":"l-rn-1-1","course":"react-native-apps"},{"id":"new-architecture","term":"New Architecture","definition":"نظام الرسم والوحدات الأصلية في React Native، المبني على JSI ومُصيِّر Fabric والـ TurboModules. وهو المعمارية الوحيدة منذ الإصدار 0.82 من React Native.","lesson":"l-rn-1-1","course":"react-native-apps"},{"id":"hermes","term":"Hermes","definition":"محرّك JavaScript المصمّم لـ React Native. يشغّل كود JavaScript في تطبيقك على thread خاص به، منفصل عن الـ UI thread الذي يرسم الـ views ويستقبل اللمسات.","lesson":"l-rn-1-1","course":"react-native-apps"},{"id":"expo-go","term":"Expo Go","definition":"تطبيق من المتجر فيه مجموعة ثابتة من الوحدات الأصلية، يحمّل كود JavaScript الخاص بمشروعك من خادم التطوير. ممتاز للتعلّم، لكنه لا يستطيع أن يضمّ كودًا أصليًا مخصّصًا.","lesson":"l-rn-1-2","course":"react-native-apps"},{"id":"development-build","term":"Development build","definition":"ملف تطبيقك الخاص، بوحداتك الأصلية وهويّتك وإعداداتك، إضافةً إلى أدوات التطوير مثل Fast Refresh. تنشئه باستخدام npx expo run أو EAS Build.","lesson":"l-rn-1-2","course":"react-native-apps"},{"id":"metro","term":"Metro","definition":"مُجمِّع JavaScript وخادم التطوير الذي يشغّله الأمر npx expo start. يقدّم كودك إلى Expo Go أو إلى الـ development build، وعليه يعتمد Fast Refresh.","lesson":"l-rn-1-2","course":"react-native-apps"},{"id":"pressable","term":"Pressable","definition":"الـ component الأساسي لكل ما يُنقَر. يُبلغ عن الضغطات والضغطات المطوّلة، ويمكن أن يكون التنسيق الخاص به دالة لحالة الضغط لإعطاء استجابة بصرية فورية.","lesson":"l-rn-1-4","course":"react-native-apps"},{"id":"hit-slop","term":"hitSlop","definition":"prop في Pressable يوسّع منطقة اللمس إلى ما وراء العنصر المرئي، فتستطيع الأيقونات الصغيرة مع ذلك بلوغ الحدّ الأدنى لهدف اللمس وهو 44 نقطة.","lesson":"l-rn-1-4","course":"react-native-apps"},{"id":"style-array","term":"مصفوفة التنسيق (style array)","definition":"prop التنسيق حين يُعطى مصفوفةً من كائنات التنسيق. يدمجها React Native من اليسار إلى اليمين، فتفوز المفاتيح اللاحقة، وتُتخطّى القيم الزائفة.","lesson":"l-rn-2-1","course":"react-native-apps"},{"id":"density-independent-point","term":"النقطة المستقلّة عن الكثافة (density-independent point)","definition":"الوحدة التي تقف خلف كل رقم بلا وحدة في تنسيقات React Native. تحوّل المنصّة النقاط إلى بكسلات فعلية، فتبدو الأحجام متماثلة على الشاشات منخفضة الكثافة وعالية الكثافة.","lesson":"l-rn-2-1","course":"react-native-apps"},{"id":"main-axis","term":"المحور الرئيسي (main axis)","definition":"الاتجاه الذي ترتّب فيه حاوية flex أبناءها، ويحدّده flexDirection. وهو عمودي افتراضيًا في React Native، ويحدّد justifyContent مواضع الأبناء على امتداده.","lesson":"l-rn-2-2","course":"react-native-apps"},{"id":"safe-area","term":"Safe area","definition":"جزء الشاشة الذي لا تغطّيه النتوءات ولا الزوايا المستديرة ولا مؤشّر الشاشة الرئيسية ولا أشرطة النظام. والشاشات التي ليس لها ترويسة تضيف حشوها بنفسها عبر هوامش react-native-safe-area-context.","lesson":"l-rn-2-3","course":"react-native-apps"},{"id":"virtualization","term":"Virtualization","definition":"التقنية التي يستخدمها FlatList وSectionList لتركيب الصفوف القريبة من منطقة العرض فقط، واستبدال البقية بفراغ، فتبقى القوائم الطويلة سريعة وخفيفة على الذاكرة.","lesson":"l-rn-2-4","course":"react-native-apps"},{"id":"key-extractor","term":"keyExtractor","definition":"prop في FlatList يُرجع مفتاحًا ثابتًا وفريدًا لكل عنصر، وهو معرّفه عادةً، فتحتفظ الصفوف بهويّتها الصحيحة حين تُضاف العناصر أو تُحذف أو يُعاد ترتيبها.","lesson":"l-rn-2-4","course":"react-native-apps"},{"id":"file-based-routing","term":"التوجيه المبني على الملفات (file-based routing)","definition":"نموذج Expo Router الذي يكون فيه كل ملف داخل src/app شاشةً ومساره هو الـ URL، مع ملفات _layout تغلّف المسارات المجاورة بأداة تنقّل.","lesson":"l-rn-3-1","course":"react-native-apps"},{"id":"stack-navigator","term":"Stack navigator","definition":"أداة تنقّل تضيف الشاشات بعضها فوق بعض مع حركات أصلية وإيماءات رجوع. وتبقى الشاشات التي تحتها مركّبة، محتفظةً بالـ state وموضع التمرير.","lesson":"l-rn-3-1","course":"react-native-apps"},{"id":"route-group","term":"مجموعة المسارات (route group)","definition":"مجلّد اسمه بين قوسين، مثل (tabs). يتيح لمساراته مشاركة layout واحد دون أن يضيف جزءًا إلى عناوين URL الخاصة بها.","lesson":"l-rn-3-2","course":"react-native-apps"},{"id":"dynamic-route","term":"المسار الديناميكي (dynamic route)","definition":"ملف مسار اسمه بين أقواس مربّعة، مثل [id].tsx، يطابق أي جزء مفرد من الـ URL ويكشفه param نصيًا عبر useLocalSearchParams.","lesson":"l-rn-3-2","course":"react-native-apps"},{"id":"protected-route","term":"المسار المحمي (protected route)","definition":"مسار مغلّف بـ Stack.Protected مع شرط guard. ما دام الشرط false يكون المسار غير متاح، ويُعاد توجيه أي تنقّل إليه، بما في ذلك من الـ deep links.","lesson":"l-rn-3-5","course":"react-native-apps"},{"id":"deep-link","term":"Deep link","definition":"رابط URL، مثل trailhead://hikes/42، يفتح التطبيق مباشرة على شاشة محدّدة. ويربطه Expo Router بملف المسار المناسب تلقائيًا.","lesson":"l-rn-3-5","course":"react-native-apps"},{"id":"async-storage","term":"AsyncStorage","definition":"مخزن مفتاح-قيمة للنصوص، غير متزامن وغير مشفّر. يناسب التفضيلات الصغيرة، لا الأسرار ولا المجموعات الكبيرة من السجلّات التي تحتاج إلى الاستعلام عنها.","lesson":"l-rn-4-2","course":"react-native-apps"},{"id":"secure-store","term":"SecureStore","definition":"الوحدة expo-secure-store، التي تشفّر القيم الصغيرة مثل الـ tokens باستخدام Keychain في iOS وKeystore في Android.","lesson":"l-rn-4-2","course":"react-native-apps"},{"id":"migration","term":"ترحيل قاعدة البيانات (database migration)","definition":"خطوة مرقّمة بإصدار ترقّي مخطّط قاعدة بيانات موجودة، كإضافة عمود، وتُنفَّذ مرة واحدة على كل جهاز بالترتيب، وتُتتبَّع عادةً عبر PRAGMA user_version في SQLite.","lesson":"l-rn-4-2","course":"react-native-apps"},{"id":"config-plugin","term":"Config plugin","definition":"مُدخل في app.json يكتب الإعدادات الأصلية، مثل أوصاف الأذونات في iOS أو مُدخلات الـ manifest في Android، حين يُبنى التطبيق. وأي تغيير فيه يحتاج إلى build جديد.","lesson":"l-rn-4-3","course":"react-native-apps"},{"id":"can-ask-again","term":"canAskAgain","definition":"حقل في استجابة الأذونات في Expo. حين تكون قيمته false، لا يعرض النظام نافذة الإذن مرة أخرى، فلا يستطيع تغيير إجابة المستخدم إلا تطبيق الإعدادات.","lesson":"l-rn-4-3","course":"react-native-apps"},{"id":"react-native-devtools","term":"React Native DevTools","definition":"أداة التصحيح المدمجة، تُفتح بالضغط على j في طرفية Metro، وتقدّم console ونقاط توقّف ومستكشف Components وProfiler لتطبيقك العامل.","lesson":"l-rn-5-1","course":"react-native-apps"},{"id":"jest-expo","term":"jest-expo","definition":"preset لأداة Jest يضبط التحويلات اللازمة لـ React Native ويصنع mock للجانب الأصلي من وحدات Expo، فتعمل الاختبارات في Node دون جهاز.","lesson":"l-rn-5-2","course":"react-native-apps"},{"id":"eas-build","term":"EAS Build","definition":"خدمة Expo السحابية التي تترجم ملفات تطبيقات Android وiOS وتوقّعها من مشروعك، باستخدام profiles معرّفة في eas.json مثل development وpreview وproduction.","lesson":"l-rn-5-3","course":"react-native-apps"},{"id":"eas-update","term":"EAS Update","definition":"خدمة Expo لنشر كود JavaScript وassets جديدة إلى الـ builds المثبّتة عبر الهواء، دون إصدار في المتجر. ولا تستطيع إيصال تغييرات الكود الأصلي.","lesson":"l-rn-5-4","course":"react-native-apps"},{"id":"runtime-version","term":"إصدار وقت التشغيل (runtime version)","definition":"وسم مشترك بين build والتحديثات المتوافقة معه. لا ينطبق التحديث إلا على الـ builds التي لها إصدار وقت التشغيل نفسه، وهذا يحمي الـ builds القديمة من كود JavaScript يحتاج إلى كود أصلي أحدث.","lesson":"l-rn-5-4","course":"react-native-apps"},{"id":"type-inference","term":"استنتاج النوع (Type inference)","definition":"قدرة Swift على معرفة نوع القيمة من القيمة التي تسندها، فيكون <code dir=\"ltr\">let cups = 3</code> من النوع <code dir=\"ltr\">Int</code> دون تحديد صريح. ويبقى النوع ثابتًا بعد ذلك.","lesson":"l-sw-1-1","course":"swift-essentials"},{"id":"decimal","term":"Decimal","definition":"نوع أرقام من Foundation يخزّن الأرقام بالنظام العشري بدقة، ما يجعله الخيار الصحيح للمال. وعلى عكس <code dir=\"ltr\">Double</code>، إضافة 0.1 عشر مرات تعطي 1 بالضبط.","lesson":"l-sw-1-1","course":"swift-essentials"},{"id":"optional","term":"Optional","definition":"نوع مثل <code dir=\"ltr\">Decimal?</code> يحمل إما قيمة أو <code dir=\"ltr\">nil</code>. لا تسمح لك Swift باستخدامه كقيمة عادية حتى تفكّه بأمان.","lesson":"l-sw-1-2","course":"swift-essentials"},{"id":"guard-let","term":"guard let","definition":"جملة تفكّ optional أو تفحص شرطًا، ويجب أن يغادر فرع <code dir=\"ltr\">else</code> فيها النطاق. وبعدها تبقى القيمة المفكوكة متاحة حتى نهاية الدالة.","lesson":"l-sw-1-2","course":"swift-essentials"},{"id":"nil-coalescing","term":"عامل الدمج مع nil (??)","definition":"العامل <code dir=\"ltr\">??</code> الذي يعيد القيمة الموجودة داخل optional، أو قيمة افتراضية حين يكون الـ optional مساويًا لـ <code dir=\"ltr\">nil</code>، كما في <code dir=\"ltr\">note ?? &quot;No note&quot;</code>.","lesson":"l-sw-1-2","course":"swift-essentials"},{"id":"force-unwrap","term":"الفكّ القسري (Force unwrap !)","definition":"كتابة <code dir=\"ltr\">!</code> بعد optional لأخذ قيمته دون فحص. إن كان الـ optional مساويًا لـ <code dir=\"ltr\">nil</code> يتعطّل التطبيق فورًا، فاستخدمه فقط حين تكون <code dir=\"ltr\">nil</code> خطأً من المبرمج.","lesson":"l-sw-1-2","course":"swift-essentials"},{"id":"exhaustive-switch","term":"الـ switch الشاملة (Exhaustive switch)","definition":"قاعدة Swift التي تُلزم جملة <code dir=\"ltr\">switch</code> بمعالجة كل قيمة ممكنة. ومع الـ enums تجعل الـ compiler يسرد كل switch يجب تحديثها حين تضيف حالة.","lesson":"l-sw-1-3","course":"swift-essentials"},{"id":"closure","term":"Closure","definition":"كتلة كود بلا اسم يمكن تخزينها، وتمريرها إلى دوال مثل <code dir=\"ltr\">filter</code> أو <code dir=\"ltr\">map</code>، واستدعاؤها لاحقًا. وتلتقط المتغيّرات التي تستخدمها من النطاق المحيط بها.","lesson":"l-sw-1-4","course":"swift-essentials"},{"id":"value-semantics","term":"سلوك القيمة (Value semantics)","definition":"سلوك الـ structs والـ enums: إسناد القيمة أو تمريرها ينتج نسخة مستقلّة، فتغيير النسخة لا يؤثّر أبدًا في الأصل.","lesson":"l-sw-2-1","course":"swift-essentials"},{"id":"reference-semantics","term":"سلوك المرجع (Reference semantics)","definition":"سلوك الـ classes والـ actors: إسناد instance ينسخ مرجعًا، فيمكن لعدة أسماء أن تشير إلى الكائن نفسه وترى تغييرات بعضها.","lesson":"l-sw-2-1","course":"swift-essentials"},{"id":"mutating","term":"mutating","definition":"كلمة مفتاحية توضع على methods الـ structs والـ enums التي تغيّر خصائص القيمة نفسها. ولا تُستدعى الـ mutating methods إلا على <code dir=\"ltr\">var</code>، لا على <code dir=\"ltr\">let</code> أبدًا.","lesson":"l-sw-2-1","course":"swift-essentials"},{"id":"retain-cycle","term":"دورة الاحتفاظ (Retain cycle)","definition":"كائنان، أو كائن وclosure، يحمل كلٌّ منهما مرجعًا قويًا إلى الآخر، فلا يستطيع ARC تحرير أيٍّ منهما. والتقاط <code dir=\"ltr\">[weak self]</code> داخل الـ closure يكسر الدورة.","lesson":"l-sw-2-1","course":"swift-essentials"},{"id":"associated-value","term":"القيمة المرتبطة (Associated value)","definition":"بيانات مرفقة بحالة معيّنة من enum لكل instance، مثل <code dir=\"ltr\">case card(lastFour: String)</code>. وتقرؤها من جديد عبر مطابقة الأنماط مثل <code dir=\"ltr\">case .card(let lastFour)</code>.","lesson":"l-sw-2-2","course":"swift-essentials"},{"id":"raw-value","term":"القيمة الخام (Raw value)","definition":"نص <code dir=\"ltr\">String</code> أو رقم ثابت يُخزَّن لكل حالة في enum معرّف مثل <code dir=\"ltr\">enum Category: String</code>. ويحوّل <code dir=\"ltr\">init(rawValue:)</code> في الاتجاه المعاكس ويعيد <code dir=\"ltr\">nil</code> للقيم غير المعروفة.","lesson":"l-sw-2-2","course":"swift-essentials"},{"id":"protocol","term":"Protocol","definition":"مجموعة مسمّاة من المتطلّبات، مثل الخصائص والـ methods، تستطيع الـ structs والـ classes والـ enums تبنّيها. والكود المكتوب للـ protocol يعمل مع كل نوع متوافق معه.","lesson":"l-sw-2-3","course":"swift-essentials"},{"id":"protocol-extension","term":"Protocol extension","definition":"extension على protocol يوفّر تنفيذات افتراضية، فيكتسب كل نوع متوافق ذلك السلوك دون كتابته مرة أخرى.","lesson":"l-sw-2-3","course":"swift-essentials"},{"id":"typed-throws","term":"Typed throws","definition":"صيغة في Swift 6 مثل <code dir=\"ltr\">throws(BudgetError)</code> تسمّي نوع الخطأ الدقيق الذي قد ترميه الدالة، فيستطيع المستدعون كتابة switch شاملة على الخطأ دون حالة التقاط عامة.","lesson":"l-sw-2-4","course":"swift-essentials"},{"id":"modifier","term":"View modifier","definition":"method مثل <code dir=\"ltr\">.padding()</code> أو <code dir=\"ltr\">.font(.headline)</code> تغلّف view في SwiftUI داخل view جديد مع تطبيق تغيير. وتُطبَّق الـ modifiers بالترتيب، لذلك ترتيبها مهم.","lesson":"l-sw-3-1","course":"swift-essentials"},{"id":"state","term":"@State","definition":"property wrapper في SwiftUI يخزّن قيمة يملكها الـ view خارج الـ struct الخاص به، فتبقى بعد كل re-render وتطلق تحديثًا حين تتغيّر.","lesson":"l-sw-3-2","course":"swift-essentials"},{"id":"binding","term":"Binding","definition":"اتصال في الاتجاهين مع قيمة يملكها طرف آخر، يُكتب بالبادئة <code dir=\"ltr\">$</code>. وعناصر التحكّم مثل <code dir=\"ltr\">Toggle</code> و<code dir=\"ltr\">TextField</code> تأخذ bindings لتقرأ مصدر الحقيقة وتكتب فيه.","lesson":"l-sw-3-2","course":"swift-essentials"},{"id":"observable","term":"@Observable","definition":"ماكرو من إطار Observation يجعل خصائص الـ class قابلة للتتبّع، فلا يعيد SwiftUI رسم إلا الـ views التي قرأ الـ body الخاص بها خاصية تغيّرت.","lesson":"l-sw-3-2","course":"swift-essentials"},{"id":"navigation-stack","term":"NavigationStack","definition":"حاوية في SwiftUI تدفع الشاشات وتُخرجها. يختار <code dir=\"ltr\">NavigationLink(value:)</code> قيمة، ويقرّر <code dir=\"ltr\">.navigationDestination(for:)</code> أيّ شاشة تعرضها.","lesson":"l-sw-3-3","course":"swift-essentials"},{"id":"structured-concurrency","term":"الـ concurrency المهيكلة (Structured concurrency)","definition":"تشغيل العمل غير المتزامن كمهام أبناء، عبر <code dir=\"ltr\">async let</code> أو مجموعات المهام، يجب أن تنتهي قبل أن يعود الأب. وإلغاء الأب يلغي كل الأبناء تلقائيًا.","lesson":"l-sw-4-1","course":"swift-essentials"},{"id":"actor","term":"Actor","definition":"نوع مرجعي يحمي الـ state القابلة للتغيير الخاصة به بتنفيذ استدعاء واحد في كل مرة. والكود خارج الـ actor يجب أن يستخدم <code dir=\"ltr\">await</code> للوصول إليه، وهذا يمنع سباقات البيانات.","lesson":"l-sw-4-1","course":"swift-essentials"},{"id":"sendable","term":"Sendable","definition":"protocol يعلّم الأنواع الآمنة للتمرير بين نطاقات الـ concurrency. والـ structs المبنية من قيم Sendable تستوفيه تلقائيًا؛ أما الـ classes العادية ذات الخصائص القابلة للتغيير فلا.","lesson":"l-sw-4-1","course":"swift-essentials"},{"id":"main-actor","term":"@MainActor","definition":"سمة تعزل الكود أو النوع على الـ main actor، أي الـ main thread الذي تعمل عليه الواجهة. ومشاريع تطبيقات Xcode الجديدة تجعله العزل الافتراضي.","lesson":"l-sw-4-1","course":"swift-essentials"},{"id":"codable","term":"Codable","definition":"الجمع بين <code dir=\"ltr\">Decodable</code> و<code dir=\"ltr\">Encodable</code>، ما يتيح للـ compiler توليد كود يحوّل أنواعك من صيغ مثل JSON وإليها.","lesson":"l-sw-4-2","course":"swift-essentials"},{"id":"swiftdata-model","term":"@Model (SwiftData)","definition":"ماكرو يحوّل الـ class إلى بيانات SwiftData محفوظة بشكل دائم. تقرأ النماذج عبر <code dir=\"ltr\">@Query</code>، وتضيفها أو تحذفها عبر الـ model context الذي يحفظ تلقائيًا.","lesson":"l-sw-4-3","course":"swift-essentials"},{"id":"swift-testing","term":"Swift Testing","definition":"إطار الاختبار من Apple، حيث الاختبارات دوال معلّمة بـ <code dir=\"ltr\">@Test</code>، تُفحص بـ <code dir=\"ltr\">#expect</code> و<code dir=\"ltr\">#require</code>، وتُشغَّل على مدخلات متعدّدة عبر <code dir=\"ltr\">arguments:</code>.","lesson":"l-sw-4-4","course":"swift-essentials"},{"id":"testflight","term":"TestFlight","definition":"خدمة Apple لتوزيع النسخ التجريبية. النسخ المرفوعة إلى App Store Connect تصل فورًا إلى 100 مختبِر داخلي كحدّ أقصى، وإلى 10,000 مختبِر خارجي كحدّ أقصى بعد Beta App Review.","lesson":"l-sw-4-4","course":"swift-essentials"},{"id":"container","term":"Container","definition":"عملية عادية تعزلها نواة Linux بالـ namespaces وتحدّ مواردها بالـ cgroups، وتعمل من نظام ملفات image مع layer خاصة قابلة للكتابة يمكن التخلّص منها.","lesson":"l-dk-1-1","course":"docker-kubernetes"},{"id":"image","term":"Image","definition":"لقطة لنظام ملفات مقسّمة إلى layers وللقراءة فقط، مع بيانات وصفية مثل الأمر الافتراضي والمستخدم. يمكن لـ image واحدة أن تكون قالبًا لأي عدد من الـ containers.","lesson":"l-dk-1-1","course":"docker-kubernetes"},{"id":"namespaces-cgroups","term":"Namespaces وcgroups","definition":"ميزتان في النواة تقوم عليهما الـ containers: الـ namespaces تتحكّم فيما تراه العملية (العمليات والشبكة والـ mounts)، والـ cgroups تحدّ ما تستهلكه (المعالج والذاكرة والإدخال والإخراج).","lesson":"l-dk-1-1","course":"docker-kubernetes"},{"id":"build-context","term":"Build context","definition":"مجموعة الملفات التي يرسلها <code dir=\"ltr\">docker build</code> إلى أداة البناء، وهي عادةً المجلد الذي تمرّره كآخر معامل، مطروحًا منه كل ما يطابق <code dir=\"ltr\">.dockerignore</code>. ولا تقرأ <code dir=\"ltr\">COPY</code> إلا منه.","lesson":"l-dk-1-2","course":"docker-kubernetes"},{"id":"exec-form","term":"صيغة exec ‏(Exec form)","definition":"كتابة <code dir=\"ltr\">CMD</code> أو <code dir=\"ltr\">ENTRYPOINT</code> كمصفوفة JSON، مثل <code dir=\"ltr\">[&quot;node&quot;, &quot;dist/server.js&quot;]</code>، حتى يعمل البرنامج كـ PID 1 دون shell ويستقبل إشارات الإيقاف مباشرة.","lesson":"l-dk-1-2","course":"docker-kubernetes"},{"id":"layer-cache","term":"Build cache","definition":"نتائج مخزّنة لخطوات بناء سابقة. تُعاد الخطوة من الـ cache حين لا تتغيّر تعليمتها ومُدخلاتها؛ أما أول خطوة متغيّرة وكل خطوة بعدها فيُعاد بناؤها.","lesson":"l-dk-1-3","course":"docker-kubernetes"},{"id":"sigterm","term":"SIGTERM","definition":"إشارة الإيقاف المهذّبة التي يرسلها Docker وKubernetes إلى PID 1 قبل SIGKILL القسرية. على التطبيقات معالجتها بإنهاء العمل الجاري والخروج بنظافة.","lesson":"l-dk-1-4","course":"docker-kubernetes"},{"id":"multi-stage-build","term":"Multi-stage build","definition":"‏Dockerfile فيه عدّة مراحل <code dir=\"ltr\">FROM</code> لا تُشحن منها إلا الأخيرة، فتبقى المترجِمات واعتماديات التطوير والمصادر في المراحل السابقة وخارج image الإنتاج.","lesson":"l-dk-2-1","course":"docker-kubernetes"},{"id":"dockerignore","term":".dockerignore","definition":"ملف يسرد أنماطًا تُستبعد من الـ build context، مثل <code dir=\"ltr\">node_modules</code> و<code dir=\"ltr\">.git</code> وملفات <code dir=\"ltr\">.env</code>، فيسرّع البناء ويُبقي الأسرار خارج الـ images.","lesson":"l-dk-2-1","course":"docker-kubernetes"},{"id":"distroless","term":"Distroless image","definition":"‏base image مصغّرة لا تحتوي إلا على بيئة تشغيل اللغة ومكتباتها، دون shell أو مدير حزم، فتقلّص مساحة الهجوم وتقرير الثغرات.","lesson":"l-dk-2-2","course":"docker-kubernetes"},{"id":"digest","term":"البصمة (Image digest)","definition":"‏hash من نوع SHA-256 يحدّد المحتوى الدقيق للـ image. على عكس الـ tag، لا يمكن أن يشير أبدًا إلى بايتات مختلفة، فالتثبيت بالـ digest يضمن أن كل node يشغّل الـ image نفسها.","lesson":"l-dk-2-3","course":"docker-kubernetes"},{"id":"secret-mount","term":"Secret mount","definition":"ميزة في BuildKit، هي <code dir=\"ltr\">RUN --mount=type=secret</code>، تتيح بيانات اعتماد لخطوة بناء واحدة كملف أو كمتغيّر بيئة دون كتابتها في أي layer من الـ image.","lesson":"l-dk-2-4","course":"docker-kubernetes"},{"id":"compose-service","term":"خدمة Compose ‏(Compose service)","definition":"مكوّن واحد من تطبيق Compose، مثل <code dir=\"ltr\">api</code> أو <code dir=\"ltr\">db</code>، معرَّف في <code dir=\"ltr\">compose.yaml</code>، وتصل إليه الخدمات الأخرى على شبكة المشروع باسم الخدمة.","lesson":"l-dk-3-1","course":"docker-kubernetes"},{"id":"named-volume","term":"Named volume","definition":"تخزين يديره Docker ويوجد باستقلال عن الـ containers، يُستخدم لبيانات مثل ملفات قاعدة البيانات التي يجب أن تبقى بعد حذف الـ container. والأمر <code dir=\"ltr\">docker compose down -v</code> يحذفه.","lesson":"l-dk-3-2","course":"docker-kubernetes"},{"id":"healthcheck","term":"فحص الصحة (Healthcheck)","definition":"أمر يشغّله Docker داخل الـ container وفق جدول زمني ليقرّر هل هو سليم. ويستطيع Compose جعل الخدمات الأخرى تنتظره بالشرط <code dir=\"ltr\">condition: service_healthy</code>.","lesson":"l-dk-3-3","course":"docker-kubernetes"},{"id":"compose-watch","term":"Compose watch","definition":"وضع للتطوير يبدأ بـ <code dir=\"ltr\">docker compose up --watch</code>، يزامن الملفات المعدّلة إلى الـ containers العاملة أو يعيد بناء الـ image حين تتغيّر ملفات مثل الـ lockfile.","lesson":"l-dk-3-4","course":"docker-kubernetes"},{"id":"control-loop","term":"حلقة التحكّم (Control loop)","definition":"النمط الذي تقوم عليه الـ controllers في Kubernetes: مراقبة الحالة الفعلية باستمرار، ومقارنتها بالحالة المرغوبة المخزّنة في الـ API، والتصرّف لسدّ الفرق.","lesson":"l-dk-4-1","course":"docker-kubernetes"},{"id":"pod","term":"Pod","definition":"أصغر وحدة يُجدوِلها Kubernetes: ‏container واحد أو أكثر تتشارك هوية شبكية وvolumes. الـ Pods يمكن التخلّص منها، فهي تُستبدل ولا تُصلَح.","lesson":"l-dk-4-2","course":"docker-kubernetes"},{"id":"deployment","term":"Deployment","definition":"كائن في Kubernetes يُبقي مجموعة من الـ Pods المتطابقة قيد التشغيل عبر الـ ReplicaSets، ويستبدلها تدريجيًا حين يتغيّر قالب الـ Pod.","lesson":"l-dk-4-2","course":"docker-kubernetes"},{"id":"label-selector","term":"Label selector","definition":"استعلام على labels من أزواج مفتاح-قيمة تستخدمه كائنات Kubernetes ليجد بعضها بعضًا، مثل Service يختار الـ Pods التي يرسل إليها الحركة.","lesson":"l-dk-4-2","course":"docker-kubernetes"},{"id":"service","term":"Service","definition":"عنوان IP افتراضي واسم DNS ثابتان أمام مجموعة متغيّرة من الـ Pods الجاهزة يختارها label selector. من أنواعه ClusterIP وNodePort وLoadBalancer.","lesson":"l-dk-4-3","course":"docker-kubernetes"},{"id":"configmap-secret","term":"ConfigMap وSecret","definition":"كائنان يحفظان إعدادات الـ Pods، ويُحقنان كمتغيّرات بيئة أو كملفات. الـ Secrets لبيانات الاعتماد لكنها مرمّزة بـ base64 فقط، لذا يهمّ التحكّم في الوصول إليها.","lesson":"l-dk-4-4","course":"docker-kubernetes"},{"id":"namespace","term":"Namespace","definition":"نطاق في Kubernetes لأسماء الكائنات والصلاحيات والحصص، يكون عادةً واحدًا لكل تطبيق أو فريق. لا يحجب حركة الشبكة دون NetworkPolicy.","lesson":"l-dk-4-4","course":"docker-kubernetes"},{"id":"readiness-probe","term":"Readiness probe","definition":"فحص دوري يقرّر هل يجب أن يستقبل الـ Pod حركة. فشله يزيل الـ Pod من endpoints الـ Service دون إعادة تشغيله، وهو بوّابة للتحديثات المتدرّجة.","lesson":"l-dk-5-1","course":"docker-kubernetes"},{"id":"liveness-probe","term":"Liveness probe","definition":"فحص دوري يقرّر هل الـ container عالق. فشله يعيد تشغيل الـ container، لذا يجب ألا يعتمد على قواعد البيانات أو الخدمات الأخرى.","lesson":"l-dk-5-1","course":"docker-kubernetes"},{"id":"requests-limits","term":"Requests وlimits","definition":"إعدادات موارد لكل container: الـ requests هي ما يحجزه الـ scheduler، والـ limits سقوف مفروضة. تجاوز حدّ المعالج يسبّب الخنق (throttling)؛ وتجاوز حدّ الذاكرة يسبّب القتل بسبب نفاد الذاكرة (OOM).","lesson":"l-dk-5-2","course":"docker-kubernetes"},{"id":"hpa","term":"HorizontalPodAutoscaler","definition":"‏controller ‏(<code dir=\"ltr\">autoscaling/v2</code>) يعدّل عدد نسخ حمل العمل ليُبقي مقياسًا ما، مثل متوسط استخدام المعالج نسبةً إلى الـ requests، عند هدف محدّد أو حوله.","lesson":"l-dk-5-2","course":"docker-kubernetes"},{"id":"rolling-update","term":"التحديث المتدرّج (Rolling update)","definition":"الاستراتيجية الافتراضية للـ Deployment: يتوسّع ReplicaSet جديد بينما يتقلّص القديم، بوتيرة يضبطها <code dir=\"ltr\">maxSurge</code> و<code dir=\"ltr\">maxUnavailable</code>، ولا يتقدّم إلا بقدر ما تسمح به الـ readiness.","lesson":"l-dk-5-3","course":"docker-kubernetes"},{"id":"helm-chart","term":"Helm chart","definition":"حزمة من manifests ‏Kubernetes على شكل قوالب مع قيم افتراضية. الأمر <code dir=\"ltr\">helm upgrade --install</code> ينشرها كـ release revision مرقّمة يستطيع <code dir=\"ltr\">helm rollback</code> العودة إليها.","lesson":"l-dk-5-3","course":"docker-kubernetes"},{"id":"gateway-api","term":"Gateway API","definition":"خليفة Ingress في Kubernetes لتوجيه الحركة الخارجية، مقسّم إلى موارد GatewayClass وGateway وHTTPRoute حتى يملك كلٌّ من فريق المنصّة وفريق التطبيق جزأه.","lesson":"l-dk-5-4","course":"docker-kubernetes"},{"id":"region","term":"Region","definition":"منطقة جغرافية منفصلة تشغّل فيها AWS نسختها الخاصة من معظم الخدمات، مثل eu-west-1 في أيرلندا. تبقى بياناتك في الـ Region التي تختارها ما لم تنقلها أو تنسخها.","lesson":"l-aws-1-2","course":"aws-cloud-foundations"},{"id":"availability-zone","term":"منطقة التوافر (Availability Zone, AZ)","definition":"مركز بيانات مستقل أو أكثر داخل Region، بكهرباء وشبكات مستقلة. تشغيل حمل العمل في منطقتي توافر أو أكثر يتيح له النجاة من خسارة إحداها.","lesson":"l-aws-1-2","course":"aws-cloud-foundations"},{"id":"edge-location","term":"موقع الحافة (edge location)","definition":"واحد من مواقع AWS الصغيرة الكثيرة القريبة من المستخدمين، يخزّن فيه Amazon CloudFront المحتوى مؤقتًا ويقدّمه، ويجيب فيه Amazon Route 53 عن استعلامات DNS.","lesson":"l-aws-1-2","course":"aws-cloud-foundations"},{"id":"shared-responsibility","term":"نموذج المسؤولية المشتركة (shared responsibility model)","definition":"تقسيم لمهام الأمان تؤمّن فيه AWS السحابة نفسها، كالعتاد والمنشآت وبرمجيات الخدمات، بينما يؤمّن العملاء بياناتهم والوصول والإعدادات والكود.","lesson":"l-aws-1-3","course":"aws-cloud-foundations"},{"id":"root-user","term":"مستخدم الجذر (root user)","definition":"الهوية التي تُنشأ ببريد التسجيل في حساب AWS. يستطيع فعل أي شيء، بما في ذلك إغلاق الحساب، لذا يحصل على MFA قوي، ولا مفاتيح وصول، ولا يُستخدم إلا نادرًا.","lesson":"l-aws-1-3","course":"aws-cloud-foundations"},{"id":"aws-budgets","term":"AWS Budgets","definition":"خدمة تتتبّع الإنفاق الفعلي والمتوقّع مقابل مبلغ تحدّده، وترسل تنبيهات عند تجاوز الحدود. إنها تحذّرك لكنها لا توقف الإنفاق من تلقاء نفسها.","lesson":"l-aws-1-3","course":"aws-cloud-foundations"},{"id":"aws-cli","term":"AWS CLI v2","definition":"أداة سطر الأوامر التي تستدعي الـ APIs نفسها التي يستدعيها الـ console. تتبع الأوامر النمط aws <service> <operation>، مع خيارات عامة مثل --profile و–region و–query و–output.","lesson":"l-aws-1-4","course":"aws-cloud-foundations"},{"id":"get-caller-identity","term":"aws sts get-caller-identity","definition":"أمر في الـ CLI يعيد معرّف الحساب والـ ARN للهوية التي تمثّلها بيانات اعتمادك. لا يحتاج إلى أي صلاحيات، لذا فهو الفحص القياسي قبل الأوامر المدمّرة.","lesson":"l-aws-1-4","course":"aws-cloud-foundations"},{"id":"arn","term":"ARN (Amazon Resource Name)","definition":"المعرّف الفريد لمورد في AWS، بالشكل arn:partition:service:region:account-id:resource. تستخدم السياسات الـ ARNs لتحديد الموارد التي تغطّيها العبارة بدقّة.","lesson":"l-aws-2-1","course":"aws-cloud-foundations"},{"id":"iam-role","term":"IAM role","definition":"هوية لها صلاحيات لكن بلا بيانات اعتماد طويلة الأمد. يتقمّصها principal موثوق فيتلقّى من AWS STS بيانات اعتماد مؤقتة تنتهي صلاحيتها بعد الجلسة.","lesson":"l-aws-2-1","course":"aws-cloud-foundations"},{"id":"explicit-deny","term":"الرفض الصريح (explicit deny)","definition":"عبارة Deny في أي سياسة منطبقة تطابق الطلب. وهي تتجاوز أي Allow دائمًا، ما يجعلها أساس حواجز الحماية الموثوقة.","lesson":"l-aws-2-1","course":"aws-cloud-foundations"},{"id":"least-privilege","term":"أقل الصلاحيات (least privilege)","definition":"منح الهوية الإجراءات المحدّدة فقط على الموارد المحدّدة التي تحتاجها مهمتها، وعدم توسيع الصلاحيات إلا حين يُظهر خطأ AccessDenied حقيقي أن شيئًا ما ناقص.","lesson":"l-aws-2-2","course":"aws-cloud-foundations"},{"id":"condition-key","term":"مفتاح الشرط (condition key)","definition":"قيمة من سياق الطلب، مثل aws:SecureTransport أو aws:MultiFactorAuthPresent، تختبرها كتلة Condition في السياسة لتقرّر هل تنطبق العبارة.","lesson":"l-aws-2-2","course":"aws-cloud-foundations"},{"id":"identity-center","term":"IAM Identity Center","definition":"خدمة AWS التي يسجّل فيها الأشخاص الدخول مرة واحدة، مع MFA، ويحصلون على وصول قصير الأمد إلى الحسابات وحزم الصلاحيات المسندة إليهم، دون مستخدمي IAM أو مفاتيح وصول.","lesson":"l-aws-2-3","course":"aws-cloud-foundations"},{"id":"trust-policy","term":"سياسة الثقة (trust policy)","definition":"السياسة القائمة على المورد في الـ role الخاص بـ IAM، والتي تسمّي الـ principals الذين يحق لهم تقمّص الـ role، مثل lambda.amazonaws.com.","lesson":"l-aws-2-3","course":"aws-cloud-foundations"},{"id":"execution-role","term":"Lambda execution role","definition":"الـ role في IAM الذي تتقمّصه دالة Lambda حين تعمل. تلتقط حزم AWS SDK بيانات اعتماده المؤقتة تلقائيًا، فلا يحتوي كود الدالة على مفاتيح وصول أبدًا.","lesson":"l-aws-2-3","course":"aws-cloud-foundations"},{"id":"instance-type","term":"نوع الـ instance (instance type)","definition":"الاسم الذي يحدّد عتاد الـ instance في EC2، مثل m7g.large: العائلة m، والجيل 7، ومعالج Graviton g، والحجم large. كل خطوة في الحجم تضاعف الموارد تقريبًا.","lesson":"l-aws-3-1","course":"aws-cloud-foundations"},{"id":"spot-instance","term":"Spot Instance","definition":"سعة فائضة في EC2 تُعرض بخصم كبير، ويمكن أن تسترجعها AWS بإنذار مدته دقيقتان. تناسب العمل الدفعي القابل لإعادة التشغيل، لا قواعد البيانات ولا الخوادم التي يتعامل معها المستخدمون.","lesson":"l-aws-3-1","course":"aws-cloud-foundations"},{"id":"gb-second","term":"GB-second","definition":"وحدة احتساب الحوسبة في Lambda: الذاكرة المخصّصة بالغيغابايت مضروبة في وقت التشغيل بالثواني، مقيسًا بالمللي ثانية.","lesson":"l-aws-3-1","course":"aws-cloud-foundations"},{"id":"storage-class","term":"فئة التخزين في S3 (S3 storage class)","definition":"إعداد لكل كائن، مثل S3 Standard أو S3 Glacier Deep Archive، يقايض بين سعر التخزين وتكلفة الاسترجاع ووقته والحد الأدنى لمدة التخزين.","lesson":"l-aws-3-2","course":"aws-cloud-foundations"},{"id":"block-public-access","term":"S3 Block Public Access","definition":"إعدادات على مستوى الـ bucket والحساب، مفعّلة افتراضيًا في الـ buckets الجديدة، تتجاوز أي سياسة أو ACL قد تجعل البيانات عامة.","lesson":"l-aws-3-2","course":"aws-cloud-foundations"},{"id":"partition-key","term":"مفتاح التقسيم (partition key)","definition":"سمة المفتاح في DynamoDB التي تحدّد مكان تخزين العنصر. يجب أن يسمّي Query قيمة واحدة لمفتاح التقسيم، ولهذا تُصمَّم المفاتيح حول الأسئلة التي تطرحها.","lesson":"l-aws-3-3","course":"aws-cloud-foundations"},{"id":"multi-az","term":"نشر Multi-AZ (Multi-AZ deployment)","definition":"إعداد في Amazon RDS فيه قاعدة بيانات standby متزامنة في منطقة توافر ثانية، تتولّى العمل تلقائيًا إذا تعطّلت منطقة توافر النسخة الرئيسية.","lesson":"l-aws-3-3","course":"aws-cloud-foundations"},{"id":"public-subnet","term":"الشبكة الفرعية العامة (public subnet)","definition":"شبكة فرعية في VPC يرسل جدول التوجيه الخاص بها 0.0.0.0/0 إلى بوابة إنترنت. أما الشبكات الفرعية الخاصة فليس فيها مسار كهذا، فلا يستطيع الإنترنت بدء اتصالات بها.","lesson":"l-aws-3-4","course":"aws-cloud-foundations"},{"id":"security-group","term":"مجموعة الأمان (security group)","definition":"جدار حماية ذو حالة على شكل قائمة سماح، يُرفق بواجهة الشبكة الخاصة بمورد ما. يُسمح تلقائيًا بالردود على الزيارات المسموح بها، ويمكن أن تسمّي القواعد مجموعة أمان أخرى كمصدر.","lesson":"l-aws-3-4","course":"aws-cloud-foundations"},{"id":"network-acl","term":"Network ACL","definition":"قائمة عديمة الحالة من قواعد السماح والرفض المرقّمة، تُطبَّق عند حدود الشبكة الفرعية. ولأنها عديمة الحالة، تحتاج زيارات الرد إلى قواعد خاصة بها.","lesson":"l-aws-3-4","course":"aws-cloud-foundations"},{"id":"oac","term":"Origin access control (OAC)","definition":"ميزة في CloudFront توقّع الطلبات إلى bucket خاص في S3، كي تستطيع سياسة الـ bucket السماح لذلك الـ distribution وحده بالقراءة، فيبقى الـ bucket مغلقًا أمام أي أحد آخر.","lesson":"l-aws-4-1","course":"aws-cloud-foundations"},{"id":"conditional-write","term":"الكتابة المشروطة (conditional write)","definition":"عملية كتابة في DynamoDB مع ConditionExpression، مثل attribute_not_exists(email)، لا تنجح إلا إذا تحقّق الشرط، ويُفحص الشرط بشكل ذرّي لمنع التكرار.","lesson":"l-aws-4-2","course":"aws-cloud-foundations"},{"id":"cloudwatch-alarm","term":"إنذار CloudWatch (CloudWatch alarm)","definition":"قاعدة تراقب مقياسًا واحدًا مقابل حدّ معيّن على مدى فترة، وتغيّر حالتها عند تجاوزه، وعادةً ترسل إشعارًا إلى topic في Amazon SNS ينبّه الأشخاص.","lesson":"l-aws-4-3","course":"aws-cloud-foundations"},{"id":"well-architected","term":"AWS Well-Architected Framework","definition":"مجموعة أسئلة التصميم من AWS، مجمّعة في ست ركائز هي التميّز التشغيلي والأمان والموثوقية وكفاءة الأداء وتحسين التكلفة والاستدامة.","lesson":"l-aws-4-3","course":"aws-cloud-foundations"},{"id":"supervised-learning","term":"التعلّم الموجَّه (Supervised learning)","definition":"تعلّم الربط بين الـ features وهدف معروف باستخدام أمثلة ذات labels، كي يتنبأ النموذج بالهدف لحالات جديدة. والتصنيف والانحدار شكلاه الرئيسيان.","lesson":"l-ml-1-1","course":"ml-crash-course"},{"id":"unsupervised-learning","term":"التعلّم غير الموجَّه (Unsupervised learning)","definition":"إيجاد بنية في بيانات لا عمود هدف فيها، مثل مجموعات من الصفوف المتشابهة (العنقدة) أو ملخّص مضغوط لأعمدة كثيرة (تقليل الأبعاد).","lesson":"l-ml-1-1","course":"ml-crash-course"},{"id":"feature","term":"Feature","definition":"عمود مُدخل يستخدمه النموذج ليتنبأ، مثل عدد الأيام منذ آخر طلب. ويجب أن تكون الـ features معروفة في اللحظة التي يُجرى فيها التنبؤ.","lesson":"l-ml-1-2","course":"ml-crash-course"},{"id":"target","term":"الهدف (Target / label)","definition":"العمود الذي يتعلّم النموذج الموجَّه التنبؤ به، مثل ما إذا كان العميل قد انقطع. ويُسمّى عادةً y في scikit-learn.","lesson":"l-ml-1-2","course":"ml-crash-course"},{"id":"train-test-split","term":"تقسيم التدريب والاختبار (Train/test split)","definition":"حجز جزء من البيانات ذات الـ labels، لا يُستخدم أبدًا في التدريب أو في اختيار النموذج، لقياس مدى نجاح النموذج النهائي مع حالات لم يرَها.","lesson":"l-ml-1-2","course":"ml-crash-course"},{"id":"estimator","term":"Estimator","definition":"أي كائن في scikit-learn يتعلّم من البيانات عبر fit. النماذج والـ scalers والـ encoders كلها estimators، وتضيف النماذج إليها predict وscore.","lesson":"l-ml-1-3","course":"ml-crash-course"},{"id":"hyperparameter","term":"Hyperparameter","definition":"إعداد يُختار قبل التدريب ويتحكم في طريقة تعلّم النموذج، مثل max_depth أو C، بخلاف المعاملات التي يتعلّمها النموذج أثناء fit.","lesson":"l-ml-1-3","course":"ml-crash-course"},{"id":"overfitting","term":"الإفراط في التوافق (Overfitting)","definition":"حين يتعلّم النموذج الضجيج في بيانات تدريبه، فيحقق على صفوف التدريب نتيجة أفضل بكثير منها على الصفوف الجديدة. وعلاجه مرونة أقل أو بيانات أكثر أو الـ regularization.","lesson":"l-ml-1-3","course":"ml-crash-course"},{"id":"baseline","term":"خط الأساس (Baseline)","definition":"نموذج مرجعي بسيط، مثل التنبؤ بفئة الأغلبية أو قاعدة عمل من سطر واحد، يجب على أي نموذج حقيقي أن يتفوّق عليه بوضوح كي يستحق كلفته.","lesson":"l-ml-1-4","course":"ml-crash-course"},{"id":"residual","term":"الباقي (Residual)","definition":"الفرق بين القيمة الفعلية وتنبؤ النموذج بها. ومقاييس الانحدار مثل MAE وRMSE تلخّص البواقي.","lesson":"l-ml-2-1","course":"ml-crash-course"},{"id":"r-squared","term":"معامل التحديد (R²)","definition":"حصة تباين الهدف التي يفسّرها نموذج الانحدار مقارنةً بالتنبؤ الدائم بالمتوسط: 1 يعني الكمال، و0 يعني أنه ليس أفضل من المتوسط، وقد يكون سالبًا.","lesson":"l-ml-2-1","course":"ml-crash-course"},{"id":"gradient-descent","term":"Gradient descent","definition":"طريقة تحسين تحسب مرارًا ميل دالة الخسارة لكل معامل، وتحرّك المعاملات خطوة صغيرة نزولًا، بحجم يحدّده معدّل التعلّم.","lesson":"l-ml-2-2","course":"ml-crash-course"},{"id":"feature-scaling","term":"توحيد مقاييس الـ features (Feature scaling)","definition":"إعادة معايرة الأعمدة إلى نطاقات متقاربة، عادةً متوسط 0 وانحراف معياري 1 باستخدام StandardScaler المدرَّب على بيانات التدريب وحدها. ويلزم للنماذج المعتمدة على المسافة والمدرَّبة بالتدرّج والمعاقَبة.","lesson":"l-ml-2-2","course":"ml-crash-course"},{"id":"regularisation","term":"Regularization","definition":"إضافة عقوبة على حجم المعاملات إلى دالة الخسارة كي يفضّل النموذج ملاءمات أبسط. يستخدم Ridge مربعات المعاملات؛ ويستخدم Lasso قيمها المطلقة وقد يجعل بعضها صفرًا.","lesson":"l-ml-2-4","course":"ml-crash-course"},{"id":"logistic-regression","term":"الانحدار اللوجستي (Logistic regression)","definition":"نموذج تصنيف خطي يمرّر مجموعًا موزونًا من الـ features عبر دالة الـ sigmoid ليُخرج احتمالًا بين 0 و1.","lesson":"l-ml-3-1","course":"ml-crash-course"},{"id":"decision-tree","term":"شجرة القرار (Decision tree)","definition":"نموذج يتنبأ بطرح سلسلة من أسئلة نعم/لا عن features مفردة، مختارة بحيث تكون المجموعات الناتجة أنقى ما يمكن.","lesson":"l-ml-3-2","course":"ml-crash-course"},{"id":"gradient-boosting","term":"Gradient boosting","definition":"نموذج مجمّع يضيف أشجارًا ضحلة واحدة تلو الأخرى، كلٌّ منها مدرَّبة على أخطاء الأشجار التي قبلها، مع معدّل تعلّم يتحكم في مساهمة كل شجرة.","lesson":"l-ml-3-3","course":"ml-crash-course"},{"id":"confusion-matrix","term":"مصفوفة الالتباس (Confusion matrix)","definition":"جدول يعدّ السلبيات الصحيحة والإيجابيات الكاذبة والسلبيات الكاذبة والإيجابيات الصحيحة. وفي scikit-learn تمثّل الصفوف الفئات الفعلية والأعمدة الفئات المتنبأ بها.","lesson":"l-ml-3-4","course":"ml-crash-course"},{"id":"precision-recall","term":"Precision وRecall","definition":"الـ precision هي حصة الحالات المُعلَّمة التي هي إيجابية فعلًا؛ والـ recall هي حصة الحالات الإيجابية فعلًا التي عُلِّمت. ورفع إحداهما يخفض الأخرى عادةً.","lesson":"l-ml-3-4","course":"ml-crash-course"},{"id":"roc-auc","term":"ROC AUC","definition":"مقياس لجودة الترتيب لا يعتمد على عتبة: احتمال أن ينال مثال إيجابي مختار عشوائيًا درجة أعلى من مثال سلبي مختار عشوائيًا. القيمة 0.5 عشوائية، و1.0 مثالية.","lesson":"l-ml-3-4","course":"ml-crash-course"},{"id":"decision-threshold","term":"عتبة القرار (Decision threshold)","definition":"حدّ الاحتمال الذي يصنّف المصنِّف فوقه الحالة إيجابية. القيمة الافتراضية 0.5، لكن يجب اختيارها بناءً على كلفة كل نوع من الأخطاء.","lesson":"l-ml-3-5","course":"ml-crash-course"},{"id":"cross-validation","term":"التحقق المتقاطع (Cross-validation)","definition":"تقسيم بيانات التدريب إلى k طيّة وتدريب k نموذجًا، كلٌّ منها يُقيَّم على طيّة مختلفة، للحصول على تقدير أثبت للأداء وفكرة عن مدى تشتّته.","lesson":"l-ml-4-1","course":"ml-crash-course"},{"id":"pipeline","term":"Pipeline","definition":"كائن في scikit-learn يسلسل خطوات المعالجة المسبقة ونموذجًا نهائيًا في estimator واحد، فتُدرَّب كل خطوة على بيانات التدريب وحدها وتُطبَّق بالطريقة نفسها لاحقًا.","lesson":"l-ml-4-2","course":"ml-crash-course"},{"id":"one-hot-encoding","term":"One-hot encoding","definition":"تحويل عمود فئوي إلى عمود 0/1 لكل فئة كي تستطيع النماذج استخدامه. ويتعامل OneHotEncoder مع الفئات غير المرئية حين يُضبط handle_unknown على ignore.","lesson":"l-ml-4-2","course":"ml-crash-course"},{"id":"data-leakage","term":"تسرّب البيانات (Data leakage)","definition":"معلومات متاحة أثناء التدريب أو التقييم لن تكون متاحة وقت التنبؤ، مثل features سُجّلت بعد تاريخ التنبؤ أو معالجة مسبقة دُرِّبت على صفوف التحقق.","lesson":"l-ml-4-4","course":"ml-crash-course"},{"id":"k-means","term":"k-means","definition":"خوارزمية عنقدة تتناوب بين إسناد كل نقطة إلى أقرب مركز ونقل كل مركز إلى متوسط نقاطه، لعدد مختار من العناقيد k.","lesson":"l-ml-5-1","course":"ml-crash-course"},{"id":"pca","term":"تحليل المكوّنات الرئيسية (PCA)","definition":"تقنية تجد محاور جديدة، كلٌّ منها مزيج موزون من الأعمدة الأصلية، مرتّبة بحسب مقدار ما تلتقطه من تباين البيانات، فيستطيع عدد قليل منها تلخيص الكثير.","lesson":"l-ml-5-1","course":"ml-crash-course"},{"id":"epoch","term":"Epoch","definition":"مرور كامل واحد لخوارزمية تدريب الشبكة العصبية على بيانات التدريب كلها. ويستمر التدريب عادةً لعدد كبير من الـ epochs بينما تنخفض الخسارة.","lesson":"l-ml-5-2","course":"ml-crash-course"},{"id":"embedding","term":"Embedding","definition":"متّجه ثابت الطول ينتجه نموذج لتمثيل نص أو عنصر آخر، مرتّب بحيث تكون للعناصر المتشابهة في المعنى متّجهات متقاربة.","lesson":"l-ml-5-3","course":"ml-crash-course"},{"id":"data-drift","term":"انجراف البيانات (Data drift)","definition":"تغيّر مع الزمن في توزيع مدخلات النموذج مقارنةً ببيانات تدريبه، قد يجعل التنبؤات أقل موثوقية ويجب مراقبته.","lesson":"l-ml-5-4","course":"ml-crash-course"},{"id":"type","term":"نوع البيانات (Type)","definition":"طبيعة القيمة، وهي التي تحدّد ما يمكنك فعله بها. من الأنواع الأساسية في JavaScript: number وstring وboolean وundefined وnull؛ والعامل typeof يخبرك بنوع أي قيمة.","lesson":"l-js-1-2","course":"javascript-fundamentals"},{"id":"variable","term":"المتغيّر (Variable)","definition":"اسم يشير إلى قيمة كي يستخدمها البرنامج لاحقًا. في JavaScript يكون النوع للقيمة لا للمتغيّر، لذلك يمكن لمتغيّر واحد أن يشير إلى أنواع مختلفة مع الوقت.","lesson":"l-js-1-2","course":"javascript-fundamentals"},{"id":"let-const","term":"let وconst","definition":"الطريقتان الحديثتان للتصريح بمتغيّر. الاسم المُصرَّح به بـ const لا يمكن توجيهه إلى قيمة أخرى أبدًا؛ أما let فيمكن إعادة إسنادها. ابدأ بـ const ولا تستخدم let إلا عند الحاجة.","lesson":"l-js-1-2","course":"javascript-fundamentals"},{"id":"floating-point","term":"العدد العشري الثنائي (Floating-point)","definition":"رقم مخزّن بالنظام الثنائي بدقة محدودة، كما هي كل أرقام JavaScript. كثير من الأعداد العشرية لا يمكن تخزينها بدقة، فتعطي 0.1 + 0.2 القيمة 0.30000000000000004؛ لذلك خزّن المال سنتاتٍ صحيحة.","lesson":"l-js-1-3","course":"javascript-fundamentals"},{"id":"strict-equality","term":"المساواة الصارمة (===)","definition":"مقارنة لا تكون صحيحة إلا حين يكون للقيمتين النوع نفسه والقيمة نفسها. وعلى عكس المساواة المتساهلة (==)، لا تحوّل الأنواع أولًا أبدًا، لذلك “5” === 5 تساوي false.","lesson":"l-js-1-3","course":"javascript-fundamentals"},{"id":"template-literal","term":"Template literal","definition":"نص يُكتب بين علامات backtick، يستطيع إدراج قيمة أي تعبير عبر ${ } ويمكن أن يمتد على عدّة أسطر، مثل <code dir=\"ltr\">Total: ${total}</code>.","lesson":"l-js-1-4","course":"javascript-fundamentals"},{"id":"truthy-falsy","term":"Truthy وFalsy","definition":"طريقة معاملة JavaScript لأي قيمة تُستخدم شرطًا. ثماني قيم فقط falsy: false و0 و-0 و0n والنص الفارغ وnull وundefined وNaN. وكل قيمة أخرى truthy.","lesson":"l-js-2-1","course":"javascript-fundamentals"},{"id":"function","term":"الدالة (Function)","definition":"كتلة كود لها اسم ويمكن إعادة استخدامها. تعلن عن معاملات، وتستلم وسائط حين تُستدعى، وتنفّذ جسمها وتُعيد نتيجة عبر return؛ ودون return تكون النتيجة undefined.","lesson":"l-js-2-3","course":"javascript-fundamentals"},{"id":"arrow-function","term":"الدالة السهمية (Arrow function)","definition":"صياغة أقصر للدوال، مثل (cents) =&gt; cents / 100. إن جاء بعد السهم تعبير واحد، أُرجع تلقائيًا؛ أما مع الأقواس المعقوفة فتحتاج إلى return صريحة.","lesson":"l-js-2-3","course":"javascript-fundamentals"},{"id":"callback","term":"Callback","definition":"دالة تُمرَّر إلى دالة أخرى، وتلك الأخرى هي التي تقرّر متى تستدعيها. دوال المصفوفات مثل map، ومستمعو الأحداث، والمؤقّتات، كلها تأخذ callbacks.","lesson":"l-js-2-3","course":"javascript-fundamentals"},{"id":"scope","term":"النطاق (Scope)","definition":"منطقة الكود التي يمكن فيها استخدام اسم ما. نطاق let وconst هو أقرب كتلة، والبحث عن الأسماء يتّجه من النطاقات الداخلية إلى الخارجية، لا إلى الداخل أبدًا.","lesson":"l-js-2-4","course":"javascript-fundamentals"},{"id":"closure","term":"Closure","definition":"دالة مقترنة بمتغيّرات النطاق الذي أُنشئت فيه. تحتفظ الدالة بإمكانية الوصول إليها حتى بعد انتهاء الدالة الخارجية، وهذا يمنحها حالة خاصة تتذكّرها.","lesson":"l-js-2-4","course":"javascript-fundamentals"},{"id":"array","term":"المصفوفة (Array)","definition":"قائمة مرتّبة من القيم، تُكتب بين أقواس مربّعة وتبدأ فهارسها من 0. للمصفوفات دوال مثل map وfilter وfind وreduce لتحويل عناصرها والبحث فيها.","lesson":"l-js-3-1","course":"javascript-fundamentals"},{"id":"object","term":"الكائن (Object)","definition":"قيمة تجمع خصائص مسمّاة، مثل { label: “Coffee”, amount: 450 }. تُقرأ الخصائص بصيغة النقطة، أو بالأقواس المربّعة حين يكون الاسم في متغيّر.","lesson":"l-js-3-2","course":"javascript-fundamentals"},{"id":"reference","term":"المرجع (Reference)","definition":"ما يحمله المتغيّر حين تكون قيمته كائنًا أو مصفوفة: مؤشّر إليها، لا نسخة منها. وإسناده أو تمريره يتشارك الكائن نفسه، فيظهر التغيير عبر أي اسم من خلال الأسماء كلها.","lesson":"l-js-3-2","course":"javascript-fundamentals"},{"id":"spread","term":"صيغة النشر (Spread)","definition":"ثلاث نقاط تنسخ عناصر مصفوفة أو خصائص كائن إلى مصفوفة أو كائن جديد، كما في […list, item] أو { …expense, amount: 500 }. والنسخة سطحية.","lesson":"l-js-3-2","course":"javascript-fundamentals"},{"id":"destructuring","term":"التفكيك (Destructuring)","definition":"صياغة تفكّ خصائص كائن أو عناصر مصفوفة إلى متغيّرات في خطوة واحدة، مثل const { label, amount } = expense. وتدعم القيم الافتراضية وتعمل في معاملات الدوال.","lesson":"l-js-3-2","course":"javascript-fundamentals"},{"id":"reduce","term":"reduce","definition":"دالة مصفوفات تمرّ على العناصر حاملةً مُراكِمًا (accumulator)، وتُرجع المُراكِم النهائي. تُستخدم للمجاميع والتجميع؛ ومرّر لها دائمًا قيمة ابتدائية وسيطًا ثانيًا.","lesson":"l-js-3-3","course":"javascript-fundamentals"},{"id":"optional-chaining","term":"السلسلة الاختيارية (?.)","definition":"عامل يقرأ الخاصية فقط إن لم تكن القيمة على يساره null أو undefined، فيُرجع undefined بدلًا من رمي TypeError، كما في expense.receipt?.url.","lesson":"l-js-3-4","course":"javascript-fundamentals"},{"id":"nullish-coalescing","term":"nullish coalescing (??)","definition":"عامل لا يُرجع طرفه الأيمن إلا حين يكون الطرف الأيسر null أو undefined. وعلى عكس ||، يحتفظ بالقيم الحقيقية مثل 0 والنص الفارغ.","lesson":"l-js-3-4","course":"javascript-fundamentals"},{"id":"dom","term":"DOM","definition":"نموذج كائنات المستند (Document Object Model): شجرة الكائنات الحيّة في المتصفّح التي تمثّل الصفحة. وتغيير هذه الكائنات بـ JavaScript، مثل textContent لعنصر ما، يحدّث ما يراه المستخدم فورًا.","lesson":"l-js-4-1","course":"javascript-fundamentals"},{"id":"event-delegation","term":"تفويض الأحداث (Event delegation)","definition":"التعامل مع أحداث عناصر أبناء كثيرة بمستمع واحد على الحاوية التي تضمّها. تنتشر الأحداث للأعلى إلى الحاوية، وتجد event.target.closest() الابن المعني، بما في ذلك الأبناء المضافون لاحقًا.","lesson":"l-js-4-2","course":"javascript-fundamentals"},{"id":"json","term":"JSON","definition":"اختصار JavaScript Object Notation، وهو صيغة نصية للبيانات. تحوّل JSON.stringify القيم إلى نص JSON وتعيده JSON.parse قيمًا؛ ويحمل النصوص والأرقام والقيم المنطقية وnull والمصفوفات والكائنات البسيطة.","lesson":"l-js-4-4","course":"javascript-fundamentals"},{"id":"promise","term":"Promise","definition":"كائن يمثّل نتيجة ليست جاهزة بعد. يبدأ معلّقًا (pending) ويستقرّ مرة واحدة، إمّا مُنجَزًا بقيمة أو مرفوضًا بخطأ؛ وتُلحق then وcatch ما يحدث بعد ذلك.","lesson":"l-js-4-5","course":"javascript-fundamentals"},{"id":"async-await","term":"async/await","definition":"صياغة للعمل مع الـ promises. داخل دالة async، توقف await تلك الدالة مؤقتًا حتى يستقرّ الـ promise وتعطي قيمته، فيُقرأ الكود غير المتزامن من الأعلى إلى الأسفل وتُلتقط الأخطاء بـ try/catch.","lesson":"l-js-4-5","course":"javascript-fundamentals"},{"id":"event-loop","term":"حلقة الأحداث (Event loop)","definition":"الآلية التي تتيح لـ JavaScript ذات الخيط الواحد أن تنتظر دون أن تتجمّد. حين يفرغ مكدّس الاستدعاءات، تنفّذ كل callbacks الـ promises المنتظرة (المهام الدقيقة)، ثم المهمة التالية مثل مؤقّت أو نقرة.","lesson":"l-js-4-5","course":"javascript-fundamentals"},{"id":"module","term":"الوحدة (Module)","definition":"ملف JavaScript له نطاقه الخاص، ولا يتشارك القيم مع الملفات الأخرى إلا عبر export وimport. وفي المتصفّح، تُحمَّل وحدة الدخول بوسم script له type=“module”.","lesson":"l-js-5-1","course":"javascript-fundamentals"},{"id":"class","term":"الصنف (Class)","definition":"مخطّط للكائنات يحزم البيانات مع الـ methods التي تعمل عليها. تنفّذ new الـ constructor وتُرجع instance جديدة؛ والحقول الخاصة الموسومة بـ # مخفية عن الكود الخارجي.","lesson":"l-js-5-2","course":"javascript-fundamentals"},{"id":"stack-trace","term":"أثر المكدّس (Stack trace)","definition":"قائمة استدعاءات الدوال، مع أسماء الملفات وأرقام الأسطر، التي أدّت إلى خطأ ما، الأحدث أولًا. وهي تُظهر أين وقع الخطأ وكيف وصل البرنامج إلى هناك.","lesson":"l-js-5-3","course":"javascript-fundamentals"},{"id":"breakpoint","term":"نقطة التوقّف (Breakpoint)","definition":"علامة في DevTools، أو تعليمة debugger في الكود، توقف التنفيذ مؤقتًا عند سطر ما كي تفحص كل متغيّر ومكدّس الاستدعاءات، وتتقدّم في الكود سطرًا سطرًا.","lesson":"l-js-5-3","course":"javascript-fundamentals"},{"id":"version-control","term":"التحكم في الإصدارات (Version control)","definition":"نظام يسجّل لقطات من المشروع عبر الزمن، فتستطيع أن ترى ما الذي تغيّر ومتى ولماذا، وأن تعود إلى نسخ سابقة، وأن تجمع عمل عدة أشخاص.","lesson":"l-git-1-1","course":"git-github"},{"id":"repository","term":"المستودع (Repository)","definition":"السجلّ الكامل للمشروع وإعداداته، مخزّنًا في مجلد .git المخفي؛ يحتوي كل commit وكل فرع وكل tag، ويُنشأ بـ git init أو git clone.","lesson":"l-git-1-2","course":"git-github"},{"id":"commit","term":"Commit","definition":"لقطة مسجّلة لكل ملف متتبَّع، مع المؤلف والتاريخ والرسالة ومؤشّر إلى الـ commit الأب. معرّفه hash مشتقّ من كل ذلك، لذا لا يتغيّر أبدًا.","lesson":"l-git-1-1","course":"git-github"},{"id":"working-tree","term":"مجلد العمل (Working tree)","definition":"ملفات المشروع على القرص التي تفتحها وتعدّلها. يقارنها Git بالـ index وبآخر commit ليبلّغك بما تغيّر.","lesson":"l-git-1-3","course":"git-github"},{"id":"index","term":"منطقة التجهيز (Index / staging area)","definition":"الـ commit التالي قيد التجميع. ينسخ git add المحتوى الحالي للملف إليه، ويحوّله git commit إلى commit، ويُخرج git restore --staged المحتوى منه.","lesson":"l-git-1-3","course":"git-github"},{"id":"untracked-file","term":"ملف غير متتبَّع (Untracked file)","definition":"ملف في مجلد العمل لم يسجّله Git قط وليس مجهّزًا. يبقى خارج الـ commits حتى تنفّذ git add له، ويستطيع .gitignore إخفاءه.","lesson":"l-git-1-2","course":"git-github"},{"id":"dag","term":"رسم الـ commits البياني (DAG)","definition":"سجلّ Git كرسم بياني موجَّه غير دوري: يشير كل commit إلى أبيه أو أبويه، وتتبّع هذه الروابط إلى الخلف من أي commit يعطيك سجلّه.","lesson":"l-git-1-4","course":"git-github"},{"id":"merge-commit","term":"Merge commit","definition":"commit له أبوان، يُنشأ حين يجمع Git فرعين تقدّم كلاهما. ولقطته تحتوي العمل من خطَّي السجلّ معًا.","lesson":"l-git-1-4","course":"git-github"},{"id":"branch","term":"الفرع (Branch)","definition":"مؤشّر مسمّى ومتحرّك إلى commit واحد. إنشاء commit وأنت على فرع يقدّمه إلى الـ commit الجديد؛ وإنشاء فرع لا ينسخ أي ملفات.","lesson":"l-git-2-1","course":"git-github"},{"id":"head","term":"HEAD","definition":"مؤشّر Git إلى مكانك. يسمّي عادةً الفرع الحالي، والفرع يسمّي commit؛ و HEAD~1 تعني الـ commit الذي يسبق الـ commit الذي أنت عليه.","lesson":"l-git-2-1","course":"git-github"},{"id":"detached-head","term":"Detached HEAD","definition":"الحالة التي يشير فيها الـ HEAD مباشرة إلى commit بدل فرع. الـ commits الجديدة المنشأة هناك لا تنتمي إلى أي فرع حتى تنشئ واحدًا بـ git switch -c.","lesson":"l-git-2-1","course":"git-github"},{"id":"fast-forward","term":"Fast-forward","definition":"دمج لم يتحرّك فيه الفرع الحالي منذ بدأ الفرع الآخر، فيقدّم Git المؤشّر إلى الأمام ببساطة ولا ينشئ merge commit.","lesson":"l-git-2-2","course":"git-github"},{"id":"merge-base","term":"Merge base","definition":"أحدث commit يتشاركه فرعان. يقارن Git طرف كل فرع به أثناء الدمج الثلاثي ليقرّر أيّ التغييرات يأخذ.","lesson":"l-git-2-2","course":"git-github"},{"id":"merge-conflict","term":"تعارض الدمج (Merge conflict)","definition":"ما يحدث حين يغيّر الفرعان الأسطر نفسها منذ الـ merge base. يكتب Git النسختين بين علامات وينتظر منك أن تحرّر الملف وتنفّذ git add وتكمل.","lesson":"l-git-2-3","course":"git-github"},{"id":"rebase","term":"Rebase","definition":"إعادة تشغيل commits فرع فوق commit آخر، فتنتج commits جديدة بمعرّفات جديدة وسجلّ خطّي. آمن فقط للـ commits التي لم يبنِ عليها أحد غيرك.","lesson":"l-git-2-4","course":"git-github"},{"id":"force-with-lease","term":"git push --force-with-lease","definition":"رفع بالقوة لا يكتب فوق الفرع البعيد إلا إن كان ما زال يشير إلى حيث رأيته آخر مرة، فلن تمحو بصمت commits رفعها شخص آخر منذ آخر fetch لك.","lesson":"l-git-2-4","course":"git-github"},{"id":"remote","term":"المستودع البعيد (Remote)","definition":"عنوان URL مسمّى لنسخة أخرى من الـ repository، على GitHub في الغالب. و origin هو الاسم المتعارف عليه للنسخة التي استنسخت منها أو ترفع إليها.","lesson":"l-git-3-1","course":"git-github"},{"id":"remote-tracking-branch","term":"فرع تتبّع بعيد (Remote-tracking branch)","definition":"سجلّ محلي للقراءة فقط، مثل origin/main، لمكان فرع ما على الـ remote عند آخر fetch أو pull أو push. لا يتحرّك إلا حين تتواصل مع الـ remote.","lesson":"l-git-3-1","course":"git-github"},{"id":"upstream-branch","term":"Upstream branch","definition":"الفرع البعيد الذي يتتبّعه فرع محلي، ويُضبط بـ git push -u. يجعل git push و git pull المجرّدين يعملان، ويتيح لـ git status عرض عدد الـ commits المتقدّمة والمتأخّرة.","lesson":"l-git-3-1","course":"git-github"},{"id":"ssh-key","term":"زوج مفاتيح SSH (SSH key pair)","definition":"مفتاحان مترابطان يُستخدمان لإثبات هويتك أمام GitHub: المفتاح الخاص يبقى على جهازك، والمفتاح العام ذو الامتداد .pub يُضاف إلى حسابك على GitHub.","lesson":"l-git-3-2","course":"git-github"},{"id":"pull-request","term":"طلب الدمج (Pull request)","definition":"اقتراح على GitHub لدمج فرع في آخر، يعلّق فيه المراجعون وتعمل فيه الفحوص الآلية، ثم يُدمج التغيير في النهاية. والرفع الجديد إلى الفرع يحدّثه.","lesson":"l-git-3-3","course":"git-github"},{"id":"fork","term":"Fork","definition":"نسختك الخاصة على GitHub من repository يملكه شخص آخر. ترفع إليها الفروع وتفتح منها pull requests عائدة إلى الأصل، الذي يُسمّى بحسب العُرف upstream.","lesson":"l-git-3-4","course":"git-github"},{"id":"revert","term":"git revert","definition":"أمر ينشئ commit جديدًا يطبّق العكس التام لـ commit سابق. يتراجع عن التغييرات دون إعادة كتابة السجلّ، لذا فهو آمن على الفروع المشتركة.","lesson":"l-git-4-1","course":"git-github"},{"id":"reflog","term":"Reflog","definition":"سجلّ محلي لكل موضع شغله الـ HEAD، مثل الـ commits وعمليات الـ reset والـ rebase والانتقال بين الفروع. يتيح لك العثور على commits لم يعد يشير إليها أي فرع واستعادتها.","lesson":"l-git-4-1","course":"git-github"},{"id":"stash","term":"Stash","definition":"مكان تركن فيه التغييرات غير المسجّلة لتحصل على مجلد عمل نظيف. يحفظها git stash push، ويعيدها git stash pop؛ أضف -u لتضمين الملفات غير المتتبَّعة.","lesson":"l-git-4-2","course":"git-github"},{"id":"gitignore","term":".gitignore","definition":"ملف يسرد أنماط الملفات غير المتتبَّعة التي يجب ألّا يتتبّعها Git أبدًا، مثل node_modules/ وناتج البناء و .env. ولا يؤثّر في الملفات المتتبَّعة أصلًا.","lesson":"l-git-4-2","course":"git-github"},{"id":"conventional-commits","term":"Conventional Commits","definition":"صيغة لرسائل الـ commits، type(optional scope): description، تستخدم أنواعًا مثل feat و fix و docs، لكي تستطيع الأدوات توليد سجلّات التغيير وأرقام الإصدارات الدلالية.","lesson":"l-git-4-3","course":"git-github"},{"id":"annotated-tag","term":"Tag مشروح (Annotated tag)","definition":"علامة دائمة ومسمّاة على commit تخزّن أيضًا اسم الواسم والتاريخ ورسالة. يُنشأ بـ git tag -a، وهو الطريقة المعتادة لتعليم الإصدارات.","lesson":"l-git-4-3","course":"git-github"},{"id":"github-actions-workflow","term":"GitHub Actions workflow","definition":"ملف YAML في .github/workflows/ يشغّل jobs على آلات GitHub حين تقع أحداث مثل pull_request. وكل job يبلّغ عن status check على الـ pull request.","lesson":"l-git-4-4","course":"git-github"},{"id":"ruleset","term":"Ruleset","definition":"مجموعة مسمّاة من قواعد GitHub للفروع أو الـ tags، مثل اشتراط pull request، واشتراط نجاح الـ status checks، ومنع الرفع بالقوة إلى main.","lesson":"l-git-4-4","course":"git-github"},{"id":"situational-disability","term":"الإعاقة الظرفية (situational disability)","definition":"قيد مؤقت تسبّبه الظروف لا جسد الشخص، مثل وهج على الشاشة أو غرفة صاخبة أو حمل رضيع بذراع واحدة. والتصاميم التي تخدم الإعاقات الدائمة تساعد هنا في الغالب أيضًا.","lesson":"l-a11y-1-1","course":"web-accessibility"},{"id":"assistive-technology","term":"التقنيات المساعدة (assistive technology)","definition":"برمجيات أو أجهزة يستخدمها الناس لتشغيل الحاسوب بطريقة تناسبهم، مثل قارئات الشاشة وبرامج التكبير وأجهزة التبديل والتحكّم الصوتي. وهي تقرأ الصفحة عبر شجرة إمكانية الوصول.","lesson":"l-a11y-1-2","course":"web-accessibility"},{"id":"accessibility-tree","term":"شجرة إمكانية الوصول (accessibility tree)","definition":"شجرة مبسّطة يبنيها المتصفّح من الـ DOM وCSS، لكل عقدة فيها دور واسم وأي حالات أو قيمة. والتقنيات المساعدة تقرأ هذه الشجرة، لا البكسلات على الشاشة.","lesson":"l-a11y-1-2","course":"web-accessibility"},{"id":"screen-reader","term":"قارئ الشاشة (screen reader)","definition":"برنامج مساعد يحوّل شجرة إمكانية الوصول إلى كلام منطوق أو إلى طريقة برايل، ويتيح للمستخدمين التنقّل عبر العناوين والـ landmarks والروابط وحقول النماذج. ومن أشهرها JAWS وNVDA وVoiceOver وTalkBack.","lesson":"l-a11y-1-2","course":"web-accessibility"},{"id":"visually-hidden","term":"النص المخفي بصريًا (visually hidden text)","definition":"نص يُقَصّ بـ CSS إلى مربع بحجم 1px فيبقى في شجرة إمكانية الوصول دون أن يشغل مساحة مرئية. وعلى عكس display: none، ما زالت قارئات الشاشة تُعلنه.","lesson":"l-a11y-1-2","course":"web-accessibility"},{"id":"wcag","term":"WCAG","definition":"إرشادات إمكانية الوصول إلى محتوى الويب، وهي معيار W3C للمحتوى سهل الوصول. ينظّم الإصدار 2.2، المنشور في أكتوبر 2023، معايير نجاح قابلة للاختبار تحت أربعة مبادئ وثلاثة مستويات توافق.","lesson":"l-a11y-1-3","course":"web-accessibility"},{"id":"pour","term":"POUR","definition":"المبادئ الأربعة في قمّة WCAG: يجب أن يكون المحتوى قابلًا للإدراك (Perceivable)، وقابلًا للتشغيل (Operable)، وقابلًا للفهم (Understandable)، ومتينًا (Robust). ويقع كل إرشاد ومعيار نجاح تحت أحدها.","lesson":"l-a11y-1-3","course":"web-accessibility"},{"id":"conformance-level","term":"مستوى التوافق (A، AA، AAA)","definition":"المستوى الذي يقع فيه معيار النجاح، والذي يُعلَن عنده التوافق. المستوى AA، الذي يتضمّن كل معايير A، هو الهدف الذي تشترطه معظم القوانين والسياسات.","lesson":"l-a11y-1-3","course":"web-accessibility"},{"id":"european-accessibility-act","term":"قانون إمكانية الوصول الأوروبي (European Accessibility Act)","definition":"التوجيه الأوروبي 2019/882، الساري منذ 28 يونيو 2025، الذي يشترط أن تكون المنتجات والخدمات المشمولة، مثل التجارة الإلكترونية والخدمات المصرفية وبيع التذاكر، سهلة الوصول. ومعياره المرجعي EN 301 549 يقابل WCAG 2.1 AA، وقد نُشر تحديثه المبني على WCAG 2.2 عام 2026.","lesson":"l-a11y-1-3","course":"web-accessibility"},{"id":"landmark","term":"Landmark","definition":"منطقة في الصفحة لها دور يستطيع مستخدمو قارئ الشاشة عرض قائمة بها والقفز إليها، مثل banner وnavigation وmain وcontentinfo. وتُنشئها عناصر HTML مثل header وnav وmain وfooter.","lesson":"l-a11y-2-1","course":"web-accessibility"},{"id":"autocomplete-token","term":"قيمة autocomplete (autocomplete token)","definition":"قيمة لخاصية autocomplete في HTML، مثل name أو email أو cc-number، تعلن الغرض من الحقل فيستطيع المتصفّح تعبئته. وهي تحقّق معيار WCAG ‏1.3.5 Identify Input Purpose.","lesson":"l-a11y-2-3","course":"web-accessibility"},{"id":"alt-text","term":"النص البديل (alt text)","definition":"البديل النصي للصورة، ويُكتب في خاصية alt. يجب أن ينقل غرض الصورة في سياقها: ما تُظهره إن كانت معلوماتية، أو ما تفعله إن كانت رابطًا أو زرًّا.","lesson":"l-a11y-2-4","course":"web-accessibility"},{"id":"decorative-image","term":"الصورة الزخرفية (decorative image)","definition":"صورة لا تضيف أي معلومة في سياقها، مثل فاصل أو صورة للأجواء. تحصل على خاصية alt فارغة (alt=“”) فتتخطّاها قارئات الشاشة بدلًا من قراءة اسم ملفها.","lesson":"l-a11y-2-4","course":"web-accessibility"},{"id":"focus-order","term":"ترتيب التركيز (focus order)","definition":"التسلسل الذي ينتقل به مفتاح Tab بين العناصر القابلة للتركيز. وهو يتبع ترتيب الـ DOM، فيجب أن يطابق الكود ترتيب القراءة المرئي، ولا يجوز أبدًا استخدام قيم tabindex موجبة.","lesson":"l-a11y-3-1","course":"web-accessibility"},{"id":"focus-visible","term":":focus-visible","definition":"pseudo-class في CSS يطابق حين يقرّر المتصفّح أن التركيز يجب أن يظهر، كما في التنقّل بلوحة المفاتيح. وتنسيقه بإطار قوي يمنح مستخدمي لوحة المفاتيح مؤشّرًا واضحًا دون إظهار الحلقات عند النقر بالفأرة.","lesson":"l-a11y-3-1","course":"web-accessibility"},{"id":"skip-link","term":"رابط التخطّي (skip link)","definition":"رابط في أول الصفحة تمامًا، مخفي عادةً حتى يتلقّى التركيز، يقفز إلى المحتوى الرئيسي. يتيح لمستخدمي لوحة المفاتيح تجاوز التنقّل المتكرّر، محقّقًا معيار WCAG ‏2.4.1 Bypass Blocks.","lesson":"l-a11y-3-1","course":"web-accessibility"},{"id":"modal-dialog","term":"نافذة الحوار المشروطة (modal dialog)","definition":"نافذة تحجب بقية الصفحة حتى تُغلق. وعنصر dialog الأصلي المفتوح بـ showModal() ينقل التركيز إلى داخله، ويجعل الصفحة inert، ويُغلق بـ Escape، ويعيد التركيز بعد ذلك.","lesson":"l-a11y-3-2","course":"web-accessibility"},{"id":"inert","term":"inert","definition":"خاصية في HTML تُخرج العنصر وكل ما بداخله من التركيز والتفاعل بالمؤشّر وشجرة إمكانية الوصول. وهي مناسبة للأدراج المغلقة واللوحات الواقعة خارج الشاشة والمحتوى الذي خلف طبقة مخصّصة.","lesson":"l-a11y-3-2","course":"web-accessibility"},{"id":"aria","term":"ARIA","definition":"اختصار Accessible Rich Internet Applications، وهي مجموعة خصائص للأدوار والحالات والخصائص تغيّر ما تكشفه شجرة إمكانية الوصول. لا تضيف أي سلوك أبدًا، لذا يُفضَّل HTML الأصلي حيثما وُجد.","lesson":"l-a11y-3-3","course":"web-accessibility"},{"id":"live-region","term":"Live region","definition":"عنصر تُعلن قارئات الشاشة تغييرات محتواه دون نقل التركيز. ‏role=“status” مهذّبة وrole=“alert” حازمة؛ ويجب أن تكون المنطقة موجودة قبل أن يتغيّر نصها.","lesson":"l-a11y-3-3","course":"web-accessibility"},{"id":"apg","term":"دليل ARIA Authoring Practices ‏(APG)","definition":"دليل من W3C يصف أنماط الـ widgets الشائعة مثل التبويبات والـ disclosure ونافذة الحوار وزر القائمة، مع الأدوار والحالات وتفاعل لوحة المفاتيح الذي يتوقّعه المستخدمون من كلٍّ منها.","lesson":"l-a11y-3-4","course":"web-accessibility"},{"id":"roving-tabindex","term":"Roving tabindex","definition":"تقنية للـ widgets المركّبة لا يحمل فيها tabindex=“0” إلا العنصر النشط، بينما تحمل البقية “-1”. فيكون الـ widget محطة Tab واحدة، وتنقل مفاتيح الأسهم التركيز والقيمة 0 بين العناصر.","lesson":"l-a11y-3-4","course":"web-accessibility"},{"id":"contrast-ratio","term":"نسبة التباين (contrast ratio)","definition":"مقياس WCAG للفرق في الإضاءة النسبية بين لونين، من 1:1 إلى 21:1. يحتاج المستوى AA إلى 4.5:1 للنص العادي، و3:1 للنص الكبير وللعناصر غير النصية الضرورية.","lesson":"l-a11y-4-1","course":"web-accessibility"},{"id":"reflow","term":"إعادة التدفّق (reflow)","definition":"معيار WCAG ‏1.4.10: يجب أن يتّسع المحتوى لـ viewport عرضه 320 بكسل CSS دون تمرير أفقي، وهو عرض نافذة بعرض 1280px عند تكبير 400%. وجداول البيانات والخرائط مستثناة.","lesson":"l-a11y-4-2","course":"web-accessibility"},{"id":"prefers-reduced-motion","term":"prefers-reduced-motion","definition":"media feature في CSS تعكس إعداد نظام التشغيل لدى المستخدم لتقليل الحركة. استخدمها لاستبدال الحركات الكبيرة بتلاشٍ أو لحذفها، مراعاةً للمصابين باضطرابات دهليزية.","lesson":"l-a11y-4-2","course":"web-accessibility"},{"id":"accessible-name","term":"الاسم المتاح (accessible name)","definition":"النص الذي يعرّف العنصر للتقنيات المساعدة. تحسبه المتصفّحات من aria-labelledby، ثم aria-label، ثم التسمية الأصلية مثل label أو alt، ثم المحتوى، ثم title.","lesson":"l-a11y-4-3","course":"web-accessibility"},{"id":"label-in-name","term":"Label in Name","definition":"معيار WCAG ‏2.5.3: حين يكون لعنصر التحكّم نص مرئي، يجب أن يحتوي اسمه المتاح ذلك النص، ويُفضَّل أن يكون في بدايته، ليستطيع مستخدمو التحكّم الصوتي تفعيله بنطق ما يرونه.","lesson":"l-a11y-4-3","course":"web-accessibility"},{"id":"logical-properties","term":"الخصائص المنطقية (logical properties)","definition":"خصائص CSS مثل margin-inline-start وpadding-inline-end تتبع اتجاه الكتابة بدلًا من الجهات الفيزيائية، فتنعكس التخطيطات تلقائيًا في اللغات التي تُكتب من اليمين إلى اليسار مثل العربية.","lesson":"l-a11y-4-4","course":"web-accessibility"},{"id":"axe-core","term":"axe-core","definition":"محرّك قواعد مفتوح المصدر لإمكانية الوصول من شركة Deque، يعمل داخل الصفحة ويبلّغ عن المخالفات مع الإشارة إلى معايير WCAG. وهو يشغّل axe DevTools وتدقيق إمكانية الوصول في Lighthouse وتكاملات اختبار مثل ‎@axe-core/playwright.","lesson":"l-a11y-5-1","course":"web-accessibility"},{"id":"browse-mode","term":"وضع التصفّح (browse mode)","definition":"وضع في NVDA يقرأ فيه مؤشّر افتراضي الصفحة، وتقفز الحروف المفردة بين العناصر، مثل H للعناوين. أما وضع التركيز (focus mode) فيرسل ضغطات المفاتيح إلى العنصر الذي عليه التركيز للكتابة.","lesson":"l-a11y-5-2","course":"web-accessibility"},{"id":"testing-trophy","term":"كأس الاختبارات (Testing trophy)","definition":"نموذج لمجموعة الاختبارات من أربع طبقات: التحليل الساكن، واختبارات unit وintegration وend-to-end. يكون في أعرض حالاته عند اختبارات الـ integration، التي تمنح عادةً أكبر ثقة مقابل تكلفتها.","lesson":"l-tj-1-1","course":"testing-javascript"},{"id":"unit-test","term":"Unit test","definition":"اختبار يفحص دالة واحدة أو وحدة برمجية واحدة بمعزل عن غيرها، وعادةً في أجزاء من الثانية. مثالي للمنطق الصافي ذي الحالات الحدّية الكثيرة، مثل تقريب المبالغ المالية.","lesson":"l-tj-1-1","course":"testing-javascript"},{"id":"integration-test","term":"Integration test","definition":"اختبار يفحص عدة وحدات تعمل معًا، مثل مكوّن نموذج يستخدم كود التحليل الحقيقي مع شبكة مزيّفة. يلتقط أخطاء الربط التي تفوت الـ unit tests.","lesson":"l-tj-1-1","course":"testing-javascript"},{"id":"end-to-end-test","term":"End-to-end test","definition":"اختبار يقود التطبيق الحقيقي في متصفّح حقيقي، عبر الواجهة والـ API وطبقة البيانات. وهو أقرب أنواع الاختبارات إلى الواقع وأغلاها ثمنًا.","lesson":"l-tj-4-1","course":"testing-javascript"},{"id":"watch-mode","term":"وضع المراقبة (Watch mode)","definition":"الوضع الافتراضي لـ Vitest محليًا: بعد التشغيل ينتظر، وحين تحفظ ملفًا يعيد تشغيل الاختبارات المتأثّرة بذلك التغيير فقط، معتمدًا على مخطّط الوحدات في Vite.","lesson":"l-tj-1-2","course":"testing-javascript"},{"id":"aaa","term":"Arrange, Act, Assert","definition":"شكل ثلاثي للاختبارات: ابنِ المدخلات، ونفّذ الفعل الوحيد الخاضع للاختبار، ثم اذكر ما يجب أن يكون صحيحًا الآن. يجعل الاختبارات سهلة التصفّح بالعين.","lesson":"l-tj-1-3","course":"testing-javascript"},{"id":"assertion","term":"Assertion","definition":"فحص داخل الاختبار يرمي خطأً حين لا تكون القيمة كما توقّعت، مثل <code dir=\"ltr\">expect(total).toBe(1000)</code>. ويفشل الاختبار حين يرمي أحد الـ assertions خطأً.","lesson":"l-tj-1-3","course":"testing-javascript"},{"id":"implementation-detail","term":"التفاصيل الداخلية (Implementation detail)","definition":"الطريقة التي ينتج بها الكود نتيجته (دوال مساعدة خاصة، وحالة داخلية، وترتيب الاستدعاءات)، في مقابل السلوك الذي يلاحظه المستدعون. الاختبارات المرتبطة بها تنكسر مع إعادات هيكلة غير ضارّة.","lesson":"l-tj-2-1","course":"testing-javascript"},{"id":"invariant","term":"الثابت (Invariant)","definition":"خاصية تصحّ مع كل مدخل صالح، مثل “مجموع الحصص يساوي الإجمالي”. وتأكيد ثابت ما عبر عدة مدخلات يلتقط عائلات كاملة من الأخطاء.","lesson":"l-tj-2-1","course":"testing-javascript"},{"id":"boundary-value","term":"تحليل القيم الحدّية (Boundary value analysis)","definition":"اختبار المدخلات الواقعة تحت كل حدّ في قاعدة ما مباشرة، وعليه، وفوقه مباشرة، مثل 0 و0.01، أو منزلتين عشريتين وثلاث، لأن الأخطاء تتجمّع عند هذه الحواف.","lesson":"l-tj-2-2","course":"testing-javascript"},{"id":"table-driven-test","term":"الاختبار المعتمد على الجداول (Table-driven test)","definition":"اختبار يُكتب مرة واحدة ويُشغَّل لكل صف في جدول من المدخلات والمخرجات المتوقّعة. في Vitest، ينشئ <code dir=\"ltr\">test.each</code> اختبارًا مسمّى لكل صف.","lesson":"l-tj-2-2","course":"testing-javascript"},{"id":"stub","term":"Stub","definition":"متعاون بديل يعيد إجابات جاهزة كي يتحكّم الاختبار في اعتمادية ما، مثل كائن API تُحلّ دالة <code dir=\"ltr\">post</code> فيه دائمًا بمعرّف.","lesson":"l-tj-2-3","course":"testing-javascript"},{"id":"test-double","term":"بديل الاختبار (Test double)","definition":"أي شيء يقوم مقام متعاون حقيقي في الاختبار: الـ stubs تعيد إجابات جاهزة، والـ spies تسجّل الاستدعاءات، والـ mocks هي spies تؤكّد عليها، والـ fakes نسخ أبسط تعمل فعلًا.","lesson":"l-tj-2-4","course":"testing-javascript"},{"id":"spy","term":"Spy","definition":"غلاف حول دالة يسجّل كيف استُدعيت. يراقب <code dir=\"ltr\">vi.spyOn(object, method)</code> دالة حقيقية، ويستطيع أيضًا استبدالها إلى أن تُستعاد.","lesson":"l-tj-2-4","course":"testing-javascript"},{"id":"fake-timers","term":"المؤقّتات المزيّفة (Fake timers)","definition":"ساعة خاصة بالاختبار تستبدل <code dir=\"ltr\">setTimeout</code> و<code dir=\"ltr\">setInterval</code> و<code dir=\"ltr\">Date</code>، فتستطيع الاختبارات القفز إلى الأمام باستدعاءات مثل <code dir=\"ltr\">vi.advanceTimersByTime(2000)</code> بدل الانتظار بالوقت الحقيقي.","lesson":"l-tj-2-4","course":"testing-javascript"},{"id":"accessible-name","term":"الاسم القابل للوصول (Accessible name)","definition":"الاسم الذي تعلنه التقنيات المساعدة لعنصر ما، ويُحسب من <code dir=\"ltr\">aria-labelledby</code> أو <code dir=\"ltr\">aria-label</code> أو تسمية مرتبطة أو نص العنصر. وتطابق استعلامات الدور عليه.","lesson":"l-tj-3-1","course":"testing-javascript"},{"id":"query-priority","term":"أولوية الاستعلامات (Query priority)","definition":"الترتيب الذي توصي به Testing Library لإيجاد العناصر: بالدور، أو التسمية، أو النص النائب، أو النص، أو القيمة المعروضة أولًا؛ ثم النص البديل والعنوان؛ والـ test ids في الأخير.","lesson":"l-tj-3-1","course":"testing-javascript"},{"id":"user-event","term":"user-event","definition":"حزمة من Testing Library تحاكي تفاعلات المستخدم كاملة، بما فيها أحداث المؤشّر والتركيز ولوحة المفاتيح، بدل إطلاق أحداث منفردة كما يفعل <code dir=\"ltr\">fireEvent</code>.","lesson":"l-tj-3-2","course":"testing-javascript"},{"id":"findby","term":"استعلام findBy (findBy query)","definition":"استعلام غير متزامن في Testing Library يعيد المحاولة حتى يظهر عنصر مطابق، فيُحلّ به، أو يُرفض بعد انتهاء المهلة (ثانية واحدة افتراضيًا).","lesson":"l-tj-3-3","course":"testing-javascript"},{"id":"msw","term":"MSW (Mock Service Worker)","definition":"مكتبة تعترض طلبات الشبكة في Node والمتصفّح وتجيب عنها بمعالِجات تعرّفها أنت، فيظلّ الـ fetch الحقيقي وكود البيانات لديك يعملان في الاختبارات.","lesson":"l-tj-3-4","course":"testing-javascript"},{"id":"locator","term":"Locator","definition":"في Playwright، وصف كسول وصارم لطريقة إيجاد عنصر، مثل <code dir=\"ltr\">page.getByRole('button', { name: 'Save' })</code>. ويُعاد حلّه مع كل فعل.","lesson":"l-tj-4-1","course":"testing-javascript"},{"id":"web-first-assertion","term":"Assertion موجّه للويب (Web-first assertion)","definition":"assertion في Playwright على locator، مثل <code dir=\"ltr\">toHaveText</code>، يعيد فحص الصفحة حتى ينجح أو تنتهي مهلته، بدل قراءة قيمة مرة واحدة.","lesson":"l-tj-4-1","course":"testing-javascript"},{"id":"fixture","term":"Fixture","definition":"في Playwright، قيمة يطلبها الاختبار باسمها، مثل <code dir=\"ltr\">page</code> أو <code dir=\"ltr\">group</code> مخصّصة، تُهيّأ قبل <code dir=\"ltr\">use()</code> وتُهدم بعده، ولا تُنشأ إلا للاختبارات التي تحتاجها.","lesson":"l-tj-4-2","course":"testing-javascript"},{"id":"trace","term":"Trace","definition":"تسجيل من Playwright لتشغيل اختبار، فيه كل فعل، ولقطات DOM قبله وبعده، ومخرجات الـ console، واستدعاءات الشبكة، ويُفتح في عارض الـ trace.","lesson":"l-tj-4-3","course":"testing-javascript"},{"id":"flaky-test","term":"Flaky test","definition":"اختبار متقلّب ينجح أحيانًا ويفشل أحيانًا دون أي تغيير في الكود، عادةً بسبب التوقيت أو البيانات المشتركة أو الوقت غير المتحكَّم فيه. ويعلّم الفرق تجاهل حالات الفشل.","lesson":"l-tj-4-3","course":"testing-javascript"},{"id":"tdd","term":"التطوير الموجّه بالاختبارات (TDD)","definition":"كتابة اختبار فاشل واحد، ثم جعله ينجح بأبسط كود، ثم إعادة الهيكلة والاختبارات خضراء، في دورات قصيرة متكرّرة تُعرف بـ red وgreen وrefactor.","lesson":"l-tj-5-1","course":"testing-javascript"},{"id":"code-coverage","term":"Code coverage","definition":"نسبة العبارات والفروع والدوال والأسطر التي عملت أثناء الاختبارات. تُظهر الكود غير المختبَر، لكنها لا تُظهر إن كان الكود المنفَّذ قد فُحص فعلًا.","lesson":"l-tj-5-2","course":"testing-javascript"},{"id":"mutation-testing","term":"اختبار الطفرات (Mutation testing)","definition":"تقييم مجموعة الاختبارات بصنع أخطاء صغيرة متعمَّدة (mutants) في الكود وإعادة تشغيل الاختبارات؛ الـ mutants المقتولة التُقطت، والناجية تكشف اختبارات ضعيفة.","lesson":"l-tj-5-3","course":"testing-javascript"},{"id":"equivalent-mutant","term":"Mutant متكافئ (Equivalent mutant)","definition":"mutant لا يغيّر تعديله أي سلوك يستطيع المستدعي ملاحظته، فلا يستطيع أي اختبار معقول قتله. يجب تجاهله، لا مطاردته.","lesson":"l-tj-5-3","course":"testing-javascript"},{"id":"required-check","term":"فحص الحالة الإلزامي (Required status check)","definition":"مهمّة CI يجب أن تنجح قبل أن يُدمج pull request في فرع محمي، فتحوّل pipeline الاختبارات من اقتراح إلى بوابة.","lesson":"l-tj-5-4","course":"testing-javascript"}]