Jeff Blankenburg is a passionate technologist with a wide range of interests.
This website is dedicated to discussing the ideas that pass through his head.

The main header for this website was created using Microsoft Silverlight.
Install it to see what you're missing!

Get Silverlight to see the whole site!

Tag! You're It! (A New App For Your Phone)

Thursday, February 05, 2009

I recently discovered Microsoft Tag, and my mind is running with the possibilities is presents. Let me start first, however, by telling you what Tag is.

What Is Microsoft Tag?

At first, I thought it was something similar to a UPC symbol, but after further investigation, I'm realizing the power this technology has. In short, the image to the left is a "tag." It's specifically designed for one single purpose: connecting the "real world" to the online world. And all it uses is the tiny camera on your cell phone. I'm not even just talking Windows Mobile phones here...this application is also available for iPhone, J2ME, Blackberry, and Symbian S60 phones. Go to http://gettag.mobi to get it on your phone now.

This can include providing more information about a product in text, a person's business card, a website, or even a phone number for you to dial. Imagine walking through your favorite store (Best Buy, in my case) and just scanning the products you want, with your phone. They could immediately be compiled into a wish list that you could send to your family for the holidays. Pretty cool stuff.

Do me a favor. Go here on your phone: http://gettag.mobi. Install the program, and then let me walk you through a few more scenarios I'm imagining. It will make the story FAR more compelling if you can try it.

Retail sales enhancement

One of the big challenges that retailers face is keeping products in stock. In the case of a clothing retailer, they've also got sizes to contend with. So, as a consumer, what do you do when they don't have your size?

You might ask the clerk if they have any more XLs.

You might ask them to check another store.

You might just leave, and not get that really cool t-shirt.

Retailers have identified this as a problem, and have tried to find solutions to it. Some stores have a computer terminal which lets you order from their online store, but this requires the store to have Internet access, and a working computer. Others will call another store and hold it for you, but that requires you to drive across town to another location. And then there's the time-honored tradition of rain checks, but as a consumer, who wants to HAVE to come back to the store?

What if, instead of all that hassle, they put Tags next to each of their products in their store. If they are out of stock, the consumer can just scan the Tag, and immediately get taken to a web page that provides a simple checkout process. They already know the product you want. Shipping is free, because you did it from the store. Just give them your address, your credit card, and you're done. It shows up at your house a few days later.

For example, if Best Buy would create a Tag for every product they sell, they could make life much easier for their shoppers. Let's say that Windows Vista is selling SO WELL (go with me here...), that they are out of stock. If the Tag that I placed in the picture were on the shelf, I could just scan it, and order online from my phone. (Scan the Tag...it works!)



Conference Badge Enhancement

When you go to a conference, the first thing they give you is a badge. It has your name, the company you work for, and lately, your Twitter name on it. But it's just words on paper. If I want to follow you on Twitter, for example, I still need to write down your handle, or type it in my phone. And that doesn't give me your email address, phone numbers, websites, etc. I'd have to get those separately.

What if, on your badge, was a personalized Tag that provided people with all of the information you wanted to give them. When you met someone, they could just point their phone's camera at your badge and immediately capture your contact information. Here's an example badge from Codemash 2009.



Bathroom Graffiti Simplicity

Instead of carrying a Sharpie around to tell horrible stories about your ex, why not make stickers of a Tag, and plaster those up in the bathroom instead? (Or get really good at drawing triangles.) When someone scans it with their phone, their phone prompts them to make a call to the number you specified.. This allows you to change your bathroom graffiti all over town with a few clicks of a mouse, as well. Updating the record on the Tag website changes where these Tags take you.



Business Card Enhancement

In a very similar way to the Conference Badge concept, you could put a Tag on your business card that would provide the recipient with a vCard immediately on their phone. No need to take it home and type the info in, they've already got it. Think of the cards you could save by letting someone scan one rather than giving it away. Now you're saving trees! Remember, you should have personalized business cards anyways...

Assembly Line Efficiency

Many assembly lines are challenged by keeping enough of the appropriate parts at the appropriate stations (we'll use bolts in this example). You don't want overstock, because there's not enough room at the line itself. You also don't want too few, however, because if you run out, the line has to stop, and productivity halts. How things work today, someone usually makes a call to the stock room to replenish the supply of bolts.

What if, instead, there were a set of Tags on the wall. Each tag redirected the user to a webpage that alerted the stock room of the need at Station #7. The worker can then go back to work, and the stock room team can get to moving the supplies to the right place. Most warehouse and assembly line environments require some sort of mobile device, primarily because of their size. It becomes increasingly difficult to find someone if they are roaming through 100,000 square feet of open space.

Concert Enhancement

Imagine going to a concert of your favorite band, and during the show, they play one of their brand new songs. Then, on one of the big screens they have at the venue, they show a Tag. When you point your phone at that Tag (you were already using it like a lighter, admit it), a recording of that new song is downloaded to your phone. (Scan it...these Tags all really work!)



Scavenger Hunt

In my final idea, I was thinking about how Tags could be used for a group adventure. Imagine creating a set of Tags that were then printed out as stickers. Probably something on the smaller side. I'm thinking maybe postage stamp size. Now, fast-forward to the next conference you're attending. The organizers point to an easel during the keynote, on which only a Tag is printed. Those that scan it are shown a hint about the location of the next Tag. Perhaps it's hidden in one of the conference rooms. Perhaps it's printed in your program on page 17. But there's more.

Each of these tags can also be password protected. So instead of just providing a hint, you can also prompt them to figure out what the next password is. Now, we've got ourselves a scavenger hunt. Maybe the next tag is on someONE. And they know the password to the next level. The possibilities are endless. And if you live out my way, don't be surprised to see this happen at an upcoming conference near you...



This tag works (as do the rest of them), but it's not real. Contacting me about it will only result in mockery and shame. :)

Summary

In short, the possibilities for Tagging things are limitless. I've had some conversations with folks this week, and ideas were just popping out of them as we talked. I didn't even have these nice visuals to help my story along...

Where do you see this technology being used? What businesses would most benefit from something like this? Do you think YOUR business could use it? To get started...create your own Tags at http://www.microsoft.com/tag.

kick it on DotNetKicks.com

Labels: , , , , ,

posted by Jeff Blankenburg, 2:23 PM | link | 6 comments |

MDC = Mighty Darn Cool (great video enclosed)

Friday, January 16, 2009

I've been talking about MDC at user groups, Codemash, and plenty of other places, but it's time I talk about it here too.

The MSDN Developer Conference is coming to Detroit, MI on January 22. Yes. Next Thursday. How have you not registered for this yet?

PDC content, in your backyard, for 99 dollars? I'm disappointed in you. Seriously. You will walk out of this full day event, not only with a DVD copy of Windows 7 Beta, but with knowledge and information that you can be using TODAY on your software projects.

Andy Erickson recently attended the MDC event in Atlanta, and took his video camera with him. Take the time to watch this video. Is should be all of the convincing you need.

Labels: , , ,

posted by Jeff Blankenburg, 4:41 PM | link | 1 comments |

10 Reasons The Zune Beats The iPod. Seriously.

Monday, November 24, 2008

Every time I show people my Zune, they're intrigued. Perhaps they've never heard of it. Most don't even realize it's made by Microsoft. Few have ever seen one. So with the shopping holidays right around the corner, I wanted to make sure that everyone has the information they need to make the best decision. The Zune really is a better choice.

1) The Zune Pass

This is, by far, the single greatest reason to get in on the Zune Social. A song from the iTunes store costs 99 cents. Let's call it $1 for simplicity. Get 15 songs this month? That's gonna cost you $15. What if you could take that same $15, and instead have access to ALL the music? That's Zune Pass.

The Zune Pass is a subscription service that allows you to download all of the music you want for a $15 monthly fee. And here's the best part: each month, you get to pick 10 songs to keep FOREVER. In the iPod world, you can get 10 songs for $10, but you can't download thousands of other songs for $5 more.

In case that's not enough...you can use ONE Zune Pass to fill THREE Zunes. So you and your two children/siblings/parents/friends/roommates/strangers/colleagues can now get all the music you can listen to for $5 per person. You'll just have to fight over the 10 songs you're going to keep every month.

2) No Generational Gaps

Have an old iPod? I don't mean the oldest one, I mean anything but the newest one. Ever crave some of the new features? Wouldn't it be nice if Apple would update your iPod's firmware to do some of the neat things the new ones do? That's not going to happen. They're counting on you buying the next one too. That's how you sell millions of devices each year. Just get your customers to buy a new one. Again.

The first Zune to be released was the Zune 30. Today, there's also 4GB, 8GB, 16GB, 80GB, and 120GB models. But the great part of each new release is that the firmware is updated on ALL of them. Including the Zune 30. It has all of the features of the newest Zunes, and will continue to be upgraded as new software features are added. There's no such thing as an "old" Zune.

3) Price

For all of my comparisons here, I am using the prices at zune.net and ipod.com. Retailers will probably have sales, but the device's site will be official record. I am also only comparing similar models by size. There is an iPod Shuffle in 1GB ($49) and 2GB ($69) sizes, and a Zune 4GB ($99) and 80GB ($229) that do not have comparable models. In every case, the Zune is cheaper, with more features, and is forward-compatible with new versions. The iPod costs more, does less, and does not receive upgrades in the future.


8GB Models
2,000 songs | 25 hours of video
Zune 8GB ($139)
iPod Nano 8GB ($149)


16GB Models
4,000 songs | 50 hours of video
Zune 16GB ($179)
iPod Nano 8GB ($199)


120GB Models
30,000 songs | 375 hours of video
Zune 120GB ($249)
iPod Classic ($249)

4) Wireless Sharing

Microsoft Zune - SharingSome call it "squirting," because you can "squirt" a song over to someone else's Zune. This feature not only allows you to detect other Zunes in your vicinity, but also send songs from your device to the other one. The recipient can then listen to the song 3 times over 3 days before it goes away. This same technology also allows you to play games (like Texas Hold'em) with the other Zuneheads in the room.

This feature also allows you to see what other people are listening to, so you can find recommendations for yourself in the Zune Marketplace.

5) Wireless Sync

All of these devices are still dependent on using a computer as well. You've got to plug your device into the computer with all of your music in order to get new songs, podcasts, audiobooks, etc. With the Zune though, as long as it is charging, it can get your new stuff. Leave it plugged in your car's power outlet. Charge it in the kitchen. Set it in the dock near your stereo. It will use your wireless network to get everything you've added to your collection since the last time you synced up.



 

6) Wireless Shopping

Ever been sitting in a coffee shop with your device, and wish you could just get that song your friend told you about? Instead of writing it down, sending yourself an email, etc. and getting it later? The Zune Marketplace is completely available on your device when you've got access to a wireless network. And McDonald's has made their internet access free to Zune users. So just look up that song, and add it to your cart. It'll be on your device in a few seconds, ready to play.

In addition, you can go out and get the latest podcasts, audiobooks, etc. that you may not have had time to get and synchronize the last time you were home. This makes it even easier for you to get the content you want, when you want it.



 

7) Customization

Sure, engraving is all the rage. You've got this gorgeous, expensive device, surely you want to make sure everyone knows it's yours. But text just isn't enough. In addition to the cool face I put on mine, there's about 75 other designs to choose from. But if you just want text, you can do that too. One other thing (that might only be important to me), the iPod has a shorter character limit than the Zune. So those of us with long names (or URLs) might not get them to fit. The 'm' in my .com wasn't allowed.



8) FM Radio

Sometimes, we just want to listen to the radio. Or the TVs at the gym. Being able to tune in to the local radio stations is a big plus. Even with thousands of songs at our fingertips, sometimes they get mundane.

Now let's say you hear a song that you don't know. And it's good. Just click the "Add to Cart" button, and you can have it. (And if you have the Zune Pass, you don't even have to pay for it.) If you're in a wireless hotspot, you can even download it right away! It takes the RDS data from the radio station and finds that track in the Zune Marketplace. Easy.







 

9) Xbox 360 Compatibility

One of my favorite features of the Zune world is its compatibility with my Xbox 360. I can use the music on my Zune to replace the in-game music from a game. The game makers generally choose good music, but sometimes it just gets old to hear the same 5 or 6 tracks OVER and OVER. If I can use the thousands of songs on my Zune instead, why shouldn't I? I can even use my Xbox controller to change the songs once the Zune is plugged in.

In addition, the points that I use to buy games from Xbox Live Arcade, movies from the Xbox Marketplace, etc. are the same points I use to buy stuff from the Zune Marketplace. And my usernames, login information, profile info, etc. are all linked. Very cool.







 

10) You can create your own games for it.

This is a blog for software developers, and I need to make sure there's something in this post for you. Using XNA (the same .NET technologies for building games for the Xbox 360), you can create games for the Zune as well.

You just need XNA Game Studio 3.0 CTP and the Zune software. There's even a sample game for you to download and toy around with the code. Here's a link to the project files.







 

11) Free television and movies.

[UPDATED] I'm not sure how I missed this originally, but this is a major point that needs to be added. If you are running Windows Media Center (if you're running Vista Home Premium or higher, you are), you can record live television to your hard drive. Those files can be synced to your Zune as well, making your Zune a place to watch all of your favorite TV shows and movies, for free. I find that I record shows that I don't have time to watch during the week, but that provide plenty of entertainment on an airplane, or shows where the audio is plenty for while I am driving. Sometimes podcasts just aren't what I'm in the mood for. So there you go. A bonus eleventh point!

Overall, I see the Zune as the choice for more features for the same or less price. Add that to the Zune Pass, and you've got something amazing: a feature-rich device with all the music you can handle. And because of the forethought spent to decide on a hardware platform, there will be plenty of new surprises coming in the future, without the need for another purchase. I'm looking forward to it.

The iPod is a good device. I'm not saying it isn't. Clearly, as everyone seems to have had an iPod at one time, they are popular. But being popular just because you're popular isn't enough. Some of this innovation will certainly be copied, just as some of the things the Zune does were certainly inspired by Apple. But after reading this post, if you don't agree that today's Zune is the superior device, I'd love to hear your side. Please leave me your comments.

Labels: , , , ,

posted by Jeff Blankenburg, 8:33 AM | link | 102 comments |

TUTORIAL #10: Running a PowerPoint Slideshow From Your Windows Mobile Phone

Wednesday, November 19, 2008

During the recent .NET University, I had my first iPhone envy. Leon Gersing was giving a presentation on the basics of OOP (which was excellent), and I noticed that he was carrying around his iPhone while he talked.

On closer inspection, he was actually using his iPhone as his presentation clicker. He was able to move forward and backward in his presentation, and his phone was actually displaying his speaker notes in his hand! How cool is that?

Frustrated, I was convinced that there must be a way to do this on a Windows Mobile phone. I have given plenty of presentations that sing the praises of my WM6 phone, and have even compiled a list of the things I have used it for in a specific week.



So, you'll notice that "Run a Powerpoint presentation" is not on my list. But today, I have to edit that slide. Here's how you can do it too:

1) Download Windows SideShow for Windows Mobile

Get the files here. This is the first piece of all of this. Windows SideShow is a new technology that delivers information from your PC to a secondary display on two kinds of devices: those that are integrated into a computer, such as a small color display in a laptop lid; and those that are separate from a computer, such as a remote control or mobile phone. With this additional display you can view important information whether your laptop is on, off, or in sleep mode.

2) Install the .CAB file on your phone.

There is an excellent help file in the files you just downloaded, and I will leave it to you to make sure that you get this software installed on your phone. If you're still running Windows Mobile 5, make sure that you get the .NET Compact Framework installed on your phone as well (the installer is also included, for your convenience.)

3) Create a Bluetooth connection to your phone from your Vista PC.

Yes, if I didn't mention it, SideShow is a feature of Windows Vista. This will not work in Windows XP. My apologies. To create the Bluetooth connection, here's the steps:
  1. On your PC, go to Control Panel > Hardware and Sound > Bluetooth devices > Set up a Bluetooth enabled device
  2. On your phone, open your Start menu, choose Bluetooth, and then choose Bluetooth Manager.
  3. Make sure the status is set to "Bluetooth ON", that you have a name for your device that you like (mine is blankenq for my Motorola Q9c), and that the checkbox reading "Allow other Bluetooth devices to see this phone" is checked.
  4. Back on your PC, click the "Add..." button on the Devices tab.
  5. Check the box that reads "My device is set up and ready to be found.", and click Next.
  6. It will search for available Bluetooth devices, and eventually show you a list. Choose the device that has the name you used when you set up your phone, and click Next.
  7. Next, it will ask you "Do you need a passkey to access your device?" The answer is YES. Yes, you do. I prefer using the choice: "Let me choose my own passkey." Then enter a passkey from 8-16 digits long. Remember what you typed, and then click Next.
  8. Look at your phone. It should now be asking you to enter that passkey again. Enter it in the box, and click Accept.
  9. Your PC will then install some device drivers, and you're off and running. Your phone is now paired with your PC!
  10. Click Finish, and you can exit your way though the rest of the Control Panel.

4) Install the Office PowerPoint Remote Gadget

Get the files here.This is the actual "gadget" that you can run in Windows SideShow. This is what you use to manipulate your Powerpoint presentations. To make your life easy, check the box that reads, "Open Windows SideShow in Control Panel when I click Finish." If you forget the box, open the Control Panel, and choose Programs > Windows SideShow. In here, you should see 4 boxes available for checking. Your email, your calendar, Powerpoint, and Windows Media Player. The three that aren't Powerpoint come with SideShow by default. This will allow you to see your email, view your calendar, control Windows Media Player, and run Powerpoint presentations from your PC, even if it is sleeping. Cool, huh? Check the boxes you want access to.

5) Take a look at your Home screen on your phone.

You should now see a new item in your Home screen. This is the Windows SideShow section, and it is how you get to the applications available to you in Windows SideShow. Fire up a PowerPoint presentation on your PC, and it will show up in the PowerPoint remote menu. You can start the slideshow, move from one slide to the next, and the speaker notes for each slide are even shown on your phone's screen!

Eat that, Mr. Gersing. :)

kick it on DotNetKicks.com

Labels: , , , , ,

posted by Jeff Blankenburg, 4:42 PM | link | 5 comments |

TUTORIAL #9: Embedding Fonts In Silverlight 2

Monday, November 10, 2008

Many times when I am creating a Silverlight application, I'm not happy using the default 10 fonts that are part of Silverlight. I've got hundreds of other fonts on my machine that make more sense, but then I need that font on every user's machine that visits my site. Thankfully, Silverlight makes that easy for me.

1) Add a TextBlock to your XAML.


<TextBlock Width="100" Height="100" Text="Jeff Blankenburg"></TextBlock>

2) Add your font to the project.

In Expression Blend and in Visual Studio, this is pretty easy. Right click on your Silverlight project, and choose "Add Existing Item..." From there navigate to your Fonts folder (or where ever you're keeping fonts these days), which in Windows Vista is found at c:\windows\fonts\. Choose the TrueType font you wish to use (that's any font file with a .TTF extension), and add it to your project.

3) Understand what we're actually doing.

In Visual Studio, click on your new font file in your project. In the properties window, one of the items in the list is "Build Action." Make sure that this is set to "Resource." It should be set to that by default, but confirming it never hurts. What we're doing is telling the application that this is a resource that we will need access to when the application runs. Since Silverlight applications run on the client machine, it will be packed inside your .XAP file for the trip across the Internet.

4) Apply your font to your textblock.

You may have noticed, if you were working ahead, that applying a font to your textblock is simple. In Studio, you can just type in the property FontFamily for the TextBlock, and specify the font you want to use. However, the preview window will only respond for the 10 fonts that are native to Silverlight. These are: Arial, Comic Sans, Courier New, Georgia, Lucida Sans Unicode, Portable User Interface, Times New Roman, Trebuchet MS, Verdana, and Webdings.
<TextBlock Width="100" Height="100" Text="Jeff Blankenburg" FontFamily="Times New Roman"></TextBlock>
In Expression Blend, you get a nice dropdown to choose your fonts from. They even have a nice icon system to show you which fonts are actually available. The default fonts have an A with the Silverlight logo next to them, and the new font we have added has an application icon with an A over it. Fonts without an icon need to be included (using this process) before they can be used. You CAN use them, but that font will not be shown on any machine that does not have that font installed.



Here's the tricky part of using a foreign font. We don't just get to reference the name of this font. There's a unique syntax for making sure we get this correct. A font actually has two names: the name of the .ttf file, and the actual name of the font. We will need to know both of these. In my example, I am using the font "Calibri." So in order to use that font, I need my FontFamily property to look like the following line:

<TextBlock Width="100" Height="100" Text="Jeff Blankenburg" FontFamily="calibri.ttf#Calibri"></TextBlock>


What I have done is tell Silverlight that I want my font to come from the file named calibri.ttf, and I want the font from that file named Calibri.

That's all it takes! You should now be able to see that font rendered in the Visual Studio preview pane, as well as Expression Blend and our running application. Just remember that we need to package these external fonts into our application, and then we have to use this alternate syntax to point directly to the font.

I hope this helps you get past the hurdle of using the same 10 fonts over and over and over. Please let me know how this helps you!

kick it on DotNetKicks.com

Labels: , , , , ,

posted by Jeff Blankenburg, 2:23 PM | link | 2 comments |

MSNBC Election Predictions - The Contest

Tuesday, October 28, 2008

With the election of the next United States president looming before us, I thought it would be fun to have a contest to see who can predict the correct outcome.

There's a great WPF application available to help us do just that, too. You can see Chuck Todd use it on a Microsoft Surface device here.

So, if you're interested, you can go download that application to your desktop (Windows only, sorry), and create your own prediction map. You can then export your predictions to an XML file, and send them to me via email (jeffrey.blankenburg@microsoft.com). Please name your XML file <<YourName>>.xml.

The top 5 closest predictions will win a prize, and the top prize will be a Zune 8 media player. The other 4 winners will receive their choice of either Windows Vista Ultimate or Visual Studio 2008. "Closest" is defined by the number of states you predicted correctly, not the total number of electoral votes.

To use the application,
  • Click on a candidate, making it active.
  • Click on a state. It will turn the color of the selected candidate.
  • If you click a state a second time, it will turn lighter, meaning the state is "leaning" that candidate's direction. A third time will take it back to gray.
  • Click "Save Predictions" to save your choices as XML. Use your name as the file name.


kick it on DotNetKicks.com


OFFICIAL CONTEST RULES
Agreement to Official Rules: Participation in the contest constitutes entrant's full and unconditional agreement to and acceptance of these Official Contest Rules and the decisions of Jeff Blankenburg, which are final and binding. Winning a prize is contingent upon fulfilling all requirements set forth herein.
Eligibility: This Sweepstakes is open to any Microsoft employee or intern; however, any person directly involved in the development or execution of this contest is ineligible to enter.
Entry Period: This Sweepstakes will end on November 3th 2008 at 11:59 PM EST. Any entries recieved after this time will not be counted.
Judging: On or about November 4, 2008, Jeff Blankenburg will evaluate the entries. The decisions of the Judges are final. The odds of winning depend on the relative performance of all entrants and the number of eligible entries received. If a potential winner cannot be contacted within three (3) days after the first attempt to contact him/her, Jeff Blankenburg may select an alternate potential winner in his/her place at random from the remaining entries.
Prizes: Zune 8, Vista Ultimate, VS 2008. Prizes are not transferable or refundable and must be accepted as awarded. No cash or other substitution may be made, except by Jeff Blankenburg, who reserves the right to substitute a prize (or component thereof) with another prize (or component thereof) of equal or greater value if the prize is not available for any reason.
General Conditions: If a selected winner cannot be contacted, is ineligible, or fails to claim a prize within a reasonable amount of time, they will forfeit the prize and an alternate winner will be selected. In the event of a dispute the decisions of Jeff Blankenburg are final. By entering, participants release and hold harmless Jeff Blankenburg, Microsoft its subsidiaries, affiliates, directors, officers, employees and agents from any and all liability or injuries, loss or damage of any kind arising from or in connection with this Sweepstakes or the use of any prize won. Acceptance of the prize constitutes permission for Jeff Blankenburg to use winner's name and likeness for advertising and promotional purposes without additional compensation unless prohibited by law. By entering this Sweepstakes, you signify your acceptance of these Official Rules. All federal, state, and local laws and regulations apply. Void where prohibited by law. The winner is responsible for any and all other costs and expenses not listed above. Prizes may be reported as income to a winner and the winner will be responsible for all taxes associated with the receipt of a prize.

Labels: , , , ,

posted by Jeff Blankenburg, 10:07 AM | link | 0 comments |

TUTORIAL #8: Creating An AutoComplete TextBox With AJAX

Monday, October 27, 2008

There's this incredible resource in the AJAX Control Toolkit, and it's about time we started using it. Today I am going to talk about the AutoComplete Extender, and how simple it is to rig up to an existing ASMX web service. As usual, I will provide the code at the end of this post in both C# and VB.NET. Let's start at the beginning:

1) Create a new web site.



2) Create a new ASMX web service.

Right-click on the project, and choose "Add New Item..." From the dialog box, choose Web Service, and name the service NCAA.asmx (I'll explain the name later.) Also, for our demo, we're going to leave the code in one single file. Uncheck the "Place code in a seperate file" box.


3) Write a quick web method.

We'll be making this more complicated later, but for now, we're going to write a simple web service that is meant for the AutoComplete Extender. For this control, our method must have this signature:
public string[] GetTeamList(string text)
So for now, here's the full code to put inside your ASMX file:
using System;
using System.Collections;
using System.Configuration;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;


namespace AutoComplete
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class ncaa : System.Web.Services.WebService
{
[WebMethod]
public string[] getTeamList(string prefixText)
{
string[] teamName = new String[6];
teamName[0] = "Bowling Green State University";
teamName[1] = "Ohio State University";
teamName[2] = "Ohio University";
teamName[3] = "Cleveland State University";
teamName[4] = "University of Cincinnati";
teamName[5] = "University of Dayton";
return teamName;
}
}
}


4) We should verify our web service works.

Right click on your ASMX file, and choose "View in Browser." Clicking on the method name, GetTeamList, will ask you for a "prefixText" value. That value isn't used yet, so just click the Invoke button to see our list of colleges returned in XML.


5) Now we need add a textbox.

We're actually going to add a few things to our Default.aspx page, but the first thing to do is add a standard TextBox control to the page. You should be able to grab that from your toolbox. The other things to add require a potential download first. I'll show you the completed HTML after step #9.


6) Get the ASP.NET AJAX Library.

You only need to do this if you're not using the ASP.NET 3.5 framework. Here is the link to the AJAX library downloads.


7) Get the AJAX Control Toolkit.

The control toolkit is an open source project on CodePlex, and you can download it here. Unless you're really interested in contributing/taking it apart, all you really need is the link to the DLL Only. Save that to your computer, and then you need to add it to your Toolbox.


8) Add it to your VS Toolbox.

Here's the quick way to get those new controls and extenders into your Visual Studio toolbox:
  1. Pin out your toolbox by clicking on the pushpin icon at the top.
  2. Right-click on the toolbox and choose "Add Tab"
  3. Give it a name like "AJAX Control Toolkit."
  4. Drag the toolkit .DLL file from your computer to the new tab you created.
  5. You should now see your new controls in your toolbox.


9) Add our AJAX elements to the page.

Now we need to add an AJAX ScriptManager and a new AutoCompleteExtender to our page. You can either type them, or just drag them from your toolbox. Here's what your Default.aspx file should look now:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AutoComplete._Default" %>
<%
@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<
html xmlns="http://www.w3.org/1999/xhtml" >
<
head runat="server">
<
title>Jeff Blankenburg | AutoCompleteExtender</title>
<
link href="style.css" rel="stylesheet" type="text/css" />
</
head>
<
body>
<
form id="form1" runat="server">
<
div>
<
asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<
asp:TextBox ID="collegeteam" runat="server"></asp:TextBox>
<
cc1:AutoCompleteExtender ID="collegeteamextender" runat="server" ServicePath="ncaa.asmx" ServiceMethod="getTeamList" MinimumPrefixLength="3" CompletionSetCount="10" TargetControlID="collegeteam">
</
cc1:AutoCompleteExtender>
</
div>
</
form>
</
body>
</
html>


10) Some explanation for the HTML...

You'll notice that I added some properties to the controls that are on our page, so let me explain what they are.
  • Service Path - this is the web service that we are going to call
  • Service Method - this is the method in that web service that we are calling.
  • Minimum Prefix Length - this is the number of characters a user must enter before the extender will start calling the web service. If you've got thousands or millions of possible return values, I'd make this 3 or 4, at a minimum.
  • Completion Set Count - this forces the control to only show a specific number of results (you need to modify your web service for this to work).


11) Run the web site.

At this point, we should have a fully functional AutoComplete extender. You can run the site to check it out. Just start typing in the textbox to see what happens. But we're pulling back a static list of data. That's not very interesting at all. I want to do something realistic with this functionality.

12) Web Service += Usefulness

The reason that I called my web service NCAA is because I want to allow my users to choose from a list of colleges as they are typing. The first thing we'll need then, is a database of colleges. Here's my database of all of the Division I schools, with their names, mascots, and hex colors. Now we need to modify our web service so that we're pulling results out of the database based on our text typed in the TextBox. Here's my new web service code (you can just copy and paste over the old stuff.)

using System;
using System.Collections;
using System.Configuration;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;


namespace AutoComplete
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class ncaa : System.Web.Services.WebService
{
[WebMethod]
public string[] getTeamList(string prefixText)
{
DataSet teams = new DataSet();
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
string sql = "SELECT team_name FROM team WHERE team_name LIKE '" + prefixText + "%'";
SqlCommand sqlCmd = new SqlCommand(sql, conn);
conn.Open();
SqlDataAdapter sqlAdpt = new SqlDataAdapter();
sqlAdpt.SelectCommand = sqlCmd;
sqlAdpt.Fill(teams);
string[] teamName = new String[teams.Tables[0].Rows.Count];
int i = 0;
try
{
foreach (DataRow row in teams.Tables[0].Rows)
{
teamName.SetValue(row["team_name"].ToString(), i);
i++;
}
}
catch { }
finally
{
conn.Close();
}
return teamName;
}
}
}


You'll notice that without modifying our .aspx file, we can completely update the functionality behind our web service. This seperation can be invaluable when building applications from web services, because you don't want a change in one thing to potentially break another.

13) What about that CompletionSetCount?

So I mentioned earlier that you can set the number of results you want returned so that you don't end up with a huge, unmanageable list. This will require a small change to your web service, but nothing significant. Without these changes, your CompletionSetCount value will just be ignored. The first change is that we need to receive a second parameter (an integer) in our WebMethod. That's right, the extender just sends it as a second parameter to your method. The second change, then, is just to modify your method to utilize that value. Here's my final web service source code, using this added feature:

using System;
using System.Collections;
using System.Configuration;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;


namespace AutoComplete
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class ncaa : System.Web.Services.WebService
{
[WebMethod]
public string[] getTeamList(string prefixText, int count)
{
DataSet teams = new DataSet();
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
string sql = "SELECT TOP " + count + " team_name FROM team WHERE team_name LIKE '" + prefixText + "%'";
SqlCommand sqlCmd = new SqlCommand(sql, conn);
conn.Open();
SqlDataAdapter sqlAdpt = new SqlDataAdapter();
sqlAdpt.SelectCommand = sqlCmd;
sqlAdpt.Fill(teams);
string[] teamName = new String[teams.Tables[0].Rows.Count];
int i = 0;
try
{
foreach (DataRow row in teams.Tables[0].Rows)
{
teamName.SetValue(row["team_name"].ToString(), i);
i++;
}
}
catch { }
finally
{
conn.Close();
}
return teamName;
}
}
}


Demo

Here's a link to the active demo. Because my hosting provider does not support SQL Express (we can talk about CrystalTech later), I am actually running it from a full SQL 2005 database, but the MDB I provided is merely a copy of the table I am using.

Click to see the AutoComplete demo.

Source Code

Click to download the AutoComplete demo in C#. Click to download the AutoComplete demo in VB.NET.

kick it on DotNetKicks.com

Labels: , , , , ,

posted by Jeff Blankenburg, 12:16 PM | link | 10 comments |

5 Reasons To Use Live Mesh

Thursday, October 23, 2008


To begin, Live Mesh is an application that has saved my butt more than a few times. Now let me tell you how.

Live Mesh is perceived to be a file sharing application, of which there are certainly many others available. It's the details that make it outstanding. Not only will it effortlessly (and quickly!) sync your files across all of your machines, but it also provides the ability to Remote Desktop to those machines as well.

Remoting into your machine is invaluable. How many times have you left a file on the wrong computer? Now, from ANY computer, you can get it. You can even use just a browser to remote into your machines, so you don't have leave a mark on your friend/colleague/mom's computer to do so.

In addition, you can also leverage 5GB of storage in the cloud to sync all your files. Then you can just go to your "OS in the cloud" to get to those files as well.

But that's now what this article is about. I've been using Mesh for 6 months now, and I've found some rather clever ways to leverage this technology. Here's my Mesh Tips:

1) Syncing your Messenger nicknames

I consider myself pretty good with names and faces. But when it comes to your email address, or your avatar/handle/username, I often struggle. So one of the features in MSN Messenger that I use pretty often is the "nickname" tag. I can rename your entry in my Messenger window to be your actual name, rather than whatever you chose to name yourself that day, or by your Live address, which is usually something like frogtoad786@live.com. I'm just not going to remember who you are, especially if we talk infrequently.

This information is stored in an XML file that is stored locally on my computer. By adding that folder to my mesh, and syncing it with all of my other machines, I no longer have to guess who you are. I've now got my nicknames everywhere I need them.

2) Universal Web Favorites


There have been a ton of services pop up on the web to help circumvent the age-old problem with Favorites in the browser.
That problem is getting those Favorites on all of your computers. Very often I will save a URL on one computer (or even one browser) only to need it somewhere else. So I started using services like Google Bookmarks, where all of my bookmarks were just persisted in the cloud. Then I could install their intrusive* toolbar to access them relatively easily.

But the mechanisms that the browser creators built for us to manage our favorites are actually pretty good, less that whole cloud persistence thing. So by using Live Mesh to sync my Favorites folder on each of my computers, I have now solved the one downside to the Favorites feature in the browser.

* Aside from taking up browser real estate, take some time to look at the traffic and processor time that Google Toolbar takes up. It's surprising.

3) Your music library is now everywhere

This is one of the more challenging tasks facing people with multiple machines. Music libraries are an intricate work of art in many cases. We're talking about THOUSANDS of files, in THOUSANDS of folders. Each one organized by artist, then album, and for the really persistent )like me), you've even got places for the album art, and all of the tracks are numbered in order, so you can sort them in album order.

These types of collections range anywhere from 1-2 GB all the way up to the hundreds of gigabytes. This is an immense task to have your music on each machine. Especially because it's not as if music has stopped being made, so you're always adding new songs, albums, etc. You want those individual changes to show up everywhere you might listen to music, right?

Up until Mesh, I bought a 250 GB portable hard drive to solve this problem. But that meant I had to take it everywhere. It was not convienient in the slightest.

With Live Mesh, I can just add my "Music" folder to the Mesh, and now my library, and all of its future changes are on each of my computers.

[DISCLAIMER] Please keep in mind that we're still talking about moving a large amount of data across the Internet and downloading it to muliple machines. That first push from Mesh is going to take a while. But once it's done, it's done.

[MISCONCEPTION] Many people read about Live Mesh's 5GB limitation, and immediately rule out using large numbers of files with it. The 5GB limit only applied to what is persisted in your Live Mesh Desktop online. You get 5GB of storage in the cloud. Once you go over that limit, Mesh will change how it works to be P2P (peer-to-peer). It will still sync your files across your machines based on the rules you've established, but those files will skip going to the cloud. There's just not room. (I've even heard that Mesh is smart enough to recognize when two machines are on the same network, and will circumvent even going to the Internet to P2P the files.)

4) All of your projects, all the time

The thing I use Mesh for the most is definitely for keeping copies of all of my project files everywhere I need them. I am currently using three different laptops for my road trips (depending on where I'm going and how I'm getting there). When I get to a place that I may be presenting or meeting with developers, I often need to show demos, and that's what most of my code is. Demonstrations of technology that I may need to use at any time.

Also, if I have time to work on a new project from the road, those updates will be sitting on my desktop machine when I get back home. It's a perfect solution for a one-man development shop. It starts to present challenges when you've got multiple people working on multiple files, so I can't recommend a version control system enough for that scenario.

5) Sharing your family photos

I have a brother in Chicago, sister in Columbus, parents in Cleveland, and inlaws in Akron and Canada. Sending email was always the way to share photos/videos/etc. with them. Then I built a website, but maintaining and uploading all of those files became frustrating. So I moved to Flickr. But now all of my images were publicly viewable, or I had to force everyone to get an account on Flickr so I could get them access.

None of those are ideal situations. I'd prefer to have all of us have access to ONE folder that Mesh updates from each of our computers, and dumping files into that folder results in those things showing up on my parent's and sibling's computers.

By sharing a Mesh folder with everyone, we can all dump files to each other, and keep up with each other in a far more personal way.



To wrap up, these are just a few of the ways that I use Live Mesh. It's made my life much easier for using multiple machines (even machines that aren't mine.)

If you haven't tried Mesh yet, why not? It will definitely save you time.

If you have, how are you using it? I'd love to know how it's helping you.

kick it on DotNetKicks.com

Labels: , , , , , , , ,

posted by Jeff Blankenburg, 4:32 PM | link | 6 comments |

Blankenthoughts: A Popular History Tour

Wednesday, October 22, 2008

Inspired by the most recent post over at Advergirl (a friend of mine), I have decided to list out links to the 10 most popular posts from the entire 2+ year history of my blog. The reason for this is to introduce some of my older (but still useful) articles to some of my newer readers. So here goes:

10) Calling Javascript From Silverlight 2

This is another in my series of tutorial posts, which walks you through creating a Silverlight application that can both call, pass values to, and retrieve values from a Javascript method in the web page host. An invaluable read for any Silverlight developer.

9) Extraordinary Nut Snack

This is a commentary on the commercials from Frito-Lay on their new line of snacks. It includes a video of their first try at commercials. Beautifully done in CGI, the almonds fall like dominoes. And then they say the title of this post. Your mind will wander.

8) CAPTCHA the Flag

This is a complete walkthrough on implementing Asirra, a new CAPTCHA control (of sorts) from Microsoft Research. It's incredibly easy to add to your application, and might even result in an adoption!

7) 6 Tips For Making Website Registration User Friendly

There are a million different websites out there, and there's a million different ways to register for an account on them. This is a list of simple suggestions for the next time you head down the "registration" path. Best tip? Make it easier for your users, not for the developer building the pages.

6) Top 10 Things New Twitter Users Need To Know To Get Followers

You only get one real chance to impress upon someone why they should follow you on Twitter. Following these rules will help you immensely.

5) Simple Resizing In Silverlight

One of the beauties of Silverlight is that it is based on vector graphics. This means that no matter what size you display them, they don't get pixelated and blurry. Vector graphics can grow or shrink to any size, and this tutorial shows you the simple way to make it happen.

4) Creating A Simple Silverlight Animation

As the creator of the CodeMash logo, I was excited when I found out I could convert my Adobe Illustrator file to XAML. Once that was completed, the next logical step was to animate the gears. This tutorial shows you how to do that, as well as a quick tour around Expression Blend.

4) Left Outer Join In LINQ

As someone who has a hard time getting out of a traditional SQL mindset, when I started using LINQ, the question of how to emulate a left outer join immediately confronted me. This outlines the simple way to do just that.

3) I Hate Windows, I'm Moving To Windows Mojave

This was briefly written to announce the Windows Mojave website and advertising campaign. It has certainly has its praises and criticims, but this post got more traffic in one day than any other post has ever gotten.

2) TUTORIAL: Creating a WCF Service for Silverlight 2 and SQL

One of my first "tutorial" posts, this hit the ground running, and hasn't looked back. It's an excellent beginning example of how to get Silverlight talking to a web service that accesses a SQL database.

1) General Ionics: Fake or Fab?

This article was written while I was buying a water filtration system for my home. While not technical in nature, this has been, by far, my most popular post to date.

Labels: , , , ,

posted by Jeff Blankenburg, 8:35 PM | link | 0 comments |

My Indianapolis 500

Thursday, October 09, 2008

Today I am excited about speaking at the Indianapolis .NET User Group meeting. The reason I call it my Indianapolis 500 is because that's how many miles I'm going to be driving to get there and back today. According to Live Maps, it's 231 miles each way. Count in the fact that I am certain to make a wrong turn at some point, and that adds up to around 500 miles total. Now if only I could drive 200 miles/hour...

Anyways, I'm going to be presenting a completely revamped version of my "Amazing Things You Need To See" talk for them, and even plan to Photosynth the room/building we're having the meeting in during the talk. Should be a great night.

Here's a link to the slide deck for those of you that are interested...

Labels: , , , ,

posted by Jeff Blankenburg, 10:26 AM | link | 4 comments |

.NET University Registration Info

Tuesday, September 30, 2008

The .NET University will be held at the Columbus office on November 8. My full write-up can be found here.

Here's the link to registration:

http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032390539&Culture=en-US

Labels: , ,

posted by Jeff Blankenburg, 1:28 PM | link | 2 comments |

TUTORIAL #5: Calling Javascript From Silverlight 2

Tuesday, September 23, 2008

In this post, I want to show you how incredibly simple it is to call a Javascript function from the managed code of your Silverlight application. We'll also be able to retrieve a value from that function, and return it to Silverlight. If you're just hunting for the syntax, just jump to step #6. This post covers creating everything from scratch, in both VB and C#.

1) Create your Silverlight project and sister web site.

I've already documented creating a new Silverlight project here, so I'll let you read that one first, if necessary.

2) Let's write a "legacy" Javascript function.

We need a JS function to call, so let's make it interesting. Let's say that I have some code from a previous app that determines all of the prime numbers from 1 to 500. I don't necessarily want to rewrite that, so let's just reuse it. Here's the code:


//The purpose of this code is to find all of the prime numbers under 500.
//The definition of a prime number is one that is only divisible by 1 and itself.
//We are utilizing the Sieve of Eratosthenes to enhance our algorithm.
var primeArray = new Array();
var primecounter = -1;
var primeFlag = true;

function getPrimes(useri){
     primeArray.length = 0;
     primecounter = -1;
     var i = 500;
     if (useri != ""){
          i = useri;
     }
     for (j=1;j<=i;j++) checkForPrime(j);
          return primeArray.join(" ");
}
function integerCheck(newvalue){
     var regexp = /(^\d\d*$)/;
     if(regexp.exec(newvalue)) primeFlag = false;
}
function checkForPrime(j){
     primeFlag = true;
     for (k=0;k<=primecounter;k++){
          if ((primeArray[k] != "")&&(primeFlag)){
               if ((j/primeArray[k] != 1)&&(j/primeArray[k] != j)){
                    integerCheck(j/primeArray[k]);
               }
          }
     }
     if (primeFlag){
          primeArray[primecounter+1] = j;
          primecounter++;
     }
}


3) Add that JS code to our web page.

Just add a <script> block in the <head> of your web page, and put the above code inside. Done!

4) Now we need to write some XAML.

Open your Page.xaml file that was created for you, and let's add a button. We'll use this button's event handlers to call our Javascript function eventually. To add a button, here's the XAML I am using inside of the <Grid> I was provided:


<Button Width="100" Height="50" Content="Get Primes!" />


5) Add an event handler to our button.

In our button, add the "Click" property, and Intellisense will prompt you to create a "New Event Handler." This will create the method in the code behind file for you. Here's the new button XAML:


<Button Width="100" Height="50" Content="Get Primes!" Click="Button_Click" />


6) Time to call that Javascript function.

Jump into the code behind file for your XAML (page.xaml.cs or page.xaml.vb by default). There's a new method called Button_Click for you. We are going to write ONE line of code to make this happen. And here it is:

C#

HtmlPage.Window.Invoke("getPrimes");

VB

System.Windows.Browser.HtmlPage.Window.Invoke("getPrimes")


I kinda lied though on the 1 line of code thing. For C#, we also need the "using System.Windows.Browser;" statement. The "getPrimes" value we are passing is the name of the Javascript function we want to call. But this only gets us halfway there. My JS function creates a list of prime numbers and then sends them back as a return value. So we need to actually do something with this value.

7) Refactoring our code to use the return value.

So we know we can call a Javascript function, but returning the value is going to be a little more challenging. We need to capture the return value, cast it as a string (everything from Javascript is assumed to be an object), and display it in our Silverlight app. But let's make it a little more interesting. Let's also change things to pass parameters to our JS function as well.

First, we need some new XAML elements. I've added a <TextBlock> to my XAML page to display the primes, as well as a <TextBox> to gather the number of primes the user wants to generate. Here's the new XAML code:


<StackPanel x:Name="LayoutRoot" Background="White">
     <TextBlock Width="400" Text="Primes to what number?" TextAlignment="Center" />
     <TextBox Width="100" Height="24" x:Name="primecount" Margin="0,0,0,10" />
     <Button Width="100" Height="50" Content="Get Primes!" Click="Button_Click" />
     <TextBlock x:Name="primebox" Width="800" TextWrapping="Wrap" />
</StackPanel>

And now here's my new C# and VB code inside my Button_Click methods to pass our value and display this data:

C#

string primeArray = (string) HtmlPage.Window.Invoke("getPrimes", primecount.Text);
primebox.Text = primeArray;

VB

Dim primeArray = System.Windows.Browser.HtmlPage.Window.Invoke("getPrimes", primecount.Text)
primebox.Text = primeArray.ToString


What will happen in this scenario is that if the user provides a value, we will use it, and if they don't, we'll default to 500.

8) So let's run it!

That's it! We've successfully called a Javascript function from Silverlight (in both C# and VB), retrieved the value it created, and displayed it in our application. We also passed specific parameters to that Javascript function to influence its behavior. Click the Demo button to see it in action.



9) Source Code Links

I've provided the source code for this example in both C# and VB. Just click the appropriate button.

C#.NET Source Code VB.NET Source Code

kick it on DotNetKicks.com

Labels: , , , , , ,

posted by Jeff Blankenburg, 12:21 PM | link | 3 comments |

TUTORIAL #4: Showing Non-Silverlight Content To Users Without The Plugin

Monday, September 22, 2008


I just recently updated the navigation on my blog (http://www.jeffblankenburg.com) to be a nice Silverlight control, and realized that I was not really providing an optimal experience for those people that don't have the plugin installed. So since I had to go through it, I thought I would share with you how simple this actually is.

When you add a new Silverlight control to your page, this is what the code will look like:


<div id="silverlightControlHost">
     <object data="data:application/x-silverlight," type="application/x-silverlight-2-b2" width="880" height="60">
          <param name="source" value="ClientBin/JeffBlankenburg.com.xap"/>
          <param name="onerror" value="onSilverlightError" />
          <param name="background" value="white" />
     </object>
</div>


How To Add Your Non-Silverlight Content

Here's all you need to do to get it to work. Inside the <object> tag, after all of the <param> tags, just add your HTML. In my example, I have a different navigation in HTML for non-Silverlight users. It will display this content when the Silverlight plugin is absent.

Here's the new example, with my content included:


<div id="silverlightControlHost">
     <object data="data:application/x-silverlight," type="application/x-silverlight-2-b2" width="880" height="60">
          <param name="source" value="ClientBin/JeffBlankenburg.com.xap"/>
          <param name="onerror" value="onSilverlightError" />
          <param name="background" value="white" />
          <div id="sitetitle"><h1><a href="http://www.jeffblankenburg.com" class="style3">Blankenthoughts</a</h1><p class="style4"><strong>These are my thoughts. Nothing more.</strong></p></div><div id="menu"><a href="http://go.microsoft.com/fwlink/?LinkID=115261" style="text-decoration: none;"><img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none"/></a></div>
     </object>
</div>


How do I test this? I have the plugin installed!

That's easy in IE8. Just go to:

Tools > Internet Options > Programs > Manage Add-ons

and choose the Silverlight plugin. You can temporarily disable it there. Great new feature. Here's a picture of the screen (click to enlarge).



There you go. You can now create custom HTML to display for your users that have not yet installed the Silverlight plugin. I'd recommend letting them know they're missing out on the full experience, however, or they will never find your cool Silverlight control.

kick it on DotNetKicks.com

Labels: , , , ,

posted by Jeff Blankenburg, 11:41 AM | link | 2 comments |

.NET University in Columbus, OH - November 8, 2008

If you are a regular reader of my blog, I need your help.

Jim Holmes and I are putting on a .NET University-style event on November 8, 2008. It will be held at the Columbus Microsoft office (it's right next to Polaris Mall).

Here's where I need your help. I don't need you to register. I don't need you to attend. I need you to tell the junior developers at your company about this. I need you to tell your friends that have been curious about .NET development about it. You are welcome to attend as well, but if you're using these technologies regularly, it will probably be a refresher.

This event is going to be covering the basics. Web services, C# and VB.NET 3.5, Visual Studio 2008. AJAX 101, Silverlight 101, and WPF 101.

We want to give developers an opportunity to get up to speed on all of the new development technologies that have come out of Microsoft in the past year or so, and this seems to be a great way to do it.

As soon as registration opens for this event, I will posting that information here as well. If you're interested in speaking on one of the subjects listed above in a 100-level presentation, please contact me ASAP so we can get everything arranged.

Labels: , , , , ,

posted by Jeff Blankenburg, 9:32 AM | link | 3 comments |

TUTORIAL #3: Using Blogger with ASP.NET and Master Pages

Tuesday, September 16, 2008


I love the Blogger publishing engine, but I am frustrated by the apparent inability to do anything with .NET and Master Pages using it. This tutorial will show you how to get over that hurdle. A special thank you to Sarah Dutkiewicz for this awesome idea.

WHAT? A Microsoft guy is promoting a Google service? Yeah. I do that sometimes. I believe in using the best tool for the job, and in my case, Blogger fits that bill. There are plenty of blogging services out there, but many of them require me to also host a database, an application, etc., and I just don't want to have to deal with all of that. I want to write my posts, and know they ended up on my site. Plain and simple.

So let's talk about how we can use ASP.NET with Blogger to get a pretty nice scenario.

1) I am assuming you can set up a blog at Blogger.com.

Go to blogger.com. Follow instructions.

2) Create a new "Web Application" in Visual Studio.

I say to do a "Web Application" because I don't know what the future holds for your blog. If you want Silverlight, or more complicated things on your blog, it's a good place to start. You can use "New Web Site," but you may find your options limited later.

3) Create a new Master Page.

I titled my Master Page the same as my blog. Blankenthoughts.master. You can surely name it whatever you want. Delete all of the provided HTML that is written for you.

4) Let's get that blog template.

Go to the Template portion of your Dashboard for your blog, and copy the HTML that is provided. (I am assuming you like your current template. If you don't, take care of that first.) Now paste that code into your Master Page. It's gonna be gross. Also, as a backup, create a text file or HTML page or something and paste the code in there. And SAVE it. It never hurts to have a backup of the original.

5) Let's learn an awesome new keystroke.

So you've got that awfully unformatted HTML in your master page. Resist the urge to reformat it. I've got a faster solution. Press Ctrl + K and then Ctrl + D. Voila, your HTML is formatted.

6) Now we can save our master page.

Go ahead and save your master page, and we also need to create a new ASPX page based on that master page (make sure you check that checkbox). I called mine BloggerTemplate.aspx because this is going to hold the code that I paste back into Blogger. We're going to be jumping back and forth between the Master Page and the ASPX file quite a bit now, but it's just copying and pasting, so no biggie.

7) We need to move the <Blogger> tag, and all of its contents.

Somewhere in your Master Page now, there's a tag called <Blogger>. Cut (Ctrl + X) it from the opening tag to the closing one </Blogger>. In its place, create an <asp:ContentPlaceholder runat="server" ID="blogbody"> tag.

8) Create the content in our ASPX page.

We now need to replace that content in our BloggerTemplate.aspx file. Let's make one edit to our ASPX file before we paste that code in there. I changed my header values that are pre-populated for me. Here's the only line of code on my ASPX file right now:

<%@ Page MasterPageFile="~/Blankenthoughts.master" Title="<$BlogPageTitle$>" %>

Just under that, just add a:

<asp:Content ID="blogbody" ContentPlaceHolderID="blogbody" runat="server">

Inside that tag, paste the HTML we cut out of our Master Page. When we're done, Visual Studio is going to be FREAKING out over all of the proprietary Blogger tags we're using, but it will still build, and that's all that matters. Just trust that you did it right.

9) Now let's do the same thing for the other Blogger-specific stuff.

In my case, I also have some META information in the header of my page, archive links to the previous months that I have had posts, and also a section that shows my latest post titles. Each of these use Blogger-specific tags, and I'd rather get those out of my Master page and back into the Blogger template, where they belong. So create a ContentPlaceHolder for each of these sections, and copy that code into a Content tag in your BloggerTemplate.aspx file. Here's a link to see the source code of my final template file.

10) We're at step #10 already. Are we almost done?

Yes. But good things come to those who wait.

11) Now we need to change some settings.

In your Blogger Dashboard, we're going to have to change some of the settings. I'll just list them here, by the navigation you take to get to them.


  1. Settings > Publishing > Blog Filename: default.aspx

  2. Settings > Archiving > Archive Filename: archive.aspx

I am assuming you're hosting this blog in an environment that can process .NET pages...so IIS is kinda necessary.

12) Publish your website to your FTP site.

Because of the "We're going to delete everything" policy of Visual Studio, I prefer to move my files manually. I'd recommend this for you as well, or you'll be forced to publish from Blogger each time that you modify your website. (Because VS will delete EVERYTHING, not just the files it is overwriting.)

13) Publish your blog from Blogger for the last time.

You shouldn't be forced to publish your entire site anymore. Well, except when you post something new. But that can also be circumvented by posting from Live Writer. It's far more robust than the Blogger interface, and works great with the engine.

At this point, you should be up and running. I will be glad to coach you through this if you have issues, because I only encountered about 100 different issues specific to my hosting environment, folder structure, etc. Please let me know if this helped you out...it's good to know this stuff is providing some value.

kick it on DotNetKicks.com

Labels: , , , , ,

posted by Jeff Blankenburg, 11:17 AM | link | 5 comments |

I hate Vista. I'm moving to Windows Mojave.

Tuesday, July 29, 2008

So I've heard the bad press. I've seen the pc vs. mac ads. I've heard my friends' complaints about crashing, security, and speed.

That's why I'm moving to Windows Mojave. It seems Microsoft finally got an OS right.

Check this out:

http://www.mojaveexperiment.com

kick it on DotNetKicks.com

Labels: , , , ,

posted by Jeff Blankenburg, 1:39 PM | link | 23 comments |

CAPTCHA The Flag

Thursday, July 10, 2008

So I was wandering around the Microsoft Research site, and happened upon something I had not heard of before: Asirra. It's a new model for a CAPTCHA test, and it seems to be pretty simple to implement.

For those of you not familiar with the term CAPTCHA, it stands for "Completely Automated Public Turing test to tell Computers and Humans Apart." You've certainly seen them before on sites like Ticketmaster, where you're asked to enter some characters that are all skewed and blurry in an image. Here some examples:



The basic idea behind it is simple. You need a test that a human can pass, but that software cannot. Imagine if Ticketmaster DIDN'T have a CAPTCHA challenge on their site. When baseball tickets went on sale, or seats to the Radiohead concert become available, a scalper could fire up his software, buy ALL of the tickets, and then re-sell them at a significant profit somewhere else. You wouldn't have a chance.

But, by enforcing a CAPTCHA challenge, that scalper is only able to buy tickets in small quantities (maybe 10) at a time, before he's forced to visually interpret some data that only a human can read. A computer has a serious challenge in reading text that has been skewed accurately.

Enter Asirra. While only a project of the Microsoft Research team, it IS available for public consumption. It also challenges the idea that a CAPTCHA challenge needs to be letters and numbers that are jumbled up to be unreadable by optical character recognition (OCR) software. Instead, it presents you with a set of 12 images. They're all pictures of animals. It's up the human to determine which ones are cats. With over 3 million images currently available, and a database that grows in size by roughly 10,000 images per day, there's a good chance you'll never even see the same pictures twice. I've included an example of it on this page, but it's not part of a form, so it's just for display purposes. A link to a working sample of mine is in the next paragraph.





Using some simple javascript and a few lines of C#, I have built a page that demonstrates this powerful tool for keeping your site from being exploited. You can see the Asirra CAPTCHA in C# action here. Also important to note is that they have also provided this tool with code samples for using it with Python, PHP, C#, VB, JScript, and Perl. This is not tied to any Microsoft-specific tools or languages. In fact, the web service that runs the challenge is actually written in Python. My sample code running in C# can be downloaded here.

On top of the technical problem that this solves, it's also good for the pet community. All of the images come from PetFinder.com, and all of those animals are unwanted, but perfectly lovable animals in need of a home. Exposing their pictures and profiles to a larger audience can only help to find a place for some of these needy animals to live. I think these kinds of solutions have a certain elegance that you don't see much in software.

kick it on DotNetKicks.com

Labels: , , , ,

posted by Jeff Blankenburg, 9:11 AM | link | 8 comments |

Where In The World Is Jeff Blankenburg?

Tuesday, July 08, 2008

I just took a look at my calendar, and I'm going to be busy for the next few months. Here's an overview of where I'll be. If you're gonna be nearby, make sure to stop and say Hi.

Ann Arbor Give Camp
July 11 - 13 (Columbus, OH)

Northwest Ohio .NET User Group
presenting "Cool Stuff from Microsoft"
July 15 (Toledo, OH)

Microsoft TechReady
July 25 - August 2 (Redmond, WA)

CodeStock
August 9 (Knoxville, TN)

eRubyCon
August 15-17 (Coumbus, OH)

DevLink
presenting on Silverlight 2.0 and Visual Studio 2008
August 22-23 (Nashville, TN)

MS Team Offsite
August 25-27 (Chicago, IL)

Labels: , ,

posted by Jeff Blankenburg, 5:04 PM | link | 0 comments |

I Like To Talk...

Tuesday, June 24, 2008

I like speaking in public. I really enjoy it. But it's been far too long since I've done it. And my next scheduled talk isn't until the end of August, at DevLink.

I'm posting this message to let the world know that I'm ready to get back in the game. Please contact me at jeffrey.blankenburg@microsoft.com if you would like me to come talk to your developers, whether that's internal to your company, or at a user group in your community. I will do my best to accomodate all requests. I've got several new talks ready, as well as a few older favorites that audiences enjoy.

Here they are:

* Building Next Generation Web Apps With Visual Studio 2008
This talk is an overview of Visual Studio 2008 and some of the great new features it has to offer. This includes tools and techniques ranging from the Split view design pane to effectively using LINQ.

* Silverlight 101: The Basics
This talk really is an introduction. We'll talk about XAML, build a basic application, and show the integration with Expression Blend. I would recommend this for any group that wants to get their feet wet with Silverlight.

* Silverlight 301: Way More Than A Spinning Button
In this talk, we will learn how to build a Silverlight application that talks to a SQL server through a WCF web service. We will render the content in a visually appealing way using XAML. And if you ask nicely, I'll even spin a button for ya.

* Cool Microsoft Stuff: The Technologies You Have To Try
This is an overview of some of the amazing things Microsoft is working on behind the scenes. Some of them are available in beta form, but you're guaranteed to see something you've never seen before. This includes technologies like Photosynth, Deep Zoom, and Live Mesh.

* XNA Anyone?
This talk will walk you through the basics of game development using XNA as the platform. We will also talk about game development for the Zune.

Labels: , , , , ,

posted by Jeff Blankenburg, 10:21 AM | link | 0 comments |

TUTORIAL #1: Creating a WCF Service For Silverlight 2 and SQL

Thursday, June 19, 2008

Today I'm going to show how to create a simple WCF service, and consume it from a Silverlight application. This is something you are going to need to do quite often, and if for no other reason, I am documenting this here so that I have it as a reference.

The first thing we need to do is create a Silverlight application. (In order to have all of the Silverlight 2 prerequisites, make sure you visit this page.)

1) I'm going to start from the beginning. First, we need to create a new Silverlight project. I'm naming mine JBWCFService.

Creating a new Silverlight project

2) We will then be prompted to create a web project to accompany our Silverlight project. I choose a Web Application Project from the dropdown.



3) Here is a view of what my solution explorer looks like after the projects are created. I have a Silverlight project called JBWCFService and a Web Application project called JBWCFServiceWeb, not surprisingly.



4) Next, I want to create a SQL database from which to get my data from. I'm not going to walk through all the steps of adding tables, columns, and data. You can certainly find that elsewhere. Here's my adding the SQL database to my project though...



5) OK, it's time to create our service. I'm naming my service MyNewService. It's just another thing to add to our project, so here we go:



6) Once the new service has been created, you will have a few new files in your project. In my case, they are named IMyNewService.cs, MyNewService.svc, and its code-behind, MyNewService.svc.cs. By default, the interface (IMyNewService.cs) will be open and ready for editing. They create a DoWork() method for you, but we're going to delete that and do something more interesting in a little while. First, we need to get LINQ up and running against our data. I am naming mine LINQClasses.



7) In addition to adding the class files necessary, this will also open the LINQ design surface by default. We can just drag items from our data structure right to the left half of the surface, creating ORM class structures that represent our data. In my example, I only have one table, profile, but we can do this for all of our tables, and stored procedures can be dragged to the right half of the surface, creating methods. I have already dragged my table over in the next screenshot (click to enlarge).



8) We also want to make sure that our data is unidirectionally serializable (I like big words). By clicking on the design surface (not one of the table boxes), you can get to the properties of the DataContext, and change the Serialization Mode to "Unidirectional."



9) Now we need our Silverlight project to become aware of our WCF service running in the web application project. To do this, we just need to add a new service reference to the Silverlight project. Click the "Discover" button to find it automatically. This will also automatically spin up a web server for your service to run in. I named my service reference MyNewServiceReference.



10) Ready to write some code? To this point, everything has been handled automatically for us. Now we have to get our hands dirty. Let's go back to our Service interface (IMyNewService.cs). In there, let's get rid of that DoWork() method. Instead, our method is going to return a List of profiles from the database, based on our new classes that were created for us. Because this is an interface, we don't define the actual functionality of the method here, just it's signature. I named my method GetProfilesByLastName.



11) Ok, that was exhausting. Let's have the IDE write some more code for us now. Let's open the code-behind file for MyNewService.svc (MyNewService.svc.cs). You can see that it inherits from the interface we just defined, so right click on the name of the interface, and have it implement the interface for you.



12) Now you've got the shell for the method. We just need to tell this method what to do. Here's where the LINQ comes into play. We need to get a reference to our DataContext from earlier, and then I wrote a simple query to retrieve names from the database based on a last name query. Finally, we return our list of data.



13) Each time we update our service, we will need to update our service reference in the Silverlight project, so that it sees our new methods. Just right click on the service reference and choose "Update Service Reference." Also, we have one small change we need to make to our web.config file as well. If you've been following the instructions, then you can scroll down to the bottom of your web.config and look for the <endpoint binding="wsHttpBinding" /> property. Silverlight only currently supports basicHttpBinding, so we need to change it to that.



14) Next, we need to add one more reference to our Silverlight project before we can finally start working with the XAML. We need to add a reference to System.Windows.Controls.Data so that we can use the DataGrid control in our interface.



15) XAML time. Kinda. We need to include that reference as a namespace in our Page.xaml document. OK, now we can add some controls to our page. I also added a Button, a TextBox, and a DataGrid, inside a couple of StackPanels, for layout purposes.



16) Now, we need to call that method in our service and populate that grid. The first thing we need to do is instantiate our ServiceClient. Now, since we are calling this service asynchronously, we also need to set up an event handler to know when our data has returned so that we can update the DataGrid. There's an excellent bit of shorthand for creating this code automatically. My screenshot shows all of the code I will need, but for the line that starts:

sc.GetProfilesByLastName +=

I only actually typed what is above. After that, I pressed the Tab key twice. The first press of Tab actually finishes out my EventHandler statement. The second Tab press creates my EventHandler method, so that I can add the guts. Finally in my Button_Click method, I need to call the GetProfilesByLastName asynchronously, passing in the value from my TextBox, named DataEntry.



17) The last little touch we need to put on this application is the actual binding of the data to our DataGrid, and we'll do that in the new EventHandler method that was created for us. There's just one line of code in the method:

DataGrid.ItemsSource = e.Result;



So, there you have it. We've created a WCF service that uses LINQ to talk to a SQL server, and a Silverlight 2 application that consumes that service and renders the result. Not bad for 17 steps, and only a few lines of code.

Click here to download the solution files.

Labels: , , , , , , ,

posted by Jeff Blankenburg, 11:34 AM | link | 9 comments |

Silverlight Layout Options - Grid (Part 3 of 3)

Friday, June 06, 2008

(See Part 1 and Part 2 first...)

In the third and final installment of this series on Silverlight Layout, we are going to be discussing my preferred option for interface creation: The Grid. In many ways, I would compare this to table based layout in HTML (which is generally a bad word), but I will come to its defense in Silverlight today.

There are many reasons why table-based layouts should not be used in HTML. A few of them are:

1) Tables are very heavy. With all of the <tr> and <td> tags you need, the page bloats quickly.

2) CSS is the right way to do it. Once you harness the power of CSS, you have far greater control of your layout (not to mention accessibility) than you do with tables.

3) Tables are very difficult to manipulate once they are in place. If you've ever tried to move things around in a legacy table layout, you know what I'm talking about.

The reason I am recommending this type of layout is because those problems have been addressed in Silverlight with the <Grid>. So let's take a look at the code.



You'll notice that this doesn't really look like HTML table layout that you've seen in the past. Instead, we've seperated (still in the same file, mind you) the content from the layout. We don't have to wrap each element in a set of table tags. We define a grid, and then we assign each element to a cell of that grid. I've also turned on the ShowGridLines attribute, so we can see exactly what the grid looks like. We can also assign height and width values to the cells of the grid, up to and including the wildcard "*" character. This tells the application to use the rest of the remaining space for that cell. If you have more than one wildcard cell, it will split the unclaimed space evenly between them. Please note that the grid starts with 0,0, not 1,1. So our Red Rectangle is assigned to Grid.Cell="0" and Grid.Row="0" which puts it in the top left corner. Each of the respective rectangles after that is assigned to their respective grid location as well. The design pane of Visual Studio 2008 looks like this with the XAML I just used:



You'll notice that the Black rectangle is missing. That is the one assigned to the wildcard space. In the design pane, there's not a Canvas width and height defined. In the XAML, I did not specify a width and height for my Grid. This causes it to fill the entire space of the window it is rendered in. When we run the application, however, you'll see that the black box is, in fact, there, and takes up the rest of your browser window.

In my next post, I will talk about using templates to create "styles" that can be reused by your XAML elements.

Labels: , , , , , , ,

posted by Jeff Blankenburg, 8:36 AM | link | 0 comments |

Silverlight Layout Options - Stack Panel (Part 2 of 3)

(See Part 1 first...)

Today we are looking at a second way to lay out your interface in Silverlight. This will be far more familiar to the CSS fanatics out there. The primary concept is simple...we'll be using a StackPanel control to position our elements.

For those of you less familiar with CSS, this is more of a flow-based layout. As the size of the Silverlight container grows and shrinks, you will find that the elements will move to accomodate that space. I, personally, would not recommend approaching your entire interface with this technique, but it certainly makes sense for small portions, like navigations and lists of data.

Most of our positions will be determined by manipulating the margins of the individual elements on the page. In doing so, we can place our elements specific distances apart without having to specify their exact position on that page.

In the example below, I have 6 buttons that I want to arrange in a 3x2 block. I start with an outer stack panel that, by default, will stack my elements vertically. However, I want to have two rows of 3 buttons each, so I am going to nest two more stack panels. Each of these will have the Orientation attribute of the StackPanel set to Horizontal, to create the rows.



For demonstration purposes, I also modified the margins of a few of the buttons, just to show that we are merely stacking these elements. This is not a grid, or table, and certainly not absolute positioning. These elements are merely stacked, either horizontally or vertically, with margins as the leverage to move things around a bit.

NOTE: I have a major complaint about how margins were implemented in Silverlight.

Again, for those of you familiar with CSS, the de-facto standard for specifying margin sizes was one of two formats:

margin-left:10px;
margin-right:10px;
etc.

OR

margin:0 10px 0 10px;

Each of those examples would have given you a 10 pixel margin on both the left and right of the element you were styling. In the second example, we are using a bit of shorthand to specify ALL of the margins in one line. They start with the top, and go clockwise. margin:Top Right Bottom Left;

In the margin implementation for Silverlight, it would appear that they also offer a shorthand version for margins (actually, the only version is shorthand), and they did not follow the standard convention mentioned above. Instead, they chose to use Margin="Left, Top, Right, Bottom". I've not yet talked with the team to see why this convention was chosen over something more familiar to developers, but if I can find an answer, I will post it here.

(continue to Part 3...)

Labels: , , , , ,

posted by Jeff Blankenburg, 8:35 AM | link | 2 comments |

40 Days and 40 Long Nights

Tuesday, May 27, 2008

40 days ago, my wife and I welcomed a new child into the world. Miles Robert Blankenburg was 8 lbs. 10 oz. and 19" long (tall?). On that day (April 16), I started my very generous paternity leave from Microsoft.

Prior to Miles joining us, I had aspirations for what I would do with all of this time. First and foremost, I would be able to completely focus on my family. But certainly there would be some time left over to work on a coding project or two, right? Maybe I'll now have the focus to lose some weight? Maybe I can finally catch up on some of the landscaping I've been putting off?

I'm here to report that family is ALL that I focused on (that's the right thing, right?). I actually gained two pounds. And as this blog, my email, Twitter, my fantasy baseball team, and dozens of other sites will attest, I have almost not touched a computer during that time. Sure, I checked the weather a couple of times, and looked up some sports scores, but that would pretty much be the extent of it. It's weird. I feel like I've gone through some sort of 12-step program. The first few days, I tried bringing the baby into my office so that I could get online. But that became harder and harder. Slowly, I weened myself off of the computer entirely. Not because I wanted to, but because it seemed unnecessary during what was supposed to be family time. This past week, I've almost not been interested in using a computer. But now that I'm back to work (and let's be honest, I'm ready to be back), I feel like a smoker who quit, only to go through an entire pack in an evening. Today will probably be very scatterbrained, surfing everywhere and accomplishing nothing.

My corporate network password has expired, so I've got that interesting challenge to overcome this morning. I've got a full inbox to go through (once I get network access, of course) and start responding to. In short, I'm probably going to spend this week catching up on what you've all been doing for the last 40 days.

So, what did you do in the last 40 days?

Here's a list of the things I know I missed (what an amazing 40 days it's been in the Heartland!)

05/10/08 - West Michigan Day of .NET
05/17/08 - Cleveland Day of .NET
A number of new specialized user groups have sprung up, but I will write a new post outlining these later this week.

Labels: , ,

posted by Jeff Blankenburg, 8:21 AM | link | 2 comments |

Cleveland, Detroit, and Columbus, Oh My!

Sunday, March 23, 2008

I had an opportunity to really get out and meet a great deal of the northern contingent of the Heartland district the past two weeks, and many of you have been asking for my slide deck for reference. The title of the talk was:

"Reach End Users With Next Generation Web Applications"

Here's a link to the slide deck.

I'll write more once this crazy road trip is over!

Labels: , ,

posted by Jeff Blankenburg, 4:01 PM | link | 1 comments |

Dean Hachamovich Keynote on IE8

Wednesday, March 05, 2008

Dean Hachamovich - General Manager, Internet Explorer

1. CSS 2.1 - incompatibilities are detrimental to developer progress. IE 8 seems to WORK! Interoperabilities are core. We've provided 702 test cases to the W3C for CSS standards testing. IE8 will interpret web-standards as precisely as can be interpreted.
2. CSS Certification
3. Performance - modern sites rely heavily on script. IE 8 is performing as well as Firefox and Safari, and it's not done. The Back Button, with AJAX, is currently broken. IE 8 gives that power to the developer, so that Back works the way the user expects it to. Pages can be "connection aware" and change when you lose your connection.
4. HTML 5 Start
5. Developer Tools - in browser debugging of javascript and setting breakpoints, etc. CSS management and review on a LIVE page. Sweetness.
6. Activities - no more cutting and pasting from a web page. highlight, and get a menu with plenty of options like "show on map", look up on ebay, search, etc.
7. WebSlices - save part of a page to the browser, and it updates LIVE when you access it. This is functionality enabled by developers.
8. IE8 Beta 1 is available NOW. http://www.microsoft.com/ie/ie8

Labels: , , , , ,

posted by Jeff Blankenburg, 12:57 PM | link | 4 comments |

Microsoft Mix 08 Keynote (Ray Ozzie)

Ray Ozzie talking about the "big picture" of Microsoft's development momentum

Advertising is the economic engine for the web.
The internet is the medium for all future technologies. Content is king. Social networking is exploding. Significantly investing in search.

How is the internet shaping and transforming Microsoft's products and services?

  1. The web is a hub. The hub of our technology experiences. There is an explosion of connected devices out there right now.
  2. The power of choice for when businesses embrace the cloud. All MS software will be re-engineered to enable "Server service symmetry." Distributed and federated applications will rise.
  3. We need to embrace small pieces loosely joined. Think SOA. Transparency, standards, and interoperabilty are key. Multi-device development skills are becoming a necessity.

The next five years: everything about software development will change with the impact of the cloud on applications.

Keeps referring to your collection of internet-enabled devices as your " personal device mesh."

Connected Devices: imagine the bi-directional synchronization of all of your devices, with centralized web-based deployment.

Connected Entertainment: individuals will only have to license their media ONCE. And consume that media from all of their devices. Media entertainments services are progressively transforming to share media.

Connected Productivity: office for the PC, office mobile for the phone, office live for the web that will seamlessly integrate together. The web will become an "experience hub." See Office Live Workspace. It will be the hob of our connected productivity strategy. Think Sharepoint, Exchange, etc.

Connected Business: CRM for all, not just the enterprise. Much more to come in 2008. Think Exchange, Sharepoint, and Communicator hosted services. SQL Server data services available to developers in the cloud.

Connected Development: Everything is .NET...ScottGu will expand on this later.

Labels: , , , , ,

posted by Jeff Blankenburg, 12:29 PM | link | 0 comments |

Columbus Lightning Talks

Thursday, February 28, 2008

Tonight at the Columbus .NET Developers Group (CONDG), they are having 8 lightning talks as their presentation. Lightning talks are basically 10-15 minute presentations that go one after another, with 1 minute breaks for setup/teardown.

Here are the subjects that were presented:

Steve Horn - ADO.NET
Matt Casto - Silverlight (consuming ADO.NET)
Amanda Laucher/James Bender - F#
Steve Harman - Rhino Mocks
Brian Sherwin - Log4Net
Jon Kruger - LINQ to SQL
John Vottero - PowerShell 4 Devs

These presentations were also videotaped, and will be made available on the CONDG website.

Also, in the early housekeeping, there were two major announcements made:

1) Brian Prince has accepted the Architect Evangelist role with Microsoft. He'll be working alongside me in the Heartland.

2) Carey Payette was elected the new president of CONDG. Congratulations Carey.

Labels: , , , , , , , , , , ,

posted by Jeff Blankenburg, 6:32 PM | link | 1 comments |

Free Software!!!

Friday, February 22, 2008

As I hope you'll recall, we had some Visual Studio 2008 Install Fests late last fall. These events sold out in under 48 hours. We gave away 525 disks that could be redeemed for a full version of VS2008 Professional.

I've just heard back from the organization that was running this effort for us, and there's been a surprisingly LOW redemption rate. This is just a friendly reminder to everyone that has a Trial disc and has not gone online to redeem it for their full version.

THAT OFFER EXPIRES ON MONDAY, FEBRUARY 25, 2008!

Please make sure you get yours in. I'd hate to see you miss out on this offer.

Labels: , ,

posted by Jeff Blankenburg, 10:06 AM | link | 9 comments |

Visual Studio Has Arrived!

Monday, February 18, 2008


For those of you that had the good fortune to get over to one of the Visual Studio 2008 Install Fests we had late last year, today's your day!

The full licensed copy of VS2008 Pro has been mailed, and you should be receiving it as soon as TODAY.

Keep an eye on your mailboxes...

Labels: , ,

posted by Jeff Blankenburg, 1:31 PM | link | 1 comments |

Upcoming Events in Our Area

Monday, February 04, 2008


This information will also be going out in the MSDN Flash email, but if you're not subscribed, I wanted to make sure you got it here as well.



ArcReady http://www.arcready.com/
ArcReady is a free half-day series covering the topics important to aspiring and existing software architects.
     Cincinnati 3/3/2008
     Nashville 3/4/2008



DevCares http://www.devcares.com/
DevCares is a FREE half-day technical training series created by Developers for Developers! We’ll address the needs and issues of developers today and show you how to make a real difference in the way that you work!
     Southfield, MI 02/15
     Columbus, OH 02/29


Central Ohio Day of .NET April 19, 2008
The Central Ohio Day of .NET is a joint venture between the Dayton .NET Developers Group, Central Ohio .NET Developers Group and the Cincinnati .NET Users Group. The event originally was called the Cincinnati-Dayton Area Code camp and ran in 2006 and 2007 under that name. With the inclusion of the Columbus group the event has been renamed to the Central Ohio Day of .NET. The event is a FREE day of technology discussions devoted to helping the local development community grow.

Day of .NET events are a series of mini-conferences organized by developers for developers. You can find out more about Day of .NET events, including seeing upcoming events, on the series website at http://www.dodn.org/.





Visual Studio 2008, SQL Server 2008, Windows Server 2008 LAUNCH EVENTS!
     3/13/2008 Cleveland, OH
     3/18/2008 Detroit, MI "Premier Event"
     3/20/2008 Columbus, OH
     4/3/2008 Indianapolis, IN
     4/14/2008 Pittsburgh, PA
     5/1/2008 Nashville, TN
     5/13/2008 Grand Rapids, MI
     5/22/2008 Louisville, KY

Labels: ,

posted by Jeff Blankenburg, 10:29 AM | link | 2 comments |

Incredibly Honored...

Wednesday, January 30, 2008

Two days ago, I received an email that really surprised me.

With this job, I am amazed at the people I get to meet. I'm making great friends on a daily basis with some of the smartest people in the Midwest (and the country, if you ask me.)

I do a good amount of speaking, and certainly in Ohio I've done my share lately. With each speaking engagement, I get the chance to leave an impression on a room full of people. Positive or negative, I'm leaving impressions. On Tuesday, I realized how far those impressions travel.

My live.com email address (if you know me, you could guess it) is one I use for places I need a LiveID. I don't really use it for email, or calendar, etc. Just for logging in to sites that require it.

Occasionally (maybe once a month), I'll jump over to the email, just to see if someone might have written me there by mistake. There were 6 messages, 5 of which challenged my masculinity in one way or another. The 6th message though, was from a woman named Paula Caso.

She was contacting me because she teaches at a Cleveland-area high school, and runs the computer club there. They were having a fundraiser, and were building a new computer that they would auction off later this spring. With their allotted budget, they built an amazing machine. High-end gaming system. However, they were short-sighted in their spending. They blew their whole budget on the machine, and forgot to leave something for an operating system. (Before you start talking about free ones, remember that this machine will be auctioned to the public, and Windows is almost certainly a requirement.) Her husband had seen me talk at the Cleveland .NET SIG, and thought she should contact me to see if I could help.

It was her signature line in her email that most intrigued me, however.

(PS: North Olmsted High School is a public 9-12 school on the west side of the Cleveland metropolitan area in Ohio.)

(PSS: Our computer club web site is http://www.nohsteachers.info/PCaso/NOHSCompClub/ -- we maintain our own server, but our site is in need of updating.)


As it turns out, I grew up in North Olmsted, and spent my 4 years of high school at NOHS (as a three-sport athelete, no less). Smallest of worlds. So I'm looking into a way to help them out. And I let her know that. I also gave her a little background on what my role is with Microsoft. I told her that I've been writing/architecting software for the past 10 years, and that now I get to tell everyone about the new, cool things that we're doing at Microsoft.

She immediately asked me if I would be interested in coming to talk to her computer club. Since I will be at the Cleveland .NET SIG on February 12, I told her she could have that entire day, if necessary. She contacted the principal, and got me a small assembly on that day.

They are going to pull math, physics, and computer science students from their classes to come hear what *I* have to say? Whoa. That's flattering. I was expecting 8 kids in a classroom.

Looks like I need to wrap up this post and start writing a presentation.

Labels: , ,

posted by Jeff Blankenburg, 8:51 AM | link | 6 comments |

Why you should use a product before you sell it...

Tuesday, January 29, 2008



So with my newlyfound Christmas riches, I decided to make a couple of purchases recently for my home office.

1) Microsoft Wireless Entertainment Desktop 8000

2) HP MediaSmart Server EX470

Once my server arrives, I'm sure I'll have a blog post about it. But today's post is about the WED 8000.

First, let me say that the mouse and keyboard work EXCELLENTLY. In fact, I love them. The keyboard is wireless, bluetooth, and BACKLIT. The backlighting comes on as I approach the desk. For a guy that likes to work in the dark, that's a huge plus. It's even got a trackpad (like a laptop) on the keyboard, for when you're leaning back in your chair. Just awesome.

The mouse has what seems like 74 buttons, all configurable. 4 direction scroll wheel...basically everything you've ever heard of in a mouse is there. And it's bluetooth as well.

They both charge on a dock. The dock has 4 USB ports, in case you need to plug other stuff in, and it also is the Bluetooth receiver. This was the cool part of my installation experience. I got everything set up, and it immediately told me that "your device is locked. Unlock your device to connect via Bluetooth." I disregarded the error, since the keyboard and mouse don't have locks. Then I realized what had happened. It was trying to connect to my Palm Treo 700wx in my pocket. Once I unlocked the phone, it immediately connected and allowed me to sync with the computer. Goodbye phone dock.


Now to the appearance of the set. Brushed aluminum. Beautiful. Could be the centerpiece of my desktop. I've been using the mouse for about two weeks now, and every time I walk to my desk, I can't help but notice how pretty this stuff looks.

That's when the trouble begins. This morning, while catching up on email, something stabs me on my wrist. I look down to see a small, roundish fleck of metal. I look around to see where it could have come from, but my desk is messy, so it could have just been laying there. About twenty minutes later, though, I get another stab in the wrist. Another very similar little fleck. As I pull my hand up, I now figure out where these are coming from. On the bottom end of the mouse, the Microsoft logo is there in shiny silver metal foil. Running my finger over it, there are almost no edges. But it now reads: Microso.



They put foil letters right in the place where your hand not only contacts the mouse, but probably where it shifts the most as well. I'm enamoured with this mouse and keyboard, but it just feels a little "ruined" now. I'll certainly get over it, but I just want to know...did anyone use this thing before is was packaged and shipped to stores?

Labels: , ,

posted by Jeff Blankenburg, 10:28 AM | link | 4 comments |

JUXtapose - Episode 3: Popfly: Creating Your First Mashup

Monday, January 28, 2008

posted by Jeff Blankenburg, 3:49 PM | link | 0 comments |

Yahoo! Messenger for Windows Vista

Wednesday, December 05, 2007



This evening, Yahoo! Messenger for Windows Vista went live. You can download the software here. You can read the official release information at the Yahoo! Messenger Blog.

You can skin it.

You can tab it.

You can scale it.

Today, it is one of the largest applications available that is built in WPF. The application is all .NET 3.0 built on top of an unmanagaged legacy layer of code. The bridge is a mixed-mode C++ DLL. These together provide a WPF-friendly data model to the unmanaged code portions.

I think it will set the trend for the next generation of messaging applications. In addition to just looking cool, it's also compatible with MSN Messenger. So you can talk to all of your MSN buddies using this client as well. Now if they would just all play nicely, we'd finally be getting where we need to be.

GTalk, MSN, Yahoo!, AIM, Jabber, etc. Can't we all just get along?

Labels: , , ,

posted by Jeff Blankenburg, 11:48 PM | link | 0 comments |

Want a free copy of Visual Studio 2008 Pro?

Tuesday, November 27, 2007



So some of you may have heard rumblings about some piece of software being released recently, and some of you even chided me for not having a super mega blog announcement about it.

Visual Studio 2008 has RTMed!


Now, in other news, we have put together a few events to give away copies of Visual Studio 2008 Pro to y'all. (I'm currently in Texas...my apologies.)

We will be holding a Holiday Bowl-O-Rama & InstallFest event in Nashville, TN on December 3rd, and another one in Detroit, MI on December 7th. These events MUST be registered for in order to get the free bits, so here's the links to these events:

Nashville, TN - December 3
Detroit, MI - December 7

We will be handing out Visual Studio 2008 Pro (90-day trial) disks to everyone that attends. However, we are only able to give away a full version (available in early 2008) to those individuals that register using the links above, AND attend. Registration alone is not going to be enough.

As some of you loyal readers know, I went bowling a few weeks ago, and declared myself the best bowler that reads this blog. This is your opportunity to prove me wrong. These events will be held at bowling alleys, and we'll be picking up the costs of bowling and shoes, and food will be provided as well. All you need to do is show up, and hurl that ball down the alley.

If you can beat my 2-game average, I will have a special gift for you. (This is above and beyond the Visual Studio software you're going to receive). I'm not going to be promoting this contest at the events, so you'll have to come find me with your proof of score. It's one of the many benefits of being a regular reader of this blog.

So, go register for your event. Tell your colleages to register. It's gonna be a blast. We'll also have XBoxes with Guitar Hero III and Halo 3 available for playing.

Labels: , , ,

posted by Jeff Blankenburg, 10:13 AM | link | 6 comments |

You're Probably Not Interested...

Friday, November 09, 2007


1) Keynotes by Steve Ballmer and Scott Guthrie.
2) 3-4 days in Las Vegas, at the Venetian Hotel and Casino.
3) An opportunity to immerse yourself in the technologies that make up "The Next Web," and participate in a 72-hour conversation about the future of web technologies.

OK, since I'm sure that list appeals to very few of you, I'll be brief.

I'm describing Microsoft's MIX 2008 conference. I had the good fortune to attend last year, as an attendee, and had an amazing time. Silverlight was announced, for one. I had an opportunity to meet some incredible speakers, technologists, and Microsoft influentials those days. I had an opportunity to give over $200 of my own, hard-earned money to complete strangers at the poker tables.

In short, it was the best conference I have been to. My expectations are riding pretty high that v2008 will not disappoint. With that, registration is now open.

So, mull it over with your Manager. Blackmail your Boss.* Persuade your Project Manager. Discuss it with your Director. I'd love to have a posse to hang with in Vegas this year.

Are you going? Let me know!


* I do not, in any way, actually endorse blackmailing anyone. Please take it for the alliteration it was meant to provide, and nothing more.

Labels: , , ,

posted by Jeff Blankenburg, 9:36 AM | link | 1 comments |

The new hotness...@live

Wednesday, November 07, 2007

So for those of you I haven't already told...

Live.com email addresses and accounts are now available. Here's the steps you need to take:

1) Go to any "Passport" site and sign out. I recommend http://www.passport.com.

2) Go to http://get.live.com/getlive/overview and create your new Live account.

You're all set! "But Jeff, wait a second...how does that help me? If I want to use this for Messenger, etc., how do I do that easily?"

Here's the rest of the steps:

3) Go back to http://www.passport.com.

4) Sign in with either your new @live.com address, or your old Passport address.

5) Click on the "Settings" section on the left side of the page.

6) Click on "Linked IDs" in the Other Accounts section.

7) Click "Link an existing Windows Live ID"

8) Enter the password for the account you're logged in as, and the email and password for the account you want to link up. Here's more information on linking IDs.

9) Only a few steps left...go to MSN Messenger, and log in as your "old" account. In the Menu Bar, choose Contacts > Save Instant Messaging Contacts.

10) Save the file to your desktop or something.

11) Log out of messenger.

12) Log into messenger with the new account credentials.

13) Choose Contacts > Import Instant Messaging Contacts... and choose the new file we created from your desktop.

14) Change your tagline for a few days to let your messaging contacts know that you're now on their list twice, and that they can delete the "old" account. For example, my tagline currently reads: "I'm on your list twice. Delete the HOTMAIL one."

Ta-da! You now are using a new @live.com address, and you have access to all of your old settings, etc. that you had through your old passport account!

Labels: , ,

posted by Jeff Blankenburg, 11:06 AM | link | 2 comments |

JUXtapose Episode 2: ComponentOne Sapphire Interviews

Monday, November 05, 2007



JUXtapose - Episode 2: ComponentOne Sapphire Interviews
JUXtapose - Episode 2: ComponentOne Sapphire Interviews


Oh, and the timing is perfect...they just released the Alpha version of Sapphire today. Just register on their site, and download the installer!

http://labs.componentone.com/Sapphire/

Labels: , , , , ,

posted by Jeff Blankenburg, 12:03 PM | link | 0 comments |

JUXtapose Episode 1: Simple Animation Using Expression Blend

Friday, November 02, 2007

posted by Jeff Blankenburg, 1:27 PM | link | 4 comments |

Introducing JUXtapose


So I'm sure I'll be posting these everywhere, but I want my blog to at least be the starting place.

JUXtapose is the name of my new webcast series, and it will be primarily focused on the technologies I am most passionate about. This includes user interface technologies like Silverlight and WPF, as well as more general stuff like Javascript and CSS. It will also feature interviews from notable (and soon to be notable) developers in the field that have an opinion to lend on user experience.

The name JUXtapose comes from the subtitle: Jeff on User Experience.

Please leave comments, I'd love your initial thoughts on this, as well as recommendations and volunteerism for future shows.

Labels: , , , ,

posted by Jeff Blankenburg, 1:12 PM | link | 4 comments |

Central Ohio .NET Developer's Group Recap

Friday, October 26, 2007

I had an opportunity to speak at the October CONDG meeting last night, and had a great crowd. It was a great talk on Silverlight and some of the other cool things that Microsoft is up to, including Popfly, Surface, and Photosynth.

We also cleaned out the "swag closet," giving away a total of 16 items. This included some rubberized, roll-up keyboards (for typing in the bathtub), some 32MB flash drives, some 128MB flash drives, a few books, and a copy of Vista (congrats to Aaron Ponzani!).

Included in this post are links to the slide decks and demos that I used during the presentation.

Thanks to everyone that attended!

Silverlight 301 Deck & Demos

Innovative Microsoft Stuff Slide Deck

Labels: , , , , ,

posted by Jeff Blankenburg, 10:05 AM | link | 1 comments |

ReMix or DevLink? Anyone?

Thursday, October 04, 2007



I'm going to be starting another week-long adventure on Sunday, and I'm looking to meet you. I'm starting to put together a series of webcasts on developing effective UI, UX, and the interface technologies that are used to create them.

If you have thoughts on any of these subjects, or if I just haven't met you yet, please introduce yourself. I want to meet passionate developers.

Here are my expected locations for the next week:

Sunday, 10/7, 1:00 PM - Browns vs. Patriots game
Monday, 10/8, All Day - ReMix07 Boston
Tuesday, 10/9, All Day - ReMix07 Boston
Wednesday, 10/10, 5:00 PM - Cleveland for potential Game #5
Thursday, 10/11, All Day - DevLink Nashville
Friday, 10/12, All Day - DevLink Nashville
Saturday, 10/13, All Day - DevLink Nashville

Labels: , ,

posted by Jeff Blankenburg, 10:55 AM | link | 1 comments |

.NET Framework, now available in large print

Wednesday, October 03, 2007

This post is part of a large announcement today. Microsoft is releasing the source code for the .NET framework libraries under the Microsoft Reference License. This license allows viewing of source code, but not modification or redistribution. The source code will be downloadable and viewable by anyone who accepts the license agreement.

This is a very exciting announcement. You'll be able to download a package with all of the source, and then be able to install and browse it locally.

I can continue gushing about this, or I can send you to the official announcement locations:

Scott Guthrie's blog has the primary announcement, with screenshots of the Visual Studio experience.

Also, there is a 30-minute podcast interview with Shawn Burke on Hanselminutes.

Labels: , ,

posted by Jeff Blankenburg, 11:12 AM | link | 0 comments |

TUTORIAL: Creating A Simple Silverlight Animation

Monday, October 01, 2007

Silverlight has to be one of the easiest things I have ever worked with.

Last year, I was asked to put together a logo and site design for a new type of technology conference: CodeMash. (As a sidenote, registration just opened for the 2008 Codemash. For the price, it is by far one of the best conferences you'll attend this year.)

I designed the logo in Adobe Illustrator CS2, knowing that it would be used for print materials, the website, t-shirts, etc. It only made sense to create it using vector graphics. Little did I know at the time, it would also be the way that I turned that logo into an animation for CodeMash v2.0.0.8.

This post is meant to be a tutorial on what it really takes to create a simple Silverlight animation.

First, you are going to need to install some software (I am including links the newest stuff, but you should be able to do this with v1 of expression, and no Silverlight):
* Silverlight 1.1. Alpha
* Microsoft Expression Blend 2 September Preview (This version is good through June 1, 2008)

Once you've got those installed, you're also going to need some base XAML (eXtensible Application Markup Language) to work with. Download the CodeMash logo here. All this markup is at this point is the design. Just save this .txt file down, and we'll use it momentarily.

OK, now on to the tutorial:

1) Open Expression Blend 2, and create a new project.

2) Choose Silverlight Application (.NET)

3) By default, Page.xaml will be open. Choose the XAML view.

4) Cut and paste the contents of the logo.xaml file you downloaded earlier IN BETWEEN the <canvas> and </canvas> tags that are currently provided to you.

5) Flip back to the Design view, and you should now see the CodeMash logo on your canvas.

6) You're probably also noticing that the white canvas we started with isn't really big enough for our design. We should probably make that bigger as well. It needs to be 650px x 777px. We've got two options with this one. This first is just to edit the XAML directly. Take a look at that initial <canvas> tag we started with. It's got width and height properties, so we can just change the values. The second option is much better for those of you that don't want to edit your XAML directly. Click on the element named "Page" (that's our primary canvas) in the "Objects and Timeline" panel. Then, click on "Properties" in the top right. This shows you, much like Visual Studio, the Properties that are available to the element you've selected. Finally, you'll see the width and height properties in the list. You can type the values there, or you can use the innovative "slider" interface to get to the value you desire.

7) Take a look at the Objects and Timeline panel. You should see a well organized list of all of the elements that make up the logo. Gears, glasses, etc. Each one of these elements is defined in the XAML we imported. We are primarily going to be working in this panel the rest of the way.

8) Press F7 on your keyboard. This will take us into the "Animation Workspace." It's not any different from the "Design Workspace" (F6) we were in, except that the panels have been moved.
9) Expand the elements in the Objects and Timeline panel, and look for:
Page > Orange_Gear > Orange_Gear_Teeth. Click on that element once, highlighting it.

10) Under the "Objects and Timeline" panel header, there is a drop-down list with "(No Storyboard open)" as the selected value. Click the ">" button just to the right of that list. This will bring up the storyboard search dialog. Click the "+" symbol to create a new storyboard. Name your timeline/storyboard (it's named Timeline1 by default), and click "OK." Since we're gonna be animating the gears, I named my timeline "GearSpin."

11) You will now see that a timeline has appeared next to our list of elements. Each number (1, 2, 3, etc.) represents one second of time. We will use these times to "schedule" our animations. For those of you unfamiliar with animation software, we are going to be creating keyframes that will do most of the animation work for us. Basically, we define the states we want our elements to be in at certain keyframes, and the software figures out how to get it from Point A to Point B without any other instruction. Please also notice that your canvas now has a red line around it, and in the top right corner, now says, "Timeline recording is on." This means that all of our future actions will be recorded and animated. When we want to make a change that we don't want to be part of the animation, we need to make sure to turn recording off.

12) Make sure that the element "Orange_Gear_Teeth" is still selected. Just above where ZERO seconds is on the timeline, there is an icon with a green "+" in it. Click it. By clicking this, we are creating a keyframe at 0:00 of our animation. This means that it will start as soon as the application does. We could move this to 1 second if we wanted a 1 second delay before our animation began, but for this demo, we want it to start at the beginning.

13) Next, we need to create a new place for these gears to be. So let's say we want to have them rotate 90 degrees in 1 second. Drag the yellow timeline indicator to one second. Click the "+" to set another Keyframe at 1 second. In the "Properties" tab in the top right of Expression Blend, find the "Transform" section, and click the "Rotate" tab inside there. You will see that the current Angle is set to 0 degrees. Let's change that to 90 degrees. You can either click and drag the box to the right, until it says 90, or you can just click on the box, which will allow you to type 90.

14) Whoa! You may have noticed that your gear teeth have derailed from their hub. That's because we didn't define the center of those objects appropriately. Press CTRL + z on your keyboard, to undo the change you just made. Also, because we don't want to animate moving the center of these objects, we need to turn off recording. You can do this by clicking on the red circle in the top right corner of the canvas.

15) Because you have highlighted the "Gear_Orange_Teeth" layer, you should see a blue box surrounding those elements, but probably a bit bigger than just those elements need. You should also see a white dot that indicates where the center of that entire box is. We need to move that. Click on it and drag it to the blue center of the orange gear. That's the point we want our teeth to rotate around, right? To be more exact, I recommend zooming in and placing your center point that way.

16) Once you're confident in your center point, turn recording back on, modify that angle again, changing it to 90 degrees. Now you can click the "PLAY" button (it's right above the timeline) to see your orange gear spin.

17) We've got one other thing to take care of to make this look great. We don't want to have the gears stop after 1 second. We want them to continue spinning forever. This is a simple change. We had selected Orange_Gear_Teeth from the timeline earlier, and now we need to expand it. Inside it, you will see a RenderTransform element. This was created when we changed that rotation angle. Expand it all the way, and you will see an "Angle" element. Right-clicking on this will give you the option to "Edit Repeat Count." We can set this to 1, 2, 100, etc. There's also an "infinity" option. Choose that, and our gears will spin forever.


18) Now, we need to animate the other two gears. We are going to follow the same steps for the Blue and Green Gears. So take steps 9-17, rinse, lather, repeat. The only difference for the other two gears is that they rotate in the other direction. So instead of 90 degrees, they will be set to -90 degrees.
19) You should now have a working Silverlight application, that has the gears spinning. Press F5 to run your project!

Labels: , , , ,

posted by Jeff Blankenburg, 2:32 PM | link | 4 comments |

My Upcoming Travels...and a new, cool Night of AJAX

Tuesday, September 18, 2007


In case you're terribly interested in where I'll be over the next month, here's the short list (I'm sure this will be added to).

September 24 - Halo 3 Pre-Launch Party in Detroit, MI
September 25 - Halo 3 Launch Party in Columbus, OH
September 26 - Halo 3 Launch Party in Cincinnati, OH
September 27 - Columbus .NET Developer's Group Meeting
October 8 - ReMix07 Boston
October 9 - ReMix07 Boston
October 11 - Nashville .NET User's Group
October 12 - DevLink
October 13 - DevLink
October 15 - The Night of AJAX in Cleveland, OH (at the Microsoft office)
October 20 - Day of .NET in Ann Arbor, MI

26 days, 7 cities. Not bad. Where should I go next? Anyone have some great events coming up that I'm not aware of?

Also, in case you're curious, the Night of AJAX is a public event in Cleveland. We are going to be welcoming Jay Kimble of Codebetter.com fame and AJAX guru from Florida. It is planned to be a two hour event in which Jay will present an Intro to AJAX followed up with AJAX best practices and a discussion of Javascript Alternatives (eg. Script#/Silverlight). Please plan to check it out. Be sure to check back for more information as it becomes available. Please leave a comment or email me if you'd like more information. Special thanks to Dave Balzer for getting this great idea put together.

Labels: , , , , ,

posted by Jeff Blankenburg, 9:02 PM | link | 0 comments |

Phone discoveries in my travels...

Friday, September 14, 2007

So, this past week, I've been to Cleveland, Detroit (Ann Arbor), Columbus, and Cincinnati. In my driving, I finally used my phone to it's fullest potential.

The backstory: I rented a Jeep Liberty for my travels, it just made more sense. In renting a car, I made an assumption. The radio would actually work. As it turns out, it didn't. So now I've got 5 trips over 2 hours in length with nothing to listen to.

I've got a Palm Treo 700wx. It's running Windows Mobile 5.0, and I've also picked up the TomTom software and GPS device for it as well. With no music, and no real idea where I'm going (other than an address), my phone came to my rescue.

Within a 5 minute period, here's the 8 ways I used my phone:
1) I made a phone call. This one should be obvious.
2) I got turn-by turn directions to my destination.
3) I listened to MP3s using Windows Media Player and the built-in speaker.
4) I sent a text message to accept a friend request on Facebook.
5) I checked my work and personal email accounts (seperately).
6) I surfed to my RSS aggregator to see if
7) Using my RSS aggregator, I used Voice Command to read me some blog posts while I drove. It did surprisingly well turning text into speech.
8) I got notification that I had a conference call scheduled for 3:30.

Man! My phone is still pretty cool. Do that, iPhone.

Labels: , ,

posted by Jeff Blankenburg, 8:57 AM | link | 1 comments |

Basking In The Moonlight

Wednesday, September 05, 2007

While I was at Mix 07 as a guest of Microsoft, I had an opportunity to witness some amazing products that were coming in the near future. The one I found the most impressive was a technology called Silverlight. The "canned" answer to what Silverlight is, is: Microsoft® Silverlight™ is a cross-browser, cross-platform plug-in for delivering the next generation of .NET based media experiences and rich interactive applications for the Web.

For the three of you that I haven't told about it yet, here's some cool examples to see what's capable:

Tafiti - Silverlight Search Engine based on Live Search

Halo 3 Trailers

Major League Baseball Video Streaming

Anyways, the point of this post is to announce that Silverlight 1.0 has been released! You can go to http://silverlight.net/GetStarted/ now to download the final release of the runtime and development tools.

In addition, Microsoft has also announced a partnership with Novell, which will be building a 100% compatible Silverlight runtime implementation called "Moonlight".

Moonlight will run on all Linux distributions, and support FireFox, Konqueror, and Opera browsers. Moonlight will support both the JavaScript programming model available in Silverlight 1.0, as well as the full .NET programming model we will enable in Silverlight 1.1.

UPDATE: Here's plenty more information on Moonlight.

This is an exciting day for user experience. If you want help getting started on your first project, or just want to tell me about the cool way you're using Silverlight, drop me a line!

For all the nitty gritty details about this release, I don't think I can say it as well as Scott Guthrie, so check out his blog post on this as well.

Labels: , , ,

posted by Jeff Blankenburg, 8:56 AM | link | 0 comments |

Silverlight Presentation

Monday, August 27, 2007

Just a reminder to all of you in the Southfield/Ann Arbor/Detroit area...I will be presenting the Silverlight DevCares event on Wednesday, August 29.

http://www.devcares.com to sign up.

See ya there.

Labels: , ,

posted by Jeff Blankenburg, 9:22 AM | link | 0 comments |

Free Web Hosting For All

Saturday, August 25, 2007

I just got an inside tip that Verio is offering free MS web hosting through 2010. So, if you've been meaning to get around to building the next killer app, here's your chance to do it for free.

They even support Silverlight, so if you've been meaning to try it out, GET TO IT!
I believe they are Windows Server 2003, with IIS 6. You don't even need a credit card.

All you have to do is call Verio’s 800-932-7483 to receive your free website. This offer is unfortunately not available online. Please pass it along.

Labels: , ,

posted by Jeff Blankenburg, 8:56 AM | link | 2 comments |

Developer Evangelist

Thursday, August 02, 2007

I always get accused of not announcing the big things in my life (and I generally don't, because I don't want to come across as more arrogant), and so I've decided to let everyone know about this one.

I just recently spent a few days in Redmond, WA interviewing with a small software company located there (Microsoft). They have a position here in Columbus called "Developer Evangelist," and I have been interested in the job since I first heard about it. In short, the job requires me to learn about the new software development technologies that Microsoft has created (well before the general community has access to them), and then announce/demonstrate/teach those technologies to the developer communities in Michigan, Ohio, Kentucky, and Tennessee.

There will certainly be some travel involved with this position, getting around those 4 states, and a great deal of public speaking (something I enjoy, but have much more to learn about). This is a major deviation from what my career has been thus far, which has primarily focused on building software for clients, with budgets, timelines, and all of the other hurdles that generally stress me out.

I am really looking forward to this opportunity, and I think that this is the type of position that will offer me learning experiences on a daily basis. It's a great honor to have even been considered for this position by Microsoft, let alone awarded the job. My first day will be August 13.

This position was previously held by Drew Robbins, who has been an absolutely amazing asset to me and my team at Quick Solutions. He has left behind some enormous shoes to be filled, and I only hope I can succeed where his legacy left off. He has moved on to Redmond, where he will be the Technical Evangelist for the IIS7 team. I'm sure the world is in for a shakeup once he starts doing his magic.

So, in my travels though the "Heartland District," I hope I will have an opportunity to see many of you, if only for a beer.

Labels: , ,

posted by Jeff Blankenburg, 2:31 PM | link | 12 comments |

DevCares Event in Cincinnati, OH this Friday

Thursday, June 07, 2007

I will be speaking at the DevCares event in Cincinnati tomorrow, Friday, June 8.

I will be covering the Expression suite, with a demo on how to create a basic application using the new Expression tools from Microsoft.

I hope some of you will be able to attend!

I will post the presentation materials here afterwards.

Labels: , ,

posted by Jeff Blankenburg, 2:53 PM | link | 0 comments |

Mix '08...won't it be great?

Friday, June 01, 2007

They've already announced the dates for the Mix '08 conference. I'm really hoping to get an opportunity to go again. I'm still revelling in the knowledge and experience of the trip.

March 5-7, 2008. Venetial Hotel. Be there or be less than desirable.

Labels: , , ,

posted by Jeff Blankenburg, 4:01 PM | link | 0 comments |

Microsoft Surface

Wednesday, May 30, 2007

Holy cow. This looks awesome. It also looks like I'm holding off on buying a new coffee table.

Microsoft Surface is a new technology that basically uses a multi-touch screen to create an entirely new user experience. I can jabber on at length about this, or I can let the folks at Popular Mechanics demo it for you. Check it out:




And here's Microsoft's site as well:

http://www.microsoft.com/surface/ (why isn't this in Silverlight?)

Labels: , ,

posted by Jeff Blankenburg, 2:28 PM | link | 0 comments |

Day 1: Holy Cow.

Monday, April 30, 2007

So it's been hyped for the past few weeks that we were going to see many new things announced by Microsoft this morning. The hype didn't keep up with reality.

It was WAY better than sold.

THe biggest highlight of this conference is the combination of Silverlight with the .NET framework.

We can actually write C# code to function like you would normally expect Javascript to do.

We can create vector based animations to run in a cross-browser, cross platform environment, with all of the instructions stored in XAML.

Designers can completely control the look and actions of these elements in a graphical interface, but that design is then translated down to XAML, which can be edited, updated, etc as a file on the server. This allows the designer to control the looks, and the developer to control the functionality.

Two demos during the keynote were flooring, however.

First, the CEO from a company named Metaliq demoed a new AJAX/Silverlight/.NET application they call Top Banana. It is basically a content editing application, all within a browser. The URL is http://silverlight.metaliq.com/topbanana
It appears they have taken their demo down, but as soon as I can get access to it again. I will post it. It was truly unbelieveable.

The other struck close to home. I'm a huge baseball fan. Mondo big. And having grown up in Cleveland, I've been forced to suffer with the Indians my entire life. THe C-something-something from MLB.oom was here demoing their new MLB.TV application. It acted as I expected. Showed every possible statistic available in an interface that also shows the live games streamed over the internet. All great, all what I would expect. It include a feature that allowed you to add your favorite players (think fantasy baseball) and it would alert you every time your player did something in any of the games. It would also serve up the specific video clip of that notable performance. (On a sidenote, thsi guy said that they generate 10 DVDs worth of data with every pitch of every game. That seems like a little bit. :))

Anyways, even the fantasy player list wasn't the coolest part of this demo. Oh no. He then pulled out his cell phone, and showed us a Silverlight application running there. It showed stats, game scores, even live score updates, and runners on base. Think about the graphics that show up during a TV broadcast. Minus the actual game video. Well, with Silverlight, it appears they are going to be successful in streaming actually live video to your phone, and remember that fantasy player list, statistics, and video feeds? That was all demonstrated as well.

Man, this has been amazing thus far. Thanks again to Quick Solutions for sending me here.

Labels: , , , ,

posted by Jeff Blankenburg, 6:34 PM | link | 1 comments |

Day of .NET...I'm Speaking!

Thursday, April 05, 2007

Day of .Net May 5, 2007 - I'll be there!

After returning from Vegas on May 3rd, I'll be heading up to Ann Arbor for the Day of .NET. I was selected as a speaker for the event, and I will be presenting my talk on Google's APIs.

Hopefully, I'll see you there!

Labels: , ,

posted by Jeff Blankenburg, 2:39 PM | link | 1 comments |

Mix 07! I'll be there!

Wednesday, January 24, 2007

I'm Going To Mix 07!  Elvis Will Be At Mix 07!  Let's Mix at Mix 07!  Roll the dice with me at Mix 07!


So I know I just got back from an amazing conference in CodeMash, but I've got great news! I'm heading to Mix 07 at the end of April, thanks to the good folks at Quick Solutions. Brian Prince and the rest of the management team do nothing but support me and my technical growth. I can't thank them enough for the opportunities they have provided me.

It's taking place in the Venetian Hotel & Casino in Las Vegas, NV from April 30 - May 2, 2007. I'll actually be heading out the morning of the 29th, and flying home to Columbus on May 3rd, so it should make for an exhausting trip. Based on the preliminary schedule of events, here's how I see my schedule going down:

April 29, 2006
7:00 AM - Get to the Columbus Airport, check in, go through security checkpoints, recover from cavity search.
9:00 AM - Take the flight to Sin City.
10:38 AM - Arrive in Las Vegas. We are now operating on Vegas time people, keep up.
10:39 AM - Lose my first $10 in a slot machine.
11:00 AM - Check in to the Venetian Hotel & Casino.
11:30 AM - Lose another $50 at the blackjack table.
12:00 PM - Grab some lunch.
12:45 PM - Wander the hotel, getting my bearings on where registration, session rooms, etc. are.
4:00 PM - Head over the registration, get checked in for the event.
5:00 PM - Sit down for a long night of Texas Hold-em at the Bellagio Poker Room (or maybe the Venetian Poker Room, it looks to be new)


April 30, 2006
1:00 AM - Go to bed.
8:30 AM - Head down to the Continental Breakfast. Mingle. Meet some people.
9:30 AM - Head over the Keynotes session. Ray Ozzie and Scott Guthrie are expected to be speaking. I really enjoyed Scott's talks at CodeMash, so I hope there is new material for Mix.
12:00 PM - Lunch
1:30 PM - Time for some sessions.


Um, I expected this blog post to be longer, but it doesn't appear that they have decided which sessions will be in which time slots. So, of the sessions that are listed on the site currently, here are the ones I expect to attend:


LINQing Your Web Applications - See how Language-Integrated Query (LINQ) allows for the most seamless integration of your Web applications and relational data. Get a sneak peek at the next version of the .NET Framework and Visual Studio (codenamed “Orcas”).

Driving Your Business through User Experience - Hear how tools, technologies and cutting edge design combine to create the user experiences that drive your business. See how a continuum of user experiences can be a powerful lever to differentiate the products and services you offer via the Web.

Gazing into the Future of Web Development - Be one of the first to see the big advances planned for the next version of ASP.NET for building rich Web applications. Get a sneak peek at technology to help simplify rich content, data, services and more. Learn how to efficiently and effectively create data-driven applications that fully leverage the power of “WPF/E” and AJAX on the client coupled with powerful server-side features provided by ASP.NET.

Thinking in CSS: How to Build Great Looking Sites - Delve into CSS with Molly Holzschlag, and look at the power CSS offers to Web developers and designers. Hear Molly's secrets about how to build stunning sites quickly and easily.

Five Real World Applications that Raise the Bar for User Experience - Come learn about five applications that will change what your customers will expect from tomorrow’s software applications.

IE7 Retrospective: Microsoft's Look at the Good, Bad and Ugly - Hear from Microsoft's IE7 team about the journey from mea culpa to broad market acceptance. Hear what went right, what had to be cut, and how development priorities are set. Learn how to minimize your Web browser support headaches, and move to a more standardized Web.

There are plenty more sessions planned, and my preference may change once I see which sessions are in which time slots. Expect to see many more posts about this in the near future. And for those of you that want me to put $1 on Red 32 for you while I'm there, start saving your pennies.

Labels: , , , , , , , , , , , , , , , , ,

posted by Jeff Blankenburg, 2:33 PM | link | 2 comments |

CodeMash Day 1

Friday, January 19, 2007

Codemash. What can I say? This is the first community-driven event I have ever attneded, and I have been blown away by the quality of the attendees here. I have had an opportunity to talk with Microsoft influencers (Drew Robbins, Josh Holmes, Jennifer Marsman, you have all been great, and it's been an absolute pleasure to spend some time talking and working with each of you), community leaders (Todd Kaufman [on the board of COJUG], Rob Stevenson [part of the Columbus Ruby Brigade], and many more), as well as thought leaders in people like Neal Ford, Bruce Eckel, and Scott Guthrie.

Events like this inspire me because it's a constant reminder that I need to keep moving forward in my "commitment to a lifetime of education". I've never mentioned this concept in my blog before, but it basically comes down to this: As an individual in the software development field, I have a choice. I can either commit to a lifetime of learning the new "thing", the new technology, the new way of doing things...or I can be left behind, to become extinct. Just like the carpenter that foo-fooed the hammer, those who mock the future of software development are destined to not be a participant.

I hope that Day 2 is nearly as eye-opening as Day 1. I am having an absolutely amazing (and most of all educational) experience. Codemash!

Labels: , , , , , , , , , ,

posted by Jeff Blankenburg, 1:11 AM | link | 0 comments |

Search

My Sponsor


My Badges



Follow Jeff Blankenburg on Twitter