# Saturday, February 27, 2021

Fragile Things is a collection of 25 short stories and 7 poems written by Neil Gaiman.

Most of the stories have dark - even macabre - themes. One tells how demons are created in Hell; in another, a man discovers that he has been living his entire life in a computer simulation; still another involves a boy's sexual enslavement by an ultra-rich man.

Some are more fully fleshed out than others, as if Gaiman began a longer novel before giving up; but these are worth including because Gaiman has such a gift for language and knows how to tell a story, even if it is a partial story.

Each story is independent of the others, but some exist in the same universe. For example, the wealthy Mr. Alice and his employee Mr. Smith appear in two different stories.

A couple satires or homages to the writings of other authors - C.S. Lewis's The Chronicles of Narnia and Arthur Conan Doyle's Sherlock Holmes; and a few are inspired by art and music heard by Gaiman.

My favourite entry was the longest and final story in the collection - The Monarch of the Glen, which featured Shadow of American Gods and takes place a couple years after that novel.

Nearly everything in this book has appeared elsewhere and I had already read a few of the stories, but I enjoyed them again this time around.

Saturday, February 27, 2021 9:50:00 AM (GMT Standard Time, UTC+00:00)
# Thursday, February 25, 2021

GCast 105:

Analyzing a Video with Azure Media Services

Learn how to use Azure Media Services to apply Artificial Intelligence and Machine Learning to a video, analyzing such things as face detection, speech-to-text, object detection, and optical character recognition

Thursday, February 25, 2021 8:52:00 AM (GMT Standard Time, UTC+00:00)
# Monday, February 22, 2021

Episode 649

Richard Taylor on the Microsoft Revenue Recognition System

Richard Taylor is working on a system to process revenue received by tech giant Microsoft. He discusses the challenge in building and maintaining a large system like this and in migrating it to Azure.

Monday, February 22, 2021 8:43:00 PM (GMT Standard Time, UTC+00:00)
# Saturday, February 20, 2021

Tommy James and the Shondells turned out hit after hit in the 1960s. But James saw very little of the royalties generated by sales of his records. That money was controlled by crime boss Morris Levy, who signed a teenage James to a deal with his Roulette Records in 1966. The band went on to release two #1 records and  a dozen Top 40 singles over the next 5 years.

But Levy was notorious for non-payment of debts including tens of millions of royalties owed to James. James was forced to earn his money through constant touring and profited very little off the sale of his records.

Despite this betrayal, James and Levy maintained a close relationship throughout much of their lives. Levy was excellent at promoting James's music and James enjoyed a great deal of artistic freedom as Roulette's biggest star. James's career also benefited from Levy's strong-arm tactics: He would often bully songwriters into saving their best work for his artists.

Me, the Mob, and the Music: One Helluva Ride with Tommy James and the Shondells is Tommy James's story of life in the spotlight. It contains the usual anecdotes about women and booze and drugs that seem to be part of every rocker's life. But these stories are secondary to his interactions with Roulette and Levy.

The story climaxes in a gang war that sees Levy fleeing the country and James fearing for his life.

One wonders why James continued his relationship with Levy when he was treated so unfairly. Did he feel it was unsafe for him to leave? Was he a victim of Stockholm Syndrome? Did the career advantages of associating with Roulette outweighed the financial disadvantages?

One  wonders if the corruption at Roulette was a microcosm of the corruption in the entire music industry in the 1960s; and if that corruption continues today.

One wonders if Tommy James ever received all the royalties he was due.

Despite the unanswered questions, this book was an enjoyable read about an unlikely hitmaker and his adventures with the underbelly of the industry.

Saturday, February 20, 2021 9:49:00 AM (GMT Standard Time, UTC+00:00)
# Thursday, February 18, 2021

GCast 104:

Sharing a Video Online with Azure Media Services

Learn how to use Azure Media Services to share a video on the web for streaming and/or for downloading.

Thursday, February 18, 2021 8:51:00 AM (GMT Standard Time, UTC+00:00)
# Monday, February 15, 2021

Episode 648

Julie Lerman on Entity Framework Core 5

Julie Lerman describes some of the new features included in EF Core 5.

Monday, February 15, 2021 8:38:00 AM (GMT Standard Time, UTC+00:00)
# Saturday, February 13, 2021

Alexander Portnoy has issues.

An overprotective mother left him straddled with guilt and an Oedipal complex. His childhood memories are dominated by unpleasant bodily functions - his father complaining of persistent constipation; his mother accidentally spilling a drop of menstrual blood on the kitchen floor; his own inability to wipe himself completely or to control his masturbation.

Portnoy was raised by Jewish parents, grew up in a Jewish neighborhood, attended a Jewish school, and all his friends were Jewish. As an adult, he became obsessed with seducing attractive non-Jewish women ("shikses", as he calls them). But Portnoy has no interest in a real relationship. When referring to his past lovers, he is more likely to call them by a nickname than to use their real name. He calls his latest lover "The Monkey" after a past sexual incident she confessed to him. This is just one way in which he dehumanizes women, treating them only as sex objects. The Monkey is absurdly ignorant, but Portnoy stays with her because she is beautiful and good in bed; Portnoy is overtly misogynistic, but The Monkey stays with him because she hopes that he will marry her.

Portnoy's Complaint by Philip Roth is a satirical confession of a 33-year-old sex addict, who recognizes his self-destructive behavior and feels extreme guilt over it; but is powerless to correct these flaws. Despite his numerous faults and our very different upbringings, I was able to relate to his life.

The story is humorous, but crude. It is crude, but humorous.

I feel a little guilty for enjoying it so much.

Saturday, February 13, 2021 9:22:00 AM (GMT Standard Time, UTC+00:00)
# Thursday, February 11, 2021

GCast 103:

Encode a Video with Azure Media Services

Learn how to use Azure Media Services to encode a video into multiple formats, including support for adaptive streaming.

Thursday, February 11, 2021 9:50:00 AM (GMT Standard Time, UTC+00:00)
# Tuesday, February 9, 2021

In previous articles, I showed how to use Azure Media Services (AMS) to work with video that you upload. In this article, I will show how to broadcast a live event using AMS.

Before you get started, you will need some streaming software. For the demo in this article, I used Wirecast from Telestream. Telestream offers a free version, which is good for learning and demos but not for production, as it places a watermark on all streaming videos.

You will need to create an Azure Media Services account, as described in this article.

After the Media Service is created, navigate to the Azure Portal and to your Azure Media Services account, as shown in Fig. 1.

ams01-OverviewBlade
Fig. 1

Then, select "Live streaming" from the left menu to open the "Live streaming" blade, as shown in Fig. 2.

ams02-LiveStreamingBlade
Fig. 2

Click the [Add live event] button (Fig. 3) to open the "Create live event dialog", as shown in Fig. 4.

ams03-AddLiveEventButton
Fig. 3

ams04-CreateLiveEvent
Fig. 4

At the "Live event name" field, enter a name for your event.

You may optionally enter a description and change the Encoding, Input protocol, Input ID, or Static hostname prefix.

Check the "I have all the rights..." checkbox to indicate you are not streaming content owned by anyone other than yourself.

Click the [Review + create] button to display the summary page, as shown in Fig. 5.

ams05-CreateLiveEventConfirmation
Fig. 5

If any validation errors display, return to the "Basics" page, and correct them.

Click the [Create] button to create the live event.

When the event is created, you will return to the "Live streaming" blade with your event listed, as shown in Fig. 6.

ams06-LiveStreamingBlade
Fig. 6

Click the event name link to display the event details, as shown in Fig. 7.

ams07-LiveEvent
Fig. 7

Click the [Start] button (Fig. 8) and click [Start] on the confirmation popup (Fig. 9) to start the event.

ams08-StartButton
Fig. 8

ams09-ConfirmStart
Fig. 9

When the event is started, the event details page will show information about the input, as shown in Fig. 10.

ams10-LiveEvent
Fig. 10

The "Input URL" textbox (Fig 11) displays a URL that you will need in your streaming software. Copy this URL and save it somewhere. You will need it in your streaming software.

ams11-InputUrl
Fig. 11

For the next part, you will need some streaming software. I used Wirecast from Telestream. The user interface of the free demo version is shown in Fig. 12.

ams12-Wirecast
Fig. 12

The following steps are specific to Wirecast, but other streaming software will have similar steps.

Click the [+] button on the first layer (Fig. 13) to open the "Add Shot" dialog, as shown in Fig. 14.

ams13-Layer
Fig. 13

ams14-AddLayer
Fig. 14

I chose to share the image captured by my webcam, but you can share screen captures or videos, if you like. The image you are capturing will be set as a "preview". Make this same layer broadcast live by clicking the "Live" button (Fig. 15).

ams15-GoButton
Fig. 15

Now, configure your streaming software to send its live video to your AMS Live Streaming event. Select Output | Output Settings... from the menu to open the Output dialog, as shown in Fig. 16.

ams16-OutputSettings
Fig. 16

Select "RTMP Server" from the "Destination" dropdown and click the [OK] button to open the "Output settings" dialog, as shown in Fig. 17.

ams17-OutputSettings
Fig. 17

In the "Address" text box, paste the Input URL that you copied from the AMS Live Stream event. Click the [OK] button to close the dialog.

Your UI should look similar to the following.

To begin streaming, select Output | Start / Stop Broadcasting | Start All from the menu, as shown in Fig. 18.

ams18-StartOutput
Fig. 18

Your UI should look similar to Fig. 19.

ams19-Wirecast
Fig. 19

Return to the Azure Media Services live event. You should see a preview of what you are broadcasting from your streaming software, as shown in Fig. 20. Refresh the page if you do not see it. There may be a few seconds delay between what is captured and what is displayed.

ams20-LiveEvent
Fig. 20

Click the [+ Create an output] button (Fig. 21) to open the "Create an output" dialog with the "Create output" tab selected, as shown in Fig. 22.

ams21-CreateAnOutput
Fig. 21

ams22-CreateOutputDialog
Fig. 22

Verify the information on this tab; then, click the [Next: Add streaming locator] button to advance to the "Add streaming locator" tab, as shown in Fig. 23.

ams23-CreateOutput
Fig. 23

Verify the information on this tab; then, click the [Create] button to create a streaming locator and endpoint. You will return to the live event blades, as shown in Fig. 24.

ams24-StreamingEndpoint
Fig. 24

Click the [Start streaming endpoint] button, then click the confirmation [Start] button, as shown in Fig. 25.

ams25-StartStreamingEndpoint
Fig. 25

After the streaming endpoint is started, copy the "Streaming URL" textbox contents (Fig. 26). You will need this to create an output page for viewers to watch your live event.

ams26-StreamingUrl
Fig. 26

Create and launch a web page with the HTML in Listing 1.

Listing 1:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Azure Media Services Demo</title>
    <link href="https://amp.azure.net/libs/amp/2.3.6/skins/amp-default/azuremediaplayer.min.css" rel="stylesheet">
    <script src="https://amp.azure.net/libs/amp/2.3.6/azuremediaplayer.min.js"></script>
</head>
<body>
    <h1>Video</h1>
    <video id="vid1" class="azuremediaplayer amp-default-skin" autoplay controls width="640" height="400" data-setup='{"nativeControlsForTouch": false}'>
        <source src="STREAMING_URL"
                type="application/vnd.ms-sstr+xml" />
    </video>
</body>
</html>
  

where STREAMING_URL is the Streaming URL you copied from the live event textbox above.

Listing 2 shows an example with the URL filled in.

Listing 2:

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Azure Media Services Demo</title>
    <link href="https://amp.azure.net/libs/amp/2.3.6/skins/amp-default/azuremediaplayer.min.css" rel="stylesheet">
    <script src="https://amp.azure.net/libs/amp/2.3.6/azuremediaplayer.min.js"></script>
</head>
<body>
    <h1>Video</h1>
    <video id="vid1" class="azuremediaplayer amp-default-skin" autoplay controls width="640" height="400" data-setup='{"nativeControlsForTouch": false}'>
        <source src="https://dgtestams-usea.streaming.media.azure.net/45fb391c-8e10-4d41-a0ab-a03e50d57afd/cb4a49d9-93ad-4bb1-8894-c3f0a9fb7d43.ism/manifest"
                type="application/vnd.ms-sstr+xml" />
    </video>
</body>
</html>
  

With the live event running, your web page should display something similar to Fig. 27.

ams27-WebPage
Fig. 27

If this is published on the web, viewers will be able to watch your live stream from just about anywhere.

Be sure to stop your live event when you finish broadcasting in order to avoid unnecessary charges.

In this article, I showed you how to create a live streaming event using Azure Media Services.

Tuesday, February 9, 2021 8:03:00 AM (GMT Standard Time, UTC+00:00)
# Monday, February 8, 2021

Episode 647

Kevin Pilch on gRPC

Kevin Pilch describes gRPC - an open source system for making remote calls across processes and/or machines - and the .NET Core implementation of this system.

https://docs.microsoft.com/en-us/aspnet/core/grpc/?view=aspnetcore-5.0
Monday, February 8, 2021 9:30:00 AM (GMT Standard Time, UTC+00:00)