Πέντε αρχικά projects: CLI, SQLite, απογραφή και αρχεία — DedSec Project
Πέντε αρχικά projects: CLI, SQLite, απογραφή και αρχεία Χρησιμοποίησε Python 3.10 ή νεότερη σε άδειο φάκελο εξάσκησης. Κάθε script είναι ανεξάρτητο και δεν εγκαθιστά DedSec. Οι σύνδεσμοι…
Χρησιμοποίησε Python 3.10 ή νεότερη σε άδειο φάκελο εξάσκησης. Κάθε script είναι ανεξάρτητο και δεν εγκαθιστά DedSec. Οι σύνδεσμοι πηγαίου κώδικα είναι σχετικοί με αυτόν τον οδηγό. Ξεχώριζε την υπάρχουσα λειτουργία από τις προτεινόμενες επεκτάσεις: οι δεύτερες είναι ασκήσεις και δεν παρουσιάζονται ως ήδη υλοποιημένες δυνατότητες.
JSON εργασίες: σταθερά IDs και διατήρηση δεδομένων
Άνοιξε το todo.py. Από τον φάκελο του script δοκίμασε:
python todo.py --db practice.json add "Study Python"
python todo.py --db practice.json add "Read about queues"
python todo.py --db practice.json done 1
python todo.py --db practice.json list
Αναμένονται χωριστά IDs 1 και 2, με [x] μόνο στην πρώτη εργασία. Με νέα εκτέλεση list πρέπει να διαβάζεται το ίδιο αρχείο. Το σχετικό --db εξαρτάται από τον τρέχοντα φάκελο, οπότε διαφορετικό cwd μπορεί να δημιουργήσει άλλη βάση χωρίς να έχει χαθεί η πρώτη.
Το πρόγραμμα γράφει προσωρινό sibling και αντικαθιστά τον προορισμό. Αυτό μειώνει τον κίνδυνο μισογραμμένου τελικού JSON, αλλά το σταθερό προσωρινό όνομα δεν είναι concurrency lock ούτε εγγύηση αντοχής σε διακοπή ρεύματος. Δύο writers μπορούν να αντικαταστήσουν ο ένας τις αλλαγές του άλλου. Κράτησε το αρχικό πείραμα single-process· πολλοί writers χρειάζονται συντονισμό ή transactional storage.
Δοκίμασε done 999 και κενό title: πρέπει να αποτύχουν χωρίς αλλαγή έγκυρης βάσης. Φτιάξε χωριστό malformed JSON fixture και κράτησε το error. Επέκταση: έλεγξε id, title και done κάθε φορτωμένης εγγραφής, μαζί με duplicate IDs και λάθος τύπους. Μην «επισκευάζεις» unreadable δεδομένα αντικαθιστώντας τα σιωπηλά με άδεια λίστα.
SQLite σημειώσεις: παράμετροι, σειρά και νέα σύνδεση
Διάβασε το notes.py. Το πραγματικό schema χρησιμοποιεί στήλη text, όχι body, και εμφανίζει εγγραφές με ORDER BY id.
python notes.py --db practice.sqlite3 add "It's a note"
python notes.py --db practice.sqlite3 add "Δοκιμή"
python notes.py --db practice.sqlite3 list
Το εισαγωγικό πρέπει να αποθηκευτεί ως δεδομένο, τα ελληνικά να διατηρηθούν και οι δύο εγγραφές να εμφανιστούν με σειρά ID. Εκτέλεσε list σε νέα διεργασία για έλεγχο persistence. Το placeholder ? δεσμεύει τιμή αντί να ενώνει είσοδο χρήστη με SQL syntax.
Το NOT NULL απορρίπτει null αλλά επιτρέπει κενή συμβολοσειρά. Προτεινόμενη επέκταση: απόρριψη whitespace-only κειμένου πριν από INSERT και database CHECK αν ο κανόνας πρέπει να ισχύει για όλους τους writers. Δοκίμασε quote, Unicode, κενή είσοδο και δεύτερη σύνδεση μετά από commit. Για πλήθος σημειώσεων χρησιμοποίησε SELECT COUNT(*) FROM notes, όχι υπόθεση ότι το cursor.rowcount ενός SELECT δίνει το πλήθος. Μην αλλάξεις πραγματικό schema χωρίς δοκιμασμένο backup.
SHA-256 απογραφή: ένα byte αλλάζει ένα digest
Άνοιξε το hashes.py. Φτιάξε practice-files με alpha.txt που περιέχει abc και beta.txt που περιέχει xyz.
python hashes.py ./practice-files
Αποθήκευσε το manifest έξω από τον εξεταζόμενο φάκελο. Πρόσθεσε μόνο ! στο alpha.txt και επανάλαβε: πρέπει να αλλάξει ένα content digest. Αν το report γραφτεί μέσα στον φάκελο απογραφής, γίνεται και αυτό νέα είσοδος και μπερδεύει τη σύγκριση.
Βρες στον κώδικα το chunk size και την πολιτική traversal. Το incremental hashing περιορίζει το data buffer, αλλά μια τεράστια λίστα paths μπορεί ακόμη να καταναλώσει μνήμη. Unreadable αρχείο, symlink και αλλαγή αρχείου κατά την ανάγνωση χρειάζονται ρητή αντιμετώπιση. Επέκταση: αποτυχία με σαφές status όταν η απογραφή είναι ελλιπής. Το hash συγκρίνει δεδομένα με αναμενόμενο digest· δεν αποδεικνύει ποιος έδωσε αυτό το digest.
ZIP επιθεώρηση: ονόματα και δηλωμένα μεγέθη
Άνοιξε το inspect_zip.py. Δημιούργησε μικρό ZIP με readme.txt και sub/data.txt και εξέτασέ το χωρίς extraction:
python inspect_zip.py practice.zip
Σύγκρινε τα μέλη και τα δηλωμένα μεγέθη. Σε δεύτερο συνθετικό ZIP βάλε ../outside.txt και δες την αναφορά. Δεν χρειάζεται να γραφτεί κανένα extracted αρχείο για να επιθεωρηθεί το directory του archive. Αν η υπάρχουσα έκδοση απλώς αναφέρει ύποπτο μέλος, η μετατροπή σε απόρριψη είναι νέα δυνατότητα και όχι δεδομένη ιδιότητα.
Σχεδίασε tests για absolute path, backslash traversal που στοχεύει Windows, διπλά ονόματα μελών, υπερβολικό entry count και μεγάλο expanded size. Ένα όνομα μπορεί να ερμηνεύεται διαφορετικά σε Linux και Windows. Τα metadata βοηθούν σε preflight limits αλλά δεν αποδεικνύουν πραγματικό κόστος αποσυμπίεσης. Αν προσθέσεις extraction, χρειάζονται όρια και στα πραγματικά bytes που παράγονται.
Κάρτες κειμένου: shuffle δεν σημαίνει βαθμολόγηση
Άνοιξε το flashcards.py. Γράψε UTF-8 TSV με όρο και ορισμό χωρισμένα από πραγματικό tab, όχι από τα δύο σύμβολα backslash και t.
python flashcards.py sample.tsv --seed 4
Με Enter εμφανίζεται ο ορισμός. Το αρχικό script ανακατεύει κάρτες με seeded local random generator και αποκαλύπτει απαντήσεις· δεν βαθμολογεί typed answers, δεν σώζει πρόοδο και δεν υλοποιεί spaced repetition. Ίδιο deck και runtime με ίδιο seed πρέπει να δίνουν ίδια σειρά. Αλλαγή της σειράς αρχικών γραμμών αλλάζει την είσοδο παρότι το seed μένει σταθερό.
Δοκίμασε άδειο deck, μία κάρτα, malformed γραμμή μίας στήλης και ελληνικό ορισμό. Δες πώς παραλείπονται γραμμές με λιγότερες από δύο στήλες. Επέκταση: αναφορά αριθμών skipped γραμμών. Για μελλοντική αποθήκευση προόδου πρόσθεσε stable card IDs και χωριστό state αρχείο. Αλλαγή ερώτησης δεν πρέπει να μεταφέρει στατιστικά άλλης κάρτας. Αυτά είναι ειδικά προβλήματα state management και όχι η ίδια γενική άσκηση len σε κάθε project.