29.10.07

Composite

Από χθες άρχισα να ξεσκονίζω το GoF βιβλίο για Design Patterns. Θα ξεκινήσουμε κάτι παρουσιάσεις στην δουλειά σχετικά με το θέμα. Σε μένα έπεσε ο κλήρος του Composite pattern.

Τα patterns ξεκινήσανε από τους Erich Gamma ,Richard Helm, Ralph Johnson, John Vlissides οι οποίοι εμπενεόμενοι από αντίστοιχα βιβλία αρχιτεκτονικής, αποφασίσαν να κατασκευάσουν ένα κατάλογο από software design patterns, συνταγές, προσχέδια κώδικα τα οποία συμβαίνει να εμφανίζονται πολύ συχνά. Το βιβλίο εκδόθηκε το 1995 με τίτλο: Design Patterns: Elements of Reusable Object-Oriented Software και οι συγγραφείς γίνανε γνωστοί ως η συμμορία των τεσσάρων: Gang of Four (GoF).

Σχετικά με το Composite τώρα:
ας υποθέσουμε ότι θέλετε να κατασκευάσετε μια εφαρμογή που να υπολογίζει το συνολικό μέγεθος ενός καταλόγου στον δίσκο, ο οποίος με την σειρά του περιέχει άλλα αρχεία και άλλους καταλόγους που αναδρομικά περιέχουν δικά τους αρχεία και καταλόγους κτλ. κτλ. κτλ. Πως υπολογίζετε το συνολικό μέγεθος αυτών των αρχείων, χωρίς να καταλήξετε σε μια πληθώρα από for-if-else? Εδώ έρχεται σε βοήθεια το Composite pattern.

Απλουστεύοντας, δύο είναι οι βασικές οντότητες σε ένα σύστημα αρχείων:
  • Οι κατάλογοι: folders που περιέχουν άλλους καταλόγους και αρχεία και το μέγεθός τους αποτελείται από το άθροισμα του μεγέθους των ῾παιδιών῾ αρχείων που περιέχουν.
  • Τα αρχεία: files που έχουν μέγεθος αλλα δεν περιέχουν άλλα αρχεία ή καταλόγους.
Πέρα από τα πολλά άλλα κοινά που έχουν αυτές οι δύο οντότητες (όνομα, ημ/νία δημιουργίας, κ.α.) έχουν και κάτι κοινό που μας ενδιαφέρει στο παράδειγμά μας: Το μέγεθός τους. Για να το μοντελοποιήσουμε ορίζουμε:

/**** Interface Node - our component! *****/
public interface Node {
long calculateSize();
}


Το composite pattern βασίζεται στην έννοια του component. Το component είναι κατουσία ένα interface που ορίζει την μέθοδο (ή μεθόδους) που μας ενδιαφέρει.

Ορίζουμε λοιπόν τις εξής κλάσεις που υλοποιούν το interface Node:

/**** Class File - The leaf ****/
public class File implements Node {
private long size = 0;
private String name;

public File(String name, long size) {
this.size = size;
this.name = name;
}

public long calculateSize() {
return this.size;
}
}

/*** Class Folder - The composite **/ 
public class Folder implements Node {
private String name;

/** The list of children nodes. */
private List childrenNodes = null;

/** Constructor. */
public Folder(String name) {
this.name = name;
this.childrenNodes = new ArrayList();
}

/** Calculates the total size. */
public long calculateSize() {
long totalSize = 0;
for (Node node : childrenNodes) {
totalSize += node.calculateSize();
}
return totalSize;
}

public void addNode(Node node) {
childrenNodes.add(node);
}

public void removeNode(Node node) {
childrenNodes.remove(node);
}

public String getName() {
return name;
}

}


Από τις παραπάνω κλασεις το Folder είναι το composite γιατί είναι composed από πολλά άλλα στοιχεία-nodes. Το File είναι ένα απλο leaf το οποίο δεν έχει δικά του παρακλάδια. Η χρήση του κοινού interface θα μας βοηθήσει να υπολογίσουμε το συνολικό μέγεθος χωρίς την χρήση for-if-else ως εξής:

public class Client {
public static void main(String[] args) {
Folder root = new Folder("root");
File rootLog = new File("root-log.log", 100);
root.addNode(rootLog);

Folder home = new Folder("home");
File homeLog = new File("home-log.log", 200);
home.addNode(homeLog);

Folder homeUserA = new Folder("homeUserA");
File fileOfUserA = new File(".bashrc", 3);
homeUserA.addNode(fileOfUserA);
home.addNode(homeUserA);

Folder homeUserB = new Folder("homeUserB");
File fileOfUserB = new File(".bashrc", 7);
homeUserB.addNode(fileOfUserB);
home.addNode(homeUserB);

root.addNode(home);

Folder usr = new Folder("usr");
File usrLog = new File("usr-log.log", 50);
usr.addNode(usrLog);
root.addNode(usr);

System.out.println("Total: " + root.calculateSize());
}

}


Το pattern έχει αρκετές παραλλαγές που ταιριάζουν ανάλογα με την περίσταση. Για περισσότερες λεπτομέρεις μπορείτε απλά να google-αρετε αλλά το βιβλίο των G0F είναι το καλύτερο, απλα χρησιμοποιεί C++ κυρίως που ίσως δυσκολέψει.

Να σημειώσω ότι τα patterns δεν είναι πανάκοια. Είναι συνταγές για την συγγραφή κώδικα και τπτ άλλο και δεν πρέπει να γίνονται αυτοσκοπός αλλα το μέσω επίλυσης προβλημάτων. Για περισσότερες πληροφορίες σχετικά με την Java υπάρχει το site του Jhug με αρκετό υλικό για κάθε επίπεδο.

27.10.07

Leopard: Take two..

Σήμερα και μετά από πολύ ψάξιμο και google-ing κατάφερα να σηκώσω το τοπικό site που διατηρούσα στο macbook. Τελικά τα πράγματα δεν ήταν τόσο απλά όσο πίστευα αφού στην νεά έκδοση του λειτουργικού υπάρχει Apache 2.2 και php 5+. (Η παλιά έχει 1.3 και 4+ αντίστοιχα). Όλα αυτά σε συδιασμό με το ότι την mysql μπορώ να την ανοιγοκλείνω πλέον μόνο από το terminal με φέρανε σε μια δύσκολη θέση που ούτως ή άλλως ήθελε ψάξιμο.

Τα χειρότερο όμως δεν είχε έρθει ακόμα. Τελικά όπως διαπίστωσα, μου έλειπε όλο το Quick-View functionality. Έβλεπα μεν previews αλλα δεν μπορούσα να το κάνω όπως στο site της apple, πατώντας το "ματάκι" γιατί απλά ματάκι δεν υπήρχε! Φαίνεται ότι καπου κάπως κάποτε, πείραξα κάποια settings στο home folder τα οποία είχα να κάνουν με το journaling? Χαθήκανε ολάκερα groups από permissions σε όλους τους φακέλους. Με δεξί κλικ και get info σε οποιαδήποτε αρχείο δεν έβλεπα το μεσαίο element των permissions, αυτό που αφορά το group στο οποίο ανήκει ο χρήστης. Απλά ήταν κενό. Go figure..  

Έκανα κάποιες προσπάθειες με το Disk Utility αλλά μάταια. Σκεφτόμουν σοβαρά το reinstallation αλλα τελικά είπα, δεν φτιάχνω εναν νέο user να δω μήπως είναι home folder related το θέμα; Τελικά έτσι έγινε και όλα δουλέψανε. Μου πήρε λίγο παραπάνω να κάνω export import από Mail.app, Inbox, iPhoto, Calendar και κάτι άλλα settings αλλα τελικά τώρα όλα είναι οκ, ακόμα και το site μου έστησα. Μόνο η mysql μένει αλλα για την ώρα μπορώ να την χειριστω οπότε είμαι οκ.  

Lesson learned: Μηδένα προ του τέλους μακάριζε.. :D

Πάντως μιλάμε για ένα σύστημα σαν το δικό μου που δεν μπορώ να πω, το έχω ξεπαρθενιάσει εδώ και καιρό, πέρα από το πείραγμα που θα του κάνει ένας μέσος home user. Οπότε ίσως θα ήταν καλύτερα να είχα κάνει clean install εξ αρχής. Anyway, φαίνεται ότι το περάσαμε ανώδυνα, και εν τέλει γλυτωσα και από το άσχημα short name που είχα στο παλιό account. Είχε 15 χαρακτήρες!!!

26.10.07

Got Mac?



Ορίστε το νέο Μacosx 10.5 Leopard. Σήμερα το πρωί το έβαλα στο Macbook μου. Δεν το έχω πολυψάξει βέβαια αλλα οι πρώτες εντυπώσεις είναι πραγματικά υπερ-θετικές :D.

Αρχικά να δηλώσω ότι δεν χάνεις απολύτως ΤΙΠΟΤΑ από το παλιό σου installation! Και δεν μιλάμε για documents μόνο αλλα και για τις εφαρμογές, από τα settings και profiles του δικτύου μέχρι την java και τις επιλογές της γλωσσας. Πρακτικά δεν χρειάστηκε να βάλω τπτ καινούργιο στο σύστημα, όλα παίξανε ρολόι χωρίς extra configuration. Τσάμπα το backup που πήρα (αν και έπρεπε να γίνει). Το μόνο πράγμα που ΔΕΝ παίζει μέχρι τώρα είναι η mysql, κάτι το οποιο πρέπει να δω μιας και μου είναι απαραίτητη για το CMSms.

Αφού γίνει το indexing από το Spotlight στον δίσκο σου, αρχίζοντας να δουλεύεις με τον Finder, μπορείς να ῾περνάς῾ πάνω από αρχεία και χωρίς να τα ανοίγεις να βλέπεις τι έχουν μέσα. Μιλάμε για κανονικά previews κάνοντας κλικ σε μια ταινία για παράδειγμα απλά παίζει την ταινία πάνω στο εικονίδιο! Αυτό είναι το Cover Flow: πρακτικό iCandy. Ακόμα το εξερευνώ αλλα αλλάζει τον τρόπο με τον οποίο βλέπεις τα αρχεία σου.

Πολύ καλό και το Spaces, αν και το macosx ποτέ δεν είχε προβλήματα με το real estate της οθόνης οπότε δεν νομίζω να το χρειαστώ ιδιαίτερα. Να ναι καλα το Expose, ένα από τα καλύτερα features ever σε UI.

Ακόμα βέβαια δεν έχω δει καθόλου το Time Machine, το backup του Leopard. Με το που φορμάρω ένα από τους δίσκους σε HFS θα το τσεκάρω και αυτό.

Οι καινοτομίες είναι πολλές. Το σύστημα πάντως έχει γίνει ακόμα πιο responsive από πριν. Δεν ξέρω ίσως να είναι και η ιδέα μου αλλα ενώ το λειτουργικό μοιάζει πιο φορτωμένο οι εφαρμογές ανοιγοκλέινουν και λειτουργούν ακόμα πιο γρήγορα από πριν. Biased? Ίσως. Αλλά μετά από upgrades άλλων λειτουργικών (ονοματα δεν λέμε) μπορώ να πω ότι, ΟΧΙ ΔΕΝ ΘΑ ΧΡΕΙΑΣΤΕΙ ΝΑ ΑΛΛΑΞΩ ΜΗΧΑΝΗΜΑ!


25.10.07

Isolation Desolation


Η τελευταία συναυλία των Earthbound και το κομμάτι των Kyuss που παίξανε προς το τέλος με έκανε να ξαναγυρίσω όλη αυτή την βδομάδα σε stoner ακούσματα. Τι κρίμα για αυτό το συγκρότημα, οι συνεχιστές του (Queens of the stone age) παραείναι εμπορικοί αν και τους ακούω. Το shuffleακι έχει τιγκάρει και παίζει τσίτα 8 ώρες συνεχόμενες. Τελικά μήπως θα έπρεπε να ζω σε άλλη εποχή, ποιο φαρ ουέστ κατάσταση, όπου όλοι ήταν ποιο μοναχικοί και αυτάρκεις; Ούτε να περιμένεις νέα λειτουργικά, ούτε νέα gadgets ούτε τίποτα. Εσύ και η έρημος, βουνό πεδιάδα.. 

"In my mind you ain't looking fine
  So isolation
  And inside you ain't fine to me
  So isolation desolation"




24.10.07

Ζούγκλα κυρίες και κύριοι..

Τι να κάνω, περιμένω και εγώ όπως και ο υπόλοιπος enlighted world την νέα γάτα. Που θα πάει θα έρθει. Μέσα στο ΣΚ λογικά..

Πάντως η κατάσταση στους δρόμους πραγματικά δεν βελτιώνεται. Αναφέρομαι και πάλι σε εκείνους τους επικίνδυνους τύπους που για κάποιο λόγο οδηγούν αργά και αριστερά. Στην αρχή το είχα πάρει πολύ βαρέως το όλο θέμα, και όχι άδικα κατα την γνώμη μου. Δεν είναι και λίγο να έχεις ένα δρόμο με δύο λωρίδες κυκλοφορίας σε κάθε ρεύμα και μάλιστα κλειστό με κράσπεδα και να επιμένεις να οδογείς με 80 χ.α.ω αριστερά. Δεν λέω, υπάρχουν και όρια ταχύτητας αλλά το να τπ κάνεις μόνο και μονο για να μην μπορώ να τα ξεπεράσω μου θυμίζει λίγο από vigilante με τον Τσαρλς Μπρόνσον! Δεν μπορείς να παίζεις με αυτά τα πράγματα.

Ο άλλος μπορεί να έχει χίλιους λόγους για να πάει με 100, όπως καλύτερο αυτοκίνητο, λάστιχα, όραση, προσόντα οδηγικά ή απλά να βιάζεται. Είναι παράβαση του ΚΟΚ να πας εσύ με 70 αριστερά. Ομοίως, είναι παράβαση να προσπερνάς από δεξιά. Όπως και να κάνεις συνέχεια σήματα με τα φωτα για να κάνει στην άκρη ο άλλος. Αλλα κατι πρέπει να γινει, δεν μπορείς να είσαι συνέχεια από πίσω και ο άλλος να ῾οδηγεί και σε σκέφτεται...῾ με 70 μπροστά.

Ένας φίλος μου το είχε πει μια φορα, ῾Κωστα δεν λέει να πας δεξια σε κάτι δρόμους όπου μπορεί να σου πεταχτεί ο άλλος από το στενό  ανα πάσα στιγμή῾. Συμφωνώ και δεν έχω πρόβλημα στο 95% των άσχημων ελληνικών δρόμων. Στο υπόλοιπο όμως καλό 5% θέλω να μπορώ να πιάνω αριστερά και να το πατάω μέχρι εκεί που νομίζω ότι είναι ασφαλές. Όταν κάποιος θέλει να με προσπεράσει έχω το μυαλό μου και πιάνω δεξιά. Κοιτάμε και καθρέφτες που και που.. Το ότι η κατάσταση αυτή υπάρχει ακόμα και στην εθνική που δεν υπάρχουν στενά τα λέει όλα. Είναι θέμα οδηγικής κουλτούρας τελικά και εν τέλει παντελούς έλλειψης ευγένειας προς στους υπόλοιπους οδηγούς.

Πολλά πράγματα σήμερα

Σήμερα τρέχω και δεν φτάνω.
Ευτυχώς η ομάδα μπασκετ δεν είχε προπόνηση και μπόρεσα και ασχολήθηκα με ενα site κάτι που το ανεβαλα για πολύ πολύ καιρό. Βασικά το πρόβλημα ήταν στην απροθυμία μου να μπω στην διαδικασία να νοικιάσω ένα host name και έναν χώρο σε ένα web server. Τελικά επέλεξα ελληνικά τον Philoxeno και μάλλον δεν το μετανιώνω. Thanx papo. Το πρωί μου έγινε enable o account στο cPanel και όλα τα άλλα καλούδια. Επιτέλους, αυτό που φανταζόμουν χρόνια τώρα έγινε πραγματικότητα!

Τελικά όπως φαίνεται θα χρησιμοποιείσω το CMS Made Simple. Για την ώρα είμαι πολύ ευχαριστημένος. Προκειται για ένα πολύ απλό CMS σε γραμένο σε php που μου φαίνεται ότι δουλεύει ικανοιποιητικά. Τουλάχιστον για το συγκεκριμένο site θα έχω λίγες σελίδες οπότε μάλλον δεν θα έχω ιδιαίτερα προβλήματα.. Πολύ καλό, στήνεις, μπαίνεις, κάνεις add content και είσαι έτοιμος.

Μεσα στα άλλα αποφάσισα να μην πάρω τελικά και το mac mini. Κρίμα πραγματικά, αλλα δεν είμαι έτοιμος να παραδεχτώ ότι το super duper PC μου, που είχα πάρει πριν 10 μήνες, είναι στην πραγματικότητα η χειρότερη αγορά που έχω κάνει EVER, ειδικά όταν βλέπω μηχανάκια σαν και αυτό σε αντίστοιχα λεφτά.. ευτυχώς υπάρχει το macbook και μπορώ και δουλεύω σαν άνθρωπος. Πέρα από κάθε πλάκα, μετά το macosx τα windows απλά δεν σου φτάνουν. (Ειδικά τα Leopard που τα περιμένω πως και πως..).
ΥΓ. Όποιος δεν έχει UPS την σήμερον είναι άξιος της μοίρας του.

21.10.07

Καλή μουσική, καλοί μουσικοί...

Έχω να ποστάρω καιρό, και όλο λέω και λέω αλλά κάτι με εμποδίζει να είμαι τόσο τυπικός.. Τελικά είναι να το έχεις όπως ο "ma man" papo o οποίος πραγματικά είναι ένα τέρας συνέπειας στο αυτό το θέμα! Thanx mate για την ωραία Παρασκευή, οι earthbound είναι πράγματι το κάτι άλλο.
Φαίνεται ότι τον τελευταίο καιρό άρχισα να ξαναβγαίνω. Το προηγούμενο Σάββατο είχα πάει απέναντι από τον Σταυρό του Νότου όπου ένα κατα τα άλλα πολύ συμπαθές σχηματάκι τραγούδησε έντεχνα σκυλάδικα και παλιά λαικά με μια αξιοπρέπεια. Το προτείνω..
Αλλα το κλου της όλης φάσης ήταν αυτή την Παρασκευή. Γενικά ακούω ξένη μουσική rock, jazz, ακόμα και dance (btw τώρα ακούω Cattaneo - Sequential), κυρίως αγγλόφωνη, και είμαι λατρης του ατμοσφαιρικού/ερημικού/space rock. Ο ήχος των earthbound μου ήταν εκπληκτικά οικείος, με πολλές jazz/rock/fusion καταβολές αν και κατ-ουσίαν rock. Υπήρχαν ακόμα και blues/reggae στοιχεία ενώ αναγνώρισα ακόμα και μακρινούς ήχους από Dire Straits και Pink Floyd! 
Χάρηκα επίσης που άκουσα Kyuss στην συναυλία, παίξαν ένα κομμάτι προς το τέλος και καλό. 
Καλή μουσική, καλοί μουσικοί... Το μόνο άσχημο τα κακής ποιότητας videos που τράβηξα με το Samsung.. Pretty but lame..