portaldacalheta.pt
  • Κύριος
  • Κατανεμημένες Ομάδες
  • Τροποσ Ζωησ
  • Αλλα
  • Κερδοφορία & Αποδοτικότητα
Επιστήμη Δεδομένων Και Βάσεις Δεδομένων

Εκσυγχρονισμός λογισμικού παλαιού τύπου: Προγραμματισμός MUD με χρήση Erlang και CloudI



Τι είναι ο εκσυγχρονισμός παλαιού τύπου;

Ο παλαιός κώδικας είναι παντού. Και καθώς ο ρυθμός με τον οποίο πολλαπλασιάζεται ο κώδικας συνεχίζει να αυξάνεται εκθετικά, όλο και περισσότερος από αυτόν τον κώδικα υποβιβάζεται σε κατάσταση παλαιού τύπου. Σε πολλούς μεγάλους οργανισμούς, η συντήρηση παλαιών συστημάτων καταναλώνει περισσότερο από το 90% των πόρων των συστημάτων πληροφοριών.

διαφορά c corp και s corp

Η ανάγκη εκσυγχρονισμού παλαιού κώδικα και συστημάτων για την κάλυψη των τρεχουσών επιδόσεων και απαιτήσεων επεξεργασίας είναι ευρέως διαδεδομένη. Αυτή η ανάρτηση παρέχει μια μελέτη περίπτωσης της χρήσης του Έρλανγκ γλώσσα προγραμματισμού και το Erlang CloudI Service Oriented Architecture (SOA), για την προσαρμογή του παλαιού κώδικα - ιδίως μιας δεκαετίας συλλογής πηγαίου κώδικα C - στον 21ο αιώνα.



Σε πολλούς μεγάλους οργανισμούς, η συντήρηση παλαιών συστημάτων καταναλώνει περισσότερο από το 90% των πόρων των συστημάτων πληροφοριών.

Δολοφονία του πηγαίου κώδικα δράκου

Πριν από χρόνια, ήμουν μεγάλος οπαδός των διαδικτυακών παιχνιδιών για πολλούς παίκτες που βασίζονται σε κείμενο γνωστά ως Multi-User Dungeons ( MUDs ). Αλλά ήταν πάντα γεμάτοι προβλήματα απόδοσης. Αποφάσισα να βουτήξω σε έναν σωρό πηγαίου κώδικα δεκαετιών και να δω πώς θα μπορούσαμε να εκσυγχρονίσουμε αυτόν τον παλαιό κώδικα και να ωθήσω αυτά τα πρώιμα διαδικτυακά παιχνίδια στα όριά τους. Σε υψηλό επίπεδο, αυτό το έργο ήταν ένα εξαιρετικό παράδειγμα χρησιμοποιώντας τον Erlang για την προσαρμογή παλαιού λογισμικού ώστε να πληροί τις απαιτήσεις του 21ου αιώνα.



Μια σύντομη περίληψη:



  • Ο στόχος : Πάρτε ένα παλιό βιντεοπαιχνίδι MUD με περιορισμό 50 παικτών και ωθήστε τον πηγαίο κώδικα για να υποστηρίξετε χιλιάδες χιλιάδες ταυτόχρονες συνδέσεις.
  • Το πρόβλημα : Πηγαίος κώδικας C παλαιού τύπου.
  • Η λύση : CloudI , μια υπηρεσία που βασίζεται σε Erlang που παρέχει ανοχή σφαλμάτων και επεκτασιμότητα.

Εκσυγχρονισμός λογισμικού παλαιού τύπου: Προγραμματισμός MUD με χρήση Erlang και CloudI

Τι είναι το MUD βάσει κειμένου;

Όλα τα Παιχνίδια Μαζικά Πολλαπλών Παιχνιδιών Ρόλων ( MMORPG ) - όπως το World of Warcraft και το EverQuest - έχουν αναπτύξει δυνατότητες των οποίων η αρχική προέλευση μπορεί να εντοπιστεί σε παλαιότερα διαδικτυακά παιχνίδια για πολλούς παίκτες που βασίζονται σε κείμενο γνωστά ως Multi-User Dungeons ( MUDs ).



Το πρώτο MUD ήταν το Essex MUD του Roy Trubshaw (ή MUD1 ) που αναπτύχθηκε αρχικά το 1978 χρησιμοποιώντας τη γλώσσα συναρμολόγησης MARO-10 σε DEC PDP-10, αλλά μετατράπηκε σε BCPL, προκάτοχο της γλώσσας προγραμματισμού C (και έτρεχε μέχρι το 1987). (Όπως μπορείτε να δείτε, αυτά τα πράγματα είναι παλαιότερα από τους περισσότερους προγραμματιστές.)

Τα MUD σταδιακά κέρδισαν δημοτικότητα στα τέλη της δεκαετίας του 1980 και στις αρχές της δεκαετίας του 1990 με διάφορες βάσεις κώδικα MUD γραμμένες στο C. Η βάση δεδομένων DikuMUD, για παράδειγμα, είναι γνωστή ως η ρίζα μιας από τις μεγαλύτερες δέντρα του παραγόμενου πηγαίου κώδικα MUD, με τουλάχιστον 51 μοναδικές παραλλαγές, όλες βασισμένες στον ίδιο πηγαίο κώδικα DikuMUD. (Κατά τη διάρκεια αυτού του χρονικού πλαισίου, παρεμπιπτόντως, οι MUD έγιναν εναλλακτικά γνωστοί ως 'Πολυ-προπτυχιακοί καταστροφείς' λόγω του αριθμού των προπτυχιακών φοιτητών που απέτυχαν εκτός σχολείου λόγω της εμμονής τους μαζί τους.)



Το πρόβλημα με MUD παλαιού τύπου

Ο ιστορικός πηγαίος κώδικας C MUD (συμπεριλαμβανομένου του DikuMUD και των παραλλαγών του) είναι γεμάτος προβλήματα απόδοσης λόγω των υφιστάμενων περιορισμών κατά τη στιγμή της δημιουργίας του.

τι είναι η σχεδιαστική σκέψη στην επιχείρηση

Έλλειψη νημάτων

Τότε, δεν υπήρχε εύκολα προσβάσιμη βιβλιοθήκη με θέματα. Επιπλέον, το νήμα θα έκανε τον πηγαίο κώδικα πιο δύσκολο να διατηρηθεί και να τροποποιηθεί. Ως αποτέλεσμα, αυτά τα MUD ήταν όλα με ένα νήμα.



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

Κατά τη διάρκεια ενός μόνο «τικ» (αύξηση του εσωτερικού ρολογιού που παρακολουθεί την εξέλιξη όλων των γεγονότων του παιχνιδιού), πρέπει να επεξεργαστεί ο πηγαίος κώδικας MUD κάθε εκδήλωση παιχνιδιού για κάθε συνδεδεμένη πρίζα. Με άλλα λόγια: κάθε κομμάτι κώδικα επιβραδύνει την επεξεργασία ενός μεμονωμένου κρότου. Και αν κάποιος υπολογισμός αναγκάσει την επεξεργασία να διαρκέσει περισσότερο από ένα μεμονωμένο τσιμπούρι, το MUD καθυστερεί, επηρεάζοντας κάθε συνδεδεμένη συσκευή αναπαραγωγής.

Με αυτήν την καθυστέρηση, το παιχνίδι γίνεται αμέσως λιγότερο ελκυστικό. Οι παίκτες κοιτάζουν αβοήθητα καθώς οι χαρακτήρες τους πεθαίνουν, με τις δικές τους εντολές να παραμένουν ανεπεξέργαστες.



Παρουσιάζουμε το SillyMUD

Για τους σκοπούς αυτού του πειράματος εκσυγχρονισμού εφαρμογών παλαιού τύπου, επέλεξα SillyMUD , ένα ιστορικό παράγωγο του DikuMUD που έχει επηρεάσει τα σύγχρονα MMORPG και τα προβλήματα απόδοσης που μοιράζονται. Κατά τη διάρκεια της δεκαετίας του 1990, έπαιξα ένα MUD που προήλθε από τη βάση κώδικα SillyMUD, οπότε ήξερα ότι ο πηγαίος κώδικας θα ήταν ένα ενδιαφέρον και κάπως γνωστό σημείο εκκίνησης.

χειρισμός σφαλμάτων κόμβου js express

Τι κληρονόμησα;

Ο πηγαίος κώδικας SillyMUD είναι παρόμοιος με αυτόν των άλλων ιστορικών C MUD στο ότι περιορίζεται σε περίπου 50 ταυτόχρονες συσκευές αναπαραγωγής (64, για να είμαστε ακριβείς, με βάση τον πηγαίο κώδικα).



Ωστόσο, παρατήρησα ότι ο πηγαίος κώδικας είχε τροποποιηθεί για λόγους απόδοσης (δηλαδή, για να προωθήσει τον ταυτόχρονο περιορισμό του προγράμματος αναπαραγωγής). ΕΙΔΙΚΑ:

  • Ο πηγαίος κώδικας έλειπε μια αναζήτηση ονόματος domain στη διεύθυνση IP σύνδεσης, απουσίασε λόγω της καθυστέρησης που επιβάλλεται από μια αναζήτηση ονόματος τομέα (συνήθως, ένα παλαιότερο MUD θέλει μια αναζήτηση ονόματος τομέα για να διευκολύνει την απαγόρευση κακόβουλων χρηστών).
  • Ο πηγαίος κώδικας είχε απενεργοποιήσει την εντολή 'δωρεά' (λίγο ασυνήθιστο) λόγω της πιθανής δημιουργίας μακρών συνδεδεμένων λιστών αντικειμένων που δωρίστηκαν, οι οποίες στη συνέχεια απαιτούσαν διεργασίες εντατικής λίστας. Αυτά, με τη σειρά τους, βλάπτουν την απόδοση του παιχνιδιού για όλα άλλους παίκτες (μονόστροφο, θυμηθείτε;).

Παρουσιάζουμε το CloudI

CloudI ήταν συζητήθηκε προηγουμένως ως λύση για την ανάπτυξη πολυγλωττών λόγω της ανοχής σφαλμάτων και της επεκτασιμότητας που παρέχει.

Το CloudI παρέχει μια αφαίρεση υπηρεσίας (για να παρέχει μια αρχιτεκτονική προσανατολισμένη στην υπηρεσία ( ΕΤΣΙ, ΕΝΑ )) σε Erlang, C / C ++, Java, Python και Ruby, διατηρώντας ταυτόχρονα τα σφάλματα λογισμικού απομονωμένα στο πλαίσιο CloudI. Η ανοχή σφαλμάτων παρέχεται μέσω της εφαρμογής Erlang του CloudI, στηριζόμενη στις ανεκτές λειτουργίες της Erlang και στην εφαρμογή της Μοντέλο ηθοποιού . Αυτή η ανοχή σφαλμάτων αποτελεί βασικό χαρακτηριστικό της εφαρμογής Erlang του CloudI, όπως όλο το λογισμικό περιέχει σφάλματα .

Το CloudI παρέχει επίσης έναν διακομιστή εφαρμογών για τον έλεγχο της διάρκειας εκτέλεσης της υπηρεσίας και της δημιουργίας διεργασιών υπηρεσίας (είτε ως διαδικασίες λειτουργικού συστήματος για γλώσσες προγραμματισμού εκτός Erlang είτε ως διαδικασίες Erlang για υπηρεσίες που υλοποιούνται στο Erlang), έτσι ώστε η εκτέλεση υπηρεσίας να πραγματοποιείται χωρίς να επηρεάζεται η εξωτερική κατάσταση αξιοπιστία. Για περισσότερα, δείτε το δικό μου προηγούμενη ανάρτηση .

Πώς μπορεί το CloudI να εκσυγχρονίσει ένα MUD βάσει κειμένου παλαιού τύπου;

Ο ιστορικός πηγαίος κώδικας C MUD παρέχει μια ενδιαφέρουσα ευκαιρία για την ενσωμάτωση του CloudI, δεδομένων των προβλημάτων αξιοπιστίας του:

  • Η σταθερότητα του διακομιστή παιχνιδιών επηρεάζει άμεσα την έκκληση κάθε μηχανικής παιχνιδιού.
  • Η εστίαση στην ανάπτυξη λογισμικού για τη διόρθωση σφαλμάτων σταθερότητας διακομιστή περιορίζει το μέγεθος και το εύρος του παιχνιδιού που προκύπτει.

Με την ενσωμάτωση CloudI, τα σφάλματα σταθερότητας του διακομιστή μπορούν να διορθωθούν κανονικά, αλλά η επίδρασή τους είναι περιορισμένη, έτσι ώστε η λειτουργία του διακομιστή παιχνιδιών να μην επηρεάζεται πάντα όταν ένα σφάλμα που δεν έχει ανακαλυφθεί προηγουμένως προκαλεί αποτυχία ενός εσωτερικού συστήματος παιχνιδιών. Αυτό παρέχει ένα εξαιρετικό παράδειγμα της χρήσης του Erlang για την επιβολή ανοχής σφαλμάτων σε μια παλιά βάση κώδικα.

γράφοντας περιπτώσεις δοκιμών junit σε java

Ποιες αλλαγές απαιτήθηκαν;

Η αρχική βάση κώδικα γράφτηκε ότι είναι μονόκλωνη και εξαρτάται σε μεγάλο βαθμό από καθολικές μεταβλητές. Ο στόχος μου ήταν να διατηρήσω τη λειτουργικότητα του πηγαίου κώδικα πηγαίου κώδικα, ενώ τον εκσυγχρονίζω για τη σημερινή χρήση.

Με το CloudI, μπόρεσα να διατηρήσω τον πηγαίο κώδικα με ένα νήμα, παρέχοντας παράλληλα δυνατότητα κλιμάκωσης σύνδεσης.

Στόχος μου ήταν να διατηρήσω τη λειτουργικότητα του πηγαίου κώδικα πηγαίου κώδικα, ενώ την προσαρμόστηκα για σύγχρονη χρήση.

Ας εξετάσουμε τις απαραίτητες αλλαγές:

Έξοδος κονσόλας

Το buffering της εξόδου κονσόλας SillyMUD (οθόνη τερματικού, συχνά συνδεδεμένη με Telnet ) ήταν ήδη σε ισχύ, αλλά κάποια άμεση χρήση περιγραφικού αρχείου απαιτούσε προσωρινή αποθήκευση (έτσι ώστε η έξοδος της κονσόλας να μπορούσε να γίνει η απόκριση σε ένα αίτημα υπηρεσίας CloudI).

Χειρισμός πρίζας

Ο χειρισμός της υποδοχής στον αρχικό πηγαίο κώδικα βασίστηκε σε ένα select() Λειτουργία κλήσης για τον εντοπισμό εισόδου, σφαλμάτων και την πιθανότητα εξόδου, καθώς και για παύση για ένα τσεκ παιχνιδιού 250 χιλιοστών του δευτερολέπτου πριν από τον χειρισμό εκκρεμών γεγονότων παιχνιδιού.

πώς να φτιάξετε ένα λογιστικό σχέδιο

Η ενσωμάτωση CloudI SillyMUD βασίζεται σε εισερχόμενα αιτήματα υπηρεσίας για εισαγωγή, ενώ κάνει παύση με το C CloudI API's cloudi_poll συνάρτηση (για τα 250 χιλιοστά του δευτερολέπτου προτού χειριστείτε τα ίδια εκκρεμή γεγονότα παιχνιδιού). Ο πηγαίος κώδικας SillyMUD έτρεχε εύκολα στο CloudI ως υπηρεσία CloudI μετά την ενσωμάτωσή του στο C CloudI API (αν και Το CloudI παρέχει API C και C ++ , χρησιμοποιώντας το C API καλύτερη διευκόλυνση της ενσωμάτωσης με τον πηγαίο κώδικα C του SillyMUD).

Συνδρομές

Η ενσωμάτωση CloudI προσυπογράφει τρία κύρια μοτίβα ονομάτων υπηρεσιών για τη διαχείριση συμβάντων σύνδεσης, αποσύνδεσης και παιχνιδιού. Αυτά τα μοτίβα ονομάτων προέρχονται από τις κλήσεις API C CloudI Εγγραφείτε στον πηγαίο κώδικα ενοποίησης. Κατά συνέπεια, είτε οι συνδέσεις WebSocket είτε οι συνδέσεις Telnet έχουν προορισμούς ονόματος υπηρεσίας για την αποστολή αιτημάτων υπηρεσίας όταν πραγματοποιούνται συνδέσεις.

Η υποστήριξη WebSocket και Telnet στο CloudI παρέχεται από εσωτερικές υπηρεσίες CloudI (cloudi_service_http_cowboy για υποστήριξη WebSocket και cloudi_service_tcp για υποστήριξη Telnet). Δεδομένου ότι οι εσωτερικές υπηρεσίες CloudI είναι γραμμένες στο Erlang, είναι σε θέση να αξιοποιήσουν την ακραία επεκτασιμότητα της Erlang, ενώ ταυτόχρονα χρησιμοποιούν το CloudI άντληση υπηρεσίας που παρέχει τις λειτουργίες CloudI API.

Προχωράμε μπροστά

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

Η αφαίρεση του χειρισμού υποδοχών χαμηλού επιπέδου αντιμετώπισε το κύριο πρόβλημα επεκτασιμότητας.

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

Πόσο έχει βελτιωθεί το MUD;

Με την ενσωμάτωση CloudI, ο αριθμός των συνδέσεων κλιμακώθηκε κατά τρεις τάξεις μεγέθους, παρέχοντας ταυτόχρονα ανοχή σφαλμάτων και αυξάνοντας την απόδοση του ίδιου παλαιού παιχνιδιού.

Υπήρχαν τρεις κύριοι τομείς βελτίωσης:

  1. Ανοχή σε σφάλματα. Με την εκσυγχρονισμένη ενοποίηση υπηρεσιών SillyMUD CloudI, η απομόνωση σφαλμάτων υποδοχής και καθυστέρησης από τον πηγαίο κώδικα SillyMUD παρέχει ένα βαθμό ανοχής σφαλμάτων.
  2. Επεκτασιμότητα σύνδεσης. Με τη χρήση εσωτερικών υπηρεσιών CloudI, ο περιορισμός των ταυτόχρονων χρηστών του SillyMUD μπορεί εύκολα να πάει από 64 (ιστορικά) έως 16.384 χρήστες (χωρίς προβλήματα καθυστέρησης!) .
  3. Αποδοτικότητα και απόδοση. Με την χειρισμός σύνδεσης που γίνεται μέσα στο CloudI αντί για τον πηγαίο κώδικα SillyMUD με ένα νήμα, η αποτελεσματικότητα του πηγαίου κώδικα παιχνιδιού SillyMUD βελτιώνεται φυσικά και μπορεί να χειριστεί υψηλότερο φορτίο.

Έτσι, με την απλή ενσωμάτωση CloudI, ο αριθμός των συνδέσεων κλιμακώθηκε κατά τρεις τάξεις μεγέθους, παρέχοντας παράλληλα ανοχή σφαλμάτων και αυξάνοντας την αποτελεσματικότητα του ίδιου παλαιού παιχνιδιού.

Η μεγαλύτερη εικόνα

Η Erlang έχει παράσχει 99,9999999% χρόνο λειτουργίας (λιγότερο από 31.536 χιλιοστά του δευτερολέπτου χρόνου διακοπής ανά έτος) για συστήματα παραγωγής. Με το CloudI, προσφέρουμε την ίδια αξιοπιστία σε άλλες γλώσσες και συστήματα προγραμματισμού.

Πέρα από την απόδειξη της βιωσιμότητας αυτής της προσέγγισης για τη βελτίωση του στάσιμου πηγαίου κώδικα διακομιστή παιχνιδιού παλαιού τύπου (το SillyMUD τροποποιήθηκε τελευταία πριν από 20 χρόνια το 1993!), Αυτό το έργο δείχνει σε ευρύτερο επίπεδο πώς μπορούν να αξιοποιηθούν οι Erlang και CloudI για τον εκσυγχρονισμό εφαρμογών παλαιού τύπου και για την παροχή σφάλματος - ανοχή, βελτιωμένη απόδοση και γενικά υψηλή διαθεσιμότητα. Αυτά τα αποτελέσματα διατηρούν πολλά υποσχόμενες δυνατότητες προσαρμογής του παλαιού κώδικα στον 21ο αιώνα χωρίς να απαιτείται σημαντική αναθεώρηση λογισμικού.

Μηχανική γλώσσα - Ένας οδηγός για την ορολογία Chatbot (με Infographic)

Σχεδιασμός Ux

Μηχανική γλώσσα - Ένας οδηγός για την ορολογία Chatbot (με Infographic)
Κωδικοποίηση δεδομένων: Ένας οδηγός UTF-8 για PHP και MySQL

Κωδικοποίηση δεδομένων: Ένας οδηγός UTF-8 για PHP και MySQL

Επιστήμη Δεδομένων Και Βάσεις Δεδομένων

Δημοφιλείς Αναρτήσεις
Πώς να δημιουργήσετε μια εφαρμογή επεξεργασίας φυσικής γλώσσας
Πώς να δημιουργήσετε μια εφαρμογή επεξεργασίας φυσικής γλώσσας
Πρόβλεψη επενδυτικού κεφαλαίου 2017: Σημάδια κόπωσης
Πρόβλεψη επενδυτικού κεφαλαίου 2017: Σημάδια κόπωσης
Μια βαθιά ματιά στο JSON εναντίον XML, Μέρος 2: Τα δυνατά σημεία και οι αδυναμίες και των δύο
Μια βαθιά ματιά στο JSON εναντίον XML, Μέρος 2: Τα δυνατά σημεία και οι αδυναμίες και των δύο
Πώς να ποσοτικοποιήσετε αποτελεσματικά την αξία προϊόντος - Ένας οδηγός για τους διαχειριστές προϊόντων
Πώς να ποσοτικοποιήσετε αποτελεσματικά την αξία προϊόντος - Ένας οδηγός για τους διαχειριστές προϊόντων
Το μέλλον των ομάδων: Διαχείριση του συνδυασμένου εργατικού δυναμικού
Το μέλλον των ομάδων: Διαχείριση του συνδυασμένου εργατικού δυναμικού
 
Think Business - Πώς να αυξήσετε την αξία του σχεδιαστή σας
Think Business - Πώς να αυξήσετε την αξία του σχεδιαστή σας
Εργονομία για Ψηφιακούς Νομάδες: Εργασία στο δρόμο χωρίς να σκοτωθείτε
Εργονομία για Ψηφιακούς Νομάδες: Εργασία στο δρόμο χωρίς να σκοτωθείτε
Μια βαθιά κατάδυση στις επενδύσεις του Elon Musk: The Makings of a Billionaire
Μια βαθιά κατάδυση στις επενδύσεις του Elon Musk: The Makings of a Billionaire
Αρχιτεκτονικοί Αλγόριθμοι Βελτιστοποίησης με HorusLP
Αρχιτεκτονικοί Αλγόριθμοι Βελτιστοποίησης με HorusLP
Κοιτάζοντας τα αποτυχημένα IPO στην εποχή του μονόκερου
Κοιτάζοντας τα αποτυχημένα IPO στην εποχή του μονόκερου
Δημοφιλείς Αναρτήσεις
  • νόμος Gestalt του σχήματος και του εδάφους
  • Υπολογιστής μισθών εργολάβων εναντίον εργαζομένων
  • Μερικές από τις πιο κοινές οδηγίες που εκδίδονται από τοποθεσίες web κατά το σχεδιασμό ενός ασφαλούς κωδικού πρόσβασης περιλαμβάνουν:
  • διαφορά σε c corp και s corp
  • σε τι χρησιμεύει ο προγραμματισμός c
  • τι κάνει ένας cfo;
Κατηγορίες
  • Κατανεμημένες Ομάδες
  • Τροποσ Ζωησ
  • Αλλα
  • Κερδοφορία & Αποδοτικότητα
  • © 2022 | Ολα Τα Δικαιώματα Διατηρούνται

    portaldacalheta.pt