Commit a5f2376d authored by Antonios Angelakis's avatar Antonios Angelakis

Edit first 2 chapters

parent 67ccb534
......@@ -83,8 +83,6 @@
publisher={Pearson Education}
}
@MastersThesis{Tsiamitros,
author={Νικόλαος Τσιαμήτρος},
title={Σχεδίαση και Υλοποίηση Καταναμημένου Συστήματος για την Αυτόματη
......@@ -93,3 +91,12 @@
address={Ελλάδα},
year={2015},
}
@MastersThesis{Rozhkov,
author={Рожков М.},
title={Система автоматического тестирования программ и организации соревнований по программированию},
school={FEFU},
address={Russia},
year={2004},
}
......@@ -87,29 +87,30 @@ Software development, Free and open source software.
Ο σκοπός της παρούσας διπλωματικής εργασίας είναι ο σχεδιασμός και η υλοποίηση
νέων δυνατοτήτων σε ένα σύστημα αυτόματης αξιολόγησης προγραμματιστικών
ασκήσεων. Το σύστημα που τροποποιήθηκε, όπως θα περιγραφεί παρακάτω,
χρησιμοποιείται τόσο από το Εργαστήριο Τεχνολογίας
Λογισμικού\footnote{http://grader.softlab.ntua.gr} όσο και από την Ελληνική
Εταιρεία Επιστημόνων και Επαγγελματιών Πληροφορικής και Επικοινωνιών
(ΕΠΥ)\footnote{http://hellenico.gr/grader} για τη διοργάνωση των Πανελλήνιων
ασκήσεων. Το σύστημα που τροποποιήθηκε χρησιμοποιείται τόσο από το Εργαστήριο
Τεχνολογίας Λογισμικού \footnote{http://grader.softlab.ntua.gr}, για
προγραμματιστικές ασκήσεις και εξετάσεις, όσο και από την Ελληνική Εταιρεία
Επιστημόνων και Επαγγελματιών Πληροφορικής και Επικοινωνιών (ΕΠΥ)
\footnote{http://hellenico.gr/grader} για τη διοργάνωση των Πανελλήνιων
Διαγωνισμών Πληροφορικής.
\bigskip
Το σύστημα αυτόματης αξιολόγησης (Grader) δέχεται τις υποβολές των
διαγωνιζομένων σε συγκεκριμένα προβλήματα που ανήκουν σε διαγωνισμούς,
ώστε να τις χαρακτηρίσει ενεργές ή όχι, αξιολογώντας
το αποτέλεσμα και την απόδοση τους σε συγκεκριμένα αρχεία ελέγχου.
Έπειτα, αφού κλείσουν οι υποβολές, επαναξιολογεί όλες τις ενεργές
υποβολές αυτόματα, ώστε να παράξει τα τελικά αποτελέσματα.
διαγωνιζομένων σε συγκεκριμένα προβλήματα που ανήκουν σε διαγωνισμούς, ώστε να
τις χαρακτηρίσει ενεργές ή όχι, αξιολογώντας το αποτέλεσμα και την απόδοση τους
σε συγκεκριμένα αρχεία ελέγχου. Έπειτα, αφού κλείσουν οι υποβολές,
επαναξιολογεί όλες τις ενεργές υποβολές αυτόματα, ώστε να παράξει τα τελικά
αποτελέσματα.
\bigskip
Ο Grader, στην πρότερη κατάσταση του, επέτρεπε μόνο τη δημιουργία
μεμονωμένων αρχείων ελέγχου και όχι συνδυαστικών ομάδων καθιστώντας
δύσκολη τη δημιουργία προβλημάτων με δυαδικά αποτελέσματα, π.χ. σωστό/λάθος.
Επιπροσθέτως, δεν υπήρχε η επιλογή για προσθήκη αρχείων ελέγχου αξιολόγησης
χωρίς επιρροή στην αρχική αξιολόγηση μιας υποβολής ως θετική ή αρνητική.
Ο Grader, στην πρότερη κατάσταση του, επέτρεπε μόνο τη δημιουργία μεμονωμένων
αρχείων ελέγχου και όχι συνδυαστικών ομάδων περιορίζοντας την ευελιξία των
διαχειριστών και μην επιτρέποντας οποιαδήποτε ομαδοποίηση ή χαρακτηρισμό των
αρχείων. Επιπροσθέτως, ήταν εμφανής η έλλειψη ενός τύπου εκτέλεσης αρχείου ελέγχου
που να μην προκαθορίζει την αξιολόγηση μιας υποβολής ως θετική ή αρνητική ανεξάρτητα
από την έκβαση του.
\bigskip
......@@ -117,15 +118,15 @@ Software development, Free and open source software.
αξιολόγησης για διαγωνισμούς πληροφορικής, για να χρησιμοποιηθεί κυρίως από την
ΕΠΥ. Ως αποτέλεσμα, κάθε πρόβλημα αντιστοιχίζεται σε έναν μόνο διαγωνισμό και τόσο
οι διαγωνιζόμενοι όσο και οι υποβολές τους συνδέονται με το πρόβλημα. Για τη χρήση
του Grader σε εργασίες προγραμματισμού, θα μας ήταν προτιμότερο να υπάρχει
διαχωρισμός προβλήματος και υποβολών ώστε τα προβλήματα να μπορούν να
επαναχρησιμοποιηθούν ευκολότερα.
του Grader σε εργασίες προγραμματισμού, θα μας ωφελούσε η ύπαρξη διαχωρισμού
προβλήματος και υποβολών ώστε τα προβλήματα να μπορούν να επαναχρησιμοποιηθούν
ευκολότερα, χωρίς να "κουβαλάνε" τις υποβολές που έχουν γίνει σε αυτά.
\bigskip
Επιπλέον, κρίθηκε σημαντικό να προστεθεί η Python στις διαθέσιμες γλώσσες
υποβολής καθώς πρόκειται για μια από τις πλέον δημοφιλείς γλώσσες και
χρησιμοποιείται ως εισαγωγική γλώσσα προγραμματισμού σε σημαντικά ακαδημαϊκά
χρησιμοποιείται ως εισαγωγική γλώσσα προγραμματισμού σε σπουδαία ακαδημαϊκά
ιδρύματα, όπως είναι το MIT και το Stanford \cite{website:popularpython}.
Τέλος, ήταν απαραίτητο να γίνουν μικρές βελτιστοποιήσεις στη λογική του Grader,
να προστεθούν μικρότερες δυνατότητες που επιδιώκουν τη βελτίωση της ευκολίας
......@@ -142,22 +143,24 @@ Software development, Free and open source software.
\begin{itemize}
\item \textbf{Κεφάλαιο 2}: Συστήματα Αυτόματης Αξιολόγησης \\
Παρουσιάζουμε κάποια γνωστά συστήματα αυτόματης αξιολόγησης με παρόμοια
λειτουργία και σκοπό όπως ο Grader. Γίνεται επίσης μια σύγκριση με τις
δυνατότητες του παρόντος συστήματος.
λειτουργία και σκοπό με το Grader.
\item \textbf{Κεφάλαιο 3}: Περιγραφή Grader - Kewii \\
Περιγράφεται η υπάρχουσα δομή και λειτουργία του Grader, αναλύοντας τα
διαφορετικά μέρη του και τις σχέσεις μεταξύ τους.
Περιγράφονται τα βασικά δομικά στοιχεία και έννοιες του συστήματος που
μελετούμε. Αναλύεται το σύστημα αξιολόγησης Kewii, η διαδικτυακή
εφαρμογή Grader και η επικοινωνία μεταξύ τους.
\item \textbf{Κεφάλαιο 4}: Προσθήκη Ομάδων Αρχείων Ελέγχου \\
Αναλύεται η σχεδιαστική λογική και η υλοποίηση της νέας δυνατότητας του
συστήματος, για ομαδοποίηση των αρχείων ελέγχου των προβλημάτων.
Περιγράφεται αρχικά η προσθήκη του blue tag, ενός νέου τύπου εκτέλεσης
αρχείων ελέγχου. Αναλύεται η σχεδιαστική λογική και η υλοποίηση της νέας
δυνατότητας του Grader με σκοπό την ομαδοποίηση των αρχείων ελέγχου.
\item \textbf{Κεφάλαιο 5}: Σχεδίαση για διαχωρισμό Προβλημάτων - Διαγωνισμών \\
Περιγράφεται η υλοποίηση της συγκεκριμένης τροποποίησης για την βελτίωση της
λειτουργίας του Grader στο πλαίσιο προγραμματιστικών ασκήσεων.
Περιγράφεται η υλοποίηση της τροποποίησης του συστήματος για την βελτίωση
της λειτουργίας του Grader στο πλαίσιο προγραμματιστικών ασκήσεων.
\item \textbf{Κεφάλαιο 6}: Λοιπές Προσθήκες \\
Στο συγκεκριμένο κεφάλαιο παρατίθενται βελτιώσεις και προσθήκες μικρότερου
μεγέθους.
μεγέθους: Προσθήκη της Python, μαζικό ανέβασμα αρχείων/ομάδων και αλλαγή
επέκτασης MySQL.
\item \textbf{Κεφάλαιο 7}: Συμπεράσματα \\
Στο τελευταίο κεφάλαιο παρουσιάζονται κάποιες παρατηρήσεις σχετικά με τη
Στο τελευταίο κεφάλαιο παρουσιάζονται παρατηρήσεις σχετικά με τη
διπλωματική και αναφέρονται ιδέες για περαιτέρω ανάπτυξη του συστήματος.
\end{itemize}
......@@ -174,14 +177,14 @@ O Grader έχει σκοπό τη διοργάνωση προγραμματισ
Προτιμήθηκε να ελεγχθούν μόνο συστήματα ελεύθερου λογισμικού και ανοιχτού
κώδικα διότι μας προσφέρουν σημαντικά πλεονεκτήματα. Αρχικά, μας επιτρέπουν να
ερευνήσουμε τον τρόπο που είναι σχεδιασμένα και να πάρουμε ιδέες για τον
Grader. Επιπλέον, είναι πιθανό να παρέχουν καλύτερη ασφάλεια, καθώς
οποιοσδήποτε μπορεί να ελέγξει τον κώδικα για ευπάθειες. Φυσικά, το τελευταίο
ισχύει υπό την προϋπόθεση ότι υπάρχει πρωτοβουλία για έλεγχο της ασφάλειας
(audit), αφού η απλή δημοσιοποίηση του κώδικα μπορεί να δίνει την ψευδαίσθηση
(όπως αναφέρεται στο \cite{hansen2002open}). Τέλος, η σύγκριση του Grader με τα
συγκεκριμένα συστήματα έχει μεγάλη σημασία γιατί θα μπορούσε οποιοδήποτε από
αυτά να τον αντικαταστήσει χωρίς μεγάλο κόστος (κυρίως αυτό της μετάβασης) σε
περίπτωση που θεωρηθεί ανώτερο.
Grader. Επιπλέον, πολλές φορές παρέχουν καλύτερη ασφάλεια, καθώς οποιοσδήποτε
μπορεί να ελέγξει τον κώδικα για ευπάθειες. Φυσικά, το τελευταίο ισχύει υπό την
προϋπόθεση ότι υπάρχει πρωτοβουλία για ανεξάρτητο έλεγχο της ασφάλειας (audit),
αφού η απλή δημοσιοποίηση του κώδικα μπορεί να δίνει την ψευδαίσθηση (όπως
αναφέρεται στο \cite{hansen2002open}). Τέλος, η μελέτη των εν λόγω συστημάτων
είναι απαραίτητη αφού, χάρη στην ελευθερία χρήσης που προσφέρουν, μπορούν να
αντικαταστήσουν το Grader χωρίς μεγάλο κόστος (κυρίως αυτό της μετάβασης) σε
περίπτωση που κριθούν ως ανώτερα.
\bigskip
......@@ -201,14 +204,14 @@ Grader. Επιπλέον, είναι πιθανό να παρέχουν καλύ
\section{CMS}
Το πρώτο σύστημα που θα μελετήσουμε είναι το Contest Management System, CMS εν
συντομία. Πρόκειται για ένα κατανεμημένο σύστημα διαχείρισης και διεξαγωγής
συντομία \footnote{https://cms-dev.github.io/}. Πρόκειται για ένα κατανεμημένο σύστημα διαχείρισης και διεξαγωγής
διαγωνισμών το οποίο σχεδιάστηκε αρχικά για την Διεθνή Ολυμπιάδα Πληροφορικής
του 2012. Αποτελείται από ένα πλήθος μικρο-υπηρεσιών που συνθέτουν το συνολικό
σύστημα.
\bigskip
Είναι, πιθανότατα, το πιο ολοκληρωμένο σύστημα για διαγωνισμούς δεδομένου του
Είναι, πιθανότατα, το πιο ολοκληρωμένο σύστημα για διαγωνισμούς, δεδομένου του
μεγάλου αριθμού διαπιστευτηρίων που κατέχει, συμπεριλαμβανομένης της χρήσης του
σε όλες σχεδόν τις Διεθνείς Ολυμπιάδες από το 2012. Οι δημιουργοί του είχαν ως
στόχο τη δημιουργία ενός συστήματος ασφαλούς, ανθεκτικού σε σφάλματα λογισμικού
......@@ -226,8 +229,8 @@ Public License), η οποία επιτρέπει εμπορική χρήση,
Το CMS είναι γραμμένο σε Python και αποτελείται από πολλά μικρά κομμάτια που
αναλαμβάνουν μια ξεχωριστή λειτουργία. Αυτά μπορούν να έχουν εγκατασταθεί σε
διαφορετικούς εξυπηρετητές, σε απομακρυσμένα συστήματα. Οι υπηρεσίες-κομμάτια, από
τα οποία αποτελείται είναι τα παρακάτω:
διαφορετικούς εξυπηρετητές, ακόμα και σε απομακρυσμένα συστήματα. Οι
υπηρεσίες-κομμάτια, από τα οποία αποτελείται είναι τα παρακάτω:
\begin{itemize}
\setlength\itemsep{0em}
......@@ -247,6 +250,7 @@ Public License), η οποία επιτρέπει εμπορική χρήση,
τις βαθμολογίες.
\item ProxyService \\
Στέλνει τις βαθμολογίες στον εξυπηρετητή Αποτελεσμάτων.
(\cite{maggiolo2014cms})
\item PrintingService \\
Αναλαμβάνει την εκτύπωση των εγγράφων.
\item ContestWebServer \\
......@@ -266,8 +270,9 @@ Public License), η οποία επιτρέπει εμπορική χρήση,
\begin{figure}
\centering
\includegraphics[scale=0.4,trim=4 4 4 4,clip]{Figures/cmsarchitecture.png}
\caption[Η αρχιτεκτονική του CMS]{Οι υπηρεσίες του CMS και οι σχέσεις μεταξύ τους.
Βασισμένο στο σχήμα 1 του \cite{maggiolo2012introducing}.}
\caption[Η αρχιτεκτονική του CMS]{Οι κυριότερες υπηρεσίες του CMS και οι
σχέσεις μεταξύ τους. Βασισμένο στο σχήμα 1 του
\cite{maggiolo2012introducing}.}
\end{figure}
\bigskip
......@@ -285,12 +290,12 @@ EvaluationService και να εκτελεστούν στο ασφαλές πε
\bigskip
Η βάση που χρησιμοποιεί το CMS είναι PostgreSQL και η λειτουργία του βασίζεται
στα χαρακτηριστικά της, οπότε μόνο αυτή υποστηρίζεται. Οι γλώσσες προγραμματισμού
που υποστηρίζει η ευσταθής έκδοση του είναι οι: C, C++, PHP, Pascal, Java και
Python2. Στην τελευταία έκδοση υπό ανάπτυξη (development) υποστηρίζονται επίσης
C\#, Haskell, Python3 και Rust. Για την επέκταση του με παραπάνω γλώσσες αρκεί
η προσθήκη ενός αρχείου προδιαγραφών για κάθε νέα γλώσσα.
σε αποκλειστικά χαρακτηριστικά της (LO, Large Object), οπότε μόνο αυτή
υποστηρίζεται. Οι γλώσσες προγραμματισμού που υποστηρίζει η ευσταθής έκδοση του
είναι οι: C, C++, PHP, Pascal, Java και Python2. Στην τελευταία έκδοση υπό
ανάπτυξη (development) υποστηρίζονται επίσης C\#, Haskell, Python3 και Rust.
Για την επέκταση του με παραπάνω γλώσσες αρκεί η προσθήκη ενός αρχείου
προδιαγραφών για κάθε νέα γλώσσα.
\subsection{Εγκατάσταση και Χρήση}
......@@ -303,12 +308,12 @@ C\#, Haskell, Python3 και Rust. Για την επέκταση του με π
\bigskip
Για να τρέξει επίσης το σύστημα θα πρέπει να γίνουν οι απαραίτητες ρυθμίσεις
Για να τρέξει, επίσης, το σύστημα θα πρέπει να γίνουν οι απαραίτητες ρυθμίσεις
στην βάση αλλά και στο CMS. Μόλις ολοκληρωθεί κι αυτό το βήμα, οι διαχειριστές
μπορούν να δημιουργήσουν διαγωνισμούς και προβλήματα με τρεις τρόπους: μέσω της
διεπαφής Admin, κατευθείαν από το σύστημα αρχείων τους περιγράφοντας με αρχείο
προδιαγραφών τη μορφή τους ή με απευθείας εισαγωγή προηγούμενου διαγωνισμού που
εξάχθηκε.
εξάχθηκε από CMS.
\bigskip
......@@ -355,20 +360,21 @@ ContestWebServer. Εκεί βλέπουν για κάθε πρόβλημα τη
\section{Mooshak 2.0}
Το Mooshak 2.0 είναι κι αυτό ένα σύστημα διαχείρισης διαγωνισμών με αυτόματη
αξιολόγηση για τις υποβολές. Αποτελεί τη νεότερη υλοποίηση του Mooshak, με μεταφορά
του κώδικά από C++ και Tcl σε Java με χρήση της εργαλειοθήκης Google Web Toolkit.
H αρχική έκδοση του Mooshak δημιουργήθηκε το 2000 και βασίζεται σε ένα παλαιότερο
διαδικτυακό σύστημα εκμάθησης, το Ganesh. Ο κώδικας του διατίθεται επίσης ελεύθερα
με χρήση της άδειας Artistic License, η οποία δεν προϋποθέτει την διατήρηση
άδειας ελεύθερου λογισμικού σε μελλοντική τροποποίηση και διανομή.
Το Mooshak 2.0 \footnote{https://mooshak2.dcc.fc.up.pt/} είναι κι αυτό ένα
σύστημα διαχείρισης διαγωνισμών με αυτόματη αξιολόγηση για τις υποβολές.
Αποτελεί τη νεότερη υλοποίηση του Mooshak, με μεταφορά του κώδικά από C++ και
Tcl σε Java με χρήση της εργαλειοθήκης Google Web Toolkit. H αρχική έκδοση του
Mooshak δημιουργήθηκε το 2000 και βασίζεται σε ένα παλαιότερο διαδικτυακό
σύστημα εκμάθησης, το Ganesh. Ο κώδικας του διατίθεται επίσης ελεύθερα με χρήση
της άδειας Artistic License, η οποία δεν προϋποθέτει την διατήρηση άδειας
ελεύθερου λογισμικού σε μελλοντική τροποποίηση και διανομή.
\bigskip
Οι βασικές του προδιαγραφές βασίζονται στους κανόνες των διαγωνισμών ICPC, αλλά
υποστηρίζει και άλλες μορφές διαγωνισμών, όπως είναι οι Ολυμπιάδες πληροφορικής.
Έχει χρησιμοποιηθεί σε πληθώρα τοπικών και διεθνών διαγωνισμών αλλά και σταθερά
στο πλαίσιο εκμάθησης και αξιολόγησης φοιτητών.
στο πλαίσιο εκμάθησης και αξιολόγησης φοιτητών (\cite{leal2008using}).
\subsection{Τεχνικά Χαρακτηριστικά}
......@@ -395,7 +401,7 @@ H αρχική έκδοση του Mooshak δημιουργήθηκε το 2000
στην αποθήκευση όλων των δεδομένων του στο σύστημα αρχείων. Οι γλώσσες
προγραμματισμού που υποστηρίζει περιλαμβάνουν τις C, C++, Java, Pascal, Perl,
Python, Haskell, Haskell και Prolog, ενώ η επέκταση του ώστε να υποστηρίξει
πρόσθετες γλώσσες δεν αποτελεί δύσκολη διαδικασία.
πρόσθετες γλώσσες δεν αποτελεί δύσκολη διαδικασία (\cite{ribeiro2008early}).
\bigskip
......@@ -406,15 +412,15 @@ Python, Haskell, Haskell και Prolog, ενώ η επέκταση του ώστ
λειτουργίας στατικής ανάλυσης του πηγαίου κώδικα της υποβολής και αξιολόγησης
του με χρήση κριτηρίων ορισμένων από τους διαχειριστές του διαγωνισμού. Αυτό
επιτρέπει τη χρήση του Mooshak, παραδείγματος χάρη για ένα διαγωνισμό τύπου
code golf, δηλαδή επίτευξης της λύσης με το λιγότερο κώδικα.
code golf, δηλαδή επίτευξης της λύσης με το λιγότερο δυνατό κώδικα.
\subsection{Εγκατάσταση και Χρήση}
Η εγκατάσταση του Mooshak 2 δεν έχει πολλές απαιτήσεις. Συγκεκριμένα,
χρειάζεται μόνο το περιβάλλον της Java και το λογισμικό του εξυπηρετητή. Σε
αυτό το σημείο, μπορούν να στηθούν επίσης επιπλέον κόμβοι εάν είναι επιθυμητό,
τοπικά ή απομακρυσμένα. Μόλις στηθεί το σύστημα, η δημιουργία των διαγωνισμών
και των προβλημάτων γίνεται μέσω της δικτυακής διεπαφής του Διαχειριστή.
χρειάζεται μόνο το περιβάλλον της Java και το λογισμικό του εξυπηρετητή. Μόλις
γίνει αυτό, μπορούν να στηθούν επίσης επιπλέον κόμβοι εάν είναι επιθυμητό,
τοπικά ή απομακρυσμένα. Η δημιουργία των διαγωνισμών και των προβλημάτων
γίνεται μέσω της δικτυακής διεπαφής του Διαχειριστή.
\bigskip
......@@ -450,9 +456,10 @@ code golf, δηλαδή επίτευξης της λύσης με το λιγό
\section{CATS}
To CATS είναι το τρίτο σύστημα που θα αναλυθεί. Αφορά και αυτό τη διεξαγωγή και
τον έλεγχο προγραμματιστικών διαγωνισμών και συντηρείται από τον Alexander Klenin
του Far Eastern Federal University. Χρησιμοποιείται τόσο για μεγάλες διοργανώσεις,
To CATS \footnote{imcs.dvfu.ru/cats?lang=en} είναι το τρίτο σύστημα που θα
αναλυθεί. Αφορά και αυτό τη διεξαγωγή και τον έλεγχο προγραμματιστικών
διαγωνισμών και συντηρείται από τον Alexander Klenin του Far Eastern Federal
University (\cite{Rozhkov}). Χρησιμοποιείται τόσο για μεγάλες διοργανώσεις,
όπως είναι το ICPC Ρωσίας και Άπω Ανατολής, καθώς και για πλήθος ακαδημαϊκών
μαθημάτων και διαγωνισμών. Κατέχει άδεια GPL 2.0 επιτρέποντας την ελεύθερη
χρήση, τροποποίηση και διανομή του.
......@@ -501,8 +508,6 @@ CATS. Το CATS δημιουργεί την οθόνη του προβλήματ
Οι γλώσσες προγραμματισμού που υποστηρίζονται είναι οι C, C++, delphi, VB, Java,
C\#, Perl, Python, Ruby, PHP, Erlang, Javascript και SQL.
%TODO mipws valw kai ta site twn sistimatwn
%TODO paper rozhkov
\subsection{Εγκατάσταση και Χρήση}
Η εγκατάσταση του CATS είναι αρκετά εύκολη, καθώς έχει πολύ λίγες εξαρτήσεις
......@@ -514,9 +519,9 @@ C\#, Perl, Python, Ruby, PHP, Erlang, Javascript και SQL.
Η διαδικασία εμφάνισης των ορισμών των προβλημάτων, υποβολής των λύσεων και
διαχείρισης των διαγωνισμών από τους διαχειριστές είναι παρόμοια με τα προηγούμενα
συστήματα και παρουσιάζεται με φωτογραφίες παρακάτω. Είναι ενδιαφέρουσα και χρήσιμη
συστήματα και παρουσιάζεται με φωτογραφίες παρακάτω. Άξια αναφοράς είναι
η δυνατότητα του CATS για διαχείριση διαγωνισμών, αξιολόγηση και παρουσίαση των
αποτελεσμάτων απ᾽ευθείας μέσω της γραμμής εντολών μέσω του API που προσφέρεται.
αποτελεσμάτων απ᾽ευθείας μέσω της γραμμής εντολών μέσω ενός API που προσφέρεται.
\FloatBarrier
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment