Δείτε εδώ τα υπόλοιπα blog posts για την Teched 2007
Πρώτο session της σημερινής ημέρας, με τον Martin Maly να μας μιλάει για Dynamic Language Runtime. Το πρώτο πράγμα που έκανε ήταν να βγάλει το κλασσικό γκρι πουκάμισο που φοράνε οι ομιλητές της TechEd και να το πετάξει (!!!!!!!!!), θέλοντας με αυτό τον τρόπο να μας δείξει την ανεξαρτησία του (παρόλο που ο ίδιος δουλεύει στη Microsoft!!). Συνέχισε με μία εισαγωγή στην IronPython και με ένα demo μιας scripting γλώσσας ονόματι ToyScript. Μας έδειξε λίγο κώδικα αυτής της γλώσσας, και ανέφερε ότι επειδή κάνει target το DLR, έχουμε και δυνατότητες debugging αλλά και reference τις System.* βιβλιοθήκες.
Προχώρησε σε μία ανάλυση του πως δουλεύουν οι μεταγλωττιστές, δείχνοντας μας σε ποιο σημείο γίνεται generate IL. Στη συνέχεια, μας μίλησε για το πως δουλεύουν οι μεταγλωττιστές στο DLR, με την δημιουργία του DLR δέντρου. Το επόμενο slide περιείχε πληροφορίες για το γιατί να ασχοληθούμε με το DLR. Τα κύρια points είναι ότι μπορούμε μόνοι μας να ασχοληθούμε με τον parser, τον tokenizer και με τα semantics.
Προχώρησε σε μια ανάλυση του τι είναι τα DLR trees. Ανέφερε ότι μοιάζουν πολύ με τα Expression Trees της LINQ. Έχουνε expressions(constant, unary, binary, property value, method call κ.λ.π.), statements(if, while, try, return, switch κ.λ.π.), υπάρχει υποστήριξη για δυναμικές εντολές μέσω του DynamicActionExpression. Έπειτα, ανέλυσε το δέντρο μιας increment συνάρτησης, τόσο visually αλλά και με κώδικα.
Το επόμενο demo ήταν ένας λανθασμένος κώδικας της ToyScript. Ο Martin δεν είχε υλοποιήσει την πρόσθεση, με αποτέλεσμα ο parser να επιστρέψει error. Με βάση αυτό μας έδειξε τον generated C# κώδικα του parser. Προχώρησε, έπειτα, σε υλοιποίηση της πρόσθεσης, με χρήση της Ast.Call, η οποία μέσω reflection καλεί μία συνάρτηση πρόσθεσης από μια εξωτερική βιβλιοθήκη. Το μόνο πρόβλημα με αυτό, ήταν ότι θα πρέπει να ελέγχουμε με πολλά if/else τον τύπο των μεταβλητών που θέλουμε να προσθέσουμε.
Στη συνέχεια μας ανέλυσε τα Rules που μπορούμε να βάλουμε σε μια δυναμική γλώσσα, προκειμένου να προσαρμόσουμε τη συμπεριφορά της. To κλειδί είναι να δίνουμε τις κατάλληλες εντολές, ώστε αυτές να γίνονται generate στο δέντρο που δημιουργείται κατά τη μεταγλώττιση. Αν δεν υπάρχουν κατάλληλες εντολές, τότε επέρχεται η default συμπεριφορά του DLR. Μας έδειξε, μετά, ένα rule τύπου (if a is string && b is string) και μας έδειξε πως αυτό δημιουργείται με δέντρο.
Στο επόμενο demo, διόρθωσε τον κώδικα για την ToyScript, ώστε να μπορεί να κάνει πρόσθεση οποιαδήποτε αντικείμενα (σε όσα ξέρει το DLR να κάνει πρόσθεση) με τη χρήση του Ast.Action.Operator. Με βάση αυτό, μας έδειξε ότι το DLR δεν ξέρει να “προσθέσει” strings οπότε το υλοποιούμε μόνοι μας, δείχνοντάς μας τον τρόπο (κατασκευή ενός δικού μας rule, και μετά καλώντας την String.Concat μέσω του typeof(string)). Το test που μας επιστρέφεται από το Rule, είναι πάρα πολύ σημαντικό καθώς μπορούμε με ασφάλεια να κάνουμε επιτρεπτά casts.
Το επόμενο demo είχε ένα demo της LOLCODE (γελάσαμε πάρα πολύ όταν το είδαμε), port για DLR της οποίας έχει γράψει ο Martin. Δείτε πως γίνεται το import του System
CAN HAS System?
και πως κάνουμε output το CurrentDirectory
VISIBLE CurrentDirectory ON Environment ON System
Στο τελευταίο sample, ο Martin μας έδειξε την DLR κονσόλα, όπου και έγραψε μια συνάρτηση σε Python, και μετά την κάλεσε από την LOLCODE! Με αυτό ήθελε να μας ενημερώσει για το language interoperability, όπου και είναι ένα feature του DLR.
Πάρα πολύ καλή η παρουσίαση του Martin, πολύ καλός coder και παρουσιαστής, και δεν με χάλασε καθόλου το skip – through κάποιων slide στο τέλος! Με έψησε να ψάξω το DLR, και σκοπεύω να το κάνω σύντομα!
Το επόμενο event της ημέρας είχε τον Rob Howard να μας μιλάει για “ASP.NET internals”. Ξεκίνησε με μια εισαγωγή στην ASP.NET, και αμέσως προχώρησε στο να μας εξηγήσει για το πως δουλεύει με διάφορες εκδόσεις του IIS. Ξεκίνησε με τον IIS 5.0, μιλώντας για το aspnet_isapi.dll και πως αυτό κατευθύνει τα asp.net requests στην κατάλληλη έκδοση του framework, και για το aspnet_wp.exe. Στη συνέχεια μας μίλησε για τον IIS 6, και τον kernel network driver (http.sys), ο οποίος καλείται από το w3wp.exe και έτσι δημιουργεί το HttpRuntime, και μέσα του τον HttpHandler για τη διαχείριση του request. Με αυτό τον τρόπο, έχουμε καλύτερο caching (kernel mode caching), αφού ο πυρήνας της ASP.NET πλέον δεν είναι ένα ISAPI module, αλλά γίνεται integrate κατευθείαν στον IIS.
Έπειτα, μας μίλησε για το ASP.NET runtime. Οι προγραμματιστές μπορούνε να “πειράξουνε” το HttpRuntime, και είτε π.χ. να δημιουργήσουν special authentication σε ένα δικτυακό τόπο, ακόμα και να κάνουνε handle την επέκταση “.jpg”. Όλος ο μηχανισμός της ASP.NET είναι χτισμένος πάνω στο HttpRuntime. Το HttpRuntime χωρίζεται σε δύο μεγάλες κατηγορίες, στους HttpHandlers (κάνουνε handle file extensions) και στα HttpModules (SessionState, Authentication και OutputCache). Ο συνδυασμός και των δύο μας δίνει το HttpContext.
Εν συνεχεία, μας μίλησε γενικά για το HttpRuntime. Σε αυτό υπάρχει ολόκληρη υποδομή για request/response processing, με χρήση managed γλωσσών. Μέσα από το HttpContext object έχουμε access σε διάφορα ASP.NET APIs. Το επόμενο demo περιλάμβανε μία console εφαρμογή μέσα στην οποία είχε μια συνάρτηση ονόματι ProcessRequest, η οποία φτιάχτηκε με πολύ απλό τρόπο ώστε να κάνει serve html και .aspx σελίδες. Πάρα πολύ ωραίο demo, είδαμε ένα βασικό χαρακτηριστικό της ASP.NET (HttpRuntime hosting) μέσα από ελάχιστο κώδικα.
Στη συνέχεια, μας μίλησε για Interception Events. Μας εξήγησε ότι είναι παρόμοιας φιλοσοφίας με τα ISAPI filters και ότι είναι μέθοδοι που μπορούν να κληθούν σε διάφορα στάδια του κάθε request. Υπάρχουν δύο τρόποι για να τα χρησιμοποιήσουμε, είτε με τη χρήση του Global.asax, είτε με μεταγλωττισμένα IHttpModule components. Τόνισε ότι το σημείο που βρίσκεται ο κώδικας δεν έχει και τόση σημασία, καθώς και το Global.asax μεταγλωττίζεται. Η σειρά με την οποία θα κληθούν οι handlers είναι στο .config αρχείο.
Κατόπιν, μας μίλησε για τα per-request application events. Με τη σειρά, (τα βασικότερα) είναι
- BeginRequest
- AuthenticateRequest
- AuthorizeRequest
- ResolveRequestCache
- AcquireRequestState
- PreRequestHandlerExecute
- (από δω και πέρα αρχίζουμε να ετοιμάζουμε την απάντηση στον client)
- PostRequestHandlerExecute
- ReleaseRequestState
- UpdateRequestCache
- EndRequest
Προχώρησε σε μία επεξήγηση του Output Cache module, και μετά μας εξήγησε πως να γράψουμε το δικό μας module, κάνοντας implement το IHttpModule. Μας μίλησε ελάχιστα για το HttpHandlerFactory, και αμέσως μετά προχώρησε στην επεξήγηση του HttpHandler, με ένα ωραίο demo για να γίνει handle το v-card extension. Έφτιαξε και μια .ashx σελίδα στην οποία έκανε implement το IHttpHandler και μετά έπαιξε με την κύρια συνάρτησή του, την ProcessRequest.
Στη συνέχεια, μας μίλησε για την κλάση HttpContext. Αυτή περιέχει όλη την πληροφορία του request, η οποία είναι προσβάσιμη, επεκτάσιμη αλλά και αλλοιώσιμη από τον προγραμματιστή. Το επόμενο slide περιείχε ένα πολύ ωραίο σχήμα για το runtime page compilation, και πως αυτό σχετίζεται με το .NET compilation, από τον C#/VB.NET κώδικα, στο IL, και μετά μέσω του JIT σε native code.
Έπειτα, μας μίλησε για το πως μια ASP.NET σελίδα γίνεται parse. Ξεκίνησε με τα ASP.NET page directives, και συνέχισε με τα code & render blocks κώδικα, όπως μια συνάρτηση Page_Load, ή <%= System.DateTime.Now =>. Μετά, μας μίλησε για τα html literals και για τα server controls. Όλα αυτά “χτίζονται” πάνω σε ένα Control Tree, πάνω στα “φύλλα” του οποίου καλείται η Render μέθοδος (υπάρχει σε κάθε control), προκειμένου να γράψουν html κώδικα στο output. Με αφορμή αυτό, μας είπε μερικά πραγματάκια για την σειρά με την οποία “σκάνε” τα events κατά τη διάρκεια ζωής ενός Control ή μιας Page.
Ακόμη, μας περιέγραψε τον τρόπο που πρέπει να γράφουμε server controls declaratively, π.χ. <namespace:class id=”instanceName” … /> κ.λ.π. Το demo μετά από αυτό αφορούσε την κατασκευή ενός server control from scratch, το οποίο αφορούσε windows-related events, αλλά και ενός Confirm Button (το οποίο έκανε output javascript για confirm). Μια σχετικά πολύπλοκη διαδικασία, αλλά μας δείχνει την απίστευτη δύναμη της ASP.NET, όπου μπορούμε να προγραμματίσουμε από το πιο χαμηλό μέχρι το πιο υψηλό επίπεδο.
Τέλος, μας έδειξε έναν HttpHandler ο οποίος έκανε export σε csv file κάποια δεδομένα, πολύ εύκολα κι απλά.
Στη συνέχεια, είδαμε τον εκπληκτικό David Chappel να μας κάνει μία σύγκριση των πρωτοκόλλων SOAP/WS-* και REST. Ανέφερε ότι χρησιμοποιούνται και τα δύο κατά κόρον σήμερα, και ότι στο Windows Communication Foundation υπάρχει υποστήριξη και για τα δύο. Προχώρησε σε μια σύντομη αναφορά των χαρακτηριστικών τους, ξεκινώντας από το WS-*.
Τα κύρια χαρακτηριστικά του SOAP/WS-* είναι
- Messaging
- Reliability
- Policy
- Security
- Transactions
- Acquiring interface definitions
Στο WCF υποστηρίζονται με τα εξής bindings
- WS-HttpBinding
- NetTcpBinding
Το πρωτόκολλο περιλαμβάνει τη χρήση SOAP Envelopes (XML segments) για επικοινωνία. Εδώ μας ανέφερε μια δυσκολία που υπάρχει, σχετικά με το configuration των bindings στο WCF, αλλά και το ότι ακόμα δεν έχει επιτευχθεί καλή cross vendor interoperability (π.χ. C# κλήσεις σε Java -ή και αντίστροφα- soap service δεν παίζουνε και τόσο καλά).
Στη συνέχεια, μας μίλησε για το REST. Το REST (REpresentational State Transfer) είναι ένα σχετικά νέο πρωτόκολλο, ένα παράδειγμα κλήσης του οποίου είναι το “GET http://www.quickbank.com/Accounts/2”. Τα πάντα γίνονται access μέσω HTTP verbs και μέσω ενός URI (Unified Resource Identifier). Θετικά σημεία του είναι ότι είναι stateless και cacheable, και, όσον αφορά το WCF, εκτός από το OperationContract attribute, υπάρχουν και τα WebGet και WebInvoke. Το WebInvoke μας επιτρέπει να προσδιορίζουμε άλλα HTTP verbs εκτός του POST, ενώ το ResponseFormat για το WebGet υποστηρίζει τόσο JSON (Javascript Object Notation) όσο και XML. Το REST, συνεπώς, είναι αρκετά “δεμένο” με τα HTTP verbs, και το κακό είναι ότι ενώ το GET operation είναι προσδιορισμένο με ακρίβεια από το αντίστοιχο RFC, τα υπόλοιπα δεν είναι.
Η παρουσίαση συνέχισε με τον David να μας αναφέρει ότι το WCF έχει διάφορα URI patterns προκειμένου να υποστηρίξει το REST, το όνομα του binding είναι “WebHttpBinding”, και ότι αντί του κλασσικού ServiceHost μπορούμε να χρησιμοποιήσουμε τον WebServiceHost, οπότε δεν χρειάζεται να παίξουμε με “περίεργα” configurations. Στο WCF υπάρχει υποστήριξη και για δημιουργία RSS (Really Simple Syndication) feeds, μέσω των objects SyndicationItem και SyndicationFeed.
Έπειτα, η παρουσίαση περιλάμβανε μια απ’ευθείας σύγκριση του REST με το WS-*. Αναφέρθηκε ότι το SOAP δεν είναι μόνο web service, σε αντίθεση με το REST. Το WS-* είναι πιο operation oriented, σε αντίθεση με το REST που είναι data oriented. Το REST έχει named data, ίδιο interface για data exposure (το HTTP), δεν υπάρχει ανάγκη για ορισμό των operations ενώ στο WS-* δίνεται focus σε named operations, υπάρχουνε διαφορετικά interfaces, απαιτεί το SOAP stack και WSDL “κατανόηση”, αλλά και υλοποιήσεις του WS-*.
Κάποια παραδείγματα που παρουσιάστηκαν αργότερα μας επέτρεψαν να κατανοήσουμε ακόμα περισσότερο τη διαφορά μεταξύ των δύο πρωτοκόλλων. Το S3 Amazon Simple Storage Service, με μεθόδους GET, PUT, DELETE, HEAD επιτρέπει την αποθήκευση αντικειμένων σε “κουβάδες”, το ASTORIA project δουλεύει με REST, διάφορα operations σε τραπεζικό πληροφοριακό σύστημα όπως GetBalance και UpdateBalance μπορούν να παίξουν είτε με REST ή SOAP, ενώ για μια Transfer μέθοδο δεν υπάρχει καλύ λύση σε REST, καθώς η συγκεκριμένη μέθοδος είναι business logic και όχι data.
Τέλος, έγινε μία συγκριτική παρουσίαση των δυνατοτήτων των δύο πρωτοκόλλων για security, transactions, reliability όπου σαφώς και υπερτερεί το WS-*, αλλά απαιτεί αρκετά πιο δύσκολο configuration. Η παρουσίαση έκλεισε με το συμπέρασμα ότι το κάθε πρωτόκολλο έχει τη θέση του σε ένα project, ανάλογα τις απαιτήσεις.
Η TechEd μέρα έκλεισε με τον Ingo Rammer να μας μιλάει για hardcore production debugging. Αφού μας έκανε μια μικρή επίδειξη του cdb, ο Ingo προχώρησε σε μία αρκετά μεγάλη παρουσίαση του windbg (που ουσιαστικά είναι ένα windows front-end για τον cdb). Μας έδειξε διάφορες εντολές του, όπως
- hh -> help
- g -> go
- kb -> προβολή του stack trace
- sxe clr -> break on exceptions
- sxi clr -> ignore exceptions
- – -> shows threads
- loadby sos mscorwks -> απαιραίτητη για CLR debugging
- !printexceptions -> μας δείχνει πληροφορίες για τα exceptions
- !clrstack -> μας δείχνει το clr stack trace
- br -> set ένα breakpoint
- !dso -> show all parameters
- !do -> dump object
- !da -> dump array
Μετά από μία σύντομη αναφορά στον MDbg (command line CLR debugger), η παρουσίαση συνέχισε με μια αναφορά στο Global Flags utility (πείραγμα διάφορων ρυθμίσεων των windows) αλλά και στο Adplus (χρήσιμο για memory dumps). Στη συνέχεια, μας έδειξε πως να ανοίξουμε αυτά τα dumps με τον windbg (αυτό το έκανε για να μας δείξει πως μπορούμε να μελετήσουμε exception από κάποιο άλλο thread (εκτός του main) της εφαρμογής μας. Το Adplus γενικά είναι χρήσιμο όταν λόγω κάποιου σφάλματος, κλείνει όλο το process. Στη συνέχεια, μας έδειξε το HawkEye, μέσω του οποίου μπορούμε να πάρουμε πληροφορίες για το status ενός UI control σε μία running Windows Form, την εντολή !dumpheap -stat ControlType (όπου ControlType μπορεί να είναι TextBox, Label κ.λ.π.), για να κάνουμε dump πληροφορίες για ένα control, αλλά και την !getroot όπου μπορούμε να πάρουμε πληροφορίες για τα roots της εφαρμογής μας (χρήσιμο αν θέλουμε να διαγνώσουμε memory leaks).
Τέλος, μας ανέφερε την επιλογή που έχει το windbg για attach to process, αλλά και την εντολή !syncblk για να δούμε τυχόν προβλήματα με deadlocks στην εφαρμογή μας και μας έδειξε ένα utility, το SOSAssist, που μπορεί και ανοίγει/επεξεργάζεται dump files πιο καλά από ότι το Adplus.
<ΜΗ_ΤΕΧΝΙΚΟ_ΚΕΙΜΕΝΟ>
Το βράδυ είχα μια όχι και τόσο καλή εμπειρία. Σύμφωνα με γνωστό Έλληνα MVP (ονόματα δε λέμε), η φάτσα μου είχε γίνει κάτασπρη. Πιο συγκεκριμένα:
Ύστερα από προτροπές άλλων Ελλήνων, αποφασίσαμε να επισκεφτούμε το εστιατόριο “Caracoles”, όπου, σύμφωνα με πληροφορίες, “τρως καλά”. Κατευθυνθήκαμε, λοιπόν, προς τα εκεί, αφού περάσαμε από ένα επικό μαγαζί με όπλα (εκείνο το AK-47 θα με άφηναν να το περάσω από το αεροδρόμιο άραγε;;;;;). Φτάνοντας, (προφανώς), δεν ξέραμε τι να παραγγείλουμε. Γνωστός administrator γνωστής κοινότητας .NET developers στην Ελλάδα, μας πρότεινε μια μπριζόλα με κόκκαλο. Φυσικά (μέγα λάθος) αρνήθηκα να την παραγγείλω έχοντας μεγάλη λιγούρα για ΚΡΕΑΣ και μόνο ΚΡΕΑΣ. Οπότε και παρήγγειλα κάτι άλλο (δεν θυμάμαι όνομα). Το ίδιο έπραξε και γνωστός administrator γνωστής φοιτητικής κοινότητας. Αφού λοιπόν έρχεται, κάνω το λάθος να το κόψω. Και τι παρατηρώ ο δύσμοιρος; ΑΙΜΑ. Ναι, καλά διαβάσατε. Είτε με είχανε περάσει για καννίβαλο, είτε πριν 5′ το κακόμοιρο ζωάκι ήτανε ζωντανό. Από όποια γωνία και να το κοίταζες, έσταζε. Η γκρίνια μου, αντί να εισακουστεί, αντιμετωπίστηκε με γέλια και δούλεμα από τους υπόλοιπους της παρέας. Μαζί με τους 3 προηγούμενους της παρέας, στο δούλεμα συμμετείχαν γνωστή εργαζόμενος της Microsoft Hellas, γνωστός administrator μεγάλου IT forum κ.α. Σε λίγο καιρό θα κυκλοφορούν φωτό, βίντεο κ.λ.π. με το ωμό κρέας που ΦΥΣΙΚΑ ΚΑΙ ΔΕΝ έφαγα (εκτός κάποιων μπουκιών).
Η βραδιά είχε ωραίο κατάληξη με τους περισσότερους του team να καταλήγουν σε γνωστό κλαμπάκι, και μετά από κάποιες απώλειες λόγω κούρασης να απομένουν στο μαγαζί ο υποφαινόμενος, ο γνωστός admin της φοιτητικής κοινότητας και ο γνωστός admin της IT κοινότητας (ο οποίος αποδείχθηκε μέγας εκείνο το βράδυ, respect ταπεινά). Ωραίες παρουσίες στο μαγαζί (αν και το Greek status μας δεν ήταν κι ό,τι καλύτερο), ποτά – βενζίνη (αν το βάλεις στο Punto θα πάρει μπρος), μουσική αρκετά καλή, και, το κυριότερο, πολύς χαβαλές. Πολύ όμορφη βραδιά . ώρα ύπνου : 6.30.
</ΜΗ_ΤΕΧΝΙΚΟ_ΚΕΙΜΕΝΟ>
Φαντάζομαι διαβάσατε το 6.30 παραπάνω. Οπότε, όπως καταλαβαίνετε, την επόμενη και τελευταία μέρα της TechEd, παρακολούθησα μόνο ένα session, ονόματι “ASP.NET Model View Controller”, από τον Matt Gibbs, product manager της ASP.NET. Ο Matt μας ενημέρωσε ότι σε λίγο καιρό θα βγει η πρώτη CTP έκδοση. Στη συνέχεια, μας έδειξε πως το MVC κάνει integrate με τον μηχανισμό της ASP.NET και με το Visual Studio, ότι είναι extensible και pluggable, ότι βολεύει πάρα πολύ με TDD (Test Driven Development), μπορεί να συνεργαστεί με τα υπάρχοντα web forms αλλά και “κατασκευάζει” πιο βολικά URLs, που βοηθούν για SEO (Search Engine Optimization). Ακολούθησαν κάποια demos, ένα απλό Hello World, ένα Routing Demo με κλήσεις διαφορετικών σελίδων και κάποιας μορφής data binding, ένα demo με ControllerFactory και ViewFactory, ένα demo όπου μας έδειξε πόσο εύκολο θα είναι το TDD, και ένα demo με image generation.
Κλείνοντας, μας ανέφερε ότι σκοπός του project δεν είναι να αντικατασταθούν πλήρως τα Web Forms, αλλά να δουλέψει συμπληρωματικά με αυτά. Ακόμη το project είναι σε baby στάδιο, οπότε αναμένεται με τον καιρό να προστεθούν πολλά νέα εντυπωσιακά features!
Και εκεί πήραμε το πούλμαν για το αεροδρόμιο. Με το που φτάσαμε Αθήνα όμως, είχαμε μια ατυχία (!?!?!?!?). Δεν φτάσανε Αθήνα οι βαλίτσες μας (περίπου 30 άτομα φύγαμε με άδεια χέρια από το Ελ. Βενιζέλος…). Α, ρε Alitalia. Τέλος καλό, όλα καλά, μιας και φτάσανε σήμερα.
Αυτή ήταν η μαγική TechEd. Προσωπικά, ένιωσα απίστευτα “μικρός” μπροστά σε όλη αυτή τη γνώση που μας παρεχόταν. Συνιστώ ανεπιφύλακτα σε όλους του Microsoft oriented developers να την παρακολουθήσουν. Αν δεν την δεις, δεν ξέρεις τι χάνεις! Απλά εκπληκτικό event!!!!
Άντε, και του χρόνου!!!!!!!!!!!!!!!!!!!!
ΥΓ. Πάρτε και το link για το blog του fellow student partner με τον οποίο είχαμε την τύχη να παρεβρεθούμε στη Βαρκελώνη για το event. Εκεί θα βρείτε και διάφορες φωτογραφίες!! grnemo is his name :)