Η ιστορία ενός μικρού έργου δώδεκα ετών (για το BIRMA.NET για πρώτη φορά και ειλικρινά από πρώτο χέρι)

Η γέννηση αυτού του έργου μπορεί να θεωρηθεί μια μικρή ιδέα που μου ήρθε κάπου στα τέλη του 2007, η οποία έμελλε να βρει την τελική της μορφή μόλις 12 χρόνια αργότερα (αυτή τη στιγμή - φυσικά, αν και η τρέχουσα εφαρμογή, σύμφωνα με για τον συγγραφέα, είναι πολύ ικανοποιητικό) .

Όλα ξεκίνησαν όταν, κατά τη διαδικασία εκπλήρωσης των τότε επίσημων καθηκόντων μου στη βιβλιοθήκη, επέστησα την προσοχή στο γεγονός ότι η διαδικασία εισαγωγής δεδομένων από το σαρωμένο κείμενο των πινάκων περιεχομένων των εκδόσεων βιβλίων (και μουσικής) στην υπάρχουσα βάση δεδομένων, προφανώς, μπορεί να απλοποιηθεί σημαντικά και να αυτοματοποιηθεί, εκμεταλλευόμενος την ιδιότητα της τακτικότητας και επαναληψιμότητας όλων των δεδομένων που απαιτούνται για την εισαγωγή, όπως το όνομα του συγγραφέα του άρθρου (αν μιλάμε για μια συλλογή άρθρων), ο τίτλος του το άρθρο (ή ο υπότιτλος που αντικατοπτρίζεται στον πίνακα περιεχομένων) και ο αριθμός σελίδας του τρέχοντος στοιχείου πίνακα περιεχομένων. Στην αρχή, ήμουν πρακτικά πεπεισμένος ότι ένα σύστημα κατάλληλο για την εκτέλεση αυτής της εργασίας θα μπορούσε εύκολα να βρεθεί στο Διαδίκτυο. Όταν προκλήθηκε κάποια έκπληξη από το γεγονός ότι δεν μπορούσα να βρω ένα τέτοιο έργο, αποφάσισα να προσπαθήσω να το υλοποιήσω μόνος μου.

Μετά από αρκετά σύντομο χρονικό διάστημα, άρχισε να λειτουργεί το πρώτο πρωτότυπο, το οποίο άρχισα αμέσως να το χρησιμοποιώ στις καθημερινές μου δραστηριότητες, ενώ ταυτόχρονα το διορθώνω σε όλα τα παραδείγματα που ήρθαν στο χέρι μου. Ευτυχώς, στο συνηθισμένο μου χώρο εργασίας, όπου δεν ήμουν σε καμία περίπτωση προγραμματιστής, εξακολουθούσα να ξεφύγω από την ορατή «διακοπή λειτουργίας» στη δουλειά μου, κατά τη διάρκεια της οποίας διέλυζα εντατικά το πνευματικό μου τέκνο - κάτι σχεδόν αδιανόητο στην τρέχουσα πραγματικότητα, που υπονοεί ημερήσιες αναφορές για τις εργασίες που έγιναν κατά τη διάρκεια της ημέρας. Η διαδικασία στίλβωσης του προγράμματος διήρκεσε συνολικά όχι λιγότερο από περίπου ένα χρόνο, αλλά ακόμη και μετά από αυτό το αποτέλεσμα δύσκολα θα μπορούσε να ονομαστεί εντελώς επιτυχημένο - αρχικά τέθηκαν πάρα πολλές διαφορετικές έννοιες που δεν ήταν απολύτως σαφείς για εφαρμογή: προαιρετικά στοιχεία που μπορούν να παραλειφθεί? προβολή στοιχείων προς τα εμπρός (με σκοπό την αντικατάσταση προηγούμενων στοιχείων στα αποτελέσματα αναζήτησης). ακόμα και η δική μας προσπάθεια να υλοποιήσουμε κάτι σαν κανονικές εκφράσεις (που έχει μοναδική σύνταξη). Πρέπει να πω ότι πριν από αυτό είχα εγκαταλείψει κάπως τον προγραμματισμό (για περίπου 8 χρόνια, αν όχι περισσότερα), οπότε η νέα ευκαιρία να εφαρμόσω τις δεξιότητές μου σε μια ενδιαφέρουσα και απαραίτητη εργασία τράβηξε πλήρως την προσοχή μου. Δεν προκαλεί έκπληξη το γεγονός ότι ο πηγαίος κώδικας που προέκυψε - ελλείψει οποιασδήποτε σαφούς προσέγγισης στο σχεδιασμό του από την πλευρά μου - έγινε πολύ γρήγορα ένας αφάνταστος συνονθύλευμα διαφορετικών κομματιών στη γλώσσα C με ορισμένα στοιχεία C++ και πτυχές οπτικού προγραμματισμού (αρχικά αποφασίστηκε να χρησιμοποιήσει ένα τέτοιο σύστημα σχεδιασμού όπως το Borland C++ Builder - "σχεδόν Delphi, αλλά σε C"). Ωστόσο, όλα αυτά τελικά απέδωσαν καρπούς στην αυτοματοποίηση των καθημερινών δραστηριοτήτων της βιβλιοθήκης μας.

Ταυτόχρονα, αποφάσισα, για κάθε ενδεχόμενο, να παρακολουθήσω μαθήματα για την εκπαίδευση επαγγελματιών προγραμματιστών λογισμικού. Δεν ξέρω αν είναι πραγματικά δυνατό να μάθω «να είσαι προγραμματιστής» από την αρχή εκεί, αλλά λαμβάνοντας υπόψη τις δεξιότητες που είχα ήδη εκείνη την εποχή, μπόρεσα να κατακτήσω κάπως τεχνολογίες που ήταν πιο σχετικές εκείνη την εποχή, όπως π. ως C#, Visual Studio για ανάπτυξη στο .NET, καθώς και ορισμένες τεχνολογίες που σχετίζονται με Java, HTML και SQL. Η όλη εκπαίδευση διήρκεσε συνολικά δύο χρόνια και λειτούργησε ως αφετηρία για ένα άλλο έργο μου, το οποίο τελικά διήρκεσε αρκετά χρόνια - αλλά αυτό είναι ένα θέμα για ξεχωριστή δημοσίευση. Εδώ θα ήταν σκόπιμο να σημειώσω ότι έκανα μια προσπάθεια να προσαρμόσω τις εξελίξεις που είχα ήδη στο περιγραφόμενο έργο για να δημιουργήσω μια πλήρη εφαρμογή παραθύρου σε C# και WinForms που υλοποιεί την απαραίτητη λειτουργικότητα και να τη χρησιμοποιήσω ως βάση για επερχόμενο διπλωματικό έργο.
Με τον καιρό, αυτή η ιδέα άρχισε να μου φαίνεται άξια να εκφραστεί σε τέτοια ετήσια συνέδρια με τη συμμετοχή εκπροσώπων διαφόρων βιβλιοθηκών όπως η «LIBKOM» και η «CRIMEA». Η ιδέα, ναι, αλλά όχι η υλοποίησή της εκείνη την εποχή. Τότε ήλπιζα επίσης ότι κάποιος θα το ξαναέγραφε χρησιμοποιώντας πιο ικανές προσεγγίσεις. Με τον ένα ή τον άλλο τρόπο, μέχρι το 2013 αποφάσισα να γράψω μια έκθεση για την προκαταρκτική εργασία μου και να την στείλω στην Οργανωτική Επιτροπή του Συνεδρίου με αίτηση για επιχορήγηση για συμμετοχή στο συνέδριο. Προς κάπως έκπληξή μου, η αίτησή μου εγκρίθηκε και άρχισα να κάνω κάποιες βελτιώσεις στο έργο για να το προετοιμάσω για παρουσίαση στο συνέδριο.

Μέχρι εκείνη τη στιγμή, το έργο είχε ήδη λάβει ένα νέο όνομα BIRMA, απέκτησε διάφορες πρόσθετες (όχι τόσο πλήρως υλοποιημένες, αλλά μάλλον αναμενόμενες) δυνατότητες - όλες οι λεπτομέρειες μπορούν να βρεθούν στην έκθεσή μου.

Για να είμαι ειλικρινής, ήταν δύσκολο να αποκαλέσουμε το BIRMA 2013 κάτι ολοκληρωμένο. Ειλικρινά μιλώντας, ήταν μια πολύ τυχαία χειροτεχνία που έγινε βιαστικά. Όσον αφορά τον κώδικα, πρακτικά δεν υπήρχαν καθόλου ιδιαίτερες καινοτομίες, εκτός από μια μάλλον αβοήθητη προσπάθεια δημιουργίας κάποιου είδους ενοποιημένης σύνταξης για τον αναλυτή, στην εμφάνιση που θυμίζει τη γλώσσα μορφοποίησης IRBIS 64 (και μάλιστα, το σύστημα ISIS - με παρενθέσεις ως κυκλικές δομές· γιατί Εκείνη την εποχή νόμιζα ότι φαινόταν πολύ ωραίο). Ο αναλυτής σκόνταψε απελπιστικά σε αυτούς τους κύκλους παρενθέσεων του κατάλληλου τύπου (καθώς οι παρενθέσεις εκτελούσαν επίσης έναν άλλο ρόλο, δηλαδή, επισήμαναν προαιρετικές δομές κατά την ανάλυση που μπορούν να παραβλεφθούν). Παραπέμπω και πάλι όλους όσους θέλουν να εξοικειωθούν με την τότε δυσνόητη, αδικαιολόγητη σύνταξη του BIRMA αναλυτικότερα στην αναφορά μου εκείνης της εποχής.

Γενικά, εκτός από το ότι ταλαιπωρούμαι με τον δικό μου αναλυτή, δεν έχω τίποτα άλλο να πω σχετικά με τον κώδικα αυτής της έκδοσης - εκτός από την αντίστροφη μετατροπή των υπαρχουσών πηγών σε C++ διατηρώντας ορισμένα τυπικά χαρακτηριστικά του κώδικα .NET (για να είμαι ειλικρινής, είναι δυσνόητο, τι ακριβώς με ώθησε να μεταφέρω τα πάντα πίσω - πιθανώς κάποιος ηλίθιος φόβος να κρατήσω τους πηγαίους κώδικες μυστικούς, σαν να ήταν κάτι αντίστοιχο με τη μυστική συνταγή της Coca-Cola).

Ίσως αυτή η ανόητη απόφαση να είναι ο λόγος για τις δυσκολίες αντιστοίχισης της προκύπτουσας βιβλιοθήκης DLL με την υπάρχουσα διεπαφή ενός οικιακού σταθμού εργασίας για την εισαγωγή δεδομένων σε έναν ηλεκτρονικό κατάλογο (ναι, δεν ανέφερα άλλο σημαντικό γεγονός: από εδώ και πέρα, όλα ο κωδικός του «μηχανή» BIRMA ήταν ο αναμενόμενος, διαχωρίζεται από το τμήμα διασύνδεσης και συσκευάζεται στο κατάλληλο DLL). Γιατί ήταν απαραίτητο να γραφτεί ένας ξεχωριστός σταθμός εργασίας για αυτούς τους σκοπούς, ο οποίος ούτως ή άλλως, στην εμφάνιση και τη μέθοδο αλληλεπίδρασής του με τον χρήστη, αντέγραψε ξεδιάντροπα τον ίδιο σταθμό εργασίας "Catalogizer" του συστήματος IRBIS 64 - αυτό είναι ένα ξεχωριστό ερώτημα. Εν ολίγοις: έδωσε την απαραίτητη στιβαρότητα στις τότε εξελίξεις μου για την αποφοίτησή μου (αλλιώς η δύσπεπτη μηχανή ανάλυσης από μόνη της κατά κάποιον τρόπο δεν αρκούσε). Επιπλέον, στη συνέχεια αντιμετώπισα κάποιες δυσκολίες στην υλοποίηση της διεπαφής του σταθμού εργασίας Cataloger με τα δικά μου modules, που υλοποιούνται τόσο σε C++ όσο και σε C#, και στην απευθείας πρόσβαση στον κινητήρα μου.

Γενικά, παραδόξως, ήταν αυτό το μάλλον αδέξιο πρωτότυπο του μελλοντικού BIRMA.NET που έμελλε να γίνει το «άλογο» μου για τα επόμενα τέσσερα χρόνια. Δεν μπορεί να ειπωθεί ότι αυτό το διάστημα δεν προσπάθησα τουλάχιστον να βρω τρόπους για μια νέα, πιο ολοκληρωμένη υλοποίηση μιας μακροχρόνιας ιδέας. Μεταξύ άλλων καινοτομιών, θα έπρεπε να υπήρχαν ήδη ένθετες κυκλικές ακολουθίες που θα μπορούσαν να περιλαμβάνουν προαιρετικά στοιχεία - έτσι επρόκειτο να ζωντανέψω την ιδέα των καθολικών προτύπων για βιβλιογραφικές περιγραφές δημοσιεύσεων και διάφορα άλλα ενδιαφέροντα πράγματα. Ωστόσο, στις πρακτικές μου δραστηριότητες εκείνη την εποχή, όλα αυτά είχαν λίγη ζήτηση και η εφαρμογή που είχα εκείνη την εποχή ήταν αρκετά επαρκής για την εισαγωγή πινάκων περιεχομένων. Επιπλέον, ο φορέας ανάπτυξης της βιβλιοθήκης μας άρχισε να αποκλίνει ολοένα και περισσότερο προς την ψηφιοποίηση των αρχείων μουσείων, την αναφορά και άλλες δραστηριότητες που δεν με ενδιαφέρουν, κάτι που τελικά με ανάγκασε να το εγκαταλείψω, δίνοντας τη θέση του σε όσους να είσαι πιο ευχαριστημένος με όλα αυτά.

Παραδόξως, μετά από αυτά τα δραματικά γεγονότα το έργο BIRMA, το οποίο είχε ήδη όλα τα χαρακτηριστικά ενός τυπικού μακροχρόνιου κατασκευαστικού έργου, φάνηκε να αρχίζει να αποκτά την πολυαναμενόμενη νέα του ζωή! Είχα περισσότερο ελεύθερο χρόνο για άσκοπες σκέψεις, άρχισα και πάλι να χτενίζω τον Παγκόσμιο Ιστό αναζητώντας κάτι παρόμοιο (ευτυχώς, τώρα μπορούσα ήδη να μαντέψω να τα ψάξω όλα αυτά όχι οπουδήποτε, αλλά στο GitHub) και κάπου στο αρχές του τρέχοντος έτους, τελικά έπεσα πάνω σε ένα αντίστοιχο προϊόν της γνωστής εταιρείας Salesforce με το ασήμαντο όνομα Gorp. Από μόνο του, θα μπορούσε να κάνει σχεδόν ό,τι χρειαζόμουν από μια τέτοια μηχανή ανάλυσης - δηλαδή, να απομονώσει έξυπνα μεμονωμένα κομμάτια από αυθαίρετο, αλλά σαφώς δομημένο κείμενο, ενώ είχε μια αρκετά φιλική προς το χρήστη διεπαφή για τον τελικό χρήστη, συμπεριλαμβανομένων τόσο κατανοητών ουσιών, όπως ένα μοτίβο, πρότυπο και εμφάνιση, και ταυτόχρονα με τη χρήση της γνωστής σύνταξης των κανονικών εκφράσεων, η οποία γίνεται ασύγκριτα πιο ευανάγνωστη λόγω της διαίρεσης σε καθορισμένες σημασιολογικές ομάδες για ανάλυση.

Σε γενικές γραμμές, αποφάσισα ότι αυτό είναι το ένα Gorp (Αναρωτιέμαι τι σημαίνει αυτό το όνομα; Ίσως κάποιο είδος «κανονικού αναλυτή γενικού προσανατολισμού»;) – αυτό ακριβώς που έψαχνα εδώ και πολύ καιρό. Είναι αλήθεια ότι η άμεση εφαρμογή του για τις δικές μου ανάγκες είχε τέτοιο πρόβλημα που αυτός ο κινητήρας απαιτούσε πολύ αυστηρή τήρηση της δομικής ακολουθίας του κειμένου πηγής. Για ορισμένες αναφορές, όπως αρχεία καταγραφής (δηλαδή, τοποθετήθηκαν από τους προγραμματιστές ως σαφή παραδείγματα χρήσης του έργου), αυτό είναι αρκετά κατάλληλο, αλλά για τα ίδια κείμενα σαρωμένων πινάκων περιεχομένων, είναι απίθανο. Εξάλλου, η ίδια σελίδα με έναν πίνακα περιεχομένων μπορεί να ξεκινά με τις λέξεις "Πίνακας περιεχομένων", "Περιεχόμενα" και οποιεσδήποτε άλλες προκαταρκτικές περιγραφές που δεν χρειάζεται να τοποθετήσουμε στα αποτελέσματα της προβλεπόμενης ανάλυσης (και να τις αποκόψουμε με μη αυτόματο τρόπο κάθε φορά είναι επίσης άβολη). Επιπλέον, μεταξύ μεμονωμένων επαναλαμβανόμενων στοιχείων, όπως το όνομα του συγγραφέα, ο τίτλος και ο αριθμός σελίδας, η σελίδα μπορεί να περιέχει μια ορισμένη ποσότητα σκουπιδιών (για παράδειγμα, σχέδια και απλώς τυχαίους χαρακτήρες), τα οποία θα ήταν επίσης καλό να μπορείτε να αποκόβω. Ωστόσο, η τελευταία πτυχή δεν ήταν ακόμη τόσο σημαντική, αλλά λόγω της πρώτης, η υπάρχουσα υλοποίηση δεν μπορούσε να αρχίσει να αναζητά τις απαραίτητες δομές στο κείμενο από ένα συγκεκριμένο σημείο, αλλά απλώς την επεξεργάστηκε από την αρχή, δεν βρήκε το καθορισμένα μοτίβα εκεί και... τελείωσα τη δουλειά μου. Προφανώς, χρειαζόταν κάποιες μικροαλλαγές για να επιτρέψει τουλάχιστον λίγο χώρο μεταξύ των επαναλαμβανόμενων δομών, και αυτό με έκανε να επιστρέψω στη δουλειά.

Ένα άλλο πρόβλημα ήταν ότι το ίδιο το έργο υλοποιήθηκε σε Java και αν σχεδίαζα στο μέλλον να εφαρμόσω κάποιο μέσο διασύνδεσης αυτής της τεχνολογίας με γνωστές εφαρμογές για την εισαγωγή δεδομένων σε υπάρχουσες βάσεις δεδομένων (όπως το "Cataloguer" της Irbis), τότε τουλάχιστον κάντε αυτό σε C# και .NET. Δεν είναι ότι η ίδια η Java είναι κακή γλώσσα – κάποτε τη χρησιμοποίησα ακόμη και για να υλοποιήσω μια ενδιαφέρουσα εφαρμογή παραθύρου που εφάρμοζε τη λειτουργικότητα μιας εγχώριας προγραμματιζόμενης αριθμομηχανής (ως μέρος ενός έργου μαθήματος). Και από άποψη σύνταξης μοιάζει πολύ με το ίδιο C-sharp. Λοιπόν, αυτό είναι μόνο ένα συν: τόσο πιο εύκολο θα είναι για μένα να ολοκληρώσω ένα υπάρχον έργο. Ωστόσο, δεν ήθελα να βουτήξω ξανά σε αυτόν τον μάλλον ασυνήθιστο κόσμο των τεχνολογιών Java παραθύρων (ή μάλλον, επιτραπέζιων υπολογιστών) - τελικά, η ίδια η γλώσσα δεν ήταν "προσαρμοσμένη" για τέτοια χρήση και δεν ήθελα καθόλου την επανάληψη του την προηγούμενη εμπειρία. Ίσως είναι ακριβώς επειδή το C# σε συνδυασμό με το WinForms είναι πολύ πιο κοντά στους Δελφούς, με τους οποίους πολλοί από εμάς ξεκινήσαμε κάποτε. Ευτυχώς, η απαραίτητη λύση βρέθηκε αρκετά γρήγορα - με τη μορφή του έργου IKVM.NET, που καθιστά εύκολη τη μετάφραση υπαρχόντων προγραμμάτων Java σε διαχειριζόμενο κώδικα .NET. Είναι αλήθεια ότι το ίδιο το έργο είχε ήδη εγκαταλειφθεί από τους συγγραφείς εκείνη την εποχή, αλλά η τελευταία του εφαρμογή μου επέτρεψε να πραγματοποιήσω με μεγάλη επιτυχία τις απαραίτητες ενέργειες για τα κείμενα πηγής Gorp.

Έκανα λοιπόν όλες τις απαραίτητες αλλαγές και τα συγκέντρωσα όλα σε ένα DLL του κατάλληλου τύπου, το οποίο θα μπορούσε εύκολα να «παραληφθεί» από οποιαδήποτε έργα για το .NET Framework που δημιουργήθηκε στο Visual Studio. Στο μεταξύ, δημιούργησα ένα άλλο επίπεδο για βολική παρουσίαση των αποτελεσμάτων που επιστράφηκαν Gorp, με τη μορφή αντίστοιχων δομών δεδομένων που θα ήταν βολικό να επεξεργαστούν σε προβολή πίνακα (λαμβάνοντας ως βάση και τις γραμμές και τις στήλες, τόσο τα κλειδιά λεξικού όσο και τα αριθμητικά ευρετήρια). Λοιπόν, τα ίδια τα απαραίτητα βοηθητικά προγράμματα για την επεξεργασία και την εμφάνιση των αποτελεσμάτων γράφτηκαν αρκετά γρήγορα.

Επίσης, η διαδικασία προσαρμογής προτύπων για τον νέο κινητήρα προκειμένου να του διδάξει να αναλύει υπάρχοντα δείγματα σαρωμένων κειμένων πινάκων περιεχομένων δεν προκάλεσε ιδιαίτερες επιπλοκές. Στην πραγματικότητα, δεν χρειάστηκε καν να αναφερθώ στα προηγούμενα πρότυπα μου: απλά δημιούργησα όλα τα απαραίτητα πρότυπα από την αρχή. Επιπλέον, εάν τα πρότυπα που σχεδιάστηκαν για να λειτουργούν με την προηγούμενη έκδοση του συστήματος θέτουν ένα αρκετά στενό πλαίσιο για κείμενα που θα μπορούσαν να αναλυθούν σωστά με τη βοήθειά τους, η νέα μηχανή επέτρεψε ήδη την ανάπτυξη αρκετά καθολικών προτύπων κατάλληλων για διάφορους τύπους σήμανσης στο μια φορά. Προσπάθησα μάλιστα να γράψω κάποιου είδους ολοκληρωμένο πρότυπο για οποιοδήποτε αυθαίρετο κείμενο του πίνακα περιεχομένων, αν και, φυσικά, ακόμη και με όλες τις νέες δυνατότητες που μου ανοίγονται, συμπεριλαμβανομένης, ειδικότερα, της περιορισμένης ικανότητας υλοποίησης της ίδιας ένθετης επανάληψης σειρές (όπως, για παράδειγμα, επώνυμα και αρχικά αρκετών συγγραφέων στη σειρά), αυτό αποδείχθηκε ουτοπία.

Ίσως στο μέλλον θα είναι δυνατή η εφαρμογή μιας συγκεκριμένης έννοιας μετα-προτύπων, τα οποία θα μπορούν να ελέγχουν το κείμενο πηγής για συμμόρφωση με πολλά από τα διαθέσιμα πρότυπα ταυτόχρονα και στη συνέχεια, σύμφωνα με τα αποτελέσματα που λαμβάνονται, να επιλέγουν το καταλληλότερο, χρησιμοποιώντας κάποιο είδος ευφυούς αλγόριθμου. Αλλά τώρα με απασχολούσε περισσότερο μια άλλη ερώτηση. Ένας αναλυτής όπως Gorp, παρ' όλη την ευελιξία του και τις τροποποιήσεις που έκανα, ήταν ακόμα εκ φύσεως ανίκανο να κάνει ένα φαινομενικά απλό πράγμα που μπόρεσε να κάνει ο αυτογραμμένος αναλυτής μου από την πρώτη κιόλας έκδοση. Δηλαδή: είχε τη δυνατότητα να βρει και να εξάγει από το κείμενο πηγής όλα τα θραύσματα που ταιριάζουν με τη μάσκα που καθορίζεται στο πρότυπο που χρησιμοποιείται στη σωστή θέση, ενώ δεν ενδιαφέρεται καθόλου για το τι περιέχει το κείμενο στα κενά μεταξύ αυτών των τμημάτων. Μέχρι στιγμής, έχω βελτιώσει ελαφρώς τη νέα μηχανή, επιτρέποντάς της να αναζητήσει όλες τις πιθανές νέες επαναλήψεις μιας δεδομένης ακολουθίας τέτοιων μασκών από την τρέχουσα θέση, αφήνοντας τη δυνατότητα για την παρουσία στο κείμενο συνόλων αυθαίρετων χαρακτήρων που ήταν εντελώς δεν λαμβάνεται υπόψη στην ανάλυση, που περικλείεται μεταξύ των ανιχνευόμενων επαναλαμβανόμενων δομών. Ωστόσο, αυτό δεν κατέστησε δυνατή τη ρύθμιση της επόμενης μάσκας ανεξάρτητα από τα αποτελέσματα της αναζήτησης του προηγούμενου τμήματος χρησιμοποιώντας την αντίστοιχη μάσκα: η αυστηρότητα της περιγραφόμενης δομής κειμένου εξακολουθεί να μην αφήνει χώρο για αυθαίρετες συμπεριλήψεις ακανόνιστων χαρακτήρων.

Και αν για τα παραδείγματα των πινάκων περιεχομένων που αντιμετώπισα αυτό το πρόβλημα δεν φαινόταν ακόμα τόσο σοβαρό, τότε όταν προσπαθούσαμε να εφαρμόσω έναν νέο μηχανισμό ανάλυσης σε μια παρόμοια εργασία ανάλυσης των περιεχομένων ενός ιστότοπου (δηλαδή της ίδιας ανάλυσης), οι περιορισμοί είναι εδώ εμφανίστηκαν με όλη τους την προφανή. Εξάλλου, είναι πολύ εύκολο να ορίσετε τις απαραίτητες μάσκες για τμήματα σήμανσης ιστού, μεταξύ των οποίων θα πρέπει να βρίσκονται τα δεδομένα που αναζητούμε (τα οποία πρέπει να εξαχθούν), αλλά πώς μπορούμε να αναγκάσουμε τον αναλυτή να προχωρήσει αμέσως στο επόμενο παρόμοιο τμήμα, παρά όλες τις πιθανές ετικέτες και τα χαρακτηριστικά HTML που μπορούν να τοποθετηθούν στα κενά μεταξύ τους;

Αφού σκέφτηκα λίγο, αποφάσισα να παρουσιάσω μερικά μοτίβα υπηρεσιών (%all_before) и (%all_after), εξυπηρετώντας τον προφανή σκοπό της διασφάλισης ότι όλα όσα μπορεί να περιέχονται στο κείμενο προέλευσης παραλείπονται πριν από οποιοδήποτε μοτίβο (μάσκα) που τα ακολουθεί. Επιπλέον, εάν (%all_before) απλά αγνόησε όλα αυτά τα αυθαίρετα εγκλείσματα, λοιπόν (%all_after), αντίθετα, τους επέτρεψε να προστεθούν στο επιθυμητό θραύσμα μετά τη μετακίνηση από το προηγούμενο θραύσμα. Ακούγεται αρκετά απλό, αλλά για να εφαρμόσω αυτό το concept έπρεπε να χτενίσω ξανά τις πηγές gorp για να κάνω τις απαραίτητες τροποποιήσεις ώστε να μην σπάσω την ήδη εφαρμοσμένη λογική. Στο τέλος, το καταφέραμε (αν και γράφτηκε ακόμη και η πολύ, πρώτη, αν και πολύ προβληματική, υλοποίηση του αναλυτή μου, και ακόμη πιο γρήγορα - σε μερικές εβδομάδες). Από εδώ και πέρα, το σύστημα πήρε μια πραγματικά καθολική μορφή - όχι λιγότερο από 12 χρόνια μετά τις πρώτες προσπάθειες να λειτουργήσει.

Φυσικά, αυτό δεν είναι το τέλος των ονείρων μας. Μπορείτε επίσης να ξαναγράψετε εντελώς τον αναλυτή προτύπων gorp σε C#, χρησιμοποιώντας οποιαδήποτε από τις διαθέσιμες βιβλιοθήκες για την εφαρμογή μιας δωρεάν γραμματικής. Νομίζω ότι ο κώδικας θα πρέπει να απλοποιηθεί σημαντικά και αυτό θα μας επιτρέψει να απαλλαγούμε από την κληρονομιά με τη μορφή υπαρχουσών πηγών Java. Αλλά με τον υπάρχοντα τύπο κινητήρα, είναι επίσης πολύ πιθανό να κάνουμε διάφορα ενδιαφέροντα πράγματα, συμπεριλαμβανομένης μιας προσπάθειας υλοποίησης των μετα-πρότυπο που έχω ήδη αναφέρει, για να μην αναφέρουμε την ανάλυση διαφόρων δεδομένων από διάφορους ιστότοπους (ωστόσο, δεν αποκλείω ότι τα υπάρχοντα εξειδικευμένα εργαλεία λογισμικού είναι πιο κατάλληλα για αυτό – απλώς δεν είχα την κατάλληλη εμπειρία χρήσης τους).

Παρεμπιπτόντως, αυτό το καλοκαίρι έλαβα ήδη μια πρόσκληση μέσω email από μια εταιρεία που χρησιμοποιεί τεχνολογίες Salesforce (ο προγραμματιστής του αρχικού Gorp), περάστε μια συνέντευξη για μεταγενέστερη εργασία στη Ρίγα. Δυστυχώς, αυτή τη στιγμή δεν είμαι έτοιμος για τέτοιες ανακατατάξεις.

Εάν αυτό το υλικό προκαλεί κάποιο ενδιαφέρον, τότε στο δεύτερο μέρος θα προσπαθήσω να περιγράψω λεπτομερέστερα την τεχνολογία για τη μεταγλώττιση και στη συνέχεια την ανάλυση προτύπων χρησιμοποιώντας το παράδειγμα της υλοποίησης που χρησιμοποιείται στο Salesforce Gorp (οι δικές μου προσθήκες, με εξαίρεση μερικές λέξεις λειτουργίας που έχουν ήδη περιγραφεί, δεν κάνουν ουσιαστικά καμία αλλαγή στην ίδια τη σύνταξη του προτύπου, επομένως σχεδόν όλη η τεκμηρίωση για το αρχικό σύστημα Gorp Κατάλληλο και για τη δική μου έκδοση).

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο