Tuesday, April 22, 2008

HMS_Surprise_large

Day Three concluded with finishing the QuickStart series on Building Dynamic User Interfaces with Silverlight, from the official Silverlight website.  Day Four continues with notes and unsolicited errata on Networking and Communication in Silverlight.

A. Sending and Receiving Plain XML Messages with Silverlight -- I learned a new acronym in this very brief tutorial.  POX stands for plain ol' XML.  The System.Net.WebClient class allows us to call a web service (in this case, a DIGG service) and pass the results to a callback method.

B. Building a WCF Web Service and Accessing It by Using a Proxy -- Very nice.  A somewhat sophisticated small application combining Silverlight and WCF, explained clearly.  Someone went through and proofread this particular walkthrough, and the effort shows even in the details -- like stating what namespaces need to be referenced before one actually needs to use them.

C. Accessing Syndication Feeds with Silverlight -- Very simple tutorial on how to access an rss feed in Silverlight using the System.ServiceModel.Syndication.SyndicationFeed class.  The only problem is that if you follow the instructions precisely, it will not work.  The sample code uses the Silverlight.net rss feed, http://silverlight.net/blogs/microsoft/rss.aspx, as its source.  Unfortunately, in order to access an rss feed, the server hosting the feed must have a policy file set up to allow cross-domain access, which the Silverlight.net rss feed does not.

A tad annoying, no?  Or perhaps this is a some sort of Zen exercise intended to reinforce the principle that a Clientaccesspolicy.xml or Crossdomain.xml file must always be properly configured on the feed server. 

posted by J Ashley on Tuesday, April 22, 2008 12:33:29 AM (Eastern Standard Time, UTC-05:00)  #    Comments [0]
 Tuesday, April 15, 2008

 Tomadevaldivia

Today I have been working through the Microsoft QuickStarts for Silverlight, which include walkthroughs as well as code source.  Here are the high level topics available:

  • Getting Started with Silverlight Development [Skipped]

  • Building Dynamic User Interfaces with Silverlight

  • Networking and Communication in Silverlight

  • Interaction Between HTML and Managed Code

  • Programming with Dynamic Languages

  • Additional Programming Tasks

     

    Notes to Building Dynamic User Interfaces with Silverlight:

    A. Writing Handlers for Silverlight Input Events [Skipped] -- this is covered in most introductory materials.  Didn't see a point in reviewing it.

    B. Changing the Appearance of an Existing Control in Silverlight -- this is interesting, since it covers both styling an app as well as skinning it with ContentTemplates.  ContentTemplates do more than set properties for certain elements in your Silverlight app the way CSS does for HTML elements.  They also let you switch out your Silverlight element with a custom element such that, say, everywhere you have specified a button in your app, you now get whatever is created in the button's ContentTemplate.  It works a bit like a global replace.  On the other hand, whatever events you have hooked up to your button in order to fulfill business requirements will still work, whatever you do with the ContentTemplate.

    This QuickStart is mostly a copy / paste sort of tutorial.  That said, there are some errors in it such that, if you follow the instructions to the letter, you will end up with a useless application that hangs.

    • In section one of "To create a ControlTemplate for a button," your control template needs to include a TargetType attribute set to Button.
    • In section two of "To create a ControlTemplate for a button," name your grid "RootElement" rather than "ELEMENT_Root", as the instructions tell you to do.
    • Section two of "To specify the appearance of the control" instructs you to Add the following elements after the closing </Grid.Resources> tag, at the comment "Add the elements that specify appearance here." 
    • It ought to read Add the following elements after the closing </Grid.Resources> tag, at the comment "Add child FrameworkElement objects here." 

    C. Creating Custom Controls for Silverlight -- an eye opening walkthrough.  We create a custom Silverlight control by first creating a standard class that inherits from Control, and a separate XML file with an xaml estension.  XML file is aware of the control class, but the control class knows nothing about the XAML file.  We reuse some of the ContentTemplate techniques from the previous QuickStart to give form to our Silverlight custom control.  Here are some minor issues with the walkthrough:

    • Be sure to add the following using declaration to your control class: using System.Windows.Controls.Primitives;
    • You need to understand Dependency Properties in order to get the most out of this walkthrough.  The article provides a dead link to the MSDN article on Dependency Properties.  It should have linked here, instead.
    • Dependency Properties are a cool concept.  For the most part, they are like property bags, except with special Silverlight hooks.  The terminology, however, is either not fully worked out, or just ill-conceived.  Here's a sample definition of a dependency property, from MSDN:
    • Dependency property: A property that is backed by a DependencyProperty.  (Oh really?)
    • The tutorial has you start using a Background attribute in your ContentTemplate without first having you add it to your custom class.  You need to add this to your class in order to avoid a runtime exception:

    public static readonly DependencyProperty BackgroundProperty =
    DependencyProperty.Register("Background", typeof(Brush), typeof(NumericUpDown),
                    null);

    public Brush Background
    {
        get { return (Brush)GetValue(BackgroundProperty); }
        set { SetValue(BackgroundProperty, value); }
    }

    D. Displaying a Splash Screen While Loading a Silverlight-Based Application -- this QuickStart seems to work.  I actually can't completely tell what's happening in the walkthrough, though it seems like it will make a great reference if I ever need to customize a splash screen.

  • E. Working with Data Collections in Silverlight -- this useful QuickStart explains data binding and the DataTemplate.  No obvious errors, but a few lacunae.

    • Life will go much easier if you name your project Quickstart_Bookstore.
    • The ObservableCollection type belongs to the namespace System.Collections.ObjectModel.
    posted by J Ashley on Tuesday, April 15, 2008 3:48:49 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]
     Monday, April 14, 2008

    hms_victory 

    Today I finished reading through Christian Wenz's Essential Silverlight Up-To-Date.  According to Amazon, the book ships tomorrow -- I was able to read it though my subscription to Safari Books Online.  From what I can get out of browsing the Amazon site, it is the first Silverlight 2 book to come out, and precedes the others by about two months.  It is, essentially, the only game in town for those planning to learn Silverlight 2 from a book.

    It is a bit of a mixed bag, due not least to the difficulties involved in trying to write a book about a technology that is still in flux.  Breaking changes are expected during the transition from the beta 1 to the beta 2 of  Silverlight 2, and most book authors in this sub-genre of a sub-genre have adopted the better part of valor.  So thanks are due to Mr. Wenz for accepting such a difficult task and finding a way to meet his publisher's deadline.

    That said, while the book offers a good overview of the Silverlight 2 technology, in doesn't go into any particular depth.  The labs are difficult to follow, at times, because some of the things he writes about do not appear in the Silverlight 2 beta 1, such as a project template for user controls.  Since his walkthroughs require the use of a user control, I was obliged to google the right way to create one, just so I could finish the book.

    Frustratingly, the chapter on Programming Silverlight with .NET is extremely brief, despite the fact that this is perhaps the most interesting new feature of Silverlight 2.  Or perhaps this is merely an artifact of the way I read it, and the physical copy that will be placed on bookstore shelves will have more content.  At least I hope this is the case.

    I was finally able to get a user control into my XAML page by following the official Silverlight 2 hands-on labs, found here.  Microsoft is not known for being good at documenting their bleeding edge technology, but these labs are actually quite excellent, and may currently be the best resource for learning Silverlight 2.  I'll know more tomorrow, as I plan to work my way through all the tutorials and labs on the official Silverlight site.

    The trick with adding a user control to a XAML page, it turns out, is that a namespace declaration to the containing project has to be added to the page.  The page, for whatever reason, is not automatically aware of the assembly it is in.  Once the namespace is declared, however, Intellisense takes over and makes adding your user controls -- HelloWorld.xaml, in this case -- quite easy.

    posted by J Ashley on Monday, April 14, 2008 6:32:16 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]
     Sunday, April 13, 2008

    cuttysark

    'Twas not a propitious day.  Installing the Beta 1 of Silverlight 2 was trying.  Finding the correct place to download the correct version of Silverlight 2 was a bit tricky, but I finally did get to it: http://silverlight.net/getstarted/.

    I downloaded and installed the SDK without trouble.  On reading a bit more around the net, it turned out I also needed the correct version of the Silverlight Tools for Visual Studio 2008 in order to get the project templates I would require to do anything worthwhile, so I did.  This installation didn't go so well, and I received a message stating vaguely that I had previous software that needed to be removed.

    I removed the Silverlight browser plug-in, but I got the same message.  Since the only other Silverlight component I had installed was the SDK, I decided to remove that also.  This did the trick.  It turns out that what is now being called the Silverlight Tools is actually a comprehensive install that includes the SDK, though at some previous point it wasn't.  Checking at the Microsoft Silverlight site, it also appears that the site has been updated with a clarification to make this change more obvious.

    After getting everything installed, I fired up the Visual Studio IDE and started working through the examples in Chris Wenz's Essential Silverlight 2 -- Up to Date.  It is the only book on Silverlight 2 I could find, and the "Up to Date" postscript is meant to indicate that it will be updated on a regular basis as different versions of Silverlight are released.  The one I'm reading through is meant to be for the Silverlight 2 Beta 1, though the version being sold appears to have been written before the official release.  I was also told that this was the book which was distributed at MIX '08.

    I tried downloading the sample code that is intended to go with the book, but it turned out to be a dead link.   Oh well, I thought, I can just build each project myself according to Chris's instructions.

    At the end of the first chapter, however, I was instructed to create "a new Silverlight Control project within the current solution," and after 20 minutes or so trying to puzzle out what I was supposed to do, I finally realized that no such project template existed.  The version of the Silverlight 2 Beta 1 that was released turns out to be a different beast than the one he was writing about.  So I'll just skip this example and move on to the rest of the book, hoping that this is the exception that proves the rule, rather than the rule that proves the rule.

    In this first chapter, I also learned a new acronym to add to my bestiary of strange and exotic technical terms.  An RIA is a Rich Internet Application, not to be confused with an AJAX client, or a thin client, or a one-click client, or a rich client application.  Silverlight is an RIA, as is Adobe Flash, Adobe AIR, JavaFX and Google Gears.

    Despite the frustrations of this first day, I am still excited about Silverlight.  The contradictory and confusing nature of the various Silverlight resources can be chalked up to the entry cost for learning bleeding edge technology.  And perhaps it is even intended to discourage those not willing to bear some burden as the price for acquiring new knowledge. 

    On another front, I've decided that the best place to renew a study of Husserlian Phenomenology is with Franz Brentano.  I have a translation (which you can read here) by Benito Müller of a series of lectures given by Brentano on descriptive psychology from 1890 entitled Psychognosie, which include Brentano's influential analysis of the concept of intentionality -- the sine qua non of phenomenology. 

    In his introduction, Müller is good enough to provide the most succinct explanation of intentionality I have ever come across. "Every psychical act is intentional in that it is directed upon an object."  Would that tech book authors could achieve a similar standard of clarity.

    posted by J Ashley on Sunday, April 13, 2008 6:19:44 PM (Eastern Standard Time, UTC-05:00)  #    Comments [0]
     Thursday, April 10, 2008

    Friedrich.Wanderer Above the Sea of Fog

    Bill Ryan is a man spoken of in awed tones at the Magenic offices in Atlanta.  There are various ways to develop a reputation in the computing world.  Some people post to technology discussion groups.  Some people write books.  Some speak at conferences.  Some people are good at making friends with Microsoft developers in Redmond.  Some strive to get abbreviations tacked onto their names like MCAD, MCSD, and MVP.  The problem with all of this is that the more time you spend on these particular pursuits, the less time you actually spend coding, and so there can be a certain hollowness to these technical reputations.  The people writing the books on how to use certain technologies are often the last people you want actually building a system for you using those technologies because, as a consequence of their writing and speaking obligations, they don't actually have any real world experience using them.

    Bill, as people at Magenic say, is "the real deal."  He talks the talk and he walks the walk.  Speculation around the water cooler is that he could have only accomplished all that he did, while with Magenic, by never sleeping.

    He is basically the living ideal of what a software consultant should be.  The fact that the consultants I work with, who in their own right are all remarkable technicians and gentlemen, view Bill in this way says much.

    What is the genesis of such a reputation, and such a high level of technical competence?  My guess is that Bill is just hardwired that way, and was born to greatness.  In a blog entry from 2004, however, he provides a different origin story, one that has an almost Horatio Hornblower quality to it.

    This is my third pass at learning “Patterns” and it's going a little easier.  I tried reading the GoF book but it might as well be written in Martian b/c while I can read it, I have a mental block or something because absorption isn't there.  So my first goal of the new year (starting three days ago) is to get proficient with at least 20 Data Access Patterns.

    ...

    My next goal is to have a full command of all of the new ADO.NET 2.0 Features BEFORE the new framework is released.  Made a lot of progress so far but have a long way to go.

    I want to be able to build a fairly sophisticated Sharepoint portal without “Having” to look for help.  That's not to say that I'd ever want to build anything without referring to some stuff I've read - but if I know I can do it if I had to - I'll be where I want to be.

    Ditto for Biztalk -

    This fragment provides a fair portrait of what Bill was up to at the end of 2004.  He gave himself some extremely ambitious goals -- accomplishing any one of these would have propelled your typical developer into an architectural role in most companies -- and, more amazingly, accomplished them.

    It has been roughly three years between that post and this, which shows what can be accomplished in a so brief time.   His attitude is inspiring, and so I'll give it a shot also, in the same way a Greek youth might once have repeated a mantra he overheard outside the walls of the Parthenon.

    • I will learn Silverlight 2.0 thoroughly before the official Go Live license is released with the beta 2, sometime in May.
    • I will strive to understand the inner workings of WCF until I can understand half of everything Juval Löwy, a technical theoretician of the highest caliber, might have to say about it.
    • I will complete a code generation tool that actually builds a fully working CSLA business tier, instead of only allowing class by class generation.  Ideally, I will make it work inside the Visual Studio IDE and also have it generate a Silverlight GUI to sit on top of the business layer -- if a future release of Silverlight gets all the databinding features working correctly.  I will accomplish this before Rocky Lhotka finishes his next CSLA book.
    • By the end of the year, I will finally get to the last chapter of Wheelock's Latin.
    • By the end of the year, I will get back into phenomenology, and write a short monograph on the relationship between Husserl's phenomenology and virtual reality.

    Yoda said,

    "Try not. Do or do not. There is no try."

    Mr. Miyagi, more prolix, but with equal sagacity, said,

    "Walk on road, hm?  Walk left side, safe.  Walk right side, safe.  Walk middle, sooner or later get squished just like grape. Here, karate, same thing. Either you karate do "yes" or karate do "no." You karate do "guess so" -- squish just like grape."

    Cicero couched the same insight in these terms:

    "Ut enim qui demersi sunt in aqua nihilo magis respirare possunt si non longe absunt a summo, ut iam iamque possint emergere, quam si etiam tum essent in profundo, nec catulus ille qui iam appropinquat ut videat plus cernit quam is qui modo est natus, item qui processit aliquantum ad virtutis habitum nihilo minus in miseria est quam ille qui nihil processit."

    posted by J Ashley on Thursday, April 10, 2008 8:54:12 PM (Eastern Standard Time, UTC-05:00)  #    Comments [2]