December 2, 2003 .net

Indigo and Star Trek

Here. I've always been a big fan of wacky analogies to illustrate points and Steve's got a good one.
December 1, 2003 .net

New Longhorn Site for Academics

Here. "There are many sites on the web related to Longhorn already, but none that are geared towards academia. In fact, the most common sites like LonghornBlogs.com are made up largely of Microsoft employees. We think that an independent site where users can share their knowledge but also opinion will go a long way towards making Longhorn a better product for everyone!" LonghornBlogs.com is for anyone, but a site for academics interested in Longhorn is a good thing, too. Welcome!
November 30, 2003 .net

Another Great Set of WinForms Controls

Here. Duncan [1] points out Tim Dawson's set of WinForms controls, all of which are either free or cheap for commercial apps. Not only are the controls well-designed and flexible, they're also documented with a set of tutorials and provide an extensive design-time experience. I don't know how someone can make a living giving this stuff away, but that doesn't mean we can't enjoy Tim's generosity. [1] http://weblogs.asp.net/duncanma/posts/40415.aspx
November 30, 2003

Learning to Learn, Part II

Here. The one where I find a kindred spirit on the topic of learning to learn who's looked into it way more deeply than I have.
November 30, 2003 .net

Interesting Ex-Microsoftie Blogs on Longhorn

Here. I read a post yesterday that pointed at Wesner Moise, an ex-Microsoftie, and now I'm hooked. I'm enjoying how he applies his technical riguor to Longhorn. I also want to know about SoftPerson, his software company that "develops desktop applications based on AI." Subscribed.
November 30, 2003 spout

Learning to Learn, Part II

Tony R. Kuphaldt, an instructor at Bellingham Technical College in Washington recently emailed me that my Learning to Learn piece spoke to him and pointed me to his web site where he provides a wonderful look at his own experiences in self-teaching. In this paper, Tony describes his insights, starting with an amazing look into my own previous field of employ:

Industry training, at least in its popular form, is roughly based on the model of a fire hydrant: sit in front of it, open the valve, and take a big drink. Due to time limitations, trainers present information at a rapid pace, with participants retaining only a fraction of what they see and hear. What knowledge they do gain seldom passes on to co-workers after the training session, and is forgotten almost as rapidly as it is presented, necessitating continual re-training. … [Students] often leave with the impression of the instructor being something of a genius for being able to present so much information so quickly, and instilling within their own minds a sense of inferiority for not grasping all of it at the delivered pace.”
Further, Tony describes the technique I use to really learn something:
What did I do to learn? Simple: I would challenge my existing knowledge of a subject by trying to apply it to real-world conditions and/or thought experiments. If I didn’t know enough about a topic to successfully apply it to a realistic problem, I would research and study until I did. If ever I was completely baffled by a problem, I could determine my own conceptual weaknesses by incrementally simplifying the problem until I could solve it. Whatever complexity I eliminated from the problem that enabled me to solve it was where my understanding was weak. Once I knew what I didn’t know, I not only knew where to focus my study efforts, but I also felt more motivated to study because I could perceive my own needs.”
Tony characterizes his (and my) self-teaching technique as an internal feedback loop, where the student knows what he doesn't know. This is as opposed to an external feedback loop in an instructional setting, where the instructor knows what the student doesn't know, but the feedback loop is broken between the student and the instructor.

And as if that weren’t enough, Tony takes his goals on the road, as it were, testing a self-teaching-based curriculum on his students and reporting on his results. I find his work especially interesting not because I feel the need to teach the world to teach themselves; I’m perfectly happy to encourage folks to learn to learn, but to have them choose other techniques. However, I do feel very strongly that the Sells brothers learn to learn. I can’t imagine sending them out into the world without a firm grasp of the ability to teach themselves. I don’t know how to do that, though, unless I start home schooling them. That wouldn’t be out of the question except for this unhealthy addiction I have to a steady income stream…

November 29, 2003 .net

XAML’s Extended Attribute Syntax

Here. The one where I fall in love with XAML's extended attribute syntax.
November 29, 2003 spout

The Wonder that is XAML’s Extended Attribute Syntax

The Wonder that is XAML’s Extended Attribute Syntax

Saturday, November 29, 2003

I’ve been playing with GridPanel today and really like how elegant it is. If I say the following:

<GridPanel>
  <SimpleText>Testing</SimpleText>
  <SimpleText>1</SimpleText>
  <SimpleText>2</SimpleText>
  <SimpleText>3</SimpleText>
</GridPanel>

I get the equivalent of an HTML table with four rows with each SimpleText element forming a cell like so (augmented with Border elements not shown above to accentuate the cells):

If I want to split the data into columns, I can do that using the Columns attribute:

<GridPanel Columns="2">
  <SimpleText>Testing</SimpleText>
  <SimpleText>1</SimpleText>
  <SimpleText>2</SimpleText>
  <SimpleText>3</SimpleText>
</GridPanel>

Which gives me two rows of two columns each:

That’s all nice and simple, but still flexible. For example, if I want to set the Testing string to cover two columns, I can give it an ID in the XAML and call the GridPanel.SetColumnSpan static method in code, e.g. when the Window loads:

<!-- xaml -->
<Window ... Loaded="window1_Loaded">
  <GridPanel Columns="2">
    <SimpleText ID="testingSimpleText">Testing</SimpleText>
    <SimpleText>1</SimpleText>
    <SimpleText>2</SimpleText>
    <SimpleText>3</SimpleText>
  </GridPanel>
</Window>
// C#
void window1_Loaded(...) {
  GridPanel.SetColumnSpan(testingSimpleText, 2);
}

This code yields 3 rows arranged as follows:

This is all fine and makes you appreciate the elegance of the GridPanel. However, that’s not what inspired me to write this entry.

Remember that the SimpleText element serves as a cell in the GridPanel. Even better, the SimpleText element doesn’t know it’s serving as a cell in a GridPanel. The architecture of Avalon is loosely-couple so that all of the elements don’t need to have intimate knowledge of each other. This loose coupling is really great for future elements that some developer wants to host in a GridPanel or that want to host SimpleText elements. Still, I’d like to be able to set GridPanel-related properties for each cell” on the cell element itself, even if the cell element doesn’t know it’s a child of a GridPanel. And that’s what the extended attribute syntax in XAML lets me do. Instead of writing the code, I can just do this:

<GridPanel Columns="2">
  <SimpleText GridPanel.ColumnSpan="2">Testing</SimpleText>
  <SimpleText>1</SimpleText>
  <SimpleText>2</SimpleText>
  <SimpleText>3</SimpleText>
</GridPanel>

This dotted attribute syntax allows me to set a GridPanel setting for the SimpleText element w/o any knowledge from the GridPanel of the SimpleText or vice versa. That means that if I define the FooBar element tomorrow, I can set it’s GridPanel.ColumnSpan on it when it’s used inside a GridPanel w/o extending GridPanel. This also means that if FooBar has a Quux per-child property, I can set the FooBar.Quux attribute of the SimpleText element w/o extending SimpleText. Nice!

BTW, if you’d like to see the code that provides the GridPanel in outline mode” as above, it looks like this:

<Border Background="black" Width="100%" Height="100%">
  <GridPanel Columns="2">
    <Border Background="white" GridPanel.ColumnSpan="2">
      <SimpleText >Testing</SimpleText>
    </Border>
    <Border Background="white">
      <SimpleText>1</SimpleText>
    </Border>
    <Border Background="white">
      <SimpleText>2</SimpleText>
    </Border>
    <Border Background="white">
      <SimpleText>3</SimpleText>
    </Border>
  </GridPanel>
</Border>

Notice that the GridPanel.ColumnSpan is on the Border element, not the SimpleText element. That’s because it’s the Border that’s the cell of the GridPanel, not the SimpleText.


← Newer Entries Older Entries →