الدرس 36 من 56 · مهارات إضافية لكل شيء

المشروع الختامي الكبير: خزنة المهام المحمية

وصلنا لآخر درس — وهذا مو درس عادي، هذا تخرّج. راح نبني برنامجاً كاملاً يجمع كل ما تعلمناه بالدورة في قطعة وحدة:

• كلمة مرور محمية بالهاش (الأمان)
• حفظ واسترجاع بـ JSON (المهارات)
• التواريخ على كل مهمة (الوقت)
• الحماية من الأخطاء بـ try/except (الدرع)

البرنامج: خزنة مهام خاصة بك — مهامك الشخصية محفوظة بملف، ولا أحد يفتح الخزنة إلا بكلمة مرورك.

import json, hashlib
from datetime import datetime

DATA = "mytasks.json"

def load():
    try:
        with open(DATA, encoding="utf-8") as f:
            return json.load(f)
    except Exception:
        return {"tasks": []}   # أول مرة: ملف غير موجود

def save(d):
    with open(DATA, "w", encoding="utf-8") as f:
        json.dump(d, f, ensure_ascii=False)

data = load()

# أول تشغيل: نسوي كلمة مرور
if "pw" not in data:
    data["pw"] = hashlib.sha256(
        input("سوّ كلمة مرور للخزنة: ").encode()
    ).hexdigest()
    save(data)
else:
    guess = hashlib.sha256(input("كلمة المرور: ").encode()).hexdigest()
    if guess != data["pw"]:
        print("كلمة مرور غلط — الخزنة مقفلة")
        raise SystemExit

while True:
    cmd = input("[1] أضف مهمة  [2] اعرض مهامي  [3] خروج: ")
    if cmd == "1":
        t = input("وش المهمة؟ ")
        when = datetime.now().strftime("%Y-%m-%d %H:%M")
        data["tasks"].append({"t": t, "at": when})
        save(data)
        print("انحفظت!")
    elif cmd == "2":
        print("--- مهامي ---")
        for task in data["tasks"]
            print(task["at"], "→", task["t"])
    elif cmd == "3":
        print("مع السلامة!")
        break
    else:
        print("اختر 1 أو 2 أو 3")

امشي على الكود سطر سطر وشوف وش تعرف:

• load() تحاول تقرأ الملف، وإذا ما موجود ترجع قائمة فارغة — try/except درعنا من الانهيار أول مرة!
• كلمة المرور ما تنحفظ أبداً نصاً — نحفظ الهاش بس، ونقارن الهاشات عند كل دخول
• كل مهمة تنحفظ مع تاريخها الحقيقي بنفس لحظة إضافتها
• save() بعد كل إضافة — عشان لو طفى الجهاز، شغلك محفوظ
• الحلقة الرئيسية: قائمة خيارات ما تخرج إلا إذا اختار 3

هذا هو المبرمج الحقيقي: ما يحفظ أكواد — يفكر ويركّب. أنت الحين تقرأ برنامجاً فيه دوال وملفات وحماية وتواريخ وتفهم كل سطر فيه. مبروك وصولك لهنا. آخر خطوة: الاختبار، وبعده الشهادة بانتظارك.

اختبار سريع للدرس

جاوب على كل الأسئلة — لازم كلها صح. إذا غلطت بيطلع صندوق ذهبي يفهّمك وش الخطأ. مو عيب تغلط، كل مبرمج بالعالم غلط وأخذ منها درس.

1. ليش ما نحفظ كلمة المرور نصاً داخل الملف؟
2. ليش حولنا json.load بـ try؟
3. وش يضيف كل سطر لحظة إضافة مهمة؟
الدرس 35 الدرس 37 — سلاسل النصوص المحترفة
FeLiXFeLiX AI — مساعد المنصتين