Pipe Dreams and Hack10

Comments [0]
PipeDreams Team
The Pipe Dreams team

I didn't know what to expect when I was invited to the Hack10 Hackathon in Miami last week. I heard we would be working with Windows 10, so I installed the preview. I heard we would be working with Visual Studio 2015, so I installed that preview. I heard we would be using Azure, which was good because I love Azure and I wanted to learn more. I heard we would be doing something with the "Internet of Things" (IoT) and I wondered what was meant by that. I heard we would be using Git, so I did a bit of reading because I am very much a Git noobie.

But I didn't know what we would be working on or what the format would be.

As it turned out, we were asked to split into teams of 4 or less and come up with an idea involving IoT, Azure, Windows 10 and Git. Many people arrived with ideas and teams already formed. I did not. I looked around and saw a team of 3 with an idea and I asked if I could join them team. It was Dave Voyles, David Crook and Jennifer Marsman and they were kind enough to let me in. I had worked with Jennifer in the past and I knew Dave and David by reputation, so I believed we had a very strong technical team.

David Crook had come to the Hackathon an idea - a hardware device to monitor temperature, pressure, light, and wind flow and report that data (along with time and location information) to a database in Azure that could be queried and displayed in a portal. The hardware device would simulate the readings inside an oil pipeline because this was a real-world problem that Crook had studied before coming to the hackathon. We called our project "Pipe Dreams".

Jennifer worked to program 2 hardware devices - one to monitor the environment and one to send collected data to Azure;
Dave Voyles created a portal to displayed the data on a map, updating each collection point and popping up a message if data fell outside an acceptable range. He completed a web front-end and started a Windows 10 client;
David Crook wrote most of the business logic and analysis, including some fairly complex formulas that he acquired from his research of the oil and gas industry.
and I created an Azure SQL database and a mobile service to write and query the data.

We shared our code in a Git repository, integrated with Visual Studio Online.

When it was done, we had data flowing end-to-end, measuring the environment and collecting data via an IoT device; stored and analyzed in Azure; and reported via a web portal.

We presented our findings to the group. I opened with a video showing a pipeline explosion (of course) and promised that our solution would solve this problem. The other team members showed off the technical aspects of the solution.

It was a competition among the dozen or so teams and first place went to... Pipe Dreams! That's right, we won!

We also had a chance to see what the other teams built, which was  a lot of fun. One of the more clever (and sadistic) ideas was a device allowed audience members to rate a speaker during a presentation and give the speaker a shock if his ratings fell too low.

Two other teams placed in this competition: A team from Brazil created a game that became more difficult as more players connected over the Internet and played against you; and Paul DeCarlo, Jared Bienz, and Sertac Ozercan created a device to play music that could be controlled via a range of other devices, including Windows 8, Windows Phone, XBOX One and the Microsoft Band.

Overall, it was an excellent weekend. I learned a lot about the technologies we worked with and I was able to partner with some really bright technologists. Microsoft had invested quite a bit into the event to help keep us Evangelists up to speed on the technical side of our jobs - we stayed in a nice hotel, ate excellent food, and there were a number of experts on hand to answer questions or help us when we got stuck.

I hope these types of events continue and I hope that I can be a part of one in the future.



"Small Gods" is the thirteenth book in Terry Pratchett's Discworld series.

Pratchett's Discworld universe contains a plethora of gods. The vast majority of these gods are tiny, swarming invisibly and unnoticed in the desert. But a few gain a following of worshippers, which increases both the size and the power of these fortunate gods.  One such god was Om, who was so powerful in the country of Omnia that the priests who ruled the country would tolerate the worship (or even mention) of any other god. Om would typically manifest himself as a giant bull; but, when the story opens, he has somehow been transformed into a small tortoise. Om is preoccupied with his reduction in status - from powerful being to to tiny reptile - and with avoiding the talons of hungry eagles circling overhead.

One of Om's problems is that the people of Omnia don't really believe in him - they only go through the motions of their religion out of fear of the priests and the mysterious Quisition, who capture, judge, and torture accused heretics. Another of Om's problems is that he cares very little for the lives and fates of those who worship him - he only desires their faith because it brings him greater power, but he cannot even remember the names of his own prophets.

While struggling in his tortoise form, Om encounter Brutha, an illiterate student/servant with a good heart. Brutha is the only one in Discworld who can see or hear Om because he is the only one who believes in him without the threats from the Omnian church. Brutha is troubled to discover his god is not omnipresent or omniscient or caring or even polite. But he agrees to help him return to his former glory.

Small Gods is filled with quirky characters and witty prose. Like all the Discworld novels, every scene overflows with silliness. Pratchett describes a philosopher with the following:

His philosophy was a mixture of three famous schools -- the Cynics, the Stoics and the Epicureans -- and summed up all three of them in his famous phrase, "You can't trust any bugger further than you can throw him, and there's nothing you can do about it, so let's have a drink."

Or this witty exchange between the leaders of two countries:

"Slave is an Ephebian word. In Om we have no word for slave," said Vorbis.
"So I understand," said the Tyrant. "I imagine that fish have no word for water."

But Small Gods also biting satire about the dangers of religious zealotry and the emptiness of blindly following tradition. With Small Gods, Pratchett reaches beyond making us laugh and makes us think.


I spend a lot of time learning new skills and new technologies. After learning something new, my first reactions are to apply it that knowledge and to share that knowledge. When I was a consultant, I spent more time applying knowledge; generally, I was learning things that I needed to do my job, such as a technology that fit my current project.

Today, I am a Technical Evangelist and I spend more time passing on that knowledge to others.

I have found the following to be the most useful ways to pass on the knowledge I've learned: blog posts; technical presentations at user groups and conferences; screen casts; and hands-on labs.

Each of these media tend to appeal to different groups. There are a number of software developers, for example, who read blogs every day but never attend a code camp or user group. There are also different learning styles: some people learn more by reading; others by seeing it done; still others by doing it for themselves. (For me, a combination of all three works best).

Knowing that these different audiences exist has given me permission to package the same information into a variety of formats.

For example, for the past few months, I've developed and delivered a presentation on Azure Mobile Services. The presentation lasts about 90 minutes, which is perfect for a user group. I can cut it down to 60 or 75 minutes for a conference time slot.

Many people who saw this presentation told me they like the content because it covers all the basic features of Mobile Services and explains why they are important.

A few weeks ago, I had some extra time so I decided to commit to a adding more technical content to my blog. I was struggling to come up with ideas when I thought of the Mobile Services presentation. As often as I gave this presentation, only a few hundred people had seen it due to the fact that people had to travel to a user group or conference on a specific date and time to catch it.

I decided to transcribe the contents of my presentation into a series of blog posts. So far, I've written 9 different blog posts and I still haven't covered all the material in the 90-minute presentation.  Writing blog posts makes the content available to people who prefer written material over in-person delivery; and it also makes it available to a much larger audience - you don't need to travel to where I'm speaking in order to learn what I am teaching. (I’ve linked to the posts at the end of the article)

After a couple weeks of blog posts, I scheduled a hands-on workshop at a large university in order to show students how to use Mobile Services. I decided to start the workshop by delivering my presentation. Afterwards, I wanted the students to try the technology themselves, so I wrote a set of Hands-On labs with step-by-step instructions for creating and configuring Azure Mobile Services. The labs were similar to some of the blog posts I had already written but I re-wrote them with a different audience and a different goal in mind - The blog posts could simply be read; but with the labs, I was expecting the reader to follow along, so I had to make each step as explicit as possible. You can download the current version of these labs at https://github.com/DavidGiard/Azure-Mobile-Services-Labs.

I haven't yet decided if I'll record a set of screencasts showing developers how to manage Azure Mobile Services, but doing so would not involve a huge amount of time, since I already have most of the script written (from either the blog posts or the labs).

I'm not sure what is my next step - expanding the labs, continuing the blog post series, or creating screencasts. Of course, there are other demands on my time that will keep me from doing all of the above.

My point is that I don't see any problem repackaging the same content in multiple formats. Different people learn in different ways, so it's a great way to scale your knowledge transfer. If you are in the business of educating people, I'd love to hear your opinion. Is it cheating to repackage the same content? Or is it effective use of time and good scaling of delivery?


Azure Mobile Services Blog Posts (so far)



November 2014 Gratitudes

Comments [0]

12/5
Today I am grateful to all the Purdue students who came out to my Azure Mobile Services workshop last night.

12/4
Today I am grateful for lunch with Adina yesterday. in Wicker Park.

12/3
Today I am grateful for the audience at my final Cloud Dev Camp yesterday in Indianapolis.

12/2
Today I am grateful for my final 2014 trip to Indianapolis.

12/1
Today I am grateful I spent most of the past 24 hours with my son Tim.

11/30
Today I am grateful for another Michigan State football season with double-digit wins! #GoGreen

11/29
Today I am grateful for a home-cooked meal last night and leftovers for lunch today.

11/28
Today I am grateful for Thanksgiving dinner with my family yesterday.

11/27
Today I am grateful for my family - both near and far.

11/26
Today I am grateful that I have heat restored to my house on this chilly morning.

11/25
Today I am grateful I made it back to Michigan in time to take care of a couple emergencies with my house.

11/24
Today I am grateful to Jason Farrell, who loaned me his laptop power cord for over a week, making it possible for me to get some actual work done.

11/23
Today I am grateful for all the energy at the Northwestern University WildHacks hackathon this weekend.

11/22
Today I am grateful to be heading back home for the first time in over 10 days.

11/21
Today I am grateful to attend and speak at M3Conf for the first time yesterday and today http://m3conf.com .

11/20
Today I am grateful to those who came to the Cloud Dev Camp yesterday and to George, who helped me out by delivering an excellent Azure SQL Database presentation.

11/19
Today I am grateful for lunch yesterday with Kent in Franklin, TN.

11/18
Today I am grateful for a network of smart people I can call on for technical assistance.

11/17
Today I am grateful for: 1. The hospitality of Darlene and Kevin. 2. Getting to see an exciting Rams-Broncos game in St. Louis yesterday. 3. Fitz's root beer.

11/16
Today I am grateful for: 1. My first visit to St. Louis Day of .NET, and all the organizers, speakers, and attendees, who made it a great experience. 2. An exciting basketball game at St. Louis University last night.

11/15
Today I am grateful for all the great people I am meeting my first time at St. Louis Days of .NET.

11/14
Today I am grateful for; * Making it onto the last flight to St. Louis via standby. * My first-ever visit to Houston, TX * A great turnout at the Cloud Dev Camp yesterday * Finding my phone

11/13
Today I am grateful to spend yesterday hanging out with Sarah, driving around the state of Illinois.

11/12
Today I am grateful for the opportunity to teach my first college class last night.

11/11
Today I am grateful to all the veterans who have served our country, especially my Dad - Lt. Cmdr. E Normand Giard, USN, ret. His photo is my profile picture today in his honor.

11/10
Today I am grateful to Susan Anspaugh, who loaned me her carpet cleaner to shampoo my carpets and wasn't mad that I kept it so long.

11/9
Today I am grateful for a ticket to the MSU game last night, even though the good guys lost.

11/8
Today I am grateful I had a chance to watch the local premiere of "Teenage Ghost Punk" last night.

11/7
Today I am grateful for my first Office Hours at Chicago Innovation Exchange yesterday and to all those who showed up.

11/6
Today I am grateful that the sharp stomach cramps I took to bed last night were gone this morning.

11/5
Today I am grateful to return to Chicago and get back to what I do.

11/4
Today I am grateful I was able to stay in one place for a week, where I had a chance to catch my breath.

11/3
Today I am grateful for a walk along the river on an Autumn afternoon.


Stephen R. Donaldson introduced Thomas Covenant in his 1977 novel Lord Foul's Bane. He continued the story in The Ilearth War and concluded the Trilogy with The Power That Preserves. Donaldson went on to write a second Trilogy about this character, followed by a 4-part series titled "The Last Chronicles of Thomas Covenant". This review covers only the first Trilogy.

Thomas Covenant was a bestselling author with a good home and a loving wife and infant son, when he was suddenly struck ill with leprosy. The disease cost him 2 fingers on his right hand and his wife, who left Thomas for fear their son would catch his disease. His neighbors rejected him out of fear and ignorance, but he defied them by walking into town each week to collect his mail.

On one such trip, Thomas was crossing the street and nearly run down by a police car. When he awoke, he found himself in a strange world, known only as The Land, facing the horrific villain Lord Foul, who commanded him to deliver a message to the people of The Land.

The Lords and commoners of The Land noticed Covenant's missing fingers and his white gold wedding ring and assumed he was the reincarnation of Berek Halfhand, a heroic figure from The Land's past, who lost his fingers battling the evil Lord Foul with the powerful force of white gold. They believed that Covenant was sent to The Land to protect them and to defeat Lord Foul.

Their faith in Covenant and their non-violent code caused them to forgive Covenant's every sin and shortcoming. And he has many.

When he enters the Land, Covenant's leprosy is magically cured, restoring feelings to his nerve endings. The rush of long-unfelt sensation is so overwhelming that he rapes Lena, a young woman who had shown kindness to him. Even this betrayal does not shatter the faith of either the people of The Land or of Lena herself.

Time and again throughout the trilogy, the Land's inhabitants sacrifice themselves for Covenant, hoping he will use his power and defeat Lord Foul; but, Covenant repeatedly defers, making no effort to learn how to harness the power of his white gold ring and often pushing his responsibility onto others.

Covenant is magically transported back to his own world; but is drawn back to The Land two more times with the expectation that he will rescue its inhabitants. Most of the time, the inhabitants are disappointed. Each time, he returns to The Land years have passed in this magical world, even though only a few weeks have passed in his own.

In the world of high fantasy, there are many unlikely heroes, but few as unlikeable as Thomas Covenant.

Covenant is reluctant to take on the responsibility of battling Lord Foul. During his years as a leper, he has learned to be extremely cautious because he no longer has nerve endings to warn him of impending danger. He carries this caution into The Land, despite no longer needing it. Worse, Covenant seems incompetent as The Land's heroes and does not even recognize the powers he has such as the magic that white gold holds in The Land. He leaves disappointment and betrayal almost everywhere he goes, until his final encounter with Lord Foul at the end of the third book.

Overall, I enjoyed this trilogy. The Land suffered under Lord Foul and their chosen hero could not help them; but ultimately Covenant found his strength and did what he needed to do.  The characters were interesting enough to hold my attention for three books; but I don't know if or when I'll return to The Land and read the remaining seven.


Teenage Ghost Punk

Comments [0]

Writer/Director Michael Cramer describes Teenage Ghost Punk as a "supernatural punk rock romantic comedy" - a string of adjectives and nouns that make it tough to categorize.

The movie debuted in October at the Spooky Movie International Horror Film Festival in Washington, DC. I saw it a month later at its Chicagoland premiere at the School of Rock in Oak Park, IL.

Teenage Ghost Punk tells the story of a family moving into a haunted house. Amanda is a popular high school cheerleader from Spring Lake, MI, whose newly-divorced mother moves the family to suburban Chicago, hoping for a fresh start. Amanda feels out of place in her new home and she is stressed because she misses her cheerleader friends and tall-but-rockhead boyfriend. Things get worse when she begins to hear bumps in the night and family items turn up missing. It turns out that the house is inhabited by the ghost of Brian - a teenager who was struck by lightning while playing guitar on the house's roof during a thunderstorm in the early 1980s. Brian is convinced this is still his house and that Amanda and family are intruding. Only Amanda can see and hear Brian and his ghostly pals. They talk and become close and Amanda decides to invite Brian to the school dance, where she hopes to introduce her friends to her new boyfriend. And then it gets weird.

WP_20141107_20_48_06_Pro
Cramer, along with some of the cast and crew answer audience
questions after the Chicagoland debut viewing November 7

In 2009, Michael Cramer released his first movie - Dear Mr. Fidrych - about a kid who idolized Detroit Tigers Pitcher Mark "The Bird" Fidrych, then grew up to address his midlife crisis by taking his son across country to meet his boyhood idol Fidrych.

I liked Dear Mr. Fidrych. It reminded me of my own childhood - and not just because Cramer and I grew up together in a Detroit suburb during the 1970's when The Bird had his burst of fame. However, Dear Mr. Fidrych was an independent film created on a shoestring budget and there was no hiding these facts.  Technical aspects of the movie were lacking - in particular the sound was inconsistent throughout the film and nearly all the actors were amateurs, with the leading roles going to the director and his immediate family. The story, the energy, and the charm of Dear Mr. Fidrych were enough to more than make up for any technical weaknesses.

Teenage Ghost Punk is far more polished. One could easily believe it was produced and created by a Hollywood studio. The sound is better, the cinematography is better and the acting is better. But the script retains the humor and the humanness of Dear Mr. Fidrych. Even Jack Cramer (son of the director), who plays the title character, has grown into a solid actor. He has an engaging smile that resonates on screen as he charms both Amanda and the audience. I can't think of any aspect of moviemaking that did not improve between Cramer's first movie and this one.

Teenage Ghost Punk is filled with memorable characters. A bumbling Ghostbusters-like team fails to defeat any ghosts but end up being right about their supernatural presence; the neighborhood ghosts spend their days recreating moments from their lives and spend their evenings playing cards; The over-the-top gay neighbors bicker and cuddle shamelessly; Amanda's little brother Adam includes 4-syllable words in nearly every sentences; and Madame Lidnar has little success at her own séances, but relates as well as anyone to the ghosts when she encounters them.

The silliness of the characters adds to the story, rather than distracting from it. The theme of TGP comes together very well at the end. Ultimately, the movie is about letting go of the past and moving on. Most of the characters - living and dead - are unable to do so until the end of the movie. They grew and matured as time passed.

And so did Michael Cramer and his crew.



In my last article, I described how to use Visual Studio to create and deploy an Azure Mobile Service with server-side code written in a .NET language. I chose C# for that example. In this article, we will walk through the boilerplate C# code generated when you create a new Azure Mobile Services project.

Figure 1 shows the newly-created Azure Mobile Services project in Visual Studio’s Solution Explorer

Zumo9-Figure 01 - ZuMo Project
Figure 1

Let’s go through the key parts of the code.

Global.asax.cs

The Application_Start code runs at the very beginning of the application so any startup code goes here. In this case, we call the static method WebApiConfig.Register (Listing 1).

protected void Application_Start()
{
    WebApiConfig.Register();
}

Listing 1

WebApiConfig.cs

Let's take a look at the Register method in the WebApiConfig class.  WebApiConfig.cs is in App_Start folder.

This project uses the Entity Framework to interact read and write data. The most important line of the Register method (Listing 2) is

Database.SetInitializer(new MobileServiceInitializer());

which initializes Entity Framework settings. The new MobileServiceInitializer is found in the same file and it has the ability to seed the sample TodoItem table with a couple records (Listing 3)

public static void Register()
{
    // Use this class to set configuration options for your mobile service
    ConfigOptions options = new ConfigOptions(); 
 
    // Use this class to set WebAPI configuration options
    HttpConfiguration config = ServiceConfig.Initialize(new ConfigBuilder(options)); 
 
    // To display errors in the browser during development, uncomment the following
    // line. Comment it out again when you deploy your service for production use.
    // config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 
 
    Database.SetInitializer(new MobileServiceInitializer());
} 
 


Listing 2

public class MobileServiceInitializer : DropCreateDatabaseIfModelChanges
{
    protected override void Seed(MobileServiceContext context)
    {
        List todoItems = new List
        {
            new TodoItem { Id = "1", Text = "First item", Complete = false },
            new TodoItem { Id = "2", Text = "Second item", Complete = false },
        }; 
 
        foreach (TodoItem todoItem in todoItems)
        {
            context.Set().Add(todoItem);
        } 
 
        base.Seed(context);
    }
}

Listing 3

TodoItem.cs

Next, we'll look at the TodoItem class (Listing 4), which can be found in DataObjects folder. This is the data model and will. It has 2 explicit properties - Text: the text of a Task that we need to complete; and Complete: a flag indicated whether or not we have completed this task. This object will will map to columns in the TodoItem table.
We don't need to explicitly provide an ID property because the class inherits this property from the EntityData class.

public class TodoItem : EntityData
{
    public string Text { get; set; } 
 
    public bool Complete { get; set; }
}
 

Listing 4

MobileServiceContext.cs

This is a Context used to manage database updates and retrievals via Entity Framework. It knows where to connect to the database and what model to send to the database. The Controller class will instantiate this to interact with the database table.

TodoItemController.cs

TodoItemController is the main controller class that maps HTTP Verbs (POST, PATCH, GET, and DELETE) to specific actions. It inherits from the TableController class, which has an IDomainManager named DomainManager that is used to retrieve and update data using Entity Framework. All the controller methods need to do is to call TableController methods, such as Lookup, UpdateAsync, InsertAsync, and DeleteAsync.

For example, if a client sends a request to our mobile service’s HTTP endpoint with the POST verb, the routing engine will run the PostTodItem method in TodoItemController (Listing 5).

public async Task PostTodoItem(TodoItem item)
{
    TodoItem current = await InsertAsync(item);
    return CreatedAtRoute("Tables", new { id = current.Id }, current);
}

To add business logic to your service, you will add code to the Controller methods (GetAllTodoItems, GetTodoItem, PatchTodoItem, PostTodoItem, and DeleteTodoItem.)

In this article, we covered the code that is automatically generated in a C# Azure Mobile Service.


In a previous article, I described how to create an Azure Mobile Service built on top of node.js - with all the server-side code written in JavaScript. You can also create a Mobile Service with server-side code written in C# or Visual Basic. You will probably prefer this method if you are more  proficient in .NET than in JavaScript.

This article will walk you through the creation of an Azure Mobile Service, written in C#.

Launch Visual Studio 2013 and select File | New | Project from the menu. The New Project dialog displays, as shown in Figure 1.

Zumo8-Figure 01 - FileNew
Figure 1

Under the Templates list at the left of the dialog, expand either Visual Basic or C#; then, select the Cloud template category. Select "Azure Mobile Service" from the Cloud templates listed at the center of the dialog. Give the project a Name and Location and click the [OK] button.

The New ASP.NET Project dialog displays, as shown in Figure 2.

Zumo8-Figure 02 - NewProject Template
Figure 2

The Azure Mobile Service template should be selected and the "Web API" checkbox should be checked. Leave these selected and check and check the Host in the cloud checkbox; then, click the [OK] button.

Because you elected to host this service in the cloud, the Create Mobile Service dialog displays next, as shown in Figure 3.

Zumo8-Figure 03 - Create Mobile Service
Figure 3

Select an Azure subscription to deploy the Mobile Service; enter a name for your Mobile Service (it must be unique);  select a Region; select a database; and enter login credentials for that database. Then click the [Create] button. This should create a project on your local machine and an empty Mobile Service in your Azure subscription.

The Mobile Service project is shown in Figure 4.

Zumo8-Figure 04 - ZuMo Project
Figure 4

To publish your Mobile Service, right-click the project in the Solution Explorer and select Publish from the context menu. The "Publish Web" wizard displays with the "Profile" page activated as shown in Figure 5.

Zumo8-Figure 05 - Publish Web
Figure 5

Under "Select a publish target", click "Microsoft Azure Mobile Service". The "Select Existing Mobile Service" dialog displays as shown in Figure 6.

Zumo8-Figure 06 - Publish Web-Profile
Figure 6

From the dropdown, select the Azure Mobile Service you created above and click the [Next] button.

The Profile page of the "Publish Web" wizard displays as shown in Figure 7.

Zumo8-Figure 07 - Publish Web-Connection
Figure 7

Verify the information on the Profile page is correct and click the [Next] button.

The "Settings" page of the "Publish Web" wizard displays as shown in Figure 8.

Zumo8-Figure 08 - Publish Web-Settings
Figure 8

Select "Release" from the Configuration dropdown and click the [Next] button.

The "Preview" page of the "Publish Web" wizard displays as shown in Figure 9.

Zumo8-Figure 09 - Publish Web-Publish
Figure 9

Click the [Publish] button to publish the Mobile Service to your Azure subscription.

Now, you should be able to log onto the portal and view your new mobile service (Figure 10). Its status may be listed as “Creating…” if you go to the portal too quickly; but, within a couple minutes, you will be able to manage the service from the Azure portal.

Zumo8-Figure 10 - Service in Portal
Figure 10

You can manage this service almost exactly the same way that you managed a JavaScript mobile service. The difference is that the .NET mobile service does not contain a DATA tab. Data configuration in a .NET service is done in the Visual Studio project.

In this article, we showed the steps to create and publish a new Azure Mobile Service with server-side code in a .NET language.


Azure Mobile Services provides a simple way to expose server-side data to clients. In previous articles, we exposed data via a REST service and we created a client application that called that service to retrieve or update data.

But what if we want our service to push data down from the server to a client device without that device making a call each time? For example, you may want to tell send a message telling your app to change the text displayed on its tile, displaying the total number of orders entered in your e-commerce app; or you may want a "toast" popup notification to display on the app's device whenever someone scores in the Top 10 on a game you wrote.

We can use Push Notifications to do these things.

Each mobile vendor has its own service to manage Push Notifications and each service exposes an API to manage those notifications. Apple offers a Push Notification service to send data to registered iPhones and iPads; Google offers a Push Notification service to send data to registered Android phones and tablets; and Microsoft offers two Push Notification services - one to send data to registered Windows Pones and another to send data to registered Windows 8 or 8.1 devices.

Each of these services has an API and we can call each one explicitly for every device that will receive a notification. But this requires passing the address of each device, which is tedious and error-prone. Plus, it requires our server-side application to maintain a list of every device to which we want to push messages.

We can simplify the process by configuring Push Notifications through Azure Mobile Services. Azure Mobile Services Push Notifications automatically works with Azure Notification hubs to manage these messages.

In this article, we will focus on sending a Toast Notification to Windows 8.1 clients, but the process is similar for all Push Notifications.

The steps for setting up Push Notifications to a Windows 8.1 client using Azure Mobile Services are:

1. Create an Azure Mobile Service
2. Create a Windows 8.1 Client App and modify it as follows
    a. Associate app with store
    b. Get Package SID and Client ID from Live Services. Copy these to Mobile Service.
    c. Register notifications channel in OnLaunched (App.xaml.cs)
    d. Enable Toast notifications (Package.appxmanifest)
3. Update the Mobile Service service to send Push Notifications.

Let's walk through an example.

1. Create an Azure Mobile Service

For our example, we'll use the Azure Mobile Service we created in a previous article. 

2. Create a Windows 8.1 Client App and modify it as follows

For this example, we'll use the Windows 8.1 project in the Universal App generated for us in a previous article.

2a. Associate app with store

You will need a Windows Store account to complete this step. You can register at http://dev.windows.com/. It cost $19 to register for both the Windows Store and the Windows Phone Store and there is no annual renewal fee.
Register your app with the store by opening the Visual Studio Solution; right-clicking on the Windows 8.1 project; and selecting Store | Associate App with the Store from the context menu.
The "Associate App with the Windows Store" dialog (Figure 1) displays. Click the [Next] button.

Zumo7-Figure 01 - Associate App 
Figure 1

If prompted, sign into the Windows Store (Figure 2)

Zumo7-Figure 02 - Sign In 
Figure 2

You may be prompted for your email address (Figure 3). If so, enter it and click [Next]; then check your email account for a Security Code that was sent from the Microsoft Account Team.

Zumo7-Figure 03 - Sign In 
Figure 3

Copy this code and paste it into Sign-In Wizard (Figure 4) and click the [Submit] button.

Zumo7-Figure 04 - Sign In 
Figure 4

The "Select an app name" dialog (Figure 5) displays.

Zumo7-Figure 05 - Select App Name 
Figure 5

Enter a name for your app and click the [Reserve] button; then, click the [Next] button to display the final step in the wizard (Figure 6). Click the [Associate] button.

Zumo7-Figure 06 - Associate App
Figure 6

2b. Get Package SID and Client ID from Live Services. Copy these to Mobile Service.

Connect to the store portal (http://dev.windows.com for Windows Store apps and http://dev.windowsphone.com for Windows Phone apps) and click Dashboard. You should see your app listed with "In Progress" below its listing. Figure 7 shows the listing for an app in the Windows Store dashboard

Zumo7-Figure 07 - DevCenter Dashboard 
Figure 7

Click the [Edit] link below your app to display the Submissions Details page (Figure 8).

Zumo7-Figure 08 - App Details
Figure 8

So far, you have only completed Step 1 (Reserve App Name) of the app submission process. Click step 2 (Services) to display the app's Services page (Figure 9)

Zumo7-Figure 09 - App Services 
Figure 9

Click the Live Services site link in the second paragraph to navigate to the Live Services page (Figure 10). You may be prompted to sign in again.

Zumo7-Figure 10 - Live Services
Figure 10

Note the Package SID and Client ID on the Live Services page. Copy each of these in turn and paste them into the appropriate fields of the "Windows Store" section of the "Push" page in the Azure Mobile Services page of the Azure portal. This is demonstrated in Figure 11.

 Zumo7-Figure 11 - Azure Push
Figure 11

Click the [Save] icon to save these values to your Mobile Service. 

Your service is now capable of sending notifications to Windows store client apps.

2c. Register notifications channel in OnLaunched (App.xaml.cs)

Return to your .NET client application and open App.xaml.cs from the Shared project. Add the following 2 lines (Listing 1) to the top of this file:

   1: using Windows.Networking.PushNotifications;
   2: using Windows.UI.Popups;

Listing 1

Add the InitNotificationsAsync method to the bottom of the class (Listing 2)

   1: private async void InitNotificationsAsync()
   2: {
   3:     // Request a push notification channel.
   4:     var channel = await PushNotificationChannelManager
   5:         .CreatePushNotificationChannelForApplicationAsync();
   6:  
   7:     // Register for notifications using the new channel
   8:     System.Exception exception = null;
   9:     try
  10:     {
  11:         await MobileService.GetPush().RegisterNativeAsync(channel.Uri);
  12:     }
  13:     catch (System.Exception ex)
  14:     {
  15:         exception = ex;
  16:     }
  17:     if (exception != null)
  18:     {
  19:         var dialog = new MessageDialog(exception.Message, "Registering Channel URI");
  20:         dialog.Commands.Add(new UICommand("OK"));
  21:         await dialog.ShowAsync();
  22:     }
  23: }

Listing 2

Your client application is now listening for push notifications.

2d. Enable Toast notifications (Package.appxmanifest)

In this example, the service will send a Toast notification, which will tell the client to popup a "Toast" message. A Toast message appears at the top-right of the Windows 8 screen and may contain 1 or more lines of text and an image.

To enable your application to accept Toast notifications, open the Package.appxmanifest file and select the "Application" tab. Under the Notifications section, select the "Toast capable" dropdown and set it to "Yes". (Figure 11)

Zumo7-Figure 12 - Enable Toast
Figure 12

Your client application is now listening for push notifications and capable of creating a Toast popup when it receives a notification.

3. Update the Mobile Service service to send Push Notifications.

The final step is to actually send Push Notifications from your Mobile Service. In this example, we will use the node.js mobile service we created in this article (link) and we'll send a Toast Notification to all Windows Store clients whenever a user enters a new ToDoItem.

In the Azure portal, open your Mobile Service and navigate to the todoitem table's SCRIPT page (Figure 12). 

Zumo7-Figure 13 - Insert Script
Figure 11

Select INSERT from the dropdown and replace the script with the code in Listing 3.

   1: request.execute({
   2:     success: function() {
   3:         // If the insert succeeds, send a notification.
   4:         push.wns.send(null, payload, 'wns/toast', {
   5:             success: function(pushResponse) {
   6:                 console.log("Sent push:", pushResponse);
   7:                 request.respond();
   8:                 },              
   9:                 error: function (pushResponse) {
  10:                     console.log("Error Sending push:", pushResponse);
  11:                     request.respond(500, { error: pushResponse });
  12:                     }
  13:                 });
  14:             }
  15:         });
  16:  
  17: }

Listing 3

Test It Out

Your app is now ready to accept Push Notifications and your Mobile Service is configured to send them each time a new "ToDoItem" is inserted.

To see it in action, launch the application and insert a new ToDo item. Within a few seconds, you should see a "Toast" popup in the top right of your screen, indicating that you entered this item. If other users were also using this same app, they would see the same message.

In this article, we discussed Azure Mobile Services Push Notifications and walked through an example of adding them to a JavaScript Push Notification service and a Windows 8.1 application.


I had always heard good things about the St. Louis Days of .NET http://stldodn.com/2014, but this year was the first chance I had to attend. It did not disappoint. I didn't hear the final count, but the hallways at the Ameristar Casino Conference Center in St. Charles, MO were packed for this event.

A commitment in Houston caused me to miss the half-day workshops held on Thursday; but I arrived in St. Charles late Friday and I had a chance to mingle with many of the speakers after dinner. I liked the fact that the event drew from areas where I had a lot of contacts (Illinois, Indiana, Michigan) but also from parts of the country where I don't travel as often (e.g., Missouri, Kansas, Nebraska). Any chance I have to expand my network of smart people is a good thing.

Most speakers were from all across the Central Region but a few travelled from as far away as Philadelphia and Ottawa.

Microsoft was well-represented at the St. Louis Day of .NET. From DX (the division where I work), Bill Fink, Jennifer Marsman, Donovan Brown, Kevin Remde, Randy Pagels, and I all spoke at the conference. Jeff Fatic and Matt Winkler of Microsoft also delivered presentations.

I attended sessions on JavaScript, Azure, and Design and I learned something in every session. I also had a long conversation about Azure Notification Hubs with Azhar Salahuddin and Charlie Chapman. I have used Notification Hubs indirectly through Azure Mobile Services, but they showed me how they work under the hood and how to work directly with notification hubs

I also spent some time with Angela Dugan of Polaris Solutions picking her brain about how organizations can become more agile and with Charlie Chapman and Gus Emery talking about universal apps.

I learned a lot at the St. Louis Days of .NET and I also got a chance to get to know the communities in the western Midwest a little bit better.

The organizers were already planning to reprise St. Louis Days of .NET in 2015. I recommend you check it out.


TAMUHack User Stories

Comments [0]



In a previous article, I showed how to create a sample .NET client application to connect to your Azure Mobile Service. In this article, I will show you how to add authentication to this sample application.

Azure Mobile Services supports a number of different methods of authentication. A couple of them you would expect from a Microsoft platform - User can be authenticated against Active Directory or they can be directed to log in with a Microsoft account (formerly known as a "Live" account.) You would expect Mobile Services to support these authentication methods because they are created and/or maintained by Microsoft. However, Mobile Services is designed to accept authentication tokens that adhere to the OAuth standard and it is built to support Facebook, Twitter, and Google authentication - all of which conform to oAuth.

In order to use an Authentication Provider, you must enable support for that provider. You can enable support for one provider and instruct all clients to use that provider; or you can enable support for multiple oAuth providers and clients will be able to offer a choice to users, allowing them to log in with their favourite service.

Setting up each of these oAuth providers is pretty similar, so the best way to show you how is to walk through an example. I'll enable Twitter authentication but the process is not much different for other providers.

Creating An App on Twitter

In order to allow users to log into your app via Twitter, you need to create an app in Twitter. You can do so by navigating to http://dev.twitter.com and signing in with your Twitter credentials (you may need to create a Twitter account first. If so, you may be the last person on Earth to do so.) At the bottom of the page is a "Tools" section. Click the "Manage Your Apps" link in this section, as shown in Figure 1.

Zumo6-Figure 01 - DevTwitter
Figure 1

On the "Twitter Apps" page, click the [Create New App] button (Figure 2).

Zumo6-Figure 02 - Create New App button
Figure 2

The "Create an application" page (Figure 3) displays. The first 3 fields are required.

Zumo6-Figure 03 - Create An Application 
Figure 3

At the "Name" field, enter a name for your application. I usually use the same name I gave my Azure Mobile Service.

At the "Description" field, enter a brief description of your app.

At the "Website" field, enter your Mobile Service URL. You can find this URL in the Azure portal on the DASHBOARD tab of your Mobile Service (Figure 4)

Zumo6-Figure 04 - Mobile Service URL

Figure 4

Scroll down the "Create an Application" page (Figure 5), read the Developer agreement completely (in this case, you are likely the first person ever to do this), check the "Yes I agree" checkbox, and click the [Create your Twitter application] button to create the app.

Zumo6-Figure 05 - Developer Agreement

Figure 5

A page displays for your newly-created app with a tab menu across the top as shown in Figure 6.

Zumo6-Figure 06 - Twitter App tabs 
Figure 6

Click the "Keys and Access Tokens" tab to display the Application Settings as shown in Figure 7.

Zumo6-Figure 07 - Twitter Keys  
Figure 7

You will need the Consumer Key (API Key) and the Consumer Secret (API Secret) so keep this web page open and open a new browser or browser tab and navigate to the Azure Portal.

In the Azure Portal, select your mobile service and click the IDENTITY menu option as shown in Figure 8.

Zumo6-Figure 08 - Mobile Services IDENTITY menu 
Figure 8

On the IDENTITY page, scroll down to the "twitter settings" section. From the Twitter "Application Settings" page, copy the API Key and the API Secret and paste these values into the corresponding fields on the Azure Mobile Services IDENTITY page, as shown in Figure 9.

 Zumo6-Figure 09 - Twitter Settings
jFigure 9

Click the SAVE icon (Figure 10) at the bottom of the page to save these changes.

Zumo6-Figure 10 - Save

Figure 10

Your Mobile Service now supports Twitter authentication.

Force clients to login before accessing your service by setting permissions on the service actions. This is done at the Mobile Service table's PERMISSIONS page. (To access the PERMISSIONS page, select your Mobile Service in the Azure Portal; click the DATA tab; select the table you want to secure; and click the PERMISSIONS tab.)

Change the permission of each action to "Only Authenticated Users" by selecting "Only Authenticated Users" from the dropdown next to each action, as shown in Figure 11. Click the SAVE icon to commit these changes.

Zumo6-Figure 11 - Table Permssions
Figure 11

Now any client app that calls your service has no choice but to force users to log in with Twitter in order to use your app.

CLIENT APP

Open the client app that we created in an earlier article and open MainPage.cs in the Shared project.

Add the following code to the class.

   1: MobileServiceUser user = null;
   2: private async System.Threading.Tasks.Task AuthenticateAsync()
   3: {
   4:     while (user == null)
   5:     {
   6:             user = await App.MobileService
   7:                 .LoginAsync(MobileServiceAuthenticationProvider.Twitter);
   8:     }
   9:  

Listing 1

Then call this method by adding the following line at the top of the OnNavigatedTo method

   1: await AuthenticateAsync(); 

Listing 2

When the user navigates to the MainPage, she will be redirected to the Twitter login page where she must successfully login before proceeding. The MobileService will remember the user and pass this information in a token with each request to the REST service. If you configure another authentication provider, such as Google or Microsoft, you can direct the user to that provider's login page by changing the MobileServiceAuthenticationProvider enum, which is passed as a parameter to the MobileService.LoginAsync method.

In this article, we saw how to configure single sign-on for our Azure Mobile Service.


In previous articles, I showed how to set up a new Azure Mobile Service and how to generate a sample application.

By default, the service allows anyone with the Application Key to access this Mobile Service. This Application Key is generated automatically when the service is created. You can view the key by clicking to the "Manage Keys" icon (Figure 1) at the bottom of the Mobile Service Dashboard to display the "Manage Access Keys" dialog (Figure 2).

Zumo5-Figure 01 - Manage Keys
Figure 1

Zumo5-Figure 02 - Manage Keys
Figure 2

In the generated sample application, this access code is automatically passed to the constructor of the MobileServiceClient object that is instantiated in App.xaml.cs (Listing 1)

   1: public static MobileServiceClient MobileService = new MobileServiceClient(
   2:     "https://giard.azure-mobile.net/",
   3:     "MqJSWTxyZlOTRHdABCGOuDcQcTVqvR41"
   4: );

Listing 1

If you have created a table for your Mobile Service, you can click on the service's Data tab and manage the Permissions of that table by selecting the table and clicking the Permissions tab.

Here, you will see 4 dropdowns (Figure 3) - one for each operation you can perform on the table (INSERT, UPDATE, DELETE, and READ). For each of these operations, you can set one of the following permissions:

  • Everyone
  • Anybody with the Application Key
  • Only Authenticated Users
  • Only Scripts and Admins

Zumo5-Figure 03 - Permissions
Figure 3

Below is an explanation of each Permission option

Everyone

The service is not secured. Anyone who knows the URI can access the service operation. Set this on the READ PERMISSION and you will be able to open a browser, navigate to the table's URI and view the data in the table.

Anybody with the Application Key

This is the default permission. Any request must contain the Application Key in the HTTP Header of the request. The format is

X-ZUMO-APPLICATION:key

where key is the Application Key of this Mobile Service.

As described above, the .NET MobileServiceClient class handles this automatically if we pass the Application Key into its constructor.

Only Authenticated Users

An authentication token from a trusted authentication provider must accompany the HTTP request to this REST service. In a future article, I will show you how to set up single sign-on with trusted authentication providers so that this token is added to each request.

Only Scripts and Admins

This allows an operation to be performed only by Administrators logged onto the Azure portal or by PowerShell scripts running directly on the Virtual Machine on which the Mobile Service is running.

You are free to set different permissions for each operation. For example, you could allow anyone to read data in your table; require the Application Key for updates; authenticated sign on for inserts; and only allow Admins and server scripts to delete data from the table.

In reality, you will likely pick a single security mechanism for the table and set all operations to this. You can then write server-side code to handle any differences between the services (allowing a user to only delete his own records, for example).

 

Conclusion

The permissions are for a given combination of endpoint (which, in this case, points to a table) and action (INSERT, UPDATE, DELETE, and READ). If you like, you could set a different permission for each action on this endpoint. For example, you could declare that anyone can read data; only those with the Application Key can update data; only Authenticated users can Insert a row; and Deleting data is reserved for scripts and Admins. To me, it makes more sense to keep the same permission for each action, unless you have a specific reason for changing it for a given action.

In this article, we showed how to set permissions on each action for a given Azure Mobile Services endpoint.


In my last article, I described how to use the Azure Mobile Services wizard to create a sample client application. In this article, we will look at the code created by this wizard.

I'll focus on the C#/XAML version of the sample app but all the principles apply for the HTML5/WinJS version as well.

Figure 1 shows the solution, which includes a Windows 8.1 project, a Windows Phone 8.1 project, and a project with files that are shared by the other two projects.

Zumo4-Figure 01 - Client App
Figure 1

I always compile this app before running it, because that ensures that all NuGet packages are updated.

Because this is a Universal app, it contains both a Windows 8.1 and a Windows Phone 8.1 project. The two projects do pretty much the same thing but each has a user interface appropriate to its own platform.

A screen shot of each running app is shown in Figure 2 (Windows 8.1) and Figure 3 (Windows Phone 8.1). As you can see, this app keeps track of a  user's To Do List. The list of "To Do Items" is stored in an Azure SQL Database, which is exposed via Azure Mobile Services.

Zumo4-Figure 02 - Running Win81 App
Figure 2

Zumo4-Figure 03 - Running Win81 App
Figure 3

Most of the interesting stuff happens in the Shared project.

TodoItem.cs

Let's look first at the Model. It is in the Shared project because both apps use the same model. You can find it in the TodoItem.cs file in the DataModel folder (Listing 1).

   1: public class TodoItem
   2: {
   3:     public string Id { get; set; }
   4:  
   5:     [JsonProperty(PropertyName = "text")]
   6:     public string Text { get; set; }
   7:  
   8:     [JsonProperty(PropertyName = "complete")]
   9:     public bool Complete { get; set; }
  10: }


Listing 1

The three properties (Id, Text, and Complete) will map to columns in the SQL Server table.  Text and Complete are decorated with the JsonProperty attribute, which is found in the Newtonsoft.Json library and tells .NET how to name these properties when an object is transformed into the JSON format. Strictly speaking, this is unnecessary, but JSON objects tend to follow the
JavaScript convention of Camel casing.

App.xaml.cs

The shared App.xaml.cs takes care of some basic processing when an app starts up, suspends, or has a problem.

As far as Azure Mobile Services is concerned, the important line is the MobileService field declaration (Listing 2)

   1: public static MobileServiceClient MobileService = new MobileServiceClient(
   2:     "https://giard.azure-mobile.net/",
   3:     "MqJSWTabZlOTRHeFXPRBADoQcVtqvE41"
   4: );

Listing 2

The second parameter of the constructor is the application key generated by your Mobile Service. Passing the Application Key to the constructor of our MobileServiceClient is necessary if we set permissions to only allow calls to the mobile service by clients that provide the Application Key. Whenever we call the REST service with this object, the Application Key will be passed in the header of HTTP calls to the mobile services endpoints.

This static class is available throughout the application and contains methods to communicate with your mobile service. Its main use is to create an IMobileServiceTable by calling the static object's GetTable() method, which is done in the MainPage.

MainPage.cs

Notice that all three projects contain the MainPage class, which derives from the Page object. In both the Windows project and in the Windows Phone project, this class is in the MainPage.xaml.cs file, while the class is in the MainPage.cs file in the shared project. Notice also that these are all "partial" classes and that each is in the same namespace. At compile time, both the Windows and Windows Phone projects will pull in the class from the Shared Project and use its code.

At the top of the MainPage class is the creation of two sets of our model (Listing 3).

   1: private MobileServiceCollection items;
   2: private IMobileServiceTable todoTable = App.MobileService.GetTable();

Listing 3

MobileServiceCollection items is simply a collection on the client that is used to bind to a ListView control in our XAML named ListItems. 

The IMobileServiceTable interface has methods to interact with the REST API specified when the MobileService was created (which is our Azure Mobile Service API). So, the todoTable object has implementations of these methods specific to our service.

For example, the InsertTodoItem method makes a call to todoTable.InsertAsync() and passes an instance of the TodoItem. This calls our Azure Mobile Service REST endpoint (in this case, that endpoint is https://giard.azure-mobile.net/Tables/todoitem), using the POST Verb and passing

We can use Lync extension methods of todoTable to retrieve specific data into the todoTable object as in Listing 4 (from the RefreshTodoItems() method), which retrieves only todoItems for which the Boolean field Complete is false.  

   1: items = await todoTable
   2:     .Where(todoItem => todoItem.Complete == false)
   3:     .ToCollectionAsync();

Listing 4

The shared code takes advantage of the fact that the events fired in Windows and in Windows Phone are very similar and that the similar objects with similar names and events are created in the MainPage.xaml of each project. Because of this, the shared project can even contain event handlers that are appropriate for either project.  For example, Listing 5 is the event handler when you click a checkbox next to an item on either the phone or your Windows PC/Tablet to mark that item as "Complete".

   1: private async void CheckBoxComplete_Checked(object sender, RoutedEventArgs e)
   2: {
   3:     CheckBox cb = (CheckBox)sender;
   4:     TodoItem item = cb.DataContext as TodoItem;
   5:     await UpdateCheckedTodoItem(item);
   6: }

Listing 5

This event handler passes the checked item to the UpdateCheckedTodoItem method, which uses the todoTable object to call the REST endpoint (Listing 6).

   1: private async Task UpdateCheckedTodoItem(TodoItem item)
   2: {
   3:     // This code takes a freshly completed TodoItem and updates the database. When the MobileService 
   4:     // responds, the item is removed from the list 
   5:     await todoTable.UpdateAsync(item);
   6:     items.Remove(item);
   7:     ListItems.Focus(Windows.UI.Xaml.FocusState.Unfocused);
   8: }

Listing 6

The entire MainPage class is shown in Listing 7.

   1: sealed partial class MainPage: Page
   2: {
   3:     private MobileServiceCollection items;
   4:     private IMobileServiceTable todoTable = App.MobileService.GetTable();
   5:  
   6:     public MainPage()
   7:     {
   8:         this.InitializeComponent();
   9:     }
  10:  
  11:     private async Task InsertTodoItem(TodoItem todoItem)
  12:     {
  13:         // This code inserts a new TodoItem into the database. When the operation completes
  14:         // and Mobile Services has assigned an Id, the item is added to the CollectionView
  15:         await todoTable.InsertAsync(todoItem);
  16:         items.Add(todoItem);
  17:     }
  18:  
  19:     private async Task RefreshTodoItems()
  20:     {
  21:         MobileServiceInvalidOperationException exception = null;
  22:         try
  23:         {
  24:             // This code refreshes the entries in the list view by querying the TodoItems table.
  25:             // The query excludes completed TodoItems
  26:             items = await todoTable
  27:                 .Where(todoItem => todoItem.Complete == false)
  28:                 .ToCollectionAsync();
  29:         }
  30:         catch (MobileServiceInvalidOperationException e)
  31:         {
  32:             exception = e;
  33:         }
  34:  
  35:         if (exception != null)
  36:         {
  37:             await new MessageDialog(exception.Message, "Error loading items").ShowAsync();
  38:         }
  39:         else
  40:         {
  41:             ListItems.ItemsSource = items;
  42:             this.ButtonSave.IsEnabled = true;
  43:         }
  44:     }
  45:  
  46:     private async Task UpdateCheckedTodoItem(TodoItem item)
  47:     {
  48:         // This code takes a freshly completed TodoItem and updates the database. When the MobileService 
  49:         // responds, the item is removed from the list 
  50:         await todoTable.UpdateAsync(item);
  51:         items.Remove(item);
  52:         ListItems.Focus(Windows.UI.Xaml.FocusState.Unfocused);
  53:     }
  54:  
  55:     private async void ButtonRefresh_Click(object sender, RoutedEventArgs e)
  56:     {
  57:         await RefreshTodoItems();
  58:     }
  59:  
  60:     private async void ButtonSave_Click(object sender, RoutedEventArgs e)
  61:     {
  62:         var todoItem = new TodoItem { Text = TextInput.Text };
  63:         await InsertTodoItem(todoItem);
  64:     }
  65:  
  66:     private async void CheckBoxComplete_Checked(object sender, RoutedEventArgs e)
  67:     {
  68:         CheckBox cb = (CheckBox)sender;
  69:         TodoItem item = cb.DataContext as TodoItem;
  70:         await UpdateCheckedTodoItem(item);
  71:     }
  72:  
  73:     protected override async void OnNavigatedTo(NavigationEventArgs e)
  74:     {
  75:         await RefreshTodoItems();
  76:     }
  77: }

Listing 7

Conclusion

Notice how much of the application logic was moved into the Shared project. This isn't surprising because both the Phone app and the Windows app do the same thing - but with different user interfaces. It should be your goal to push as much of our app as you can into the Shared project.

When you build your own app, you will almost certainly use a different model and a different user interface. However, the samples code in this generated application should provide you a template for how to do basic operations on your mobile service, such as Read, Write, Update, and Delete. Make sure you understand the sample; then copy the appropriate code into your application and modify it to fit your model.


In the last article, I showed how to create a new Azure Mobile Service in the portal. In this article, I will show you how to use the wizard to create an application, consisting of a new table, an HTTP endpoint to access that table, and a sample client application to access the data through that endpoint.

Log onto the Azure Portal and select the MOBILE SERVICES icon in the left menu. Figure 1 shows the Mobile Service we created last time.

Zumo2-Figure 01 - List Service
Figure 1

Click the arrow next to the service name to display details about the service (Figure 2).

Zumo2-Figure 02 - GET STARTED
Figure 2

Notice the choices you have next to "CHOOSE A PLATFORM". The Platforms listed are the various client platforms explicitly supported by Mobile Services. Remember that Mobile Services exposes data via standard interfaces such as HTTP and JSON which can be used by a wide variety of platforms and languages. For this demo, click the "Windows" button; then expand the "CREATE A NEW WINDOWS APP" link. This will reveal the 3 steps to get you started building an application around Azure Mobile Services (Figure 3).

Zumo2-Figure 03 - GET STARTED
Figure 3

Get the tools (Figure 4) allows you to download a free version of Visual Studio. If you already have any version of Visual Studio 2013 installed, you can skip this step.

Zumo2-Figure 04 - Get the Tools
Figure 4

The "Create a table" step (Figure 5) allows you to create a sample SQL Server table. Click the green button to create a new table named "TodoItem" in your database with columns to keep track if the tasks you need to do today and whether you have completed each task.

Zumo2-Figure 05 - Create Table
Figure 5

The “Download and run your app” step (Figure 6) will generate client code that will connect to your application.

Zumo2-Figure 06 - Download App
Figure 6

Select a language (C# or JavaScript) and click the Download button to download a ZIP file containing a Universal App that includes a Windows 8.1 project, a Windows Phone 8.1 project, and a Shared Code project. Depending on your language selection, these projects will either contain a user interface written in XAML and C# code-behind or an HTML5 front-end with a WinJS code-behind. Figure 7 shows the results of C#/XAML project generated by Azure Mobile Services.

Zumo2-Figure 07 - Client App
Figure 7

Compile and run this app to see it in action. Figure 8 shows a screen shot of the Windows 8 app. You can enter a new task in the textbox and click Save to send data to the mobile service telling it to insert a row in the todoitem table. A list on the right displays all tasks that are not yet completed. Click the checkbox next to an item to send data to the mobile service telling it to update the todoitem table, setting the Complete column to FALSE.

Zumo2-Figure 08 - Running App
Figure 8

Figure 9 shows the Windows Phone project running.

Zumo2-Figure 09 - Running App
Figure 9

You can see that the apps look similar because they have the same functionality. The differences are related to the size, layout, and other considerations of the specific platform on which they run. Play with each app and you will see that they function about the same, thanks to the large percentage of shared code.

In this article, we saw how to run the Azure Mobile Services wizard to generate a sample table and client application.


With Azure Mobile Services, developers can quickly create a REST interface to read and write their backend database.

The Azure portal provides a wizard for creating a sample solution built around mobile services in just a few minutes. In this article, I will walk you through the steps to create a new Azure Mobile Service.

Log onto the Azure Portal and select the MOBILE SERVICES icon (Figure 1) in the left menu.

Zumo2-Figure 01
Figure 1

Click the NEW button at the bottom of the screen (Figure 2).

Zumo2-Figure 02 - New Button 
Figure 2

This exposes a menu (Figure 3).

Zumo2-Figure 03 - Create
Figure 3

With COMPUTE and MOBILE SERVICES selected (which should already be the case) click the CREATE button.

The "Create a Mobile Service" dialog (Figure 4) displays.

Zumo2-Figure 04 - Create
Figure 4

Give a name for the service. The full name will be whatever you type in the URL textbox, followed by ".azure-mobile.net" and it must be unique. The portal will let you know if someone else has chosen the same name. Select an existing database or create a new one; then select the Region where the Mobile Service will live. It makes sense to create the service in the same region where the database resides.

Finally, select the language in which to build the backend service. If you select JavaScript, the server-side solution will be hosted in Node.js. If you select .NET, you can create a solution in Visual Studio and deploy it to Azure, where it will be hosted in IIS.

Click the arrow (Figure 5) at the bottom right of the dialog to advance to the next page, where you can specify database information.

Zumo2-Figure 05 - Next
Figure 5

Figure 6 show the page if you elect to connect to an existing database. Select the database connection string; then enter the login name and password with which you will connect to this database.

Zumo2-Figure 06 - DB
Figure 6

Click the check button to create the Mobile Service. After a few seconds, the service will show up in the portal as in Figure 7.

Zumo2-Figure 07 - New Service
Figure 7

In this article, we saw how to create a new Azure Mobile Service. In the next article, we will add a table and allow clients to retrieve and update data in that table, using this service.


Storing data in the cloud allows your application to remember information between launches and to share data among other users, applications, and devices.

Exposing that data via a REST interface makes this data accessible to applications running on a variety of platforms and written in a variety of languages. REST is an architectural pattern for allowing clients to read and update server data through a consistent API. The current implementations of REST uses an HTTP endpoint (a URL) to expose functionality and the features of HTTP (verbs, response codes, and header data) to exchange data between the client and the server.

Azure Mobile Services (ZuMo) makes it easier to expose your data as a REST endpoint by handling the "plumbing" code for you so that you can focus on your data model and your business logic.

With just a few clicks, you can create a service and map it to a database table. ZuMo will create an HTTP endpoint; map HTTP verbs to Create, Read, Update, and Delete methods; create those methods for you; and handle the transformation from JSON data into objects that map to rows in your database table. This isn't impossible code for you to write, but it can be a lot of code. And wouldn't your time be better spent writing the code that makes your application unique?

Azure Mobile Services will even generate a client application to call your new REST service and pass data to and from it. You can use this application as a starting point or you can copy and paste code from this app into your own client app. ZuMo is capable of generating a sample client application for Windows 8, Windows Phone, HTML and JavaScript, Xamarin, PhoneGap, Android, or iOS.

Azure Mobile Services is a true cross-platform solution that is simple to implement because it handles much of the plumbing code for you.


MHacks User Stories

Comments [0]

October 2014 Gratitudes

Comments [0]

11/2
Today I am grateful for the friends I have kept for decades. They've known me at my best and at my worst.

11/1
Today I am grateful I finally caught up editing all my videos and photos.

10/31
Today I am grateful for dinner with my niece Amanda last night.

10/30
Today I am grateful for a home-cooked meal last night.

10/29
Today I am grateful for a chance to speak at the Motor City Software Testers last night & to all who came to hear me.

10/28
Today I am grateful I attended an exciting Monday Night Football game in Dallas last night.

10/27
Today I am grateful for some authentic Texas BBQ last night.

10/26
Today I am grateful for the students at TAMUHack who show energy, imagination, and passion and built so many great projects this weekend. I'm also grateful for the Michigan State Spartans, who drove through the michigan wolverines like a spike through grass yesterday!

10/25
Today I am grateful for my first trip to College Station, TX.

10/24
Today I am grateful I was invited to speak at the inaugural meeting of the Local Variables user group in South Bend, IN yesterday.

10/23
Today I am grateful for a long hot shower on a chilly morning.

10/22
Today I am grateful to God, who helped me through the difficult times in my life.

10/21
Today I am grateful for a day with few responsibilities.

10/20
Today I am grateful for a weekend in Indiana watching football with Tim Giard

10/18
Today I am grateful for lunch yesterday with Corey Haines

10/17
Today I am grateful for an unexpected gift from the Madison Mobile .NET Developers Group .

10/16
Today I am grateful for a successfully completed trip to Minnesota and Wisconsin.

10/15
Today I am grateful I completed 1 year at the best job I've ever had.

10/14
Today I am grateful for dinner last night with Brent Stineman

10/13
Today I am grateful for the open Wi-Fi that suddenly showed up when I'm in my apartment. I'm not sure if the apartment complex added a repeater or if I have a new neighbor, but I appreciate it.

10/12
The Hitchhiker's Guide to the Galaxy was published 35 years ago today! I am fortunate to have met the book's author before his passing.

10/11
Today I am grateful for dinner and drinks last night with Patricia and Gary.

10/10
Today I am grateful to the folks a the Schaumburg Microsoft .NET Technologies Meetup for inviting me to speak last night

10/9
Today I am grateful for a great audience yesterday at the first Azure Dev Camp in St. Louis.

10/8
Today I am grateful that my son called me yesterday just to say "Hi".

10/7
Today I am grateful to Velichka, who brought me chicken soup when I was sick.

10/6
Today I am grateful for 12+ hours sleep last night that I desperately needed.

10/5
Today I am grateful for dinner with friends, a ticket to the Nebraska game, and a Spartan victory!


A few months ago, I migrated this blog to Azure Web Sites.

I was aided by the fact that I use Das Blog as a blogging engine. This gave me two advantages:
1. I could select a Das Blog template from the Azure Web Site gallery, automatically configuring the appropriate settings for my site; and
2. Das Blog uses XML files instead of a database to store blog posts, so I was able to xcopy my entire blog to Azure.

The only real work was changing my DNS settings to point to Azure, which took a few minutes. I set the site to user the SHARED hosting plan, which lets me point a custom domain to it. More popular blogs (like yours) may need to use the BASIC or STANDARD Web Hosting Plan, but I stuck with the cheap one and it works fine for me.

The story here is what a non-story this migration was. My site was down less than an hour and most of that was because I messed up the DNS settings the first time. It is servicing requests just fine and I am saving money because this hosting plan is cheaper than what I paid to my old provider.

Currently, I'm not using any advanced features, such as Scaling, Autoscaling, and Web Jobs but those are available to me if I need them.

I love the simplicity of Azure Web Sites. If you are considering using Azure, this is a good place to start.




What is Demand Elasticity, how does it affect my apps, why should I care, and how does Azure address this?

Demand Elasticity is an issue because almost no app has a constant demand over time: Some apps are used primarily during business hours and very little during the night; some apps have abnormally high demand during specific events, such as the launch of a new product or while NFL games are broadcasting; some businesses have peak seasons when they do nearly all their business (I once worked for an electronics retail store that earned over 80% of their revenue between Thanksgiving and New Years Day.)

Each of the above examples describes demand variability that you can plan for. An even more difficult problem is unexpected changes in demand. Imagine if a popular TV show recommends your online service. Demand would likely skyrocket. Could your services handle this extra, unexpected load?

Because of this change in demand, you need to decide how much hardware to deploy for your application. If you deploy too much hardware, you are wasting your money, but if you deploy too little, you will miss out on potential users and revenue. And in the fact that hardware is not easy or quick to deploy - It may take your organization weeks or months to respond to a sudden, unexpected increase in demand. And what do you do with that extra hardware when demand falls? For most organizations, it's not practical to buy and sell hardware as demand goes up and down.

Ideally, as demand increases and places higher load on your servers, you would increase the amount of hardware to which your application is deployed. Then, you would remove that hardware (and stop paying for it) as demand and workload decrease.  If you are managing and deploying the hardware yourself, this is not really practical. There is no quick market to buy and sell servers and most organizations take days – if not weeks – to provision a new server.

But Azure allows you to deploy more servers to your application and it automatically deploys them for you in a matter of minutes. Most services in Azure have a setting that allows you to change the number of running instances. This can be the number of web sites, web roles, mobile service, virtual machines, or dozens of other service instances available.

Below is the setting for configuring the number of instances of an Azure Web Site.
Scale-1
figure 1

Some services even allow you to automate this process. For example, you can configure Azure to monitor the CPU used by your web sites and automatically deploy a new instance of your site when CPU rises above a certain percent and remove an instance when it falls below a given percent. You can set a minimum and maximum to keep the number of instances within this range.

For Azure Web Sites, this Auto-scaling feature is available if we select the "Standard" hosting plan. Below are the controls that allows you to set these configuration.
Scale-2

Figure 2

Scaling up helps your service deal with extra usage (planned or unplanned), while scaling down helps you save money. The quicker you can do both, the more agile you will be.

Azure allows you the flexibility to scale up and down to meet changing demand.


Yesterday was my 1-year anniversary at Microsoft.

The year has flown by. I remember being at a customer site in Toledo last summer when the recruiter called and offered me a job pending a background check. I remember standing outside the speaker room at Dev Connections in Las Vegas when my new boss Scott Fuller officially offered me the job. I remember how hard it was to tell my old boss I was leaving. I remember how excited I was to tell my friends the news. I remember feeling giddy that first day as I drove to Southfield for my orientation.

I had been trying to land a job as a Microsoft Technical Evangelist for years - ever since I first met Josh and Jennifer and Brian and Jeff and saw what they did and how smart they are and how how much good they were able to accomplish and how much fun they had doing it. But this job was only available in other parts of the country and family obligations kept me from moving. But last year, both my sons moved out of state and a Jennifer Marsman told me about an opening in Chicago and I jumped at the chance. A few months (and many interviews) later, I was in.

I spent the first week shadowing Jennifer, watching her work and learning as much as I could. I traveled to Chicago the next week and met with my new boss Scott and shadowed Dave Bost and Martin Schray, learning all I could from them.

Many people describe working at Microsoft as "drinking from a fire hose" and that is an excellent metaphor. There is so much to learn and so much to do and often it's not obvious what you should be doing or learning. My time management skills are honed sharper today than they ever have in the past.

I'm really happy in my role as an Evangelist, which consists of a lot of teaching people how to build apps on Azure, Windows 8, and Windows Phone. I love the opportunity to learn and I love the impact I have on a number of different communities. Coming in, I was focused on the developer community, spending time at user groups and code camps. But I've discovered that startups have their own community and they bring their own kind of passion to what they do. And I've spent a lot of time with student groups on campus and gained a new perspective into the American higher education system. I've met so many people who are passionate about what they do, which inspires me to excel at my tasks.

One challenge of this job has been the large amount of travel. Shortly after I joined, I was asked to cover both the Midwest and the Heartland Districts - an area stretching from Wisconsin to Tennessee. I'm proud to say that I scheduled multiple events in each of these 7 states. But it did involve a lot of driving and more than a few nights when I did not get enough sleep. I’m writing this article from a hotel room in Edina, MN. In a few minutes I’ll drive to Madison, WI to speak at a user group before driving down to Chicago tonight where I have 3 events planned for tomorrow.

After a year, I can say that I've learned a lot, I've done some good, I've lost some sleep, I've made some friends, and I've loved it.

Now I have a new boss, new metrics, and a new home (I've moved to Chicago). The future is filled with challenges. But it's very bright. I'm excited for the next 365 days and beyond!


Mina Markham on SASS

Comments [0]


September 2014 Gratitudes

Comments [0]

10/4
Today I am grateful for a weekend in Michigan.

10/3
Today I am grateful for time spent yesterday with Tim Giard. We shared a couple meals and he even attended my App Studio workshop at IU last night.

10/2
Today I am grateful for a great group of students who showed up for my first event at Purdue last night.

10/1
Today I am grateful for the gift of Life, which has been granted to me for yet another day.

9/30
Today I am grateful I finally made it home after numerous airport delays this weekend.

9/29
Today I am grateful for breakfast this morning with Josh Holmes

9/28
Today I am grateful I was able to write my first-ever Java code for Android yesterday.

9/27
Today I am grateful I finally made it to Redmond after multiple canceled flights yesterday.

9/26
Today I am grateful for an invitation to a Home Automation hackathon in Redmond.

9/25
Today I am grateful for my first trip to Rockford, IL and a great audience for my Azure Mobile Services presentation last night.

9/24
Today I am grateful I have a job that pays me to help others.

9/23
Today I am grateful for the past 9 days in which I saw many old friends, met lots of smart people, learned a lot, traveled to Colorado and California, & had a blast.

9/22
Today I am grateful to attend #FalafelCon and to all who came to my sessions yesterday.

9/21
Today I am grateful for an excellent steak diner last night and excellent company to share it with.

9/20
Today I am grateful for a weekend in San Francisco at #falafelcon

9/19
Today I am grateful I had a chance this week to meet and connect with so many of my peers from across the country.

9/18
Today I am grateful for the opportunity to assemble wheelchairs for ALS victims yesterday.

9/17
Today I am grateful for a chance to meet so many people on my team across the country.

9/16
Today I am grateful for a walk yesterday along Colorado mountain trails.

9/15
Today I am grateful for 1. Being pampered in first class for the first time in >5 years 2. Visiting Mile High Stadium for the first time and seeing an exciting football game.

9/14
Today I am grateful for my first trip to Colorado in almost 2 decades.

9/13
Today I am grateful I saw an exciting game at Miller Park last night. The Brewers won on a walk-off RBI in the bottom of the 9th.

9/12
Today I am grateful I was able to pay off some sleep debt last night.

9/11
Today I am grateful for the kind words from my boss during my first MS annual review.

9/10
Today I am grateful for a walk to the lake last night with Velichka.

9/9
Today I am grateful that the handyman I hired completed so many home repairs this past week.

9/8
Today I am grateful to spend this past weekend with a bunch of hackers and experience their passion for technology.


Here is my interview with Todd Gardner of Track:js, describing his company and how they used BizSpark and Azure to grow.


Often, it is better to show us how to do something than to tell us. Samidip Basu’s Real World Windows 8 Development does both.

Basu begins the book by describing the basics of a Windows 8 application – controls, navigation, data binding, etc. Next, he covers more advanced features, such as remote debugging and accessing the hardware features on your PC or tablet.

Along the way, he demonstrates each concept by adding features to his sample – a book catalog application.

I found this book educational – in large part because both the code and the writing are straightforward and free of clutter. I learned more from downloading and exploring the sample code than I did from the text.

This book serves as a solid introduction to Windows 8 development and as a reference for intermediate developers to use.

17137894






August 2014 Gratitudes

Comments [0]

9/6
Today I am grateful to wake up to a house filled with the smell of chocolate chip cookies, fresh baked by Brian Sherwin's kids.

9/5
Today I am grateful for:
-Jennifer unexpectedly inviting me to 3 events in the East Lansing area last night
-Being there for Jennifer's first experience of MSU Dairy Store ice cream.
-A private, late-night tour of the Lansing Maker Space by Betsy and Nick.

9/4
Today I am grateful for all the books I've read in my life and the joy they brought me.

9/3
Today I am grateful for my son Tim Giard, who joined us 20 years ago today!

9/2
Today I am grateful for the tasty homemade fudge that Susan brought me yesterday.

9/1
Today I am grateful that, following recent surgery on her leg, my mother is now free of skin cancer.

8/31
Today I am grateful for
1.) Dinner last night with my friend Mike whom I haven't seen in months.
2.) Visiting my former next door neighbors Carl and Susanne, whom I haven't seen in years.

8/30
Today I am grateful to John Kellar and his team for all their hard work that resulted in an excellent DevLink conference.

8/29
Today I am grateful for my first visit to the Chattanooga Aquarium.

8/28
Today I am grateful for dinner with DevLink crowd last night and ice cream afterward.

8/27
Today I am grateful to be back in Chattanooga for the first time in 3 years.

8/26
Today I am grateful for the hospitality and generosity of Patricia Desmarais and Gary Desmarais.

8/25
Today I am grateful I was able to send so much furniture to a better home this past week.

8/24
Today I am grateful for a second burst of energy yesterday after I felt completely drained.

8/23
Today I am grateful for 1.) Dinner last night with my friend Mike whom I haven't seen in months. 2.) Visiting my former next door neighbors Carl and Susanne, whom I haven't seen in years.

8/22
Today I am grateful to God, who has always stood by me even during the times I tried to push Him away.

8/21
Today I am grateful for an evening with the folks at the Great Lakes Area .NET User Group

8/20
Today I am grateful for time spent with my boys this summer before they headed out of state to college.

8/19
Today I am grateful for my first time speaking at the Detroit Mobile .Net Users Group

8/18
Today I am grateful my son came to visit me multiple times on his last day in town.

8/17
Today I am grateful I could cook fried rice for all the meals I was able to prepare for my sons in this kitchen.

8/16
Today I am grateful for the chance to celebrate the marriage of Shelly and Jason last night.

8/15
Today I am grateful I was able to find parking right next to my building 2 days in a row.

8/14
Today I am grateful to the organizers, volunteers, and speakers, who make That Conference bigger and better every year.

8/13
Today I am grateful for water parks.

8/12
Today I am grateful for the chance to see so many old friends yesterday.

8/10
Today I am grateful I was able to fix my shower and my bed. Mornings will be far more comfortable from now on.

8/9
Today I am grateful to attend my first ToastMasters meeting yesterday - something I've been hoping to do for years.

8/8
Today I am grateful for the helpful customer service at Target this morning.

8/7
Today I am grateful to be heading back to Chicago for a few days.

8/6
Today I am grateful that, after owning this car for a year and a half, I finally figured out how to use Ford Sync.

8/5
Today I am grateful that Jason Follas found me a place to stay during That Conference, even though it was more difficult than expected.

8/4
Today I am grateful for dinner last night with my son Tim Giard for the first time in weeks.


In The Mists of Avalon, Marion Zimmer Bradley tackles the legend of King Arthur. Bradley breathes fresh life into the story by focusing on the women of Arthurian Britain, who tend to be marginalized in other tellings of  this story. Arthur, Lancelet, Merlin, and the Round Table knights appear in this story, but only as minor characters.

Avalon is a magical land that exists slightly outside the world of mortal men - surrounded by water and hidden by mystical mists. Only certain people can pass through the mists from England to Avalon and they can pass through only at certain times. Avalon is a matriarchal society ruled by Druid priestesses; the high priestess holds the title "Lady of the Lake". Avalon obeys most of the laws of the natural universe, but it does not exist on a map and the Druids appear to have limited magical powers. At the beginning of this story, relations are good between Britain and Avalon and Avalon is still connected to the world of mortal men. By contrast, the Fairy Lands have become so disconnected  with the physical world that time moves at a different rate there and they interact very little with the men and women beyond their borders.

The primary conflict of the story arises because Arthur gains the crown of Britain helped, in part, by the Avalon priestesses, who gave him the powerful sword Excalibur and its magical scabbard that prevents protects him in battle. A few years after gaining the throne, Arthur resolves to make Britain a Christian country, ignoring the Druids who helped him rise to power.

Primarily, the story focuses on Gwenhwyfar, who is Arthur's wife and queen, but who is in love with Arthur's best friend Lancelet; and Morgaine, Arthur's half-sister and father of Arthur's only son Mordred (the child was conceived during a pagan ritual at which neither sibling recognized the other).

The story follows the relationship of Morgaine and Gwenhwyfar, who begin as close friends but later become rivals and finally hateful adversaries, bent on the destruction of one another.

It is Gwenhwyfar who convinces Arthur to reject the Druids and declare Britain a Christian country and it is Morgaine who takes the most offense at this betrayal.

Morgaine is the most interesting character. She is a Druid priestess, eventually rising to become Lady of the Lake - the highest rank among the Druids of Avalon. She comes to hate Arthur for rejecting the Druids; She hates Gwenhwyfar for influencing Arthur to do so; and she hates The her former lover Merlin, who does not act to stop Arthur.

As time passes, Morgaine sinks toward madness, conspiring with her new lover Accolon in a disastrous assassination attempt; and capturing and executing the Merlin. Eventually, she softens her stance and accepts the direction in which the world is moving. Near the end of the story, Avalon has become far less relevant in the politics of Britain and - not coincidentally - it becomes far less physically connected to the real world surrounding it. At the end, an aged Morgaine accepts the fate of Britain and of Avalon as it slips deeper into the mists.

Ms. Bradley adds depth to characters that are marginalized or one-dimensional in earlier tellings of the story. Morgaine becomes a living, breathing person under Bradley's pen, rather than the spiteful witch painted by tradition. Gwenhwyfar is much more than the beautiful object in a love triangle - she is a strong politician and she knows how to bend Arthur to her will.

Whether or not you are a fan of the Arthurian legend, you will enjoy The Mists of Avalon.




When you install Visual Studio, you are prompted to opt into a program to help improve Visual Studio. If you answer “Yes”, Visual Studio will send information back to Microsoft about errors that occur and features that are used. The information is sent during installation and later during your normal course of using Visual Studio. The Visual Studio team uses this information to learn how their product is used, how often the product is used, and where errors are occurring. All this information is helpful as they improve the product.

If you have already installed Visual Studio, you can select from the menu:
Help | Customer Feedback Options

The following dialog (Fig. 1) displays:

image

Fig. 1

Click the radio button next to "Yes I am willing to participate" and click the [OK] button.

Of course, you can also opt out of the program by selecting the “No” radio button, but then you are not helping to improve the product. Those who opt out of this often do so because they fear for their privacy; but no personal information is transmitted, You can read about the privacy of your information here.

Microsoft makes it easy for you to share information about Visual Studio usage because they want this information to help to improve Visual Studio.




The Thrawn Trilogy consists of 3 novels: Heir to the Empire, Dark Force Rising, and The Last Command. The books tell a story that takes place in a galaxy far away, a long time ago. But it is not as long ago as the events of the 6 Star Wars movies. The story begins a few years after the the Rebel victory at the Battle of Endor at the conclusion of Return of the Jedi. Although the Endor conflict and its aftermath left the Empire weakened and resulted in the deaths of Emperor Palpatine and Darth Vader, The Empire still maintains a formidable navy commanded by Grand Admiral Thrawn, a brilliant military tactician.

Han Solo and Princess Leia are now married and Leia is pregnant with their twins. Thrawn, in his quest to re-establish the Empire, enlists the services of Joruus C'baoth, the insane clone of a dead Jedi master, who is intent on enslaving Luke, Leia, and Leia's twins (the last of the Jedi line) and establishing himself as galactic dictator.

The rebels match wits with Thrawn across multiple planets, the battles flowing in favor of each in turn. Both sides try to enlist the help of neutral parties, such as a guild of smugglers led by Talon Karrde and the Noghri, a race tricked into decades of servitude by Darth Vader and the Empire. In the final book, our heroic rebels face off directly against Thrawn and C'baoth for control of the known galaxy.

These books are part of the Star Wars Expanded Universe (EU), the name given to books, games, and other media that describe the events of the Star Wars universe. Although LucasFilms recently announced that expanded universe stories are no longer considered canon, it is still fun to follow the further adventures of Luke, Leia, Han, Lando, C-3PO, and R2-D2. Zahn stays true to the characters created by Lucas. He also introduces fascinating new characters, such as Karrde, Thrawn, Mara Jade, and others, who appear in later EU stories.

Along the way, Zahn weaves an exciting tale of action and intrigue, loyalty, and betrayal. It's not the most intellectually stimulating tale but it is loads of fun. Like an unexpected visit from old freinds.



July 2014 Gratitudes

Comments [0]

8/3
Today I am grateful I was able to complete a lot of work around my house yesterday.

8/2
Today I am grateful for a few days without the pressure of driving hundreds of miles.

8/1
Today I am grateful for
Finally getting my electrical account straightened out
Finally getting my parking pass at my new apartment
Random Packer fans who showed me around Lambeau yesterday.
7/31
Today I am grateful for the chance to visit 3 great user groups in northern Wisconsin over the past 3 days.

7/30
Today I am grateful for drinks at The Lazy Monk, lunch at Taco Juanita, and conversation at The Green Mill - 3 great places to hang out in Eau Claire, WI.

7/29
Today I am grateful for my first trip to Eau Claire, WI.

7/28
2 nights ago, I slept on the floor and got very little sleep. Today I am grateful for the air mattress on which I slept last night.

7/27
Today I am grateful for my new home.

7/26
Today I am grateful to be invited to my first MGX conference and for the free Lady Gaga concert last night..

7/25
Today I am grateful for free lattes and free Dove bars.

7/24
Today I am grateful for all the people I met on my team at the DX dinner last night.

7/23
Today I am grateful for a visit to the amazing Georgia Aquarium last night.

7/22
Today I am grateful I attended my first Atlanta Braves home game last night.

7/21
Today I am grateful for my first trip to Atlanta in about 10 years.

7/20
Today I am grateful for a fresh start. And a chance to take back control of my life.

7/19
Today I am grateful that I found my drivers license, which has been missing for a week.

7/18
Today I am grateful for 2 great user group audiences in Indiana this week.

7/17
Today I am grateful to see young people getting excited about software development.

7/16
Today I am grateful to spend time with my mother for the first time since the death of my father.

7/15
Today I am grateful that I am starting to get rid of all the crap I've accumulated over the decades.

7/14
Today I am grateful for: 1. Attending the 125th anniversary Mass at St. Henry - my old church in Kentucky. 2. Lunch with Gary Desmarais and Patricia Desmarais. 3. Visiting my cousin Susan Jean Kight. 4. Surviving 2 severe thunderstorms on the drive home.

7/13
Today I am grateful to the organizers of #Codestock, who put on a great conference and allowed me to be a part of it.

7/12
Today I am grateful for the 50 years my sister Denise spent with us before she passed away, 5 years ago today.

7/11
Today I am grateful for my first #Codestock in 4 years and for time spent with old friends last night.

7/10
Today I am grateful for: 1. Great sandwiches and amazing potato pancakes at Izzy's in northern Kentucky. 2. A great audience at the Nashville Microsoft Azure Users Group. 3. Seeing Kent Fehribach for the first time in a year 4. Dinner and sidewalk music in downtown Nashville last night with Brian Sherwin and Kent.

7/9
Today I am grateful for lunch with Jeeva and for watching soccer with my son Tim.

7/8
Today I am grateful for an unexpected extra day at home between trips to help me recharge.

7/7
Today I am grateful to spend the holiday weekend with family in California.


Recently, I recorded an interview with Greg Levenhagen about the Beerology Windows 8 app he helped build. This interview is available on the DevRadio podcasat and below.



<< Older Posts | Newer Posts >>