Παρακάτω θα πρέπει να ακολουθήσετε πιστά κάποιες οδηγίες. Σκοπός είναι να εξοικειωθείτε με τη γραμμή εντολών στο linux και ειδικότερα με τη διαδικασία που θα ακολουθούμε όλο το εξάμηνο για το γράψιμο των προγραμμάτων.
Όλες οι γραμμές που αρχίζουν με δολλάριο ( \$ ) είναι γραμμές εντολών που θα πρέπει να γράψετε στη γραμμή εντολών (το \$ δεν το γράφετε). Αν είναι μεγάλες μπορείτε και να χρησιμοποιείτε copy/paste αλλά αν όχι είναι καλύτερο να τις γράφετε με το χέρι ώστε να συνηθίζετε.
Αυτά που ακολουθούν μπορείτε να τα εκτελέσετε και με remote login (από το σπίτι σας π.χ.) σε ένα από τα accounts
tmp01
έωςtmp09
που έχουν ανοιχτεί για σας στονeliot.math.uoc.gr
με το κοινό password που σας έχει δοθεί. Αν το κάνετε έτσι τότε αντί για την πρώτη εντολήcd
που βλέπετε παρακάτω δώστε τις εντολέςcd mkdir <onoma> cd <onoma>Αυτές φτιάχνουν ένα directory με το όνομά σας (ή κάποιο μοναδικό παράγωγο αυτού, με λατινικούς χαρακτήρες και χωρίς κενά) και πηγαίνει εκεί μέσα ώστε να δουλέψετε εκεί και να μη σβήσετε τα αρχεία κάποιου άλλου (και άλλοι να μη σβήσουν τα δικά σας).
Αν έχετε ήδη πανεπιστημιακό username/password μπορείτε να κάνετε login στον
eliot.math.uoc.gr
και με τα δικά σας στοιχεία (οπότε και η δουλειά σας θα παραμείνει στην περιοχή σας).
Δώστε τις παρακάτω εντολές στη γραμμή εντολών (μετά το τέλος κάθε γραμμής πατάτε enter)
$ cd
$ pwd
Μετά την πρώτη εντολή έχετε μεταβεί στο home directory σας και η εντολή pwd
σας λέει ακριβώς σε ποιο directory (κατάλογο) βρίσκεστε.
Έπειτα δημιουργήστε ένα καινούριο directory με όνομα temp
. Με τη δεύτερη εντολή μεταβαίνετε σε αυτό το directory και με την τρίτη επιβεβαιώνετε ότι βρίσκεστε όντως εκεί.
$ mkdir temp
$ cd temp
$ pwd
Η επόμενη εντολή
$ ls -l
που ρωτάει ποια αρχεία υπάρχουν εκεί με λεπτομέρειες (-l
) πρέπει να έχει ως output
total 0
μια και το directory είναι ακόμη κενό.
Τώρα θα φέρουμε με μια εντολή ένα ολόκληρο directory από κάπου αλλού στο δίσκο.
$ cp -ra /home/math/ugrads/math0000/kolount/work .
Δίνοντας μετά την εντολή
$ ls
παίρνουμε ως output το
work
Φέραμε λοιπόν ένα ολόκληρο directory με το όνομα work
. Δώστε την εντολή
$ ls -lR work
για να δείτε τα περιεχόμενα αυτού του καταλόγου (σε λεπτομέρεια) και όλων των υποκαταλόγων του.
Ας μεταβούμε τώρα σε ένα υποκατάλογο
$ cd docs
$ ls
για να πάρουμε το output
alice.txt
που είναι ένα αρχείο κειμένου που περιέχει το βιβλίο "Alice's adventures in Wonderland" του Lewis Carroll. Μπορείτε να δείτε το κείμενο του βιβλίου με την εντολή less
(που είναι απλά viewer και όχι editor, δε σας επιτρέπει δηλ. να το αλλάξετε το αρχείο)
$ less alice.txt
Αν θέλετε να κάνετε την οποιαδήποτε τροποποίηση στο αρχείο τότε πρέπει να χρησιμοποιήσετε ένα editor, π.χ. το nano
, το gedit
ή το geany
.
$ nano alice.txt
(βάλτε στη θέση του nano
στην παραπάνω εντολή διαδοχικά τους άλλους δύο editors για να δείτε τι μόρφή έχει ο καθένας).
Πόσες γραμμές έχει το αρχείο alice.txt; Μπορείτε να το δείτε ως εξής
$ wc -l alice.txt
που έχει ως output
3341 alice.txt
Μπορείτε επίσης να δώσετε τις παρακάτω δύο εντολές για να δείτε πόσες λέξεις ή πόσους χαρακτήρες (γράμματα, αλλά μετράνε και τα κενά) έχει το αρχείο αυτό.
$ wc -w alice.txt
$ wc -c alice.txt
Πάτε τώρα με τον editor της προτίμησής σας και σβήστε 10 γραμμές από το αρχείο αυτό. Δώστε μετά ξανά την εντολή
$ wc -l alice.txt
και βεβαιωθείτε ότι ο αριθμός των γραμμών έχει μειωθεί κατά 10.
Ας γυρίσουμε τώρα πίσω στο directory work
$ cd ..
Και ας πάμε μετά στον κατάλογο programs
.
$ cd programs
$ ls -F
που μας δίνει το output
askisi/ isprime.py quad.py
Το slash (/) εμφανίστηκε δίπλα στο όνομα askisi
επειδή δώσαμε την παράμετρο -F
στο ls
για να μας υποδείξει ότι το askisi
είναι directory και όχι απλό αρχείο. Τα δύο αρχεία με κατάληξη .py
είναι προγράμματα γραμμένα σε Python. Το πρόγραμμα isprime.py
μας λέει αν ο φυσικός αριθμός που του δώσαμε είναι πρώτος αριθμός (δεν έχει διαιρέτες άλλους από το 1 και τον εαυτό του) ενώ το πρόγραμμα quad.py
μας βρίσκει τις ρίζες του τριωνύμου $ax^2+bx+c=0$ ως δύο μιγαδικούς αριθμούς.
Για να τρέξετε το πρώτο πρόγραμμα δίνετε
$ python3 isprime.py
Το πρόγραμμα σας ζητάει να του δώσετε ένα φυσικό αριθμό και σας απαντάει αν είναι πρώτος ή όχι.
Για να τρέξετε το δεύτερο πρόγραμμα δίνετε
$ python3 quad.py
Το πρόγραμμα θα σας ζητήσει τρεις πραγματικούς αριθμούς $a, b, c$ (τους συντελεστές του τριωνύμου) και θα σας δώσει τις δύο ρίζες του τριωνύμου αυτού ως δύο μιγαδικούς αριθμούς (χρησιμοποιεί το σύμβολο j
και όχι το i
για την ποσότητα $\sqrt{-1}$.
Ένα τυπικό τρέξιμο αυτού του προγράμματος φαίνεται παρακάτω:
Enter a: 3
Enter b: 2
Enter c: 1
The solution are (-0.3333333333333333-0.47140452079103173j) and (-0.3333333333333333+0.47140452079103173j)
Για να δείτε πώς είναι γραμμένα τα προγράμματα αυτά δεν έχετε παρά να τα ανοίξετε με το πρόγραμμα less
ή με ένα editor, π.χ. τον nano
.
$ less isprime.py
ή
$ nano isprime.py
Με αυτά που έχουμε δει ως τώρα στο μάθημα δε μπορείτε φυσικά να καταλάβετε πώς είναι γραμμένα αυτά τα προγράμματα αλλά πολύ σύντομα θα γράφουμε τέτοια προγράμματα και πολύ πιο πολύπλοκα από αυτά.
Κατεβαίνουμε τώρα στον κατάλογο askisi
.
$ cd askisi
ο οποίος είναι κενός (βεβαιωθείτε γι' αυτό τρέχοντας την εντολή ls
εκεί μέσα).
Στον κατάλογο αυτό θα φέρουμε τώρα μια άσκηση-υπόδειγμα που μοιάζει με αυτές με τις οποίες θα ασχολούμαστε όλο το εξάμηνο.
Πηγαίνετε με τον browser σας (Firefox, Chrome ή ό,τι άλλο χρησιμοποιείτε) στη θέση
που είναι η σελίδα στην οποία θα εμφανίζονται όλες οι ασκήσεις που θα έχετε να λύσετε και ταυτόχρονα είναι και η σελίδα μέσω της οποίας θα ανεβάζετε στο σύστημα τις λυμένες σας ασκήσεις (τα συμπληρωμένα δηλ. από σας προγράμματα).
Προς την κάτω μεριά της σελίδας θα δείτε τις δύο γραμμές
Τα προβλήματα που είναι ανοιχτά αυτή τη στιμή είναι τα:
example-problem (κλείνει 23:59:59 Oct 8 2017)
Κάντε κλικ στο example-problem
οπότε σας εμφανίζεται ένας κατάλογος με τρία αρχεία, το user.py
, το tester.py
και το README.txt
. Το README.txt
είναι ένα αρχείο με οδηγίες για το πώς πρέπει να δουλεύετε τις ασκήσεις σας γενικά. Για να το δείτε μπορείτε απλά να κάνετε κλικ επάνω του.
Τα αρχεία user.py
και tester.py
αφορούν την άσκηση και πρέπει να τα κατεβάσετε και τα δύο, χωρίς να αλλάξετε τα ονόματα τους, στο κενό directory askisi
στο οποίο είμαστε. Για να το κάνουμε αυτό κάνουμε δεξί κλικ στο καθένα από αυτά τα αρχεία και επιλέγουμε να τα κατεβάσουμε (το κείμενο διαφέρει από browser σε browser γι' αυτή την επιλογή) στον κατάλογο askisi
. Μετά από αυτό αν κάνουμε ls
στον κατάλογο askisi
όπου βρισκόμαστε θα πρέπει να δούμε μόνο τα δύο αυτά αρχεία.
Κάντε τώρα edit το αρχείο user.py
, π.χ. με τον editor nano
.
$ nano user.py
Όλες οι γραμμές που αρχίζουν με το χαρακτήρα #
είναι γραμμές σχόλια στο πρόγραμμα (ουσιαστικά είναι ελεύθερο κείμενο που δεν επηρεάζει τη λειτουργια του προγράμματος). Στις γραμμές αυτές περιγράφονται διάφορες οδηγίες για το πρόγραμμα (τι πρέπει να κάνει, κλπ).
Είναι πολύ σημαντικό να τονίσουμε ότι ό,τι γράψετε εσείς μέσα στο αρχείο αυτό θα πρέπει να είναι ανάμεσα στις γραμμές #### START
και #### STOP
. Δεν επιτρέπται να πειράξετε καμία από τις άλλες γραμμές, ούτε να προσθέσετε νέες εκτός του START-STOP. Αν το κάνετε το πιθανότερο είναι ότι το πρόγραμμά σας θα θεωρηθεί εσφαλμένο από την αυτόματη διόρθωση με τον υπολογιστή ο οποίος περιμένει να βρει κάποια πληροφορία μέσα στο αρχείο user.py
που θα υποβάλλετε και ψάχνει σε συγκεκριμένα σημεία στο αρχείο.
Ως έχει το αρχείο user.py
είναι ελλιπές αφού το κομμάτι ανάμεσαστα START-STOP είναι κενό (αυτό που πρέπει να γράψετε εσείς και που πρέπει να υλοποιεί αυτά που ζητάει το πρόγραμμα). Δε θα ασχοληθούμε σε αυτό το εργαστήριο με την ουσία του συγκεκριμένου αυτού προγράμματος.
Πάρτε όμως με copy τις παρακάτω γραμμές
if c>=3:
f = (a+b+c)/3
else:
ab = (a+b)/2
f = (c+ab)/2
και τοποθετείστε τις ακριβώς όπως είναι ανάμεσα στα START-STOP. Δώστε ιδιαίτερη προσοχή στη στοίχιση ώστε να μη παρεισφρύσουν τίποτα κενά στις αρχές των γραμμών. Το if
και το else
πρέπει να αρχίζουν ακριβώς στην αρχή της γραμμής και όλες οι υπόλοιπες γραμμές να είναι στοιχημένες, η μια κάτω από την άλλη, πιο δεξιά από τα if
, else
.
Σώστε το αρχείο σας και βγείτε από τον editor. Το αρχείο user.py
είναι τώρα συμπληρωμένο με το σωστό πρόγραμμα και προχωράμε στον έλεγχό του με το πρόγραμμα tester.py
. Ευρισκόμενοι πάντα στον κατάλογο askisi
δίνουμε την εντολή
$ python3 tester.py
Το πρόγραμμα tester
τώρα, που έχει γραφεί ειδικά γι' αυτή την άσκηση, ψάχνει και βρίσκει το πρόγραμμα user.py
που γράψατε, στον ίδιο κατάλογο όπου είστε τώρα, και το ελέγχει τρέχοντάς το σε κάποιες περιπτώσεις ελέγχου. Το output που θα πάρετε θα πρέπει να είναι το εξής:
-------------------Case No 0------------------
OK
---Case No 0: OK
-------------------Case No 1------------------
OK
---Case No 1: OK
-------------------Case No 2------------------
OK
---Case No 2: OK
-------------------Case No 3------------------
OK
---Case No 3: OK
-------------------Case No 4------------------
OK
---Case No 4: OK
****** The program has run correctly in all cases.
Φαίνεται εδώ ότι το πρόγραμμα έχει ελεγχθεί σε 5 περιπτώσεις και έχει δουλέψει σωστά και στις 5. Αν το πρόγραμμα δεν τρέξει σωστά έστω και σε μία περίπτωση τότε θεωρείται λανθασμένο.
Αν τώρα δώσετε στον κατάλογο askisi
$ ls
θα πάρετε το output
__testcode__0.py __testcode__1.py __testcode__2.py __testcode__3.py __testcode__4.py tester.py user.py
Παρατηρείστε ότι ο tester έχει δημιουργήσει και κάποια αρχεία με ονόματα της μορφής __testcode__ ...
. Αυτά τα αρχεία είναι ουσιαστικά όλοι οι έλεγχοι που έκανε. Μπορείτε να τα αγνοήσετε τελείως ή ακόμη και να τα σβήσετε αν προτιμάτε.
Ξαναμπείτε τώρα με τον editor στο αρχείο user.py
και σβήστε μια από τις γραμμές που προσθέσατε προηγουμένως ανάμεσα στα START και STOP, την τελευταία. Σώστε το αρχείο, βγείτε έξω και ξανατρέξτε τον tester
$ python3 tester.py
Θα πάρετε το output
-------------------Case No 0------------------
OK
---Case No 0: OK
-------------------Case No 1------------------
Timed out!
Traceback (most recent call last):
File "__testcode__1.py", line 31, in <module>
if abs(uuu - 4) > 1e-5: #### Change this line
NameError: name 'uuu' is not defined
---Case No 1: ERROR
-------------------Case No 2------------------
Timed out!
Traceback (most recent call last):
File "__testcode__2.py", line 31, in <module>
if abs(uuu - 3.25) > 1e-5: #### Change this line
NameError: name 'uuu' is not defined
---Case No 2: ERROR
-------------------Case No 3------------------
OK
---Case No 3: OK
-------------------Case No 4------------------
Timed out!
Traceback (most recent call last):
File "__testcode__4.py", line 31, in <module>
if abs(uuu - 2.75) > 1e-5: #### Change this line
NameError: name 'uuu' is not defined
---Case No 4: ERROR
****** The program has run in error in some cases.
Τώρα το πρόγραμμα δεν έτρεξε σωστά σε όλες τις περιπτώσεις ελέγχου. Έτρεξε σωστά στις περιπτώσεις 0 και 3 αλλά όχι στις υπόλοιπες. Το κείμενο που εμφανίζεται σε κάθε περίπτωση λάθους διαφέρει από φορά σε φορά και θα σας είναι σε πολλές περιπτώσεις πολύ δύσκολο να το αποκρυπτογραφήσετε (όπως στη συγκεκριμένη περίπτωση εδώ) αφού δεν αναφέρεται καν στο αρχείο user.py
αλλά στα αρχεία __testcode__ ...
που δημιούργησε ο tester.
Σε τέτοιες περιπτώσεις θα πρέπει να τρέχετε και το πρόγραμμά σας απ' ευθείας και όχι να στηρίζεστε μόνο στον tester για να βρείτε τα λάθη σας.
$ python3 user.py
Τρέχοντας έτσι το πρόγραμμά σας και επιλέγοντας εσείς τα inputs που θα δώσετε κάθε φορά μπορείτε να ανακαλύψετε το λάθος σας.
Αφού ετοιμάσετε το αρχείο user.py
και περνάει από τον tester και από ό,τι άλλο έλεγχο επιλέξετε εσείς να του κάνετε μπορείτε να γυρίσετε πίσω στη σελίδα του μαθήματος
και να το υποβάλλετε. (Αν δεν έχετε πάρει ακόμη τα username/password του Πανεπιστημίου τότε δε μπορείτε ακόμη να το κάνετε, αλλά αν τα έχετε υποβάλλετε ό,τι έχετε για να το δοκιμάσετε.)
Μπορείτε να το υποβάλλετε πολλές φορές μέχρι τη λήξη της προθεσμίας του κάθε προγράμματος. Μένει πάντα η τελευταία. Το πρόγραμμα που υποβάλλατε σας στέλνεται και με email ως αποδεικτικό της κατάθεσής του (στο πανεπιστημιακό σας email).
Τέλος, ανεβείτε ένα κατάλογο πάνω
$ cd ..
και ξαναελέγξτε το πρόγραμμά σας με τον tester
$ python3 tester.py
για να πάρετε την απάντηση
python3: can't open file 'tester.py': [Errno 2] No such file or directory
Αυτό σημαίνει ότι το πρόγραμμα python3
(το πρόγραμμα δηλ. που εκτελεί τα προγράμματα σε Python 3, ο python interpreter με άλλα λόγια) δε βρίσκει το αρχείο tester.py
που του ζητήσατε να εκτελέσει. Αυτό είναι φυσικό αφού το όνομα tester.py
αναφέρεται σε ένα αρχείο στον τοπικό κατάλογο (που τώρα είναι το programs
πάνω από το askisi
) και το αρχείο δεν είναι σε αυτόν τον κατάλογο αλλά σε ένα υποκατάλογό του.
Για να βρεί το πρόγραμμα python3
το αρχείο tester.py
που θέλουμε να εκτελέσει μπορούμε να περιγράψουμε σωστά το όνομα του αρχείου ως askisi/tester.py
αφού σε σχέση με εκεί που βρισκόμαστε αυτό είναι το όνομά του:
$ python3 askisi/tester.py
Είναι λίγο απογοητευτικό αλλά απολύτως αναμενόμενο και λογικό ότι ούτε τώρα θα δουλέψει το πρόγραμμα αφού ο tester αναμένει να βρει το αρχείο user.py
στον τρέχοντα κατάλογο, ο οποίος παραμένει το programs
αφού δε φύγαμε από αυτόν:
Traceback (most recent call last):
File "askisi/tester.py", line 81, in <module>
lines = open(tst_userfilename).readlines()
FileNotFoundError: [Errno 2] No such file or directory: 'user.py'
Υπάρχει όμως λύση αφού το πρόγραμμα tester.py
είναι φτιαγμένο ώστε να παίρνει κι ένα προαιρετικό όρισμα το οποίο λέει στον tester.py
ποιο αρχείο να ελέγξει (όχι λοιπόν αναγκαστικά το 'user.py
). Αν δώσουμε
$ python3 askisi/tester.py askisi/user.py
τότε ο tester θα τρέξει κανονικά και θα ελέγξει το αρχείο user.py
.