Get your Visual Studio toolbox in fit


So, it has been a while since I joined the club of those who faced the intimidating

Loading toolbox content from package Microsoft.VisualStudio.IDE.Toolbox.ControlInstaller.ToolboxInstallerPackage
‘{2C98B35-07DA-45F1-96A3-BE55D91C8D7A}’

problem, every time I opened a new instance of Visual Studio and used the XAML designer.

After some search, I found a decent solution. Mind you, do not follow the first workaround described on Microsoft Connect because you will just reset the Toolbox and later the problem will reappear. The solution that worked for me is a combination of two resources I found. The first one, describes the problem. Essentially,  the Toolbox has some invalid entries that cause the delays and there is a specific procedure to find out which these entries are: You have to launch VS by the command line using the parameter /log and then parse the log file to find the time consuming entries. Each of these entries has a GUID that corresponds to registry keys, as well as a description. Judging by the description, you can delete these registry keys and/or reinstall missing components. When you have finish with this, you can force the Toolbox to be regenerated by following the instructions here: http://michaelcrump.net/fixing-a-broken-toolbox-in-visual-studio-2010-sp1

Now, as I said, an important part of all the above is to parse the log and find the time consuming entries. This is not a very easy task, as the XML formatted log file has multiple “entry” elements like this:

<entry>
<record>61</record>
<time>2012/03/19 11:12:50.224</time>
<type>Information</type>
<source>VisualStudio</source>
<description>End package load [Visual Studio Source Control Integration Package]</description>
<guid>{53544C4D-E3F8-4AA0-8195-8A8D16019423}</guid>
</entry>

What you have to do, is to compare the value of <time> element to the value of <time> element of the next <entry> element. I had 1298 entries so searching by scrolling was out of the question, since we can use LINQ to do it for us:

First, I declared a class to represent each <entry>

Class Entry     
    Public Property Record() As Integer
    Public Property Time() As DateTime
    Public Property Source() As String
    Public Property Description() As String
    Public Property Duration() As TimeSpan
End Class
class Entry     
{         
    public int Record { get; set; }
    public DateTime Time { get; set; }
    public string Source { get; set; }
    public string Description { get; set; }
    public TimeSpan Duration { get; set; }
}

Then, I parsed the log file using the following code:

        Dim logFile = "log file path + name here"
        Dim doc = XDocument.Load(logFile)

        Dim entries = doc...<entry>.Select(Function(e) New Entry() With {
                                                        .Record = e.Element("record").Value,
                                                        .Time = CDate(e.Element("time").Value),
                                                        .Source = e.Element("source"),
                                                        .Description = e.Element("description")})

        entries = entries.Zip(entries.Skip(1), Function(e1, e2)
                                                   e1.Duration = e2.Time - e1.Time
                                                   Return e1
                                               End Function).
                          OrderByDescending(Function(e) e.Duration).
                          Take(20)

C# guys might as well use this code:

            var logFile = @"log file path + name here";
            var doc = XDocument.Load(logFile);

            var entries = doc.Descendants("entry").Select(e =>
                new Entry()
                {
                    Record = (int)e.Element("record"),
                    Time = (DateTime)e.Element("time"),
                    Source = e.Element("source").Value,
                    Description = e.Element("description").Value
                });
            entries = entries.Zip(entries.Skip(1), (e1, e2) =>
                {
                    e1.Duration = e2.Time - e1.Time;
                    return e1;
                }).OrderByDescending(e => e.Duration).Take(20);

Now, you can display the entries in question. Alternatively, you can filter the entries collection for descriptions that contain the text “failed”. These entries might or might not have long duration but are useless never the less and represent packages that does not exist for various reasons such as an incomplete uninstall. That was exactly my case, as I had previously uninstalled the Oracle Developer Tools. Obviously (and not surprisingly) Oracle did sloppy job with the uninstaller.


Windows 8 Metro development Train-the-Trainer


Την εβδομάδα που μας πέρασε, είχα την χαρά να παρακολουθήσω ένα Train-the-Trainer course για Windows 8 Metro development στο Amsterdam. Μέσα σε τρεις μέρες είδαμε την ανάπτυξη μιας εφαρμογής end to end καθώς και το πώς σχεδιάζουμε το UX στις Metro εφαρμογές. Όλα ήταν πολύ ενδιαφέροντα ακόμα και για κάποιον που έχει γράψει εφαρμογές σε Windows Phone αφού ναι μεν υπάρχουν αρκετά κοινά στοιχεία, ωστόσο είναι διαφορετικό τόσο το προγραμματιστικό μοντέλο (πλέον παίζουμε με WinRT) όσο και το screen real estate. Είδικά το δεύτερο, οδηγεί σε μια νέα και διαφορετική chromeless φιλοσοφία που δεν έχουμε συνηθήσει εμείς οι .ΝΕΤ developers. Σε λίγο καιρό θα μπορέσουμε να τα πούμε κι από κοντά ωστόσο μέχρι τότε, αυτό που θα πρέπει να κρατήσετε – αν δεν το έχετε κάνει ήδη βλέποντας τα videos του //BUILD – είναι ότι είμαστε στο ξεκίνημα μιας νέας εποχής για τα consumer applications σε μια αγορά που τώρα θα δημιουργηθεί. Όπως θα είδατε όσοι εγκαταστήσατε τα Windows 8, το Windows Store αφήνει πολλά περιθώρια για να βγει κανείς από νωρίς πρώτος και να καλύψει κενά σε εφαρμογές που λείπουν.

Περισσότερα από κοντά λίαν συντόμως. Μέχρι τότε, προετοιμαστείτε γιατί το παιχνίδι γυρίζει και γίνεται πολύ ενδιαφέρον!


VB9 XML Literals


Ένα από τα νέα χαρακτηριστικά της VB.NET είναι η υποστήριξη XML Literals. Πρόκειται για τη δυνατότητα της ενσωματώσης XML μέσα στον κώδικα. Για παράδειγμα, μπορεί να πει κάποιος

Dim countriesWithCapital As XElement = _
    <Countries>
        <Country Name=’SomeCountry’ Density=’123456′> 
            <Capital>
                <Name>City Name Here</Name>
                <Longitude>123.45</Longitude>
                <Latitude>123.45</Latitude>
            </Capital>
        </Country>
    </Countries>

Αυτό δεν είναι και τόσο εντυπωσιακό βέβαια. Λίγο πιο εντυπωσιακό είναι ότι μπορεί κανείς να εισάγει expressions a la ASP χρησιμοποιώντας το <%= %> συντακτικό, πχ

Dim countriesWithCapital As XElement = _
    <Countries>
        <Country Name='<%=CountryName%> Density=<%=Density%>> 
            <Capital>
                <Name><%=Name%></Name>
                <Longitude><%=Longitude%></Longitude>
                <Latitude><%=Latitude%></Latitude>
            </Capital>
        </Country>
    </Countries>

Αυτό από μόνο του και πάλι δεν είναι τρομερά εντυπωσιακό, ωστόσο αν συνδυαστεί με ένα LINQ query τότε, έχουμε κάτι πολύ εντυπωσιακό:

Dim countriesWithCapital As XElement = _
    <Countries>
    <%= From country In Countries, city In Capitals _
        Where country.Name = city.Country _
        Select <Country Name=<%= country.Name %>
                        Density=<%= country.Population / country.Area %>>
                  <Capital>
                   <Name><%= city.Name %></Name>
                   <Longitude><%= city.Longitude %></Longitude>
                   <Latitude><%= city.Latitude %></Latitude>
                  </Capital>
               </Country> _
    %>
    </Countries>

Έχουμε ξαναπεί ότι το παραπάνω κάνει τη VB.NET dynamic language, όπερ σημαίνει ότι πλέον μπορούμε να κάνουμε ένα σωρό πολύ εντυπωσιακά κόλπα όπως φαίνεται σε αυτό το απίθανο post της Beth Massi: http://blogs.msdn.com/bethmassi/archive/2007/10/23/avoid-underscores-in-your-multiline-strings.aspx

Θεωρώ ότι τα XML Literals δίνουν ένα πολύ δυνατό code deneration εργαλείο. ΟΚ, υπάρχουν λύσεις όπως το CodeSmith ωστόσο μόνο το γεγονός ότι σε όλα τα παραπάνω έχουμε Intellisence αφήνει τα υπόλοιπα πολύ πίσω. Επιπρόσθετα, εφόσον πρόκειται για κώδικα .NET τότε μπορούμε και μιλάμε για τη δυνατότητα inheritance μέσα στο code pattern, πράγμα πολύ σημαντικό για περίπλοκα code gen σενάρια.


Back to school


Πάει καιρός, από τον Μάιο, που έχω να γράψω στο blog μου. Αυτό είναι το πρώτο post ύστερα από τόσο καιρό και πλέον πολλά πράγματα έχουν αλλάξει! Κατ’ αρχήν, μια μεγάλη προσπάθεια που ξεκινήσαμε τον Ιανουάριο του 2010 έφτασε στο τέλος της και πλέον στην οικογενειά μας είμαστε τρεις καθώς αποκτήσαμε τον Οδυσσέα! Αν υπάρχει ένας λόγος που θα μας μείνει αξέχαστο το καλοκαίρι του 2011 είναι αυτός. 36 μέρες στην Αιθιοπία, μέσα από τις ευκολίες και τις δυσκολίες, την αγωνία και την ελπίδα, την απογοήτευση και την αισιοδοξία και με την βοήθεια αρκετών ανθρώπων καταφέραμε να ξεπεράσουμε όλα εμπόδια και να γίνουμε γονείς ενός υπέροχου αγοριού. Μετά την περίοδο προσαρμογής, μας βρίσκει ο Σεπτέμβρης να προσπαθούμε να μπούμε back on track, να οργανωθούμε και το κυριότερο, να καταφέρουμε να εντάξουμε τη δουλειά μας μέσα στο οικογενειακό πρόγραμμα.

Το φθινόπωρο ξεκίνησε δυναμικά και το επόμενο τρίμηνο υπόσχεται πολλές εξελίξεις. Στην BUILD παρουσιάστηκε preview από τα Windows 8 και η γενική ομολογία είναι ότι το νέο λειτουργικό βάζει για τα καλά τη Microsoft πίσω στο παιχνίδι. Γενικότερα, αυτό που διαπίστωσα είναι ότι πλέον η Microsoft από παρατηρητής των νέων τάσεων (tablets, mobility, κλπ) γίνεται παραγωγός καινοτομίας. Δεν υπαγορεύει αλλά απαντά στον ανταγωνισμό προτείνοντας κάτι διαφορετικό χωρίς να αντιγράφει και το σημαντικότερο, πλέον φαίνεται ότι υπάρχει ολοκληρωμένη στρατηγική.

image

Στα πλαίσια αυτής της στρατηγικής αυτό που ενδιαφέρει εμάς τους developers είναι ότι το νέο λειτουργικό δεν παροπλίζει τεχνολογίες. Το περίφημο “ό,τι τρέχει σε widows 7 θα τρέχει και στα Windows 8” έχει τεράστια σημασία. Καταρχήν, όποιος παράγει desktop apps μπορεί να συνεχίσει να το κάνει χωρίς καμιά αλλαγή. Από την άλλη, το WinRT ουσιαστικά δίνει τη δυνατότητα να εφαρμόσει ο καθένας τις γνώσεις που έχει ως developer στο νέο περιβάλλον! C, C++, VB.NET, C#, XAML, HTML/CSS, JavaScript, όλα παίζουν. Και μάλιστα πάνω στο μέταλλο. ΟΚ, στην περίπτωση που μιλάμε για Metro εφαρμογές, σίγουρα θα χρειαστεί να μάθει κάποιος τα νέα APIs και να προσαρμοστεί στην φιλοσοφία του touch και των NUIs, ωστόσο αυτό θα γίνει πατώντας σε υπάρχουσες γνώσεις. Επιπρόσθετα, ένα άλλο aspect της στρατηγικής που λέγαμε είναι ότι ειδικά οι .NET developers μπορούν με την γλώσσα επιλογής τους να κάνουν target οποιοδήποτε περιβάλλον: Cloud, servers, desktops, tablets, mobiles!

 

WebSiteLogoV2

Κατά τ’ άλλα, έχουμε και τις ετοιμασίες για το ITPro|DevConnections 2011. Το πρόγραμμα έχει βγει και είναι κατά 90% οριστικοποιημένο. Στα development tracks βλέπουμε:

  • 2 tracks για Windows Phone development
    • Windows Phone Development Overview, Γκανάτσιος Δ.
    • Windows Phone Location everywhere, Μαρκέλης Η.
  • 3 tracks για Azure
    • Windows Azure AppFabric – New features, Κεφαλίδης Π. 
    • The Producer(s) – the most outrageous $1.000.000 scheme in the annals of… Windows Azure, Πάντος Κ.
    • Windows Azure Storage Deep Dive, Κεφαλίδης Π.
  • 3 tracks για web
    • Web Speaks Html5 – Real Life Conversations!, Παναγόπουλος Ι.
    • Building applications with ASP.Net 4.0, JQuery and C# 4, Καντζέλης Ν.
    • ASP.NET MVC Patterns, Practices and Tools for building Scalable and High-End business applications, Κατσιώτης Ι.
  • 3 tracks για async programming
    • Καθημερινές χρήσεις του Task Parallel Library, Καναβός Π.
    • Async CTP: Say goodbye to callbacks!, Κελαϊδίτης Μ.
    • All about Reactive Extensions (Rx), Μπιμπούδης Α.
  • 2 tracks για game (και όχι μόνο) development
    • Ανάπτυξη παιχνιδιών για smartphones με το XNA Game Studio, Αναγνώστου Κ.
    • Programming Kinect, Πτερνέας Β.

O Νίκος Παλαδινός θα έχει μία παρουσίαση με τίτλο “Lambda the Ultimate” όπου θα μιλήσει για σκοτεινό και “μαγικό” κώδικα. Επίσης, ο Κώστας Πάντος θα μας παρουσιάσει //BUILD/ oriented περιεχόμενο σε μια δεύτερη παρουσίαση. Τέλος, εγώ και ο Παναγιώτης Κεφαλίδης θα παρουσιάσουμε από κοινού ένα θέμα που θα συνδυάζει τις δύο παρουσιάσεις μας.

300009_10150389266090329_555665328_10526625_931176769_n

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

Κουράγιο και καλή συνέχεια!


Και πρώτο (νέο) glue-post εδώ :)


Αυτό είναι το πρώτο νέο post που στο νέο blog home μου. Το υλικό που υπάρχει στο παλιό (http://www.dotnetzone.gr/cs/blogs/mkelaiditis/default.aspx) έχει μεταφερθεί κι εδώ, ωστόσο πλέον θα ενημερώνεται μόνο αυτό. Οπότε, ξέρετε: update your bookmarks.

Τώρα, λένε ότι δεν πρέπει να λες για τα σχέδιά σου και να υπόσχεσαι ότι θα κάνεις περισσότερα posts. Ο κανόνας είναι “just do it”. Η αλήθεια είναι ότι έχω πολλά σχέδια και πολλά πράγματα που έχουν δρομολογηθεί, ωστόσο υπάρχει ένα οικογενειακό θέμα, ευχάριστο, για καλό, που με εμποδίζει προς το παρόν να κάνω σχέδια, απορροφά τον χρόνο μου αυτόν τον καιρό και κατ’ ανάγκη έχω αφήσει πολύ πίσω το blog μου. Προσεχώς περισσότερα!

Προς το παρόν σας περιμένω να τα πούμε μέσω Live Meeting την Τετάρτη 11 Μαΐου και να δούμε τα νέα χαρακτηριστικά του Silverlight 5 στην beta έκδοση που παρουσιάστηκε στην MIX11.


DevDays11: From Code of Horror to Code of Honor


Την Τετάρτη 26 Ιανουαρίου είχα την τιμή και τη χαρά να παρουσιάσω ένα session στα πλαίσια του κύκλου DevDays11 των τεχνικών παρουσιάσεων που διοργανώνει η Microsoft Hellas. Η ημερίδα είχε γενικό τίτλο “DevDays11 – The Code of Honor – Σχεδιάζοντας και Προγραμματίζοντας Σωστά!” και δεν ήταν technology oriented όπως συνήθως αλλά είχε ως θέματα τις σύγχρονες αρχιτεκτονικές, τις επιλογές που καλείται να κάνει κάποιος που υλοποιεί μια εφαρμογή και το πως γράφουμε σωστά κώδικα ώστε να δημιουργήσουμε εφαρμογές εύκολες στη συντήρηση.

Το δικό μου session είχε δύο κύριους άξονες, ο πρώτος ήταν σχετικά με την ποιότητα του κώδικα που βρίσκουμε από διάφορες εξωτερικές πηγές και πώς αυτός επιδρά στην εφαρμογή μας. Ο δεύτερος ήταν το πώς οι τυπικές τακτικές – όπως για παράδειγμα ο κώδικας που μας δείχνει το MSDN – μας οδηγούν να φτιάξουμε εφαρμογές που χαρακτηρίζονται από δυσκολία στην συντήρηση. Μέσα από ένα παράδειγμα μιας Silverlight εφαρμογής, έδειξα πώς μπορούμε να χρησιμοποιήσουμε τα design patterns και πόσο βοηθάει το unit testing ώστε να περιορίσουμε τα προβλήματα στη συντήρηση του κώδικα.

Όσοι από εσάς χάσατε την παρουσίαση, μπορείτε να την δείτε εδώ:

http://www.techdays.gr/videos/3308.html

Το slide deck και τα samples βρίσκονται εδώ: http://bit.ly/eUki03

Η αρχή και το τέλος την παρουσίασης έγιναν capture εκ των υστέρων καθώς παρουσιάστηκαν τεχνικά προβλήματα (του τύπου between keyboard and chair).

A! Να μην ξεχάσω: Πολλές ευχαριστίες στον Νίκο Παλλαδινό (PALLADIN) για τη βοήθεια και τις ιδέες του!


Σε beta το VS/TFS 2010 SP1 και τι σημαίνει αυτό για μας


Χθες ανακοινώθηκε η διάθεση της beta έκδοσης του VS/TFS 2010 Service Pack 1 με “go live” license. Το SP1 διορθώνει ένα μεγάλο πλήθος από bugs ωστόσο, πιστοί στην παράδοση του να βάζουν νέα features στα services packs, έχουμε και διάφορα καλούδια:

  • Local help viewer
    Τέλος της υποχρεωτικής χρήσης του browser για help view. O local help viewer είναι client app για off-line help. Τώρα θα έχουμε help, όπως παλιά, χωρίς να χρειάζεται internet. Επίσης, θα έχουμε όπως παλιά TOC, keyword index, Favorites, History και “search results”. Κάναμε έναν ωραίο κύκλο και βγήκαμε στην αρχή…
  • Silverlight 4 tools
    Δεν θα χρειάζεται extra εγκατάσταση, θα συμπεριλαμβάνονται στο πακέτο.
  • Unit Testing on .NET 3.5
    Όσοι τρέχουν unit-tests μπορούν να κάνουν target το .NET Framework 3.5. Αυτό το χαρακτηριστικό είναι αδιάφορο για την Ελλάδα.
  • Intellitrace for 64-bit and Sharepoint
    Το Intellitrace είναι super! Αρκεί να μην παίζει σε 64bit πλατφόρμα και να μην γράφεις εφαρμογές Silverlight γιατί τότε δεν υποστηρίζεται. Τουλάχιστον τώρα έφυγε ένα από τα δύο εμπόδια…
  • Performance Wizard for Silverlight
    Εδώ είναι τα καλά νέα! Ο performance wizard για το Silverlight λαμβάνει υπόψην του διαδικασίες (όπως το rendering) οι οποίες είναι λίγο “περίεργες” για τα κλασικά profiler tools.
  • VB Compiler runtime switch
    Άλλο ένα σημαντικό σημείο για όσους γράφουν VB.NET. Μέχρι σήμερα, η VB.NET έμενε χωρίς υποστήριξη σε διάφορους τύπους project (βλ. XNA) γιατί τα VB.NET assemblies έχουν εξάρτηση από το γνωστό assembly Microsoft.VisualBasic.dll. Έπρεπε λοιπόν να υπάρχει ειδική μέριμνα για να υποστηρίζεται η VB.NET, όπως για παράδειγμα έγινε πρόσφατα με την υποστήριξη WP7.
    To νέο switch του compiler (/vbruntime) θα ενσωματώνει στο τελικό assembly ένα υποσύνολο του Microsoft.VisualBasic.dll κι έτσι δεν θα απαιτείται αυτή η διαδικασία να γίνεται μέσω του project template όπως γίνεται τώρα με τα VB.NET project templates για Silverlight και WP7.
    Οπότε τώρα η υποδομή υπάρχει, μένει να γίνει και η υπόλοιπη δουλειά για να υποστηριχθεί η VB.NET για όλους τους τύπους.