Migrate

Lift Heavier Things By Tracking Your Progress

If you work out on a regular basis, you need to track your progress. I remember learning to track bench press with a printed Excel sheet in a high school weight lifting class. For some reason, perhaps because CrossFit has so much variety, it took me a while to get serious about tracking my workouts.

When I started CrossFit in February of 2011, I would get into a routine where I would show up for a workout, try to remember what weight I lifted the last time, and add some weight for the current session. This worked out really well when I was beginning, mainly because I was jumping up so much in weight each time as I started to get in shape.

After a while, I noticed that my rate of improvement was diminishing and even leveling off in some areas. The problem—which I only noticed in hindsight—was mainly due to my not being able to remember how far I had pushed myself in a previous workout. Starting at a computer screen at 5:30 AM, I wasn’t doing much research on previous weights before heading into the gym.

So earlier this year, I started tracking my workouts in a couple of Google Docs.

Apart from actually showing up for the workouts, tracking my workouts has been the single biggest contributor to my improvements this year.

I started two spreadsheets in Google Docs, Named WODs and Ben’s Lifts. I check them accordingly before heading to the gym. I even have them saved as favorites on my smartphone in case I need to look them up while I’m there. Here’s a screenshot of my entries for Deadlift this year:

image

It’s not too complicated. All you really need is the movement, date, rep scheme, and weight, but I added my 1RM, 3RM, 5RM, and a Notes fields, which turns out to be quite helpful. You notice on June 29, it had been over three months since my last 5x5 Deadlift. I was quickly able to see that I had struggled at 275 for my last 5x5 but thought I could push myself to 285. If I hadn’t been tracking my progress, I probably would have guessed based on my last 5x3 and probably would have ended up at about 265.

There are a ton of different ways to track your workouts. A lot of CrossFit blogs encourage you to post your scores to the comments (I really like this, mainly because it encourages a positive community, but it can be hard to look up old scores). Our box recently started using SocialWod to automatically track our white board. Again, I really like this for the community aspect.

Even with all of these great methods, I still recommend coming up with your own simple tracking system. It’s the best way (in addition to showing up) that I know of to help yourself improve at the gym.

Have any thoughts? I’d love to hear them in the comments below!

Building HTML Files from Markdown and using MarkdownPad

Each month, I deliver a webinar for two of our Fog Creek products, FogBugz and Kiln (speaking of, want to sign up for the webinars? Do so here: FogBugz, Kiln). To help me deliver a consistent and polished message, I’ll keep a script open in a browser window on a separate monitor. This ensures that I stay on track and mention all of the things I want to say.

To create the outline for my scripts, I use MarkdownPad on Windows, which allows me to edit my outlines using the Markdown syntax and end up with an HTML file that’s viewable in any browser.

SNAGHTML14ba1f0

I really like using MarkdownPad, but one of the slower parts of my workflow involves remembering to go to File > Export HTML for each of the 7 outline files that I have. I really wanted to be able to convert my Markdown files from the command line to make this faster. Since MarkdownPad doesn’t offer this command line functionality out of the box, I decided to try to add it myself. While I was there, I added some additional features to help me out while I’m doing a live webinar. Here’s a list of features I decided to implement.

  • Generate HTML using Markdown source from the command line
  • Use the same CSS stylesheet and other user settings that I use in MarkdownPad when I export HTML.
  • Add the ability to be able to navigate header tags using the keyboard arrow keys
  • Dynamically stylize certain key words so that they stand out. For example, if I type - KILN: in MarkdownPad, I want to be able to see - KILN: in the resulting HTML so that it stands out.

Here’s a quick screencast that shows the result of my work:

 

Let’s break down how I set this up.

Converting Markdown to HTML

The biggest challenge I faced, at least initially, was figuring out how to take Markdown source and convert it to HTML from the command line. I decided to try using MarkdownSharp, .NET Markdown transformation library that happens to be the same was what’s used within MarkdownPad. Since you can easily call .NET classes from PowerShell, I figured this would be a relatively simple implementation, which was indeed the case:

[sourcecode language="powershell"] PS C:\> Import-Module MarkdownSharp.dll PS C:\> $m = New-Object MarkdownSharp.Markdown PS C:\> $m.Transform("- This is a bullet point") <ul> <li>This is a bullet point</li> </ul> [/sourcecode]

The actual implementation was a bit trickier, but still relatively straightforward. I created a function in my Powershell Profile called Markdown-ToHtml. It will take either a file name or plain text and also lets you specify standard options for MarkdownSharp. Notice how I’m importing MarkdownSharp.dll, which is stored in a lib directory right within my Powershell profile. I think I built the file from source code, but feel free to grab my compiled version here (click the Download link on the right side of the page).

[sourcecode language="powershell"] Import-Module .\lib\MarkdownSharp.dll function Markdown-ToHtml($item, $AutoHyperlink = $False, $AutoNewLines = $False, $LinkEmails = $False, $EncodeProblemUrlCharacters = $False){ $mo = New-Object MarkdownSharp.MarkdownOptions $mo.AutoHyperlink = $AutoHyperlink $mo.AutoNewLines = $AutoNewLines $mo.LinkEmails = $LinkEmails $mo.EncodeProblemUrlCharacters = $EncodeProblemUrlCharacters $m = New-Object MarkdownSharp.Markdown($mo) $toTransform = "" if (($item.GetType().Name -eq "FileInfo") -or (Test-Path $item -ErrorAction SilentlyContinue)) { $toTransform = (Get-Content $item) $toTransform = [string]::join("`r`n",$toTransform) } elseif ($item.GetType().Name -eq "String") { $toTransform = $item } else { # I don't know what to do with this } return $m.Transform($toTransform) } [/sourcecode]

Once you have the Markdown-ToHtml file in your profile (or within your build script; either way is fine), the next step is to grab MarkdownPad’s settings so our generated HTML is consistent with what you see in MarkdownPad.

Find MarkdownPad’s Settings

MarkdownPad is a ClickOnce application, so it’s settings are stored in a user.config file in a seemingly random folder in the user’s AppData directory. Thankfully, we can use a little Powershell Magic to make sure we get the correct file:

[sourcecode language="powershell"] PS C:\> ls $env:APPDATA\..\Local\Apps\2.0 -r -include user.config | %{if(cat $_ | ss "MarkdownPad" -quiet){return $_;}} | select -first 1

Directory: C:\Users\benm\AppData\Local\Apps\2.0\Data\0CZN9Q11.JVM\MNOR0348.10M\mark..tion_12329825c85e214b_0001.0003_8873814a9315382c\Data\1.3.1.1

Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 6/18/2012 3:02 PM 10492 user.config [/sourcecode]

Reading the XML file is also pretty simple:

[sourcecode language="powershell"] #Get the MarkdownPad config file $configFile = ls $env:APPDATA\..\Local\Apps\2.0 -r -include user.config | %{if(cat $_ | ss "MarkdownPad" -quiet){return $_;}} | select -first 1 #Parse the config file as XML, pulling out appropriate values [xml]$doc = Get-Content $configFile $Css = $doc.SelectSingleNode("/configuration/userSettings/MarkdownPad.Properties.Settings/setting[@name='HTML_CustomStylesheetSource']").Value $AutoHyperlink = [System.Convert]::ToBoolean($doc.SelectSingleNode("/configuration/userSettings/MarkdownPad.Properties.Settings/setting[@name='Markdown_AutoHyperlink']").Value) $AutoNewLines = [System.Convert]::ToBoolean($doc.SelectSingleNode("/configuration/userSettings/MarkdownPad.Properties.Settings/setting[@name='Markdown_AutoNewLines']").Value) $LinkEmails = $False $EncodeProblemUrlCharacters = [System.Convert]::ToBoolean($doc.SelectSingleNode("/configuration/userSettings/MarkdownPad.Properties.Settings/setting[@name='Markdown_EncodeProblemUrlCharacters']").Value) [/sourcecode]

We’ll use these settings later when we put together the complete build script.

Navigate HTML Headers Using Arrow Keys

I wanted to be able to use the arrow keys to navigate my outline files during the live webinar. I decided to include jQuery in my generated files and I ended up finding a cool library called jQuery.ScrollTo, which is included in my build script.

To wire up the ScrollTo plugin to keyboard commands, I used the following script, called scrollToArrow.js:

[sourcecode language="javascript"] (function($){ $(window).keyup(function(e){ window.ixTag = window.ixTag || 0; tagsH = $('h1,h2,h3,h4,h5'); var key = e.which | e.keyCode; if(key === 37){ // 37 is left arrow window.ixTag = window.ixTag - 1 < 0 ? 0 : window.ixTag - 1 console.log('left'); } else if(key === 39){ // 39 is right arrow window.ixTag = window.ixTag + 1 >= tagsH.length ? tagsH.length - 1 : window.ixTag + 1 console.log('right'); } $.scrollTo($(tagsH[window.ixTag]),{duration:250}); }); })(jQuery); [/sourcecode]

It’s a bit hacky, but it does the job.

Dynamically Stylize Keywords

The next challenge was to add styling to the resulting HTML page for certain keywords so that they would jump out to me during the webinar.

6-18-2012 4-52-22 PM

I had originally solved this using a PowerShell script to modify the original Markdown file, but I decided to use some javascript instead so that the original Markdown file isn’t littered with <span> tags. Here’s what the addStyles.js file looks like:

[sourcecode language="javascript"] $(document).ready(function(){ var toMatch = /^(PP|FB|PS|VS|KILN|NP|EXPLORER|THG):/i; var matches = $('p,li').filter(function(){ return $(this).html().match(toMatch); });

$(matches).each(function() { var html = $(this).html(); console.log(html); var match = html.match(toMatch)[1]; var replaceWith = html.replace(toMatch, '<span class="' + match + '">' + match + '</span>:'); //console.log(replaceWith); $(this).html(replaceWith); }); }); [/sourcecode]

Bringing It All Together into A Build Script

I use all of the above elements—putting Markdown-ToHtml in my profile, parsing the user config, the javascript files—to put together a simple build script. In short, the script will look for all Markdown files (.md) in the directory and then output the HTML to a folder called outline-html. The javascript files and the exported CSS are also placed in outline-html. Here is build.ps1:

[sourcecode language="powershell"] #Get the MarkdownPad config file $configFile = ls $env:APPDATA\..\Local\Apps\2.0 -r -include user.config | %{if(cat $_ | ss "MarkdownPad" -quiet){return $_;}} | select -first 1 #Parse the config file as XML, pulling out appropriate values [xml]$doc = Get-Content $configFile $Css = $doc.SelectSingleNode("/configuration/userSettings/MarkdownPad.Properties.Settings/setting[@name='HTML_CustomStylesheetSource']").Value $AutoHyperlink = [System.Convert]::ToBoolean($doc.SelectSingleNode("/configuration/userSettings/MarkdownPad.Properties.Settings/setting[@name='Markdown_AutoHyperlink']").Value) $AutoNewLines = [System.Convert]::ToBoolean($doc.SelectSingleNode("/configuration/userSettings/MarkdownPad.Properties.Settings/setting[@name='Markdown_AutoNewLines']").Value) $LinkEmails = $False $EncodeProblemUrlCharacters = [System.Convert]::ToBoolean($doc.SelectSingleNode("/configuration/userSettings/MarkdownPad.Properties.Settings/setting[@name='Markdown_EncodeProblemUrlCharacters']").Value)

#put the CSS in its own file $Css | out-file .\outline-html\markdownStyle.css -encoding "UTF8"

#for each Markdown file in the directory: # 1. use MarkdownSharp to convert the markdown to the HTML body # 2. build the full HTML file, adding in CSS and javascript references in the header # 3. create the file in outline-html $files = ls *.md | %{$_.Name}

$files | foreach { $htmlBody = Markdown-ToHtml $_ -AutoHyperlink $AutoHyperlink -AutoNewLines $AutoNewLines -LinkEmails $LinkEmails -EncodeProblemUrlCharacters $EncodeProblemUrlCharacters $sb = New-Object System.Text.StringBuilder [void]$sb.AppendLine('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">') [void]$sb.AppendLine('<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">') [void]$sb.AppendLine('<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>') [void]$sb.AppendLine('<script src="jquery.scrollTo.js"></script>') [void]$sb.AppendLine('<script src="scrollToArrows.js"></script>') [void]$sb.AppendLine('<script src="addStyles.js"></script>') [void]$sb.AppendLine('<link rel="stylesheet" type="text/css" href="markdownStyle.css">') [void]$sb.AppendLine('<head>') [void]$sb.AppendLine("<title>$_</title>") [void]$sb.AppendLine('<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />') [void]$sb.AppendLine('</head>') [void]$sb.AppendLine('<body>') [void]$sb.AppendLine($htmlBody) [void]$sb.AppendLine('</body>') $htmlFileName = (($_ -split ".md")[0]) + ".html" $sb.ToString() | out-file ".\outline-html\$htmlFileName" -Encoding "UTF8" } [/sourcecode]

Once you have build.ps1, you can run it from the command line using .\build.ps1, which will generate HTML files for all markdown files in the current directory.

cURL for Powershell

OK, so the title of this post is a bit lot misleading. I haven’t implemented cURL in Powershell, but I did want a simple way to simply do an HTTP GET against a URL and download its contents. With cURL, it’s as simple as:

$ curl http://isitchristmas.com

Easy! This will download the URL as a string that can be piped into another command. In Powershell, it’s a bit more cumbersome:

PS > (New-Object net.webclient).DownloadString(
      'http://isitchristmas.com')

It will get the job done, but that’s a lot to remember just to get a string from an HTTP GET. I’ve added the following bit of code to my Powershell Profile to make this task a bit easier:

function Get-URL([string] $url){
  (New-Object net.webclient).DownloadString($url)
}
Set-Alias curl Get-URL

Those expecting the full functionality of cURL with the curl alias are going to be disappointed, but if you’re simply wanting to grab the contents of a URL, this will do the trick. Now I can get the contents of a website and pipe it into another command in Powershell, such as installing pip:

PS > curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | 
     python

The Paleo Diet is Not a Fad Diet

vegetablesmeat

I’ve written previously about how when I first heard about the Paleo Diet, I thought it was fairly extreme. No beans? Crazy! No dairy! Stupid! No grains? Actually, this one was already starting to make sense to me, but I was a bit surprised that for a strict Paleolithic approach, this wasn’t even allowed in moderation. Extreme!

The notion that the Paleo Diet is a fad is nothing new, and when a good friend of mine who is blogging about his own journey into weight-loss and healthy living  wrote a piece called What Hasn’t Worked, I decided I’d write up a piece on why Paleo is not a fad. He’s had some great success, so even if his experience is anecdotal, he does have a firm leg to stand on when he shares what’s not working. One paragraph, though, caught my attention:

Fad diets. By the time I started sniffing around fad diets I'd already educated myself enough to just come up with something on my own. Fad dieting is, again, not something you can keep up forever so I wasn't too interested.

Now, he doesn’t specifically call out the Paleo Diet, but I had recommended it to him a while back and I know he tried it, but he later moved on to other dietary regimens. That’s fine. However, whether or not Paleo was meant to be included in the mix of fad diets, I wanted to cook up a response that hopefully explains why Paleo is certainly not a fad.

Most of the people who balk at Paleo do so because of the exclusion of certain foods. In fact, the elimination of entire groups of food because they are considered harmful is, according to a questionably-written Wikipedia entry on fad diets, one of the qualifications of being a fad diet. It’s true that a strict Paleo Diet excludes all dairy (milk, cheese, yogurt), legumes (beans, peas, peanuts), grains (bread, pasta), and – this should go without saying – processed foods.

I’m not going to go in to why these foods are excluded. If you want to read more, start with this article, and then consider reading Robb Wolf’s excellent The Paleo Solution or Loren Cordain’s The Paleo Diet.

After you remove a few food groups, what’s left?

notthathardpeople

We’re left with many varieties of beast, foul, fish, vegetables, fruits, nuts, and seeds. Oh Noes! What about my Twinkies! There are no processed foods here; you’re only going to find what our bodies were designed to eat. Let’s take a closer look.

Meat

Hands-down, animal meat is the best source of dietary protein for your body. Yes, quality does matter, which is why the protein that comes from meat is orders of magnitude superior to that found in, say, a candy bar or a head of broccoli. The nutrition label for your favorite bran muffin might indicate that it contains protein, but it doesn’t say what kind of protein it is, nor does it say how useful (or destructive) that protein will be once it enters your body.

Are some forms of meat better than others? Absolutely. For example, grass-fed beef is better than grain-fed (i.e. corn-fed) beef, both in that it is leaner and has a much better ratio of Omega-3 to Omega-6 fatty acids. This should come as no surprise. Cows were made to eat grass, not grain, so when we eat animals that are living out the fullness of their genetic potential, we also benefit from a dietary perspective. The same holds for wild-caught vs. farmed (i.e. corn-fed) fish and pastured chickens vs. confined (and exclusively grain-fed) chickens.

When it comes to meat on the Paleo Diet, we want to have variety and quality to get the best sources of protein and unprocessed fat in our diet.

Fruits & Vegetables

Let’s go ahead and throw vegetables and fruits into the same category and look at them together. If you’re doing Paleo to lose weight (which works, by the way), you’re going to want to stick with mostly vegetables and minimal fruit, but from a dietary perspective, both categories offer an excellent source of carbohydrates.

I cringe every time I hear, “Oh, you’re doing a caveman diet? So that means you’re cutting out carbs,” as if pasta were the only source of dietary carbohydrates. “Yeah, but if you want to get carbs from vegetables, you have to eat a lot!” Uh-huh. You can also get your carbs from a Butterfinger and a gallon of sweet tea, but are you really getting quality carbohydrates? Not a chance.

Even at the purely nutritional level, food is a lot more than just a source of calories. Of course, you’re going to get plenty of calories from eating your fruits and veggies, but you’re also going to get lots of fiber and a wealth of micro-nutrients (e.g. vitamins & minerals). When compared to grains, even whole grains, vegetables win when it comes to nutrient content.

Nuts, Seeds, & Oils

We round out the Paleo Diet with nuts, seeds, and an wonderful assortment of oils. These provide an excellent source of fat to compliment the meat and vegetables in our diet. Dietary fat also helps trigger our sense of satiety during a meal so that we know we’re full and should stop eating.

But What About Everything Else?

What do you mean “what else”? In addition to the food choices mentioned above, what other foods do you need in your diet to get the macro-nutrients (protein, fat, & carbs) and micro-nutrients (vitamins & minerals) for healthy living? Nothing. Everything you need for a full, balanced, healthy diet is there. Dairy, grains, and legumes aren’t offering you any nutritional benefits that don’t already exist by sticking to plants and animals.

You could eat like this for the rest of your life.

Not a Diet, But a Lifestyle

The thing is, not only is the Paleo Diet not a fad diet, it’s hardly even a diet. You can eat this way for your entire life, enjoying what you eat and staying healthy. If you’re trying to lose weight, you’ll probably want to be strict with Paleo until you reach a satisfactory maintenance weight, but most folks eat Paleo 80% of the time and get 95% of the benefits. Thus, even though you probably don’t have any ice cream in the fridge while you’re eating Paleo, you don’t really have a problem with going out for an occasional frozen treat.

But, But, But …

I gave some excellent resources above to point to why certain foods are excluded in a Paleo Diet, but the truth is, if you spend all of five minutes on the internet, you can find plenty of conflicting arguments for why Paleo is wrong in one area or another. One article will talk about how a caveman ate a taco one time and so grains are really OK while another article will talk about how beans are just fine. When you don’t have a PhD in molecular biology, you can get overwhelmed pretty quickly, but you know what? Nothing you read can contradict the fact that eating Paleo foods is healthy and sustainable for your entire life.

The objections people have to Paleo have nothing to do with whether or not you can actually be healthy just eating meat, vegetables, fruit, seeds, and nuts. When people balk at Paleo, it almost always has to do with not wanting to give up certain foods. “I can’t give up my cereal” or “there’s nothing wrong with dairy” of “that diet is just a fad.” Instead of explaining the billion reasons why you’re not doing Paleo, why not just try it for 30 days and see what’s different? Start with the quick-start guide found on Robb Wolf’s website.

At the end of the day, the objections don’t really matter because the foods you’re eating with a Paleo lifestyle will make you a healthier human person. You can eat this way, with great success, for the rest of your life, and that’s why Paleo is not a fad diet.

An Everything-Glazed Lunch: A HoneyBaked Krispy Kreme Sandwich

HoneyBaked Krispy Kreme Sandwich 

Since my new job began a month ago, I’ve been trying to experiment with the World's Best Ham and try it in different food combinations.  After picking up a box of Krispy Kreme doughnuts last night, I was intrigued by the fact that a Krispy Kreme doughnut is basically bread covered in a sugar glaze:

The World's Best Doughnut

HoneyBaked Ham is basically a ham (well, not just a ham; this is the World’s Best Ham that we’re talking about here) covered in a sugar glaze (can’t you just taste the crunch? yum…)

The World's Best Ham

A sandwich, to be overly generalistic, is simply two pieces of bread with a piece of meat in between.  So what do you get when you take two glazed pieces of bread and put a glazed piece of meat in between? I present to you the HoneyBaked Krispy Kreme Sandwich:

The sandwich, squished and ready to eat

To be honest, I thought that combining the World’s Best Ham with the World’s Best Doughnut (IMHO) could possibly make the World’s Best Sandwich.  It turns out that there’s just a little too much sugar in this culinary concoction as it hides the natural tastiness of the ham.  Perhaps this would make a nice treat at state fairs and southern weddings.

While my final verdict for the sugary sandwich is only a C+, I still enjoyed the experiment and it made for a nice high-calorie Sunday brunch.

Yummm!

Finding a Job the Unconventional Way

image Sometime at the end of last summer, I was sharing with my newlywed wife that I wanted to transition into a career as a software developer.  With no professional background in programming and only being able to put on a resume what I’ve taught myself in Excel and Access VBA code, a little HTML, and some SQL, deciding to find a job as a developer was no small endeavor. 

With the encouragement of a friend, I decided to start learning Silverlight and even blogged about my learning (the post originated at Silverenlightening.com and has been ported here).  I read tons of blog posts that focused on Silverlight and software development in general.  I tried reading a book on Silverlight and when I realized that Silverlight was over my head because of my lack of programming experience, I bought a book on C# and got some great practice over at ProjectEuler.net.  I went to several different users groups each month that focused on Microsoft technologies.   I started using new technologies at work to leverage the power and flexibility of the more advanced programming frameworks.  I asked lots of questions and even provided a few answers over at StackOverflow.com, an online community where programmers can ask questions to other programmers.  And I started following lots of software developers on Twitter.

I wasn’t planning on searching for a new job until the summer of 2010.  I figured that a year of practice and learning would put me in a good position to enter the market for a job as a junior software developer.  That was until I saw this tweet from the CEO of Fog Creek Software announcing a job for a support engineer:

image

“Fog Creek? I can’t work there,” I initially thought, “they only hire the best and brightest developers on the planet!” As I read through the job description, I realized that I didn’t have to be a professional software developer to support professional software.  I just had to be smart and able to solve problems. Great!

I completed my first resume that evening, which led to a phone interview with the head of technical support at Fog Creek.  That interview went really well and eventually I was invited to New York for an in-person interview.  Although I wasn’t offered a job, the whole interview process was wonderful and I left New York with tons of confidence that I could find a new job, even with my limited background in the field of software development.

I continued to do the same things I was doing before going to New York: reading blogs, practicing programming, going to users groups, and keeping my eye on Twitter.  While I usually don’t pay much attention to when people I don’t know follow me on Twitter, when Kelly Thielemann started following me on Twitter, I decided to follow her as well.  I didn’t know much about her other than the fact that she was a recruiter for Matrix, a company I had heard about after going to the .NET users group, she tweeted about new jobs every now and then, and I’m pretty sure she went to my high school (though not a requirement when following someone on twitter, I’m more likely to follow someone local than someone halfway around the planet if they’re following me for marketing or sales reasons).

When I think back on it, I’m not sure what inspired me to click on the following tweet:

image

Sure, Java is similar to C#, but I’m by no means a “Java dev.” Maybe it was the “Jr” part of the job that made me click through (if I’m anything in the world of software development, I’m certainly junior).  The job description seemed like it might be similar to the Fog Creek job, so I figured it wouldn’t hurt to send in my resume.

The senior recruiter at Matrix who reviewed my resume saw very quickly that I wasn’t a good fit for the Java job (you actually had to know Java; who knew?).  However, she suggested another opportunity for a junior development position at HoneyBaked Ham Company.  It sounded like a great job that would provide a way to begin a career as a software developer, so I decided to pursue it.

The phone interview went really well and that led very quickly to an in-person interview.  After meeting with their lead developer and VP of IT, I felt very strongly that this job would be a great fit for me and was really hoping for an offer.  While waiting a few days to hear back from Matrix after the interview, I felt like I was dating again; I thought the anxious feeling wondering if the other person was going to call wouldn’t be an issue anymore when I got married.  Thankfully, I heard back from Matrix and received an offer!

After discussing the offer with my wife, I accepted the job and will start at HoneyBaked on March 1st.  I’m amazed at how things lined up so that I was able to get connected with HoneyBaked.  I followed blogs, networked at users groups, and kept up with industry trends on Twitter.  I didn’t go to any job fairs, use jobs-centered websites, or really do any of the conventional things that people do to look for jobs.  I guess that in today’s market, it doesn’t hurt to be a little unconventional.

Worth It: Microsoft 4000 Keyboard

Several months ago, I was on twitter and noticed a few people singing the praises of the Microsoft 4000 Natural Ergonomic Keyboard :

 

image

I was never particularly fond of ergonomic keyboards, mainly because they feel awkward at first when compared to traditional keyboards, and also because they are not well designed for computer gaming (which is perfectly fine…I believe they’re designed for typing; my priorities were much different when I was younger).

After following the conversation on twitter, someone suggested that if using a computer (and specifically typing on a keyboard) makes up a large part of your work day, you owe it to yourself to have a good mouse and keyboard.  This makes perfect sense, but I had never given much thought to the keyboards I used other than the basic fact that I needed it to use my computer.

As I’ve been trying to do more work that involves writing code, I noticed my wrists and hands starting to get sore at the end of the work day.  Since I use my computer as an essential part of my job, I decided an ergonomic keyboard might help in the long term to reduce injury to my hands and possibly even improve my typing.  When Dell had a sale on the keyboards, I decided to jump on it and buy one for work and one for the office.

While it was certainly awkward at first to position my hands angled slightly inward and tilted slightly forward at the wrist, I immediately noticed that this keyboard provides a much more natural physical position for typing than do traditional keyboards.  Using this keyboard also quickly highlighted some bad typing habits that I had acquired over years of computer use.  When you can’t use your left hand to press ‘Y’ because of a large gap in the middle of the keyboard, you quickly adjust your typing habits.

I’m very glad to say that after a month of everyday use, I’ve really come to appreciate this keyboard.  I’m certain that my typing is much faster and that I’m using better technique.  I also sometimes use the macro functionality built-in to the keyboard (though must of the other “extras” are left unused).  Overall, this keyboard has been a fantastic investment.

If you’re in a field that requires a lot of typing, you owe it to yourself to give this keyboard a try.

Notes and Reflections From the Atlanta WordCamp

Last Wednesday, I noticed the following tweet from local Microsoft Developer Evangelist, Glen Gordon:

glengordon_tweet

After I installed WordPress on my local Windows 7 machine (which went fine, except for a weird bug with Skype), I received a complimentary pass to attend the WordCamp.

While I tend to lean towards Microsoft technologies, my blog is in fact running WordPress, so I was glad to have the opportunity to attend a conference to bring me up to speed on the publishing platform.  My hope was to learn about building themes, writing plug-ins, and maybe even pick up a little PHP.

The first thing I noticed about the conference was how different the demographic was from the Microsoft users groups I had attended.  The average age of the attendees was quite young and there were lots of women.  The feeling of community was palpable throughout the event.

Overall, I was glad I went, even though the actual sessions seemed somewhat weak in demonstrating how to actually do stuff in WordPress.  The presenters of the sessions I attended were good, but they were heavy with PowerPoint slides and I would have appreciated some actual walk-throughs, and maybe even a peek at some actual code.  Perhaps that’s the developer bias within me that likes to see things demonstrated.

 

People

 

I met some wonderful people throughout the day and this was by far this biggest reward on my time. 

  • Chef Darin Sehnert – I know Darin from a cooking class that he taught while my wife and I were on our honeymoon.  His cooking classes are worth a trip to Savannah.
  • Pam Leinmiller – I had lunch with Pam and learned about her background in computer science and her plans to start a blog about positive health living.
  • Glen Gordon – I enjoyed meeting Glenn and discussing Microsoft at a Word Press conference :-).  I really appreciated his sharing about the Microsoft WebsiteSpark program.
  • Moses Ngone –  I met Moses at the “Genius Bar” and he was incredibly helpful in teaching me about a lot of the “developer” stuff that goes into WordPress.  He actually sat down with me and showed me some code, helping to build my confidence about diving into HTML, CSS, and PHP.
  • Nathan Ketsdever – After I arrived at TAP for the after party (thanks sponsors!), I noticed that Nathan was ordering the same beer I was intending to order, the Left Hand Milk Stout (though I think we actually ended up drinking the Red Brick Ale 15th Anniversary Edition. Waiter, thanks for the mistake; it was amazing).
  • Mitch Canter – I talked to Mitch briefly as he was headed out the door.  His session was my favorite because he got out of PowerPoint and talked about how he develops themes.  I really appreciated hearing about his approach to web design.
  • Matt Thomas – I met Matt towards the end of the evening.  He’s the designer behind WordPress.com.  I especially enjoyed geeking out with him about typography and fonts!

    Notes

     

     

    Final Thoughts

     

    I had a really wonderful time at the WordCamp and can’t wait to get started hacking away at my blog.  Thanks to everyone for all of their hard word and inspiration!

    Using Project Euler to Learn a Programming Language

    When I first began learning to develop Silverlight applications, I noticed very quickly that I struggled a lot with C#, even those things that most programmers would consider very basic, such as:

    • i += j is the same as i = i + j;
    • Angle Brackets < > usually identify a generic where a type ought to be specified.
    • What in the world is LINQ?
    • What does static mean?

    Since I was struggling so much with C#, I decided to read Illustrated C# 2008 by Daniel Solis.  While it was a great introduction to the language, I still found myself hungering for a way to use C# and thus test my newfound knowledge.  I started a few small projects, but I wasn’t getting excited about working on anything.  I’m talking about the kind of excitement where you don’t want to leave work or go to bed at night because you’re having so much fun writing code.

    Then I found Project Euler.

    Project Euler (projecteuler.net) is a collection of math and programming problems that can be solved using just about any programming language.  While the site is certainly tilted more towards math than programming in most cases, I find it to be an incredibly useful way to learn the nuances of a language and exercise one’s programming skills.

    While some of the problems might be easily solved using math or common conventions in computer science, I like to challenge myself to learn new concepts and not simply find the answer to the question.  That’s not to say that the conventional approach isn’t more efficient or correct; it often is. Rather, I’m referring to taking the time to let the problem be an opportunity to learn and try something new versus it being a mere question to be answered.  Let’s walk through an example of any easy problem to see what I mean.

    For example, Problem 1 states:

    If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

    Find the sum of all the multiples of 3 or 5 below 1000.

    There are in fact several ways to approach this, both mathematically and programmatically.  Going the math route, you can utilize the geometric sum, and an alternative code solution can be as simple as a simple for loop with a little bit of code for logic and addition.  I decided to create a simple array of integers and then try to use LINQ to find the result.  This is the code I used:

    static class AddMultiples
    {
        public static int PrintSum(int length)
        {
            int[] arr = new int[length];
            for (int i = 0; i < length; i++)
            {
                arr[i] = i+1;
            }
            return arr.Where(i => (i % 5 == 0) || (i % 3 == 0)).Sum();
        }
    }

    I didn’t have to populate an array to find the answer, but I was excited to discover how easy it was to extend the functionality of the array using LINQ.  The return statement of the method has two LINQ extension methods. The first extension method, Where, restricts the data set to only those numbers evenly divisible by 3 or 5, and the second extension method, Sum, adds the results of the data provided by the Where method. Sure, all of this could have been easily set up in a simple for loop, but what’s the fun in that?

    If you want to play with numbers and start learning a new programming language, I recommend spending some time at Project Euler.

    Dangers of Mobile E-mail

    A few weeks ago, my company purchased a Blackberry for me to use.  This is the first time that I’ve owned a mobile device that has had a constant connection to the internet.  However, I’ve been surprised at how having a connected device can actually cause me to get less work done if I’m not careful.  here are a few reasons why:

    1. Distractions, distractions, distractions

    There are about a billion ways that a connected phone can distract you, but the biggest one is hearing it ring or feeling it vibrate every time you receive an e-mail.  There’s simply a natural impulse to see what’s going on and whether or not you need to respond.  It’s easy to get distracted, no matter how important may be the task at hand, just because the phone rings or a little ‘toast’ notification pops up in the bottom right-hand corner of your screen.  Sometimes we even welcome an interruption if we’re not heavily invested into our work.

    Unless you’re in sales, where the quickness of your response might actually affect your chances of closing a sale, you’re mostly likely of the type of person that could do without being distracted every 5 minutes.  Almost always, an e-mail can wait, and hopefully those who work with you regularly will learn that they need to call you if there’s anything they need urgently.

    I’ve turned off all e-mail alerts on my desktop machine and almost always keep them off on my Blackberry.  I find I got a lot more done this way.

    2. Checking E-mail Frequently Can Make You Forget To Process E-mail

    I have really enjoyed being able to access e-mail on the go, at home, or even when I’m at the other side of the office.  Even though I have notifications turned off, I still check it from time to time (at a moment of my choosing) to see if I need to respond to anything.  However, I notice that when I glance through my inbox for “actionable e-mails,” I tend to think that a batch of e-mail has already been processed.  This is a problem.

    If I think subconsciously that an e-mail has already been processed simply because it’s marked unread, I may forget to do something important at my desktop computer that I couldn’t do on my mobile phone.  For example, I may get a request from a coworker to e-mail them a report that I had been working on.  Having viewed the e-mail on my phone already, I may skip over the item on my desktop if I’m not purposefully taking the time to process my inbox.

    Processing your inbox (taken in part from David Allen’s Getting Things Done) involves going through your e-mail and filing away items that are reference only and taking action or postponing those that require more work.  Even though I’m alerted of e-mail on the phone, I find that I still have to go back to my inbox on the computer and process e-mail.  I’m always surprised at how often I come across something that I had forgotten about simply because I had read it already on my blackberry.

    3. Are You Connected To The Internet or Chained To It?

    A great speaker and writer, Matthew Kelly, says that technology is supposed to be our slave, but all too often we become its slave.  Naturally, this isn’t limited to just mobile devices (how easy is it to waste time on Twitter, Facebook, and reading blogs?), but mobile devices can have a tendency to really rope us in and keep us from focusing on other important areas of our lives.

    I try to put the phone in a different room before going to bed and keep from checking e-mail for at least an hour when I first get up in the morning.  I really like to spend time in quiet reading and collecting my thoughts.  The days that I do this, I notice I am much more focused throughout the day.

    Pass the IP Address of a User to Silverlight as a Parameter

    In my beginning attempts to learn Silverlight, one of the first ideas for a project was to make a Silverlight video player that could change the source of the video file based on the location of the user.  The goal was to reduce network congestion between the branch offices back to the main office by having the Silverlight client download the media file from their local branch.  I wanted to give all users at the company the same URL to watch the video but the source of the video would actually change depending on the IP address of the user.  This is the problem I had:

    How do I make Silverlight aware of the IP address of the user and then make that data available during the lifecycle of the Silverlight application?

    It turns out that there are quite a few ways to accomplish this task, both in how to make the Silverlight client aware of the user’s IP address as well as how to make the variable accessible during the life of the application.

    Before I go into the solution that I used, here are several resources I used to find my answer:

    Getting the IP Address

    I was a bit surprised to learn that there was no default method in Silverlight to get the IP Address of the current user.  Then I remembered that Silverlight is client technology and accordingly it would need to get the user’s IP address from outside of itself.  The easiest way (that I found) is to let the server that is hosting the application provide the IP address to the Silverlight client at startup.

    If you looked at the answers in my first Stack Overflow question from above, you can see that some of the answers involve using JavaScript to directly modify a control within the Silverlight application.  While this is certainly possible, it seems a little complicated and I don’t want to have to create a control in Silverlight just to hold the IP address.  I found that using simple ASP.NET within the “initParams” parameters of the Silverlight object tag was the easiest method.  The code will look something like this:

    Click to Enlarge

    The “initParams” parameter can be used within the object tag of regular HTML or ASP.NET.  However, since I need the server to communicate the IP address to Silverlight in some way, I’m using ASP.NET (which is on the server) to pass the parameter into “initParams”.

    <param name="initParams"
    value="txtUserIP=<%=Request.UserHostAddress %>,cc=true,m=/relative"/>

    If you were to click “View Source” after the page had loaded, you would see the actual IP address instead of the ASP tags.

    Doing Something With InitParams Data

    After we pass the IP Address into InitParams, we have to do something with the data on the Silverlight side.  My third question on Stack Overflow sought to find the answer to this question, but I found the best answer to be in Tim Heuer’s video on Silverlight.net.

    The only place that InitParams are made available during the application lifecycle is at the application startup.  Specifically, you need to look in the code-behind of your App.xaml file (in my case, it was App.xaml.cs since I was using C#).  The Application_Startup method will look like this:

    Click to Enlarge 

    The InitParams are part of the StartupEventArgs e collection.  If we want to do something with the parameters in the main page, it will be important to insert our code before this.RootVisual = new MainPage();.

    Storing the InitParams in a Resource Dictionary

    While I certainly could create a public variable in my App.xaml.cs class, I liked Tim’s idea of using a resource dictionary.  He shows three different methods in his video demonstration, but the one I liked best was to simply pass the InitParams into the Application Resource Dictionary.  This way, the IP address will be available during the life of the application.

    Click to Enlarge

    A simple foreach loop will help us to add all of the InitParams to the Application’s Resource Dictionary.  You can then get the parameter value from the resource dictionary using App.Current.Resources[“txtUserIP”].ToString();.

    Last Things

    If you’re interested in how to hook up the source of a video to a media player in Silverlight, I recommend checking out the source code for the Silverlight 2 Video Player on Codeplex.  If you look in App.xaml.cs in the source code, you can see how they format a URI to be set as the source for the Media control.  You’ll need to use URI(txtURL, UriKind.RelativeOrAbsolute) if the link is external to your site and URI(txtURL, UriKind.Relative) if the link is in the same site.  The Media control’s source must be a URI, not just a string.

    Also, the source of your media control cannot be a UNC path (e.g. //InternalServer/video.wmv) because Silverlight is sandboxed so that it does not recognize local resources.  If your Silverlight App is hosted in http, then the video must be an http source, and if it’s hosted in https, then the video must be an https source.  I had hoped to be able to simply pull video from a network share at each branch office, but because of this restriction, I would actually have to set up IIS (or some other web server) to host the videos at each site.

    In regards to the IP address of the user, the IP address returned to Silverlight will only extend as far as the site on which it is hosted.  For example, if you run the Silverlight App from within your ASP.NET test hosting server on your local PC, you’ll probably get 127.0.0.1 (I think).  If it’s hosted on an IIS server behind your company’s firewall, you’ll get your internal IP address.  If the Silverlight App is hosted on a public website, you’ll get the user’s public IP address.

    Lastly, make sure you video is encoded properly or else it won’t play in Silverlight.  I recommend using MS Expression Encoder to handle this task.

     

    Learning Software Development and Plato’s Cave

    When I went to the Atlanta Silverlight Meetup Group this past Thursday, I met several people whose college degree (or lack thereof) was completely unrelated to software development.  As someone who is trying to become a “professional” software developer and is beginning the tedious process of learning several new technologies, this discovery was very heartening and caused me to reflect on my own background in philosophy and a connection I made to learning new development technologies.

    Learning software development technologies can be difficult.  It’s as much about culture, language, and the greater community ecosystem as it is about making a bunch of lines of text do cool stuff.  Sometimes it can be really difficult to understand the importance of technology without having an appreciation for where it fits in to the big picture.  The following is a thought experiment to try to help you understand what I mean.

    I took a minute to think of all of the different technologies related to software development that I’ve come across in the past month.  Take a look at the following list at see if you recognize the technology and concepts on this list (in no particular order):

    • ASP
    • ASP.NET
    • .NET
    • ASP.NET MVC
    • MVVM
    • Ruby
    • Ruby on Rails
    • Mono
    • MonoTouch
    • Moonlight
    • Silverlight
    • JavaScript
    • HTML
    • DHTML
    • Java
    • JQuery
    • XAML
    • XML
    • XAP
    • MEF
    • OSLO
    • AJAX
    • DSL
    • C#
    • VB.NET
    • RIA Services
    • Entity Framework
    • WCF
    • CLR
    • OOP
    • Spark
    • Prism

    When looking at that list, how much did you recognize? How many of the pieces can you fit together?  If you are an experienced developer, you were probably able to recognize the terms and automatically recognize how they exist in relation to one another.  For example, you might automatically recognize that “a XAP file is really just a zip file for Silverlight applications” or “JQuery is a library for JavaScript, which is not really related to Java.”  Sure, it’s a diverse list of technology, but you probably have at least a general idea of how the pieces fit together.

    Now try to imagine (or remember) what it is like not to recognize these technologies and how they fit together.  Try, for a moment, to abandon your understanding of what you already know and put yourself in the shoes of someone for whom the term .NET is just another group of letters in a malaise of technological alphabet soup.  Think about what it might feel like to write your next Silverlight application without having a clue of why you would even want to use MVVM.

    In this experiment, you may have found it quite difficult to forget things you have found important and to abandon your understanding of key technologies related to your field.  Besides, you might ask, what’s the point of trying to forget things you’ve already learned?

    That’s a great question, and to get at the answer, bear with me as we take a very brief look at ancient Greek philosophy.  In Plato’s analogy of the cave (from the Republic), the majority of humanity is described as being in a dark, barely lit cave, trying to understand the world by the dim shadows cast on the walls of the cave.  It’s hard to understand the world when all you have to go on is the shadows on the wall.

    Some people, however, find their way out of the cave and “see the light.”  No longer seeing just the shadows, with the light outside of the cave, they get to see the world as it “really is” and now have a better understanding of the world.  This is great! Now what?

    Let’s stop here for a second and make a connection to the world of software development.  The people inside the cave represent people like me.  Some of us are content with where we are and what we know, and some of us are trying to “see the light” so we can understand software better.  Either way, we’re the ones who don’t know why we should go through the trouble of using class modules and objects in our VBA Excel applications.  We don’t know why MVVM will save us time in Silverlight development, and the phrase “separating business logic from the UI” either means nothing or doesn’t seem applicable.

    On the other hand, the people outside the cave know exactly what “ORM” means, have their personal favorite, and know how to use it correctly.  Not only do they know why to use MVVM, but they contribute open source code to an MVVM framework.  Whether in their specialized discipline or in a wide range of products, these developers “get it.”

    Some devs “see the light” while others are still in the cave adding button controls to their boss’s excel report (guilty). Is that all there is to it?  This is where we return to our thought experiment of trying to forget what we know about software development.

    This is where the value of the analogy of the cave really shines.  The philosopher (or developer, I suppose) who is outside of the cave could simply bask in the glory of their own understanding, but to be a true philosopher (errr…developer…), he must go back into the cave and try to convince the great unwashed that they should want to get out of the cave.  He must try to get others to “see the light.”

    The philosopher-developer must not only tell me where to download the latest bits for their technology of choice, they must tell me why I should want these bits in the first place.  The philosopher-developer cannot only give a cool talk at MIX that demonstrates their favorite new tool, they ought to bring me to an understanding of why I should need that tool in the first place.

    The hardest part about helping others to understand why to use such-and-such technology is trying to put yourself in their place, forgetting your assumptions and trying to remember what it feels like not to know.  It’s easy to geek out and get excited with our peers, but it’s exceptionally difficult to remember what is was like to not even know why we would want to be geeking out in the first place.  A person who has donated his or herself to bringing others into the light by meeting them at their level is truly embracing the essence of what it means to be a teacher.

    Here’s an example of what I mean.  I’ve read a few posts trying to explain MVVM.  Almost always, these posts will describe the different pieces of MVVM and how they work together.  That’s great, but what I need to see, as someone who is “inside the cave”, is why MVVM is even important.  Try to forget about the greatness of MVVM for a second and walk me through an example of how I might build a simple application without it.  Get on my level and try to imagine what I would do as I try to solve the problems of building the app.  After you show me how to build an app “the traditional way,” show me how MVVM will actually help me when my boss wants to add a new text block to that data form we just built.  Show me how I would have spent 2 hours making the change my way, and then show me how I would have spent 5 minutes making the change your way.

    I might be kicking and screaming as I spend 8 hours trying to implement your new framework for the first time, but I’ll be grateful for your work after it’s saved my butt for the 50th time because management doesn’t know what they want in the UX of their product.  More importantly, I’ll have actually tried your technology because you took the time to show me why it was important.  In sum, you can yell and scream all you want about how great “the light” is outside of the cave, but until you come into the cave, get on my level, and then drag me out, I’ll never understand why I should want to join you.

    Lastly, I’ll grant that every last blog post and conference talk does not need to be directed at the unenlightened few.  Sometimes you just need to preach to the choir or demo some tools to your community.  I understand that.  However, there are still far too many “Introduction-to-Some-Technology” blog posts that show tools and bits without showing why they are even necessary.  As frequently as new technology is introduced, you can’t always assume that everyone listening to your talk or reading your blog post about the next-big-thing is up to speed on why it is even important.

    The best way to learn is by being taught by someone who wants to get on your level and guide you to a better understanding of the topic at hand.  Any volunteers?

    Notes from the Silverlight Atlanta Firestarter

    UPDATE: A full list of resources from the Silverlight Atlanta Firestarter is up: http://www.silverlightatlanta.net/?p=156

    Here are a few quick notes that I took during the Silverlight Atlanta Firstarter.   I didn’t even attempt to take comprehensive notes, but I did jot down a few things that I found interesting.  These are more for my reference than anything else.  You won’t find a lot of content for each talk, but you’ll find a few things that I found important and worth jotting down.

    At the very least, I put links to everyone’s blog or home page if I could find it.  That way you can easily look up the person if you’re interested.

    Overall Impressions

    Overall, the event was great.  I’m very thankful to all of the volunteers and sponsors who helped put it together.  I’m really excited about continuing my “getting started” efforts in Silverlight and am looking forward to future meetups and events.

    Though they introduced a very large amount of information, it was generally presented very well and served as an excellent broad introduction to Silverlight.

    Introductions

    • Corey Schuman emceed the event and introduced the speakers.  Great job!
    • Glenn Gordon was present as the “Developer Evangelist” from Microsoft.  He brings free Microsoft events, resources, and information to developers in the Southeast.  Cool.

    Keynote: Tim Heuer

    Tim Heuer is a program manager for Silverlight at Microsoft.

    • Tim doesn’t have a CS degree – I found this encouraging because I do not have a CS degree, but I want to get involved in web development
    • Apparently, Silverlight is really big with Yahoo! Japan.
    • Tim mentioned Kevin Dente on TwitterCan’t remember why.
      • Update: Tim has been a guest on Kevin Dente’s podcast, “Herding Code,” which Tim recommended listening to.  Thanks Alan for the reminder!
    • Search: Super Employee Alfred – A really cool example of SEO and Deep Link functionality within SL.

    Silverlight Soup to Nuts: Shawn Wildermuth

    I really wanted to pronounce his last name “Vildermuth.” Shawn Wildermuth did the talk on “Silverlight Soup to Nuts.” (For the record, his rotating profile picture on his blog is freaky as hell).

    • Silverlight-tour.com – A national tour for agilitrain giving workshops and classes about all the new stuff in Silverlight 3.
    • With XAML, you can name only the elements you want to appear in IntelliSense.  This reduces the clutter (such as label3,label20421,etc.) of having everything named.
    • Rock Scroll – Visual Studio Plugin – this is a cool plugin that Shawn had installed on his computer that puts a top-down look at all your code directly into the vertical scroll bar.  Plugin is written (or published) by Scott Hanselman of Microsoft.
    • Ctrl K + Ctrl D – used to format code in Visual Studio (if you needed a hint that I’m brand new to developing apps in VS, here it is)
    • SLExtensions – Because no one should have to write their own converters.  Silverlight Contrib and Silverlight Extensions recently merged.
    • this.OnPropertyChanged(“Name”); – can’t remember why I wrote this down

    Anatomy of a Silverlight App: Tim Heuer

    Tim’s back.

    • Silverlight Tools
      • Minimum
        • Silverlight Developer Runtime
        • SDK
      • Recommended
        • Visual Studio 2008 SP1 (you can even use the free Visual Web Developer)
        • Visual Studio Tools for Silverlight
        • Expression Blend 3
        • Expression Encoder 3
        • See http://silverlight.net/GetStarted
    • Somebody asked how you can get MS software other than retail – When applicable: Microsoft Action Pack, StudentSpark? (A program that gives students free access to developer software), BizSpark (a program that gives start-up free developer software)
    • DaFont.com – a place to get free fonts
    • Fonts must be embedded as a resource – please respect the usage rights of the font developers
    • Loaded += new … – Some events belong in the Loaded section, for after the UI has loaded.
    • .xap file is really just a zip file and contains:
      • appmanifest.xml
      • assemplies
        • your app
        • dependencies
      • content
    • Install Experience – See whitepaper for best practices.  See post on Tim’s blog.

    Data Services: Rik Robinson and Steve Porter

    Rik Robinson presented on Data Binding

    • {Binding …} – This is used in XAML to bind data to a XAML element.

    Steve Porter also presented.

    Note: At some point Chad Brooks was introduced.  He’s an Architect Evangelist from Microsoft.  He can be reached at Chad < dawt > Brooks < at > Microsoft < dawt > com.

    Lighting up the UI: Mason Brown and Roger Peters

    I can’t remember exactly who presented what from my notes, but Mason Brown did more of the graphics side and Roger Peters did more of the development side.

    • “Design Width” in Blend is only for design time and doesn’t interfere with the actual end presentation.
    • You can double click on a control from the left panel in Blend to easily add it to your UI with minimal code clutter.

    It was hard to take notes on a lot of this stuff because it was so visually intensive in Blend.  I really liked the explanation of behaviors, though.

    Update: A demo of the UI they wrote here.

    Outside the Plugin: Jason Rainwater

    Jason Rainwater presented on using SL 3 to interact with the browser and vice versa.  Very cool stuff.

    He mentioned checking out SL 3 resources on MSDN.  I had trouble finding a link to that other than what directs to Silverlight.net.

    Note: During one of the breaks, I was talking to someone whomentioned SubSonic as a possible way to interface MySQL with Silverlight and/or WCF.  I’m going to have to check that out.

    Media: Corey Schuman

    Corey Schuman presented on media in Silverlight.  This was a great introduction to media in Silverlight.  It’s incredible how easy it is to create a media player in Silverlight.

    Sketch Flow – Rob Zelt

    Rob Zelt spoke about SkitchFlow.  It was really neat to see an in-depth look at this new tool that comes with Blend 3 and SL3.  Great job.

    Deployment Strategies – Sergey Barskiy

    Sergey Barskiy talked about setting up a successful Silverlight deployment.  He also has a really cool accent.

    • WCF diagnostics
    • system.diagnostics.xmlWriterTraceListener

    He didn’t get a chance to go over localization and reporting (I really wanted to see reporting), but he put a follow-up post on his blog for those interested in those technologies.

    Community and Ecosystem – James Ashley

    James Ashley presented on the Silverlight ecosystem and all of the wonderful communities and resources available to help a programmer succeed in Silverlight.

    I would type out my notes from his talk, but he managed to quickly post the content onto his blog.

    Sidenote: His use of the word “phenomenology” in his blog subtitle is the only direct opportunity I’ve had to apply my degree in philosophy since starting learning Silverlight.  Well done.

    Last Things

    Death. Judgment. Heaven. Hell.  … err … I need to finish this post…

    Shawn mentioned DevCow.com as a way to connect with other developers in the Atlanta area.

    Thanks again to everyone for all their hard work!  I have so many wonderful ideas.