Diary of a code trotter

Laurent Bugnion

I am really happy to welcome you here. This page displays the 10 most recent entries of my blog.

For older posts, please go to this page where you can browse the whole content.

For other content, please visit my main page at https://galasoft.ch

Thank you for your visit!!
Laurent

Notifications Client Step 0: Specification

.NET, Azure, Azure Functions, Technical stuff, Work, Xamarin
See comments

Xamarin, Notification Hub, Functions, Cosmos DB

Find the GitHub repository for this series here.

We discussed this application on Thursday, June 18th 2020 on the Microsoft Developer Twitch channel, so join Frank Boucher and myself to see this show!

Intro

Previous article: Building a notifications client with Xamarin and Azure

I have decided to build a cross-platform Notifications Client used to receive push notifications when a long-running system needs it. This Notifications Client is generic, and not tied to a specific system or application, but serves as a receiver and repository for all kinds of notifications.

I have the following specifications in mind:

  • The client will have different pages. The notifications can have a "channel", which will sort them to a specific page.

Note: The "channel" here is a custom property I am adding to the notification for my own purpose. It's not the same at the Push Notification Topic in Firebase, which allows to push notifications only to selected devices, or the customer segments in Windows, which have the same goal. Here we just use the channel as a way to sort notifications in pages.

App main page with all the channels

App main page with all the channels

  • There should be one page showing all the notifications, and one page per channel with only the corresponding notifications.

Channel page with the corresponding notifications

Channel page with the corresponding notifications

Detail of a notification template

Detail of a notification template

  • The client should save the notifications locally.

  • The client should allow the notifications to be searched on the current page (or the "all notifications" page).

  • Notifications can be received when the application is off, or when it is running.

  • Eventually, the notifications should also be saved in the app for offline mode.

  • Notifications can be deleted from the app.

Detail page for a notification

Detail page for a notification

  • The client should be implemented in Xamarin.Forms to be cross-platform, even though initially I only need Android and possibly Windows (UWP).

Architecture

The architecture is composed of a few Azure services, as well as a Google service for Android notifications, a Windows service for Windows notifications, and later of an Apple service for iOS notifications.

Notification system architecture

Notification system architecture

  1. Any system can send a simple POST request over HTTP to an Azure Functions endpoint. The payload is a simple JSON file containing a title, a message and an optional channel.

If you are watching systems on Azure, a great way to connect a system to the Azure Functions endpoint is to use EventGrid.

  1. The Azure Function passes the notification request to an Azure Notification Hub.

  2. The Notification Hub communicates with Firebase Cloud Messaging (FCM) (Android), the corresponding services for Windows (Windows Push Notification Service WNS) and iOS (Apple Push Notification Service APNS). The notification is enqueued on these systems and sent to registered devices.

Azure Notification Hub also supports other systems such as Amazon (ADM), Baidu, and even good old Windows Phone!!

  1. FCM sends the notification to registered Android devices. Similarly, APNS sends the notification to iOS devices, and WNS sends the notification to Windows devices. What happens on the device is described below in When a device receives a notification.

  2. After the push notification has been successfully enqueued, it is saved to a cloud database. We will use the new CosmosDB free tier for this, as this allows for a powerful yet simple NoQSL database to be used.

When a device receives a notification

There are three scenarios.

  • The application is running in the foreground: The new notification is shown on a page, the user's attention is attracted for example by a sound or a flashing.

  • The application is in the background, or not running: The new notification is displayed as a push notification. The user taps the notification, which starts the app. The new notification is shown on a page.

  • Same scenario but the user dismisses the notification: Nothing happens until the next time that the app starts.

    1. When the running app receives a new notification, or when the app is started from a new notification, the notification is saved in a local database on the device (SQLite).

    2. A synchronization can occur between the cloud database and the device database. The synchronization is started by the user, it also occurs when a notification is deleted on a device, or every time that the application starts.

In the next article...

Hopefully these specs make sense for everyone!

In the next article, we will get started with the implementation of the notification system!

Happy coding

Laurent

Building a notifications client with Xamarin and Azure

.NET, Azure, Azure Functions, Technical stuff, Work, Xamarin
See comments

Xamarin, Notification Hub, Functions, Cosmos DB

Find the GitHub repository for this series here.

We discussed this application on Thursday, June 18th 2020 on the Microsoft Developer Twitch channel, so join Frank Boucher and myself to see this show!

I often find myself needing to send a notification to my mobile device, for example when a job finishes on Azure, when one of my computers at home is done doing something, or when I just want to send an alert when something changes in a system I am observing.

Normally I would go ahead and create a companion app for the system I am building, and then send notifications to this app, but sometimes it's really overkill to build a full-blown app for this. This is why I decided to build a generic notifications client that I can install on my phone.

What's really cool is that a lot of the development (with dotnet and Xamarin) can be done locally on my Surface Pro, which makes testing and debugging very much easier, before the services and applications are deployed to Azure and to my devices.

Why Push Notifications? (aka why not SignalR?)

Why did I choose to use push notifications and not another messaging service like SignalR for example?

SignalR is an amazing feature that you can easily add to a Xamarin application as shown in this sample. It is very well suited for high traffic, real-time communication. In our scenario, it doesn't quite fit, because we want the notifications to reach the device also when the application is not running, which is exactly what push notifications are made for. Also, even when the application is running, adding SignalR would be overkill because we don't really need real time, high traffic here. What we get from our watched systems is a notification from time to time, and even if this notification is delayed by a few seconds, it's not mission critical.

Finally the push notification system also includes retries, in case one device is offline for a period of time. This is very useful for our scenario too.

Steps

I am planning to build this system in the following order:

Step 0: Specification

In this step we will specify what we want the system to achieve, create a few sketches of the application and get ready :)

Step 1: Sending a notification from the Firebase Cloud Messaging

The first step will include:

  • Creating a new project in Google Firebase and setting up Firebase Cloud Messaging (FCM).
  • Building a client app just here to receive the Push Notification and test that it works.
  • Test the notification with with Postman.

Step 2: Sending a notification from Azure Notification Hub

So far I hadn't worked directly with Azure Notification Hub (I was using App Center, but this is being retired), so I need to figure out how the Notification Hub works. Thankfully there is good documentation available. Here is what we'll do in this step:

  • Create a new Azure Notification Hub and connect it to FCM.
  • Test the setup by sending a push notification with Postman.

Step 3: Build the endpoint and connect to Notification Hub.

Once we have the FCM project and the Notification Hub set up, we can build an Azure Function to serve as the main endpoint for the notification system. The Azure Function will communicate with the Azure Notification Hub by means of an SDK for .NET. This includes:

  • Build the Azure Functions application locally.
  • Build a test request in Postman to try things out.
  • Create the Azure Functions application on Azure.
  • Publish the function to the Azure Functions application.

Not started yet

Step: Sending a notification from the Windows Push Notification Services

Not started yet.

Step: Show the new notification in a page on the device.

Not started yet.

Step: Save the notifications in Cosmos DB.

Not started yet.

Step: Get the notifications from Cosmos DB into the app.

Not started yet.

Step: Save all the secrets to Azure KeyVault.

Not started yet

Step: Organize the notifications in the app in pages.

Not started yet.

Step: Save the notifications locally (synchronize).

Not started yet.

Step: Customize the application with icons, design etc...

Not started yet.

Building an ARM deployment template

In order to allow people to use this on their own, I am also planning to prepare an ARM deployment template for the Azure components.

  • Azure Function connected to the Azure Functions application GitHub repo.
  • CosmosDB.
  • Notification Hub.
  • KeyVault for the connection strings and other secrets.

In addition I will write detailed description on how to create the Firebase Cloud Messaging project, and how to configure all the Azure pieces.

Find the GitHub repository for this series here

Next article: Notifications Client Step 0: Specification

Happy coding!

Laurent

Join me online May 15, 2020: Free session

AI, Cloud developer advocate, Deep Learning, Microsoft, Technical stuff, Work
See comments

On Friday, May the 15th, 2020, I will live stream my session titled "A Gentle Introduction to Deep Learning".

A Gentle Introduction to Deep Learning

I presented this session a few times at various events and it was always quite successful. Since obviously in-person events are rather quiet these days, I want to try to live stream it and see how successful it gets. If that works well, I'll probably stream this session and others again, at different times, so more people can join.

Technically speaking, I will be using a Microsoft Teams Live event. This kind of meeting allows anyone to join, either anonymously in a web browser, or logged in on the web or in the Teams client. It also allows Q&A and the amazing Amy Boyd agreed to help moderating and answering questions. Amy is a data scientist on the Cloud advocates team and an AI specialist so you'll be in good hands.

I am very excited about this event and curious to see how it turns out. Hopefully you can also join us!

The event is free but I ask you to register here so you can receive the attendee link per email.

If you want to know when the event will be in your timezone, you can go here. If the event is too late or too early for you, I will record the event and I will also probably repeat the live stream at other times so people in the US or Asia can join too.

Can't wait to see you all on Friday!

Happy coding

Laurent

Happy 2020

Cloud Developer Advocate, Conferences, Microsoft, Microsoft Ignite the Tour, Personal
See comments

My spirit animal

This beautiful sea turtle tolerated me for a beautiful moment, and started my year 2020 in a wonderful fashion

As always at this time of the year, it's a good moment to stop and reflect on the events of the year, and get ready for the new year (or decade?)

Technically speaking, the decade will only start in 2021, since the first year of the calendar was year 1. But I think we can all agree that by popular request, the decade goes from 2020 to 2029 :) Welcome to the roaring 20s!!

First party events

For me, 2019 was mostly focused on our first party string of events called Microsoft Ignite the Tour. In 2018 - 2019, I prepared one session (about database migration) and then spoke at 9 "Ignite the Tour" events across the globe, and really enjoyed the experience. This is why around June, after the Tour 2018-2019 ended, I decided to change team and be even more committed to the Tour 2019-2020. I joined my good friend Scott Cate's newly created Scalable content team, and took over (together with my esteemed colleague Brian Benz) two of the learning paths, "Developing Cloud Native Applications" and "Modernizing Web Applications and Data for the Cloud".

Preparing the sessions took us from July until Novemeber, when we presented the premiere of all our sessions at our "big Ignite" event. And then, we went on the road... starting in Paris, which was our first "Tour" event.

All our sessions were recorded at Ignite, and so if you want to re-watch them, or catch a preview, you can head to the site and look for the videos!

I listed all the events below, and highlighted the ones where I will personally take part. Hopefully it will be an occasion to see some of you there. If you come to one of our events, make sure to reach out to me on Twitter and we'll meet up :)

Third party events

Next to these events that kept me super busy, I also had time to go to a few more events. In general, whenever we go to a location for a first party event, we always try to meet community groups in meetups or other events. So make sure to keep an eye on my Twitter feed to keep up with planned events.

As always, you can find past events on my site, where I list the slides, source code repos and all other resources related to the event.

Other content

Of course next to events, we also create other content. My blog and my YouTube channel haven't be extremely busy recently because of all the work on the Tour, but still, make sure to visit and subscribe :)

Happy new year to all!

I want to take a moment to thank everyone who came to see me talk at various events, or who watched and read my content. It's a privilege to be able to share the knowledge that I am acquiring every day in my job as a Cloud Advocate. I really hope that this content is useful to you, and that it helps you progress in your role, everyday and always.

Please take a moment to rest, relax, and recharge before more exciting technological advances in 2020!!

Happy coding!!

Laurent

List of Microsoft Ignite the Tour events for 2019-2020

Here is the list of all the Microsoft Ignite the Tour events for 2019-2020. I made the ones where I will be personally bold.

More information about Microsoft Ignite the Tour

  • Paris (13-14 Nov 2019)
  • Tokyo (5-6 Dec 2019)
  • Beijing (10-11 Dec 2019)
  • Sao Paulo (10-11 Dec 2019)
  • Toronto (8-9 Jan 2020)
  • Shenzhen (13-14 Jan 2020)
  • London (16-17 Jan 2020)
  • Seoul (21-22 Jan 2020)
  • Osaka (23-24 Jan 2020)
  • Milan (27-28 Jan 2020)
  • Johannesburg (30-31 Jan 2020)
  • Washington DC (6-7 Feb 2020)
  • Dubai (10-11 Feb 2020)
  • Sydney (13-14 Feb 2020)
  • Taipei (17-18 Feb 2020)
  • Singapore (20-21 Feb 2020)
  • Prag (24-25 Feb 2020)
  • Copenhagen (27-28 Feb 2020)
  • Zurich (4-5 Mar 2020)
  • Amsterdam (11-12 Mar 2020)
  • Shanghai (18-19 Mar 2020)
  • Hong Kong (25-26 Mar 2020)
  • Madrid (25-26 Mar 2020)
  • Mexico City (30-31 Mar 2020)
  • Mumbai (2-3 Apr 2020)
  • Bangalore (8-9 Apr 2020)
  • Chicago (15-16 Apr 2020)
  • Tel Aviv (22-23 Apr 2020)
  • Berlin (29-30 Apr 2020)
  • Stockholm (5-6 May 2020)

Microsoft Ignite the Tour 2019 - 2020

Azure, Cloud Developer Advocate, Microsoft Ignite, Microsoft Ignite the Tour
See comments

In July 2019, I decided that this year again I wanted to spend most of my time in our fiscal year 2020 (July 2019 - July 2020) on our series of conferences titles Microsoft Ignite the Tour. I am very thankful to my back-then managers Bruno Borges and Tim Heuer for making this possible, and to my now-manager Scott Cate for welcoming me on the team. Scott and I have a long history and he is in fact the one who called me back then in 2017 and asked me if I wanted to interview for this brand new team called the Cloud Developer Advocates. (Since then we dropped the developer qualifier because the team has epanded to include DevOps, SRE and more.)

In July 2019 we started creating the content that we will present on the Tour. We premiered this content last week at Microsoft Ignite in Orlando, and while some adjustments are going to be applied, it's fair to say that our content was well received.

Going on the road

Starting on the 13th and 14th of November, we're taking the show on the road. We'll be there in a total of 30 locations (the bold ones are the ones where I will present):

  • Paris (13-14 Nov 2019)
  • Tokyo (5-6 Dec 2019)
  • Beijing (10-11 Dec 2019)
  • Sao Paulo (10-11 Dec 2019) TODO Check
  • Toronto (8-9 Jan 2020)
  • Shenzhen (13-14 Jan 2020)
  • London (16-17 Jan 2020)
  • Seoul (21-22 Jan 2020)
  • Osaka (23-24 Jan 2020)
  • Milan (27-28 Jan 2020)
  • Johannesburg (30-31 Jan 2020)
  • Washington DC (6-7 Feb 2020)
  • Dubai (10-11 Feb 2020)
  • Sydney (13-14 Feb 2020)
  • Taipei (17-18 Feb 2020)
  • Singapore (20-21 Feb 2020)
  • Prag (24-25 Feb 2020)
  • Copenhagen (27-28 Feb 2020)
  • Zurich (4-5 Mar 2020)
  • Amsterdam (11-12 Mar 2020)
  • Shanghai (18-19 Mar 2020)
  • Hong Kong (25-26 Mar 2020)
  • Madrid (25-26 Mar 2020)
  • Mexico City (30-31 Mar 2020)
  • Mumbai (2-3 Apr 2020)
  • Bangalore (8-9 Apr 2020)
  • Chicago (15-16 Apr 2020)
  • Tel Aviv (22-23 Apr 2020)
  • Berlin (29-30 Apr 2020)
  • Stockholm (5-6 May 2020)

I want to stress out that this is a free event and that you can take advantage of two full days of sessions, as well as meeting with hundreds of presenters from Microsoft and partners.

My sessions in Paris

Microsoft Ignite the Tour Paris

In Paris I will present three breakout sessions (45 minutes) and one theater session (20 minutes). You can find some details about these sessions and activities at the links below.

Other activities in Paris

In addition to the Tour, you will also be able to see me at two occasions in Paris.

These two events will be conducted in French.

Ecole EPITA

EPITA

I will have the immense pleasure to introduce Microsoft Azure to students of the "Ecole pour l'Informatique et les Techniques Avancées" in Le Kremlin-Bicêtre near Paris. There, I will present my Azure 101 session which gives an overview of some services of Azure, as well as demos on how to make these work. I am very happy to have this opportunity to speak to future software developers who will shape the future of our industry. Students will see me there on Tuesday, the 12th of November between 12PM and 1PM. This event is not public.

.NET Meetup DevTalks

DevTalks

Community is and will always be one on the major reasons for my team to exist. We try to connect to local user groups as often as we can when we travel. On the 12th of November, I will also be honored to speak at a local user group about .NET, and I will speak about Cognitive Services on Azure. We will also have the pleasure to hear my esteemed colleague Frank Boucher who will speak about Docker on Azure.

You can register for this free event here.

I am very much looking forward to see everyone in France!!

Happy coding

Laurent

Meet me at Microsoft Ignite 2019

Cloud Developer Advocate, Microsoft Ignite, Microsoft Ignite the Tour, Work
See comments

Can you feel the excitement growing? Yes it's right, Microsoft Ignite and Microsoft Ignite the Tour are going to start soon.

Microsoft Ignite logo

Microsoft Ignite

Ignite is going to take place at the Orange County Convention Center in Orlando FL from November 4th to 8th. It is the largest Microsoft conference. It will also be the first time that I attend this show. It's also sold out, which means multiple tens of thousands of attendees will converge to Orlando soon...

To be honest I am a little worried to be overwhelmed by the sheer size of the event. But on the other hand it will be a great occasion to see all my friends and to make new ones :)

I will be quite active at Ignite and I am really excited about showing the sessions that we have been working on since, in some cases, August. It took a long time to prepare those sessions and polish them, and to prepare train-the-trainer packages (more about that later).

At Ignite, you will see me on stage at 3 occasions, and a whole lot of other occasions to connect with me:

MOD20 - Moving Your Database to Azure

CosmosDB, Azure SQL, Database Migration Service logos

In this session, I will show you how to migrate on-premises databses (MongoDB and SQL Server) to Azure (CosmosDB and Azure SQL Database). We will talk about our data offering, see how the Database Migratin Service assists you in the migration.

  • Agenda link
  • Date and time: Nov 6th, 11:45AM - 12:30PM

Here is the abstract:

Northwind kept the bulk of its data in an on-premises data center, which hosted servers running both SQL Server and MongoDB. After the acquisition, Tailwind Traders worked with the Northwind team to move their data center to Azure. In this session, you’ll see how to migrate an on-premises MongoDB database to Azure Cosmos DB and SQL Server database to an Azure SQL Server. From there, you’ll walk through performing the migration and ensuring minimal downtime while you switch over to the cloud-hosted providers.

MOD40 - Debugging and interacting with production applications

Azure Monitor logo

Here we will see multiple tools to monitor, debug and update web applications in production. This includes powerful tools like Azure Monitor, Application Insights, Log Analytics. We will also see how the Snapshot debugger can provide even more information about an issue. Finally we'll talk about one of my favorite features of App Services: Deployment slots. We'll see how these can be used to deploy new features safely, as well as perform A/B testing.

And for the abstract:

Now that Tailwind Traders is running fully on Azure, the developers must find ways to debug and interact with the production applications with minimal impact and maximal efficiency. Azure comes with a full set of tools and utilities that can be used to manage and monitor your applications. In this session, we will see how Streaming logs work to monitor the production application in live time. We will also talk about Deployment slots that enable easy A/B testing of new features and show how Snapshot Debugging can be used to live debug applications. We'll also see how other tools can be used to manage your websites and containers live.

MOD41 - Deploying and A/B testing without risks with Deployment Slots

Azure App Service logo

This session is a short 20 minutes theater session allowing us to deep dive into my favorite feature of the App Services on Azure, the Deployment slots. It's a deeper dive into one of the demos of MOD40 above. It will allow us to be more complete about safe feature deployment, where we use a staging slot as the target. Seeing how easily we can swap production and staging slots gives us great confidence, because in the worst case scenario, if an untested bug surfaces after the swap, we can easily swap back to the previous state, and take our time to fix the issue. We will also see how we can randomly redirect some of the traffic to a new slot for A/B testing. It means that some of the users will randomly see the new features, while others will still see the previous version of the site.

Here is the abstract for this theater session:

Who hasn’t been very scared when deploying a new feature to a website? Sometimes we feel that we will break everything, and the stress level is just not something we want to experience ever again. That's why the Deployment Slots feature of Azure App Services is such a nice experience. With Deployment Slots, you can deploy to a safe slot in the same conditions than your production environment. You can test in isolation, without risking breaking something. Then you can gradually route some of the traffic to the new features, for example to perform A/B testing. When you are satisfied with the results, you can simply switch the whole traffic to the new site. But don't fret, if something goes wrong, the old, safe site is just one mouse click away.

Debug bar

In addition to these sessions, I will often be available at the Debug bar. This is a place in the Development and Architecture Center where you can connect to Microsoft employees, MVPs and other partners, and talk about the topics that you love. I hope to be able to help for some issues but also to hear what you use our services for, and what you think can be improved (features, documentations, etc). Here is my schedule. I will make sure to update it if something changes, so make sure to bookmark this page!

  • Monday Nov 4th, 7:30AM - 11:00AM
  • Tuesday Nov 5th, 11AM - 1PM
  • Thursday Nov 7th, 3PM - 5:15PM

I am really looking forward to attend Ignite and to see you all there. Since I missed Build this year in Seattle, I didn't have my "fix" of first party conferences since Microsoft Ignite the Tour 2018 - 2019 ended in May. Ignite should be awesome :)

(and Ignite the Tour 2019 - 2020 starts soon, more in a future blog post soon :) )

Happy coding

Laurent

My new role for fiscal year 2020

Microsoft, Microsoft Ignite the Tour, Work
See comments

At Microsoft, we are using a weird way to count the years: Our fiscal year goes from July to July for some historical reason, and so every mid-calendar year, we are faced with what other firms often do in December: Reorganizing the teams, doing accounting, finishing up the budgets...

The end of the fiscal year 2019 also marked the end of our Microsoft Ignite the Tour 2019, in which we tried quite a few new concepts. We took this tour on the road in 17 different locations, including more remote locations where Microsoft rarely has first party conferences. I've personally spoken at 9 of these locations, many of these for my first time, including Mexico City, Sao Paulo, Johannesburg, Hong Kong and more.

You can see the videos of Microsoft Ignite the Tour 2019 here.

And in 2020?

With 2020 coming up, we are already hard at work on the next edition of Microsoft Ignite the Tour. And for this edition, we go bigger and further: We will have 30 locations on 5 continents (still no edition in Antartica I am afraid :)

For me personally, this is also time for a change. I asked for and obtained a change in my activities: Starting in August (which coincidentally also marks my second anniversary at Microsoft), I will move in my good friend Scott Cate's team, and my main activity for fiscal year 2020 will be dedicated to the Tour.

Learning paths: A success that we will repeat

More specifically, I will lead one of the learning paths consisting of five breakout sessions and one theater session. It's still a bit early to reveal what this learning path will be about, but let's just say that we are building on last year's feedback, keeping what worked great and improving the few areas where we can be better. The teams are now assembled and hard at work to create the sessions.

Polymath: A polyvalent presenter

One of the things we had to deal with last year was emergency situations. One of my colleagues ended up in the hospital just a couple of days before he was supposed to be presenting (he is good now, no worries :). We managed to solve this issue thanks to a very professional team and extra work, but it was stressy.

This year we want to be better prepared. This is why in addition to leading one of the learning paths, I will also take the role of polymath. In Wikipedia, the article about polymath is illustrated by a picture of Leonardo da Vinci.

Leonardo da Vinci

Source: Wikipedia

This is of course very ambitious and none of us is seriously comparing ourselves to that great man. By extrapolation, our definition of a polymath on Microsoft Ignite the Tour is someone who learns 10 different sessions, and is able to deliver those, in case of emergency such as above, with minimal preparation and time. This is a really interesting challenge for us, which will lead us to learn even more about Azure than we would normally do.

A Cloud Advocate is (amongst other things) a professional presenter, and so it's not new for us to learn and give new sessions in a relatively short time. But a big part of the job is also to be a learner. We keep learning new technologies, new services, every day. More than ever, at 48 years old I am still learning ever day, and I just love it. The polymath role pushes me further in that activity and I just love it. Without revealing too much, I can say that the areas where I will be learning and presenting are artificial intelligence, web apps, databases, containers and more.

In the next few weeks, we will start being more precise about the content of Microsoft Ignite the Tour, and I will also detail the locations where you will be able to meet me in person. For now, you can already get ready for Microsoft Ignite the Tour and check all the locations. I am looking forward very much to meeting more people in person, and to deliver these new and updated sessions.

Happy coding! Laurent

DateTime.Now: No, no...

Azure, Technical stuff, Work
See comments

This post was cross-posted to Dev.To, an awesome community!

Recently my colleague and friend Donovan Brown was in Switzerland for customer visits and for the DotNet Day conference in Zurich. I took the occasion to spend some time with him and we got to talk (as you would expect) about geeky and "cloudy" stuff.

One topic of discussion (and that was also mentioned by one of the clients) is: What do you need to get ready for the cloud... and one topic was: Timezones!!

What time is it, really?

Because of all the regions we have, it means that your code suddenly has the potential to easily go global :) So here's a fun experiment you can do:

  1. Create a new web application. Here I use Visual Studio to create an ASP.NET Core web application with Razor pages.

  2. In the HTML code, display the local time and the UTC time. In ASP.NET, I can use the following code in the index.cshtml:

Local time: @DateTime.Now

UTC: @DateTime.UtcNow

In Razor pages, you can call C# code directly from the CSHTML markup, which is very convenient.

  1. Run the application locally. If like me you are based in Western Europe, you should see something like the below (notice the 2 hours difference between local time and UTC). If you are based somewhere else, it will vary, but there are very good chances that the Local time and the UTC time are going to be different (except of course if you happen to be in a timezone where the local time is the same as UTC).

Running the application locally

  1. Now deploy your application to Azure, into the West US region. You can do that from Visual Studio directly, or create an App Service in the Azure Portal and deploy there.

  2. Run the West US application. Now you should see the same time displayed for Local and for UTC.

Running the application in Azure

What?

So that might be a surprise, and in fact I wasn't expecting that when I first did this experiment a few months ago.

What's going on here is that the Azure architects decided to make it easy for people to migrate web applications (App Services) from region to region without changes in code used to calculate time and time differences. So they run all the Azure servers on UTC. On the other hand, this has the disadvantage that you might have to modify your code to take this in account when you migrate from on-premises to the cloud

For example, if I am based in Switzerland and deploy my application to Western Europe (which is based in the Netherlands), I would expect my application to have the exact same DateTime.Now in Azure than locally. And yet...

The morale of the story...

The big learning here is that if you are looking to migrate to the cloud, suddenly timezones become very relevant, but not necessarily in the way that you would imagine. It's not that you need to know where your code will be running. It is that you need to know that these regional questions will be abstracted.

It would be a great idea to prepare yourself to the migration by doing the right thing already now on premises: Do not use DateTime.Now in your code but use DateTime.UtcNow instead and do the conversions where needed. This way you are already abstracting the location of your code, and when you migrate to the cloud and the location becomes irrelevant or unpredictable, your code will continue to work without being affected.

Happy coding

Laurent

Creating the simplest possible ASP.NET Core form with a POST method

.NET Core, .NET Standard, ASP.NET, Razor
See comments

Simple HTML form in ASP.NET Core

Recently I needed to create a simple page for someone to submit an HTML form. The rest of the Azure aplication is running on Azure serverless functions, Logic apps and Cognitive services, but for that last part I wanted something where the user can click on a link, open the page in a web browser (probably on a mobile device), enter a passphrase in a form and then submit through a POST to an SSL encrypted page. I thought of writing a small Xamarin app and submitting through POST to an Azure Function. Another option would be to use a static HTML page and to use Javascript to submit the Form through a POST to that Azure Function. I don't exclude these two options for the future.

But in the meantime I wanted to experiment with a simple Razor page (CSHTML) that would present an HTML Form to the user, and submit this Form to itself with a POST over HTTPS.

I noticed that the documentation is not great about how to do this in the simplest possible manner and so I created an example with source code and complete instructions.

I hope this is helpful to you!

Happy coding

Laurent

2018 in review, planning for 2019

Azure, Cloud Developer Advocate, Conferences, Microsoft, Personal, Work
See comments

As 2019 is starting, I want to take a moment to reflect on 2018 and think about next year.

After joining Microsoft and the Azure Cloud Developer Advocates team in August 2017, 2018 was the first full year I spent in this team. I had decided to travel a lot and speak in places I had never spoken before, connecting with developers and communities that I had never met earlier. This meant a lot of travel, but I am happy to report that all went very well, I stayed (mostly) healthy (except for a small episode of the flu probably caught on a Singapore-Zurich flight), and I learned a lot of things, both about Azure and about myself :)

The conferences

I listed below all the conferences I spoke at in 2018. There was a total of 53 sessions, some of them online, most of them in person. I loved creating and giving these sessions, but most importantly I loved connecting with the attendees. If I had to pick my two favorite events of 2018, I would probably select two user group events :

More...