Sunday, February 27, 2011

Java 7:Το νέο non-blocking I/O (NIO.2) - Part I

H Java 7, σε λίγο καιρό θα είναι πλέον γεγονός (υπάρχουν ήδη debug builds και beta εκδόσεις προς δοκιμή) και θα περιλαμβάνει πλήθος νέων χαρακτηριστικών που θα βελτιώσουν - αλλά λιγότερο και άλλα περισσότερο - την ποιότητα του κώδικα και θα κάνουν τη ζωή των developers ακόμα πιο εύκολη. Ένα από τα πιο αμφισβητούμενα APΙ της Java (από την έκδοση 1.4) και μετά ήταν και είναι το non-blocking I/O API (ΝΙΟ), τα βασικά στοιχεία του οποίου ήταν συνοπτικά τα εξής:
  • Δυνατότητα κωδικοποίησης και αποκωδικοποίησης αρχείων με διαφορετικά σετ χαρακτήρων
  • Ένα interface το οποίο μπορούσε να διαβάζει και να διαχειρίζεται αρχεία στη μνήμη
  • Δυνατόητα για επεξεργασία δεδομένων (read & write) χωρίς εμπόδια (non-blocking operations)
  • Μία νέα βιβλιοθήκη για regular expressions η οποία είχε στηριχθεί στην ισχυρή και σταθερή υλοποίηση της Perl
Όλα τα παραπάνω ήταν πράγματι ένα σημαντικό βήμα της Java αλλά υπήρχαν ακόμα αρκετά ζητήματα που είχαν μείνει σε εκκρεμότητα
  • Δεν ήταν δυνατή η διαχείριση αρχείων με τον ίδιο τρόπο και με σταθερότητα σε όλα τα λειτουργικά συστήματα.Όποιος έχει αναπτύξει κώδικα και χρειάστηκε να επεξεργαστεί αρχεία από ένα σύστημα σε windows και Linux θα χαμογελάσει κουνώντας το κεφάλι! Για το λόγο αυτό κατηγορήθηκε ότι καταστρατηγεί το slogan : "write once, run everywhere"
  • Δεν είχε ένα ενιαίο μοντέλο διαχείρισης των ιδιοτήτων των αρχείων (read / write access κτλ.)
  • Ήθελε μεγάλη προσπάθεια και error-prone κώδικα για να διαβάσει κάποιος τα περιεχόμενα ενός καταλόγου αναδρομικά.
  • Δεν επέτρεπε τη χρήση λειτουργιών που ήταν διαθέσιμες αποκλειστικά από ένα λειτουργικό σύστημα.
  • Η ανεπηρέαστη επεξεργασία δεδομένων για αρχεία δεν υποστηρίζοντα ακόμα και μέχρι την έκδοση 1.6
Η νέα έκδοση του NIO ( NIO.2 ) το οποίο ξεκίνησε ως JSR-203 είναι πλέον γεγονός στη Java 7 και αποτελεί μία από τις σημαντικότερες βελτιώσεις της με κυριότερα χαρακτηριστικά τα παρακάτω :
  • Νέες βασικές κλάσεις για διαχείριση αρχείων
    • FileSystem
    • FileStore
    • Path – Αντικαθιστά την παλαιά κλάση file
  • Ιδιότητες Αρχείων
  • Υποστήριξη λειτουργιών που είναι διαθέσιμες μόνο από συγκεκριμένα λειτουργικά συστήματα (π.χ. Symbolic Link) 
  • Το WatchService για την παρακολούθηση αλλαγών σε αρχεία ή της ιδιότητες αυτών και την ενεργοποίηση τμήματος κώδικα. 
  • Δυνατότητα αναδρομικής ανάγνωσης καταλόγων (μέθοδος walkFileTree)
  • Υποστήριξη ασύγχρονης επεξεργασίας αρχείων (Interface SeekableByteChannel) 
Ας δούμε μερικές παραπάνω λεπτομέριες για τις 3 κύριες κλάσεις της βασικής βιβλιοθήκης του NIO.2 
  • FileSystem - Αποτελεί την κλάση που αναλαμβάνει την "επικοινωνία" με το τρέχων σύστημα αρχείων, είτε αφορά το εξ'ορισμού σύστημα αρχείων που παρέχεται από το Λειτουργικό Σύστημα είτε από ένα εναλλακτικό σύστημα αρχείων που ανακτήθηκε με το URI7.
  • FileStore - Κλάση, η οποία αναλαμβάνει τη διαχείριση των partitions, των μονάδων δίσκων κτλ. Αντιπροσωπεύει με άλλα λόγια, το αποθηκευτικό μέσο στο οποίο βρίσκεται ένα αρχείο
  • Path - Η κλάση που αντικαθιστά την παλιά κλάση File και χρησιμοποιείται για όλες τις ενέργειες πάνω σε ένα αρχείο (αντιγραφή, μετακίνηση, διαγραφή κτλ.) και διαχειρίζεται όλες τις έννοιες μιας πλήρης διαδρομής (path) είτε αυτή αφορά ένα αρχείο είτε έναν κατάλογο. Αξιοσημείωτο είναι ότι όλες οι μέθοδοι της κλάσης Path δημιουργούν μόνο ένα είδος exception, το κλασσικό IOException. Αν και αυτό είναι αναμφίβολα ένα βήμα προς την απλοποίηση του κώδικα και βοηθάει προς την κατεύθυνση αυτή, υπάρχουν κάποιες (λίγες ομολογουμένως περιπτώσεις) στις οποίες, καθιστά δύσκολο τον εντοπισμό ενός πιο εξειδικευμένου προβλήματος και τη διαχείρισή του.

Στα επόμενα άρθρα θα δείξω μερικά σύντομα παραδείγματα τόσο για τις βασικές κλάσεις του NIO.2 όσο και για τα υπόλοιπα νέα χαρακτηριστικά.

Wednesday, February 9, 2011

Και το όνομα αυτού... Jenkins

Ή (δια)μάχη μεταξύ του δημιουργού του Hudson με την Oracle ( από τότε που εξαγόρασε τη sun ) θεωρώ ότι ήταν από τις πιο "βάρβαρες" που έχω παρακολουθήσει τα τελευταία χρόνια. Άρθρα, blogs, posts ένθεν και κείθεν για αποδείξει ο ένας στον άλλον τι? Ότι μπορεί να συνεχίσει καλύτερα τον εξαιρετικό ( κατά την ταπεινή μου άποψη ) Hudson CI Server? Μάλλον κάτι παραπάνω από αυτό. Προφανώς η Oracle θέλει να ελέγχει ένα από τα πιο trendy συστήματα αυτή τη στιγμή παγκοσμίως στην αγορά και να το εκμετελλευτεί αρχικά με commercial support ( όπως πολύ καλά ξέρει να κάνει ) και αργότερα γιατί όχι ακόμα και το ίδιο το προϊόν. Από την άλλη ο μπαμπάς του Hudson ( Kohsuke Kawaguchi ) σε καμία περίπτωση δεν ήταν διατεθιμένος να δωρίσει το "παιδί" του που με τόσο κόπο αλλά και επιτυχία μεγάλωσε τα τελευταία 5 χρόνια με τους όρους της Oracle.

Μετά από αρκετούς μήνες επικών μαχών που καταλήξαμε τελικά;

Στη σολομώντεια λύση που θέλει να σπάει ο μέχρι πρότινος Hudson CI Server σε Jenkins ( με τη λογική που υπήρχε) και Hudson (ως Oracle product ).
Φυσικά αυτό δεν είναι το τέλος του "πολέμου" αλλά μάλλον η αρχή του με τα δύο στρατόπεδα να συνεχίζουν την ανταλλαγή ευγενικών και μη απόψεων σε διάφορα blogs.Στο κόλπο πλέον έχει μπει και η Sonatype, η εταιρία που έχει δημιουργήσει το καλύτερο ( πάντα κατά την ταπεινή μου άποψη ) artifact repository, το Nexus, και θα αναλάβει να πάει το Hudson ( όπως ισχυρίζεται ) ένα βήμα μπροστά (;;!! ). Ας ελπίσουμε ότι η Oracle και η Sonatype θα τηρήσουν τις δεσμέυσεις τους για opensource προϊόν. οι οποίες περιείχαν και λίγη χολή για τον Hudson και φυσικά δεν έμειναν αναπάντητες

Από την άλλη η πρώτη έκδοση του Jenkins είναι πλέον γεγονός μαζί με ένα migration έγγραφο από Hudson σε Jenkins ώστε να εξασφαλίσει ο Koshuke τη συνέχιση όσων περισσότερων εγκαταστάσεων ( είμαστε κι εμείς μία από αυτές )

Προσωπικά αναμένω με μεγάλη περιέργεια την εξέλιξη της όλης αυτής κατάτασης ελπίζοντας ότι μόνο καλό θα φέρει στο απαραίτητο εργαλείο που λέγεται CI Server.