Εισαγωγή στο .NET Framework και στη C#, part 1, τμήμα Πληροφορικής και Τηλεπικοινωνιών Αθήνας

Σήμερα, 20 Δεκεμβρίου 2007, στο τμήμα Πληροφορικής και Τηλεπικοινωνιών του Πανεπιστημίου Αθηνών, έγινε μια παρουσίαση της C# και του .NET Framework, στα πλαίσια του μαθήματος “Αντικειμενοστραφής Προγραμματισμός”. Ευχαριστώ ιδιαίτερα την κ. Ιζαμπώ Καράλη, επίκουρο καθηγήτρια του τμήματος Πληροφορικής, για την ευγενική της άδεια για την πραγματοποίηση της σημερινής παρουσίασης, αλλά και τα περίπου 40 άτομα που ήταν παρόντα σήμερα.

Συνοπτικά, τα θέματα που παρουσιάστηκαν ήταν τα εξής

  • .NET Framework, CLI, CTS, CLS, CLR
  • βασικά language constructs της C# (statements, enums, structs, classes κ.λ.π.)
  • διάφορα code samples σχετικά με τη C#, για καλύτερη κατανόηση των παραπάνω

Μου άρεσε πολύ που με ρωτήσατε αρκετά για τα metadata, ελπίζω να σας φάνηκε ενδιαφέρον το παράδειγμα με την κλήση constructor μέσω reflection!

Στην δεύτερη παρουσίαση, που θα γίνει στις 8 Ιανουαρίου, θα παρουσιαστούν ακόμα περισσότερα samples, θα γίνει παρουσίαση των υπόλοιπων χαρακτηριστικών της C# καθώς και επίδειξη κατασκευής διάφορων εφαρμογών με χρήση της C#, του .NET Framework και του Visual Studio 2008.

Αν έχετε οποιαδήποτε απορία σχετικά με αυτά που παρουσιάστηκαν σήμερα, μπορείτε να επικοινωνήσετε μαζί μου μέσω προσωπικού μηνύματος είτε στο StudentGuru.gr, είτε στο lists.di.uoa.gr, είτε στο di.forums.gr, αλλά και στο MSN, στο dt008 – at – hotmail.com

Μπορείτε να κατεβάσετε τις διαφάνειες καθώς και τον κώδικα που παρουσιάστηκε σήμερα από εδώ. Και πάλι ευχαριστώ!!

 

edit: Μπορείτε να πλοηγηθείτε εδώ για πληροφορίες σχετικά με το δεύτερο μέρος της παρουσίασης!!

Ψηφίστε για το νέο PC του συλλόγου φοιτητών του DI!!

Δεν χρειάζεται να κάνετε κάτι παραπάνω από το να κάνετε ένα κλικ εδώ

 

http://www.publicpet.gr/voteforme.asp?userid=28711

 

Ο Σύλλογος φοιτητών του DI σας ευχαριστεί για την προσφορά σας!!

 

edit: για More details, εδώ: http://www.forums.gr/showthread.php?t=15569

4ο StudentGuru Event – ASP.NET για αρχάριους

Σήμερα, 14 Δεκεμβρίου 2007 ολοκληρώθηκε με επιτυχία το 4ο StudentGuru event με τίτλο “ASP.NET για αρχαρίους”. Πολλά ευχαριστώ στα 50 περίπου άτομα που ήρθανε και μας παρακολουθήσανε, ελπίζουμε να μείνατε ικανοποιημένοιSmile

Το δικό μου τμήμα της παρουσίασης περιλάμβανε 3 demo

  • ένα shoutbox, με χρήση user control και του Application object,
  • ένα απλό shopping cart για ένα online παγωτατζίδικο (!!!), με χρήση του Session object, και
  • επίδειξη databinding τόσο σε απλή όσο και σε master-details μορφή, με χρήση της Northwind και μερικών asp.net controls

Thanx again Smile

ΥΓ. επισυνάπτω τα demos και τις διαφάνειες Smile

Δημιουργία ενός απλού splash screen για Windows Forms Applications

Σήμερα, ένας φίλος μου ζήτησε μια βοήθεια σχετικά με τη δημιουργία SplashScreen για μία Windows Forms Application. Η ιδέα είναι ότι στον constructor της main φόρμας γίνεται “βαριά” δουλειά, έτσι επιλέγουμε να εμφανίσουμε μία άλλη φόρμα (splash), η οποία και παραμένει ενεργή μέχρις ότου να τελειώσει το φόρτωμα της main.

Η υλοποίηση βασίζεται στη δημιουργία ενός thread το οποίο θα κάνει new την main φόρμα, ενώ παράλληλα θα εμφανίζεται η splash. Υπάρχει μία static boolean μεταβλητή στο πρόγραμμα, η οποία γίνεται true από το πρόγραμμα, όταν τελειώσει το φόρτωμα της main. Παράλληλα, η splash, με τη χρήση ενός απλού timer, τσεκάρει κάθε τόσο την τιμή της μεταβλητής αυτής, και όταν την βρει true, τότε κλείνει.

Για περισσότερα, δείτε τον επισυναπτόμενο κώδικα

“Η επόμενη Γενιά του Internet: Αναπτύξτε εντυπωσιακές Web εφαρμογές με ελάχιστο κόπο” @ fitisi.gr

Σήμερα, είχε προγραμματιστεί να παρουσιάσω το θέμα που αναφέρεται στον τίτλο στο Φεστιβάλ Φοίτησης. Παρόλα αυτά, η παρουσίαση δεν έγινε, λόγω πίεσης χρόνου κατά τη διάρκεια της εκδήλωσης. Παρόλα αυτά, οφείλω να ευχαριστήσω τα παιδιά που ήρθαν και με βρήκαν μετά το πέρας της εκδήλωσης, όπου και καθίσαμε παρέα και είδαμε την παρουσίαση. Για την ιστορία, παρουσιάστηκαν θέματα σχετικά με την ιστορία του Web, το concept “Software Plus Services”, διάφορα εργαλεία της Microsoft για Web Development, καθώς και κάποια demos για ASP.NET, AJAX και Silverlight. Εκτός από αυτά τα demos, τελικά έδειξα και μερικά άλλα (που δεν τα είχα υπολογίσει), καθώς παρακινήθηκα από κάποιες ερωτήσεις των παιδιών. Έτσι, έγινε επίδειξη του Blend, Windows Forms εφαρμογής αλλά και WPF εφαρμογής. Πάντως, όπως υποσχέθηκα, την ερχόμενη Παρασκευή θα δείτε πολύ περισσότερα πράγματα σχετικά με Web Development!!

Θα κλείσω αναφέροντας

  • μην τυχόν και δεν δείτε αυτό και αυτό! Απλά εξαιρετικά, ειδικά το δεύτερο!
  • πολλές ευχαριστίες στον Φώτη Δραγανίδη και στον Πάνο Κοντόπουλο για τη βοήθεια και το υλικό που μου παραχωρήσανε προκειμένου να φτιάξω τις διαφάνειες για την παρουσίαση
  • Visual Web Developer 2008 (για κατασκευή ιστοσελίδων)
  • Imagine Cup

Μπορείτε να κατεβάσετε την παρουσίαση από εδώ

Source code για το Silverlight banner του 4ου StudentGuru event

Για τις ανάγκες διαφήμισης του 4oυ Studentguru Event, κατασκεύασα ένα Silverlight banner, και κατόπιν ανέβασα το source code του εδώ (για να το κατεβάσετε πρέπει να είστε μέλη του StudentGuru). Από τις πρώτες μου Silverlight προσπάθειες, ύστερα από αρκετό debugging και αρκετή προσπάθεια, κατάφερα να το τελειώσω!! Το banner κατασκευάστηκε με το Expression Blend 2.0 September CTP, για Silverlight 1.0, και με λίγη χρήση NotepadStick out tongue

Το banner μπορείτε να το δείτε, είτε άμα πλοηγηθείτε στο StudentGuru, είτε κάνοντας ένα κλικ στον παρακάτω υπερσύνδεσμο

http://studentguru.gr/info/4thEvent/Default.html

Τιιιιιιιιιιιιι;;;;;;;;;;; Δεν ξέρετε για το 4o StudentGuru event;;; Γρήγορα εδώ

Windows Forms via C# : Πανεπιστήμιο Πειραιά, τμήμα Πληροφορικής – VIDEOS AVAILABLE

Την Πέμπτη, 15 Νοεμβρίου 2007, διεξήχθη επιτυχώς η παρουσίαση “Windows Forms via C#”, στο Τμήμα Πληροφορικής του Πανεπιστημίου Πειραιώς, στα πλαίσια του μαθήματος “Αλληλεπίδραση Ανθρώπου και Υπολογιστή“. Υπεύθυνοι για αυτή την παρουσίαση ήταν ο υποφαινόμενος και ο καλός συνάδελφος και φίλος Βασίλης Βρυνιώτης. Καταρχάς, οφείλουμε να ευχαριστήσουμε την καθηγήτρια Μαρία Βίρβου, για την ευκαιρία που μας έδωσε προκειμένου να πραγματοποιήσουμε αυτή την παρουσίαση στα πλαίσια του μαθήματός της, αλλά και τους 50 περίπου συναδέλφους που ήρθαν και μας παρακολουθήσανε.

Αφορμή για την συγκεκριμένη παρουσίαση στάθηκε μια εργασία του μαθήματος, που αφορούσε την κατασκευή μίας διεπαφής χρήστη (User Interface), για τον χειρισμό των διαφόρων λειτουργιών ενός ηλεκτρονικού σπιτιού, και, ύστερα από συννενόηση με την κ. Βίρβου, αποφασίσαμε να παρουσιάσουμε την C# αλλά και τα Windows Forms, ως μια πολύ καλή επιλογή για την περάτωση της εργασίας.

Η παρουσίαση ξεκίνησε με εμένα να αναφέρω μερικά βασικά πράγματα για τη C#, τα Windows Forms, αλλά και του Visual Studio, παρέα με αρκετό γράψιμο κώδικα. Στη συνέχεια, ο Βασίλης, ανέπτυξε μία λειτουργική Windows Form, σαν ένα εισαγωγικό βήμα για την εργασία.

Μπορείτε να κατεβάσετε τα samples και τα slides από εδώ.
Σήμερα, επίσης, κάναμε και την πρώτη προσπάθεια καταγραφής της παρουσίασης με τη χρήση του Camtasia Studio!

Η όλη παρουσίαση έσπασε σε 8 κομμάτια, τα οποία ανέβηκαν στην υπηρεσία Silverlight Streaming. Για να τα δείτε, χρειάζεται να εγκαταστήσετε το αντίστοιχο silverlight plugin για τον browser σας, το οποίο μπορείτε να το προμηθευτείτε από εδώ
Μπορείτε να δείτε τα videos εδώ

Είναι η πρώτη μας προσπάθεια για live capturing παρουσίασης, οπότε ελπίζουμε να συγχωρήσετε τα όποια λαθάκια τόσο κατά τη διάρκεια της παρουσίασης, όσο και κατά την επεξεργασία του video!

Και πάλι, ευχαριστούμε και πάλι όλους όσους συνέβαλλαν στην επιτυχία της σημερινής παρουσίασης!

Teched 2007, Barcelona – Days 4,5

Δείτε εδώ τα υπόλοιπα 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 :)

Teched 2007, Barcelona – Day 3

Δείτε εδώ τα υπόλοιπα blog posts για την Teched 2007

Το πρώτο event της ημέρας είχε τον Pablo Castro να μας μιλά για Entity Framework και Application Patterns. Αρχικά έγινε μια μικρή περιγραφή του Enity Framework. Πρόκειται για μία πλατφόρμα περιγραφής δεδομένων με ένα conceptual μοντέλο. Παρότι δεν κατάφερα να δω μια άλλη παρουσίαση σχετικά με το Enity Framework, από τα λίγα εισαγωγικά που μας είπε μπορώ να πω ότι εντυπωσιάστηκα. Μοντελοποίηση βάσης δεδομένων με ένα πολύ εύκολο εργαλείο, αποθήκευση της σε ένα edm σχήμα και μετά εύκολη χρήση της για CRUD μεθόδους στη βάση δεδομένων, data synhcronization, κατασκευή αντικειμένων με properties mapped στα ανάλογα πεδία της βάσης, lazy loading κ.α.

Στη συνέχεια, μετά από ένα slide με μια μικρή περιγραφή των 2-tier εφαρμογών, είδαμε ένα πολύ ωραίο demo μιας Visual desktop asic εφαρμογής που να χρησιμοποιεί το Entity Model ενός καταστήματος ποδηλάτων. Μου άρεσε πάρα πολύ η ευκολία χρήσης του Entity Framework. Μίλησε για διάφορα patterns ώστε να χρησιμοποιούμε ποιο αποδοτικά το Entity Framework, με ένα από αυτά να είναι η χρήση του ίδιου context ώστε τα αντικείμενα μας να γίνονται marked για gargabe collection όταν πρέπει αλλά και για concurrency issues. Ένα σημαντικό σημείο της ομιλίας του ήτανε το MergeOption.NoTracking enumeration, με το οποίο απενεργοποιούμε το tracking για αλλαγές στα αντικείμενά μας (όταν π.χ. φέρνουμε read only δεδομένα).

Το επόμενο θέμα για το οποίο μας μίλησε ήταν οι web εφαρμογές. Κατέληξε στο ότι πρέπει να δημιουργούμε ένα νέο context σε κάθε page hit, και να σώζουμε δεδομένα στο ViewState μόνο όταν είναι απολύτως ααραίτητο. Το demo περιλάμβανε μία Web εφαρμογή για ένα κατάστημα ποδηλάτων. Σε αυτή την εφαρμογή, ο Pablo έγραψε αρκετό κώδικα δείχνοντας μας πως να χρησιμοποιήσουμε αποδοτικά το Entity Framework σε web εφαρμογές. Χρησιμοποίησε, επίσης, αρκετό LINQ κώδικα για να κάνει CRUD operations στη βάση (με τη βοήθεια του Entity Framework). Τόνισε επίσης ότι το άνοιγμα connection στη βάση δεν είναι performance instensive διαδικασία, μιας και προέρχονται από το connection pool. Εντυπωσιακό ήταν και το τέλος του demo, με τον Pablo από τη μία να περνάει δεδομένα από την web σελίδα και την windows φόρμα να ανανεώνεται αυτόματα, αλλά και χρήση compiled lambda expression για αποδοτικότερο κώδικα.

Έπειτα, μας μίλησε για multi tier εφαρμογές, για τα use cases αλλά και τα χαρακτηριστικά τους. Ανέφετε ότι το Entity Framework έχει κατασκευαστεί ώστε να μπορεί να συνεργάζεται καλά με το Windows Communication Foundation. Στο demo, κατασκεύασε ένα WCF service, και μέσα σε αυτό μια συνάρτηση που να επιστρέφει ένα αντικείμενο από τη βάση. Στη συνέχεια, έφτιαξε άλλο ένα project και του έβαλε reference στο service που έφτιαξε λίγο πιο πριν. Έτσι, κατάφερε να “τραβήξει” ένα αντικείμενο από το WCF Service. Ύστερα, επέκτεινε το service ώστε να επιστρέψει ένα collection από αντικείμενα. Σε αυτό το demo ανέφερε ότι πρέπει να είμαστε προσεκτικοί με το lazy loading, και το πως καλούμε δεδομένα από τη βάση, ώστε να είμαστε όσο πιο αποδοτικοί γίνεται. Τέλος, έπαιξε με το project Astoria, κατασκευάζοντας ένα μικρό demo, ώστε τα δεδομένα να είναι διαθέσιμα μέσω HTTP.

Το επόμενο event ήταν αρχιτεκτονικής φύσεως και είχε τίτλο “Build your own software factory”. Εισηγητές ήταν οι Don Smith, Dennis Doomen και Olaf Conijn. Μετά από τις απαραίτητες συστάσεις των ομιλητών, μας παρουσιάστηκε ο ορισμός ενός software factory. Σε τελείως abstract επίπεδο, πρόκειται για “πρόγραμμα που κατασκευάζει ένα άλλο πρόγραμμα”. Μας παρουσιάστηκαν εργαλεία για το Visual Studio τα οποία χρησιμοποιούν models, designers, editors και wizards προκειμένου να επιτύχουν το συγκεκριμένο σκοπό, δηλαδή να κάνουν output τον κορμό ενός προγράμματος, με τα εκτελέσιμά του αλλά και τις reusable βιβλιοθήκες του.

Στη συνέχεια, έγινε επίδειξη ενός demo, το οποίο αποτελούνταν από ένα αρκετά μεγάλο WCF service solution, με διαγράμματα από τις κλάσεις από τις οποίες αποτελούνταν. Σε αυτά τα διαγράμματα, υπάρχει δυνατότητα validate, το οποίο ποικίλλει ανάλογα με τον τύπο του project. Ο Olaf, αφού μας έδειξε αυτά, έκανε generate code από αυτό το factory.

Ο Don και ο Dennis πήρανε τη σκυτάλη, με παρουσίαση του γιατί και πότε πρέπει να χρησιμοποιούμε software factories. το γενικό συμπέρασμα που προέκυψε ήταν ότι είναι ιδανικό να χρησιμοποιούμε software factories όταν πρόκειται να κατασκευάσουμε πολλές διαφορετικές μεν εφαρμογές, αλλά ίδιου τύπου δε. Αποδεδειγμένα, το software factory είναι αρκετά δύσκολο και χρονοβόρο να κατασκευαστεί, αλλά όταν πρόκειται για πολλές εφαρμογές, είναι αρκετά πιο βολικό και μας γλιτώνει αρκετό χρόνο (καθώς και βαρετές επαναλήψεις/ επαναχρησιμοποιήσεις κώδικα).

Εν συνεχεία, ο Olaf μας έδειξε ένα ακόμα demo, αυτή τη φορά δημιουργίας ενός guidance package, το οποίο μας επιτρέπει να δημιουργήσουμε software factories. Κάπως περίπλοκη διαδικασία, περιελάμβανε εξαγωγή ενός project template από το Visual Studio, register στο guidance package, πείραγμα ενός configuration file αλλά και μερικών άλλων files, αλλά άξιζε τον κόπο. Εξαγωγή κώδικα με μερικά clicks.

Τελικά, μας παρουσιάστηκε το DSL toolkit, το οποίο πρακτικά χρησιμοποιεί DSL (Domain Specific Language) για να δημιουργήσει DSL!!!! Το generated project, όταν γινόταν build ξεκίναγε ένα νέο instance του Visual Studio, οι ρυθμίσεις του οποίου αποθηκεύονται σε διαφορετικό hive στη registry, ώστε σε περίπτωση σφάλματος στο DSL να είναι δυνατή η εκκίνηση του Visual Studio για διόρθωση του DSL. Το demo ολοκληρώθηκε με ένα integration των δύο project (guidance package και DSL). Η παρουσίαση τελείωσε με το συμπέρασμα ότι το software factory creation είναι ακόμα δύσκολο στο Visual Studio 2005, αλλά θα γίνει πολύ καλύτερη στην καινούρια έκδοση του Visual Studio Team System (codename “Rosario”), το οποίο θα έχει designer integration, recipe framework αλλά και top-down design υποστήριξη.

Το τελευταίο event της ημέρας είχε τον Ian Griffiths να μιλάει για multithreading σε Windows Presentation Foundation εφαρμογές. Ξεκίνησε με μια ενημέρωση για τον Dispatcher. Κάθε Window (και όλο το περιεχόμενό του) έχει ένα Dispatcher object, και κάθε Dispatcher object ανήκει σε ένα Thread. Ο χρυσός κανόνας, όπως υπήρχε σε ένα slide, είναι “Don’t touch the UI from the wrong thread”. Ο δεύτερος χρυσός κανόνας είναι “Don’t block the UI thread”. Οπότε, αναρωτήθηκε ο Ian, πώς γίνεται και να πειράζεις το UI αλλά και να μην το πειράζεις;

Η λύση έρχεται με τη χρήση του Dispatcher object. Εδώ ξεκίνησε και το πρώτο demo. Ο Ian μας επίδειξε μια καθυστέρηση σε UI με τη δημιουργία ενός νέου Window το οποίο καλούσε μία κλάση, η οποία έκανε Thread.Sleep() για 5 δευτερόλεπτα. Στη συνέχεια, έβαλε την αργή function της κλάσης στο ThreadPool. Το UI τότε δεν πάγωνε, απλά πήγαινε να πειράξει ένα TextBox από το δικό του thread, με συνέπεια ένα InvalidOperationException. Αυτό λύθηκε με τη χρήση της μεθόδου Dispatcher.BeginInvoke, που παίρνει σαν ορίσματα ένα DispatcherPriority enumeration, μία delegate class που δείχνει στη συνάρτηση που θα γίνει Invoke από το UI Thread, και τα τυχόν ορίσματά της.

Το DispatcherPriority enumeration έχει 10 τιμές, όπως DataBind, Render, Background, Loaded κ.λ.π., ανάλογα σε ποιο σημείο της λειτουργίας του Control θέλουμε να γίνει το Invoke. Η Dispatcher.BeginInvoke μέθοδος επιστρέφει ένα DispatcherOperation object, το οποίο έχει Operations (Wait, Abort), Properties (Priority, Status, Result) και Events (Completed, Aborted). Ο Ian μας πρότεινε να μην χρησιμοποιήσουμε το Completed event καθώς υπάρχει περίπτωση για race condition (να τελειώσει η συνάρτηση που θα κληθεί από την BeginInvoke πριν γίνει register ο event handler). Επίσης, μας πρότεινε να μην χρησιμοποιήσουμε τη Wait operation, καθώς μπορεί να γίνεται και Wait από το UI, οπότε θα καταλήξουμε σε deadlock. Ανέφερε ακόμη, πως δεν υπάρχει Dispatcher.EndInvoke μέθοδος, την ύπαρξη της οποίας έχουμε συνηθίσει από το .NET async pattern.

Συνέχισε με μια βασικά αναφορά στις δυνατότητες για asynchronous δυνατότητες. Στο .ΝΕΤ 1.1, υπάρχει το pattern BeginXXX/EndXXX και το IAsyncResult. Το βασικό πλεονέκτημα είναι ότι είναι αρκετά αξιόλογο για τις περισσότερες εργασίες. Ο Ian ανέφερε ότι αυτός είναι περίπου και ο τρόπος που δουλεύει ο πυρήνας των Windows, πράγμα το οποίο γνωρίζει από πρώτο χέρι μιας και παλιά έγραφε device drivers. Προχώρησε με ένα demo, με μία WPF εφαρμογή να καλεί ένα WCF service. Μας έδειξε στην client εφαρμογή μία επιλογή του Visual Studio, προκειμένου η proxy class που θα δημιουργηθεί να έχει async μεθόδους (αυτό γίνεται αυτόματα σε Web Service proxies). Με τη χρήση της BeginXXX μεθόδου και τη χρήση του Dispatcher, το blocking UI έγινε non-blocking.

Το .NET 2 async pattern ήταν το επόμενο σημείο της παρουσίασής του. μας περιέγραψε τις μεθόδους XXXAsync και CancelAsync/XXXAsyncCancel αλλά και τα events XXXCompleted και XXXProgressChanged. Η κύρια διαφορά με το προηγούμενο είναι ότι τα δύο events γίνονται raise στο αρχικό thread, οπότε δεν χρειάζεται άλλα “κόλπα” για πείραγμα του UI. Τα υπέρ είναι ότι υποστηρίζει ακύρωση, ότι τα events σκάνε στο ίδιο thread, και τα κατά είναι το ότι δεν υποστηρίζεται στο Windows Communication Foundation και δεν υπάρχει υποστήριξη για το Waithandle. Στη συνέχεια είδαμε ένα demo σχετικό με αυτά, με ένα WebClient object να κάνει download ασύγχρονα μια εικόνα από ένα web site και να την εμφανίζει σε ένα WPF Window. Πολύ απλά διαδικασία, πραγματικά.

Μετά από αυτό, ο Ian άνοιξε πάλι το demo με το Web Service, και έφτιαξε έναν wrapper στον client, έτσι ώστε να υποστηρίζεται το .NET 2 async pattern. Το δύσκολο σημείο εδώ ήταν να “πιάσει” το thread του caller, και αυτό το έκανε με τη χρήση ενός SynchronizationContext αντικειμένου. Έπειτα, έβαλε το SynchronizationContext.Current σε αυτό το αντικείμενο, το πέρασε στον callback της BeginInvoke, όπου και (αφού το πήρε από το AsyncState του IAsyncResult) κάλεσε μια άλλη συνάρτηση όπου και έκανε raise το event (προκειμένου να υλοποιήσει το .NET 2 async pattern). Αρχικά φάνηκε περίεργο, αλλά τελικά είναι αρκετά εύκολο μόλις καταλάβεις πως δουλεύει.

Έπειτα, μας μίλησε για την άλλη μας επιλογή, το ThreadPool. Μετά από αυτό, προχώρησε στην τελευταία μας επιλογή, να δημιουργήσουμε δικά μας threads. Έτσι, υπάρχει η δυνατότητα για μείωση του concurrency. Μας ανέφερε, βέβαια, πως ο στόχος δεν είναι αυτός, αλλά η απλότητα και η απόκριση του User Interface. Το κακό αυτής της τελευταίας επιλογής είναι πως “είμαστε μόνοι μας”. Δεν μας έδειξε demo καθώς, όπως είπε η εκάστοτε υλοποίηση εξαρτάται από την εκάστοτε εφαρμογή.

Προχώρησε σε επεξηγήσεις για το data binding. Ανέφερε πως το Windows Presentation Foundation μας προσφέρει κάποια βοήθεια, καθώς τα property change events μπορούν να γίνουν raise σε οποιοδήποτε thread, και πως υπάρχει δυνατότητα για προσδιορισμού asynchronous operation σε ένα WPF binding.  Το demo περιείχε μία κλάση που έκανε implement το INotifyPropertyChanged, καθώς αυτό είναι το interface που περιμένει το WPF, προκειμένου να υποστηρίξει data binding σε μια συγκεκριμένη κλάση. Τελευταία προσθήκη στην κλάση ήτανε μία “αργή” συνάρτηση. Κατασκεύασε ένα WPF Window, και μέσα σε αυτό ένα TextBlock που έγινε bound σε ένα δεδομένο της κλάσης που έφτιαξε πριν. Με μία αλλαγή στο δεδομένο και μπόλικα Debug.WriteLine, μας έδειξε τη διαδρομή από το UI thread στο worker thread. Εδώ μας έδειξε και την “εξυπνάδα” του WPF, το οποίο στέλνει μόνο του ένα μήνυμα στο UI thread, ότι άλλαξε το property προκειμένου να ξαναγίνει το rebinding, παρόλο που η αλλαγή έγινε σε άλλο thread.

Τέλος, μας ανέφερε πως το databinding για collection objects (όπως στο ObservableCollection<T>) δεν είναι και τόσο καλό, όταν βρίσκεται σε multithreading περιβάλλον. Είδαμε ένα demo όπου ένα databound ObservableCollection σήκωσε Exception όταν του έγινε μια αλλαγή από άλλο Thread. Αυτή η δυνατότητα υπάρχει μόνο αν η αλλαγή γίνει στο dispatcher thread. Την λύση σε αυτό το πρόβλημα την έδωσε το τελευταίο demo το οποίο μιλούσε με το MSDN web service, για να εμφανίσει τα θέματά του σε ένα treeview. Εκεί, χρησιμοποίησε πάλι το SynchronizationContext αντικείμενο, για να μπορεί να ποστάρει μηνύματα στο UI thread, για την ανανέωση της λίστας, όπου και με την έλευση των μηνυματων γινόταν το update στα bound ObservableCollection αντικείμενα.

Είχα κάνει στο παρελθόν ένα class με τον Ian, και όσο εντυπωσιασμένος είχα μείνει τότε, άλλο τόσο έμεινα τώρα. Από τους καλύτερους γνώστες του Windows Presentation Foundation παγκοσμίως, με πάρα πολύ καλή μεταδοτικότητα.

Αυτά για σήμερα!!!

Teched 2007, Barcelona – Day 2

Δείτε εδώ τα υπόλοιπα blog posts για την Teched 2007

Το πρώτο session σήμερα είχε τον απίστευτο L. Bolognese να μας μιλάει για LINQ to SQL. Ξεκίνησε την ομιλία του με επεξήγηση της αρχιτεκτονικής του LINQ to SQL. Στη συνέχεια, μας έδειξε βήμα βήμα πως μπορούμε να γράψουμε κώδικα προκειμένου να “γεμίσουμε” κάποια objects με δεδομένα από μια SQL βάση δεδομένων. Προχώρησε σε συγγραφή αρκετών LINQ queries, για πολλά από τα οποία μας εξήγησε πως δουλεύουν.

Είδαμε (για άλλη μια φορά) τον O/R designer του Visual Studio 2008, ενώ ο Bolognese συνέχισε να μας καταπλήσσει με το απίστευτο χιούμορ του. Σαν απόδειξη της ισχύος των LINQ queries, μας ανέφερε ότι η ομάδα του ζήτησε από την ομάδα του SQL Server να δώσει sql queries, τα οποία δεν θα μπορούσαν να γίνουν με LINQ. Όπως μας είπε, τέτοια queries δεν βρέθηκαν! Μας έκανε μια in depth εξήγηση του πως δουλεύει το LINQ και μια επίδειξη της ταχύτητάς του.

Σε επόμενο demo, είδαμε πως να χρησιμοποιούμε το LINQ για CRUD μεθόδους (Create, Retrieve, Update, Delete) και ότι by default υποστηρίζει optimistic concurrency. Έπειτα, μας παρουσίασε διάφορες πιο “advanced” δυνατότητες των LINQ queries, όπως τα joins, δείχνοντας παράλληλα και τον generated sql κώδικα. Τα τελευταία πράγματα που μας έδειξε ήταν η χρήση stored procedures και transactions σε LINQ queries. Εν γένει, μου έκαναν απίστευτη εντύπωση και οι δύο παρουσιάσεις του. Εξαιρετικά καλογραμμένες, κατανοητά demos. Στα συν το απίστευτο χιούμορ που βγάζουν οι ατάκες του αλλά και η αρκετά αστεία προφορά του.

Στη συνέχεια, παρακολουθήσαμε τον Jesse Liberty (που πλέον δουλεύει στην Microsoft) στην παρουσίαση “Building Great Web Experiences with Silverlight 1.x”. Ξεκίνησε με την κατασκευή ενός Silverlight 1.1 Alpha demo με τη χρήση του Visual Studio 2008. Περιέγραψε τον declarative τρόπο δημιουργίας αντικειμένων μέσω XAML. Περιέγραψε επίσης και τον πιο “προγραμματιστικό” τρόπο, μέσω του .xaml.cs αρχείου, με χρήση C#. Με βάση αυτά, μας έδειξε και ένα όμορφο demo με χρήση LinearGradientStops.

Το δεύτερο sample που μας έδειξε ήταν η δημιουργία μιας Silverlight Class Library. Αρκετά απλή και “στρωμένη” διαδικασία, ένας StreamReader διαβάζει το .xaml αρχείο (το οποίο είναι μέσα στο compiled .dll) μέσω reflection, κλήση της InitializeObjectFromXaml και αναφορά του με ένα FrameworkElement στοιχείο. Μας αποκάλυψε και πως το συμβόλαιο του με τη Microsoft του επιβάλλει σε κάθε demo να χρησιμοποιεί τον C# ? operator!!! Ο Jesse έγραψε αρκετό C# κώδικα, και επαναλάμβανε συνέχεια ότι δεν γράφει κάτι “εξωγήινο”, απλά χρησιμοποιεί μια γλώσσα που ξέρουμε όλοι. Φυσικά, και με την βοήθεια του Intellisense που υπάρχει στο Visual Studio.

Το τρίτο και τελευταίο sample του περιλάμβανε την κατασκευή ενός “game of life” προσομοίωσης. Μέσα από αυτό το sample, μας έδειξε πως γίνεται το HTML – Silverlight interaction με C# κώδικα (χρήση του System.Windows.Browser.HtmlDocument αντικειμένου), πώς μπορούμε να βάλουμε έναν C# event handler που να ανταποκρίνεται στο Click ενός HTML button αλλά και πως μπορούμε να “παίξουμε” με τα attached properties των Silverlight controls μέσα από τον managed κώδικα.

Το επόμενο session της ημέρας είχε σαν όνομα “Microsoft Visual C# under the covers. An in-depth look at C# 3.0” και presenter τον Luke Hoban. Ξεκίνησε την παρουσίασή του με μια αναφορά στα νέα features της C# 3.0

  • object initializers
  • collection initializers (“παίζει” στα Collections που κάνουν implement το IEnumerable)
  • automatic properties
  • type inference (the var keyword)
  • query expressions
  • anonymous types

δείχνοντας παράλληλα demos για αυτά, αλλά και αναφέροντας τι γίνεται κατά το compile προκειμένου να δουλέψουν αυτές οι καινοτόμες λειτουργίες (μιας και ο κορμός του .NET Framework, το CLR, δεν αλλάζει στο .NET 3. Απλά προστίθενται νέες κλάσεις και βιβλιοθήκες στο Framework). Τόνισε, παράλληλα, πως η νέα έκδοση της C# κατασκευάστηκε με έμφαση στα

  1. βελτιώσεις στη C# 2.0
  2. LINQ
  3. 100% backwards compatibility

Τα lambda expressions ήταν το θέμα του επόμενου sample. Αρχικά μίλησε για τις διαφορές με τα anonymous methods της C# 2.0 και γιατί τα lambda expressions είναι καλύτερα (αν και ο τρόπος λειτουργίας τους είναι πανομοιότυπος). Στη συνέχεια, έγραψε αρκετό κώδικα με τον οποίο δημιούργησε το Where αλλά και ένα Func<T>, για να μας δείξει πως δουλεύουν εσωτερικά τα lambda expressions, χρησιμοποιώντας χαρακτηριστικά της C# 2.0, όπως το generic interface implementation αλλά και το yield statement. Στο τέλος αυτού του sample, υλοποίησε και τη μέθοδο Select, με τη χρήση generic delegates.

Κατόπιν, έκανε refactor την Select και την Where, με χρήση των predefined Func delegates του .NET 3.5. Αφού λοιπόν τις έφτιαξε, ανέφερε το πρόβλημα του να μπούνε στο IEnumerable<T>. Μία αλλαγή που αν γινόταν, ίσως να έσπαγε υπάρχον κώδικα. Και έτσι γεννήθηκαν τα extension methods. Με μια σύντομη περιγραφή, μας εξήγησε ότι δεν σπάνε το encapsulation καθώς δεν μπαίνουνε private ή protected μέλη. Εξάλλου, κατά την ανάπτυξη του LINQ, usability tests απέδειξαν πως η συναρτησιοειδής κλήση μεθόδων (με χρήση .Where και .Select) δεν βολεύει και τόσο. Και έτσι γεννήθηκε η LINQ sql – like σύνταξη.

Τέλος, μας περιέγραψε τα Expression Trees και πως αυτά αποθηκεύουν τη lambda έκφραση και τη μετατρέπουν σε ένα object tree με σαφή δυνατότητα parsing. Σε demo, έφτιαξε τη συνάρτηση διαδοχής ( f(n) = n+1), μας έδειξε πόσο απλά μπορούμε να δούμε το body και τις παραμέτρους που έχει το lambda, αλλά και πως με τη χρήση της συνάρτησης .Compile() μπορεί να μας γυρίσει τον αντίστοιχο delegate.

Πάρα πολύ καλή η παρουσίαση, ομολογώ ότι περίμενα να δω κάτι για την υλοποίηση του IQueryable<T>, αλλά δυστυχώς ο Hoban δεν εμβάθυνε τόσο πολύ.

Το τελευταίο session που παρακολούθησα σήμερα είχε τίτλο “Implementing Workflow Enabled Services and Durable Services using .NET Framework 3.5”. Εισηγητές οι Justin Smith και Matt Winkler.

Ο στόχος της παρουσίασης ήταν να μας δείξει πως το Workflow Foundation και το Windows Communication Foundation μπορούν να ζήσουν αρμονικά. Έγινε μια μικρή επανάληψη στο από τι αποτελούνται τα δύο προαναφερθέντα frameworks. Κατόπιν, ο Justin μας περιέγραψε τα message exchange patterns, τα data formats, τα transport methods και την αρχιτεκτονική του WCF, καταλήγοντας στο ότι τα σημαντικά σημεία είναι

  • ABC (Address, Binding, Contract)
  • Service Contract (Interface)
  • Service Type (Class implementing Interface)

Στη συνέχεια, έγινε μια περιγραφή της αρχιτεκτονικής του runtime του Windows Communication Foundation, με άμεσο συμπέρασμα ότι πριν την έλευση του .NET 3.5, ήταν δύσκολη η συνεργασία του Workflow Foundation με το Windows Communication Foundation. Ακολούθησε μια περιγραφή της αρχιτεκτονικής του Workflow Foundation αλλά και περιγραφή των additions που φέρνει το .NET 3.5, όπως τα νέα activities Send και Receive.

Μετά, μας μίλησε για Workflow Services Approaches, και πιο συγκεκριμένα, για το πως μπορούμε να υλοποιήσουμε μία υπηρεσία σαν ένα Workflow, αλλά και πως μπορούμε να κάνουμε host ένα workflow από ένα service.

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

  • WCF Service Library hosting a Workflow ready client
  • DurableService και DurableOperation attributes, SQL Persistence (το πιο εντυπωσιακό απ’όλα)
  • Περιγραφή του context exchange με custom database repository
  • Duplex communication (multithreaded operation με multiple clients)

Πολύ ωραία τα σημερινά sessions, ανυπομονώ για τα αυριανά!!!

ΥΓ. Το σημερινό φαγητό δεν μου άρεσε καθόλου. Και ναι, απεχθάνομαι τα θαλασσινά!!!