Microsoft Visual Studio makes it very simple to create a new bot with the Microsoft Bot Framework.

Launch Visual Studio 2017 (You can download a free version here)

From the menu, select File | New | Project.

The "New Project" dialog displays, as shown in Fig. 1.

Fig01-NewProjectDialog
Fig. 1

Create a new "Bot Builder Echo Bot" project. From this dialog, you find this template by either expanding Visual C# | Bot Framework in the navigation tree on the left; or by entering "Bot Builder" in the search box at the top right.

Enter a name and location for your project and click the [OK] button.

When the project loads, select Build | Rebuild Solution from the menu to compile the solution and validate all references.

This simple bot receives a message and echoes back the same message, along with the length of that message. The relevant code is in the MessageReceivedAsync method of the RootDialog class, which is shown in Listing 1.

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
{
  var activity = await result as Activity;

  // Calculate something for us to return
  int length = (activity.Text ?? string.Empty).Length;

  // Return our reply to the user
  await context.PostAsync($"You sent {activity.Text} which was {length} characters");

  context.Wait(MessageReceivedAsync);
}
  

Listing 1

After the solution is rebuilt, select Debug | Start Debugging from the menu to launch the bot. This will host a web service and a web page on your local machine. The web page will display in your browser, as shown in Fig. 2.

Fig02-BotRunning
Fig. 2

Note the URL of this page, which will look something like

http://localhost:nnnn/

where nnnn is the port number on which this web application is running.

You can call the bot's web service from many sources; but the easiest way to test it is with the Bot Framework emulator. You can find detailed information on this emulator here. You can download the latest version of the emulator from here, as shown in Fig. 3.

Fig03-DownloadBotFramework
Fig. 3

Download and run the most recent EXE file from this site to install the emulator on your local PC.

Launch the emulator to view the form shown in Fig. 4.

Fig04-BotFrameworkEmulator
Fig. 4

Click the [Open Bot] button on the "Welcome" tab of the emulator. A JSON file containing configuration about your bot was created for you and saved in the Visual Studio project folder. Its root name will be the same as the project, but it will have a ".bot" extension. Select this file and click the [Choose file] button, as shown in Fig. 5.

Fig05-OpenBotConfiguration
Fig. 5

The format of this file looks like the sample in Listing 1.

{
  "name": "MyBot",
  "secretKey": "",
  "services": [
    {
      "appId": "",
      "id": "http://localhost:3978/api/messages",
      "type": "endpoint",
      "appPassword": "",
      "endpoint": "http://localhost:3978/api/messages",
      "name": "MyBot"
    }
  ]
}
  

Listing 2

NOTE: When you return to the emulator, you can click the [Open Bot] button or click a shortcut link below the button to re-load the configuration.

After you save (or open) a configuration file, a "Live Chat" tab displays in the emulator, as shown in Fig. 6

Fig06-BotEmulatorRunning
Fig. 6

To test the bot, type a message into the "Type your message" textbox and press [ENTER]. Your message will display. A short time later, a response will display with your message, followed by the number of characters.

You can find this code in the SimpleBotDemo project of the Bot-Framework-Demos on my GitHub page.

In future articles, I will show you how to enhance your bot, deploy it to a public site, such as Azure, and call it from a variety of clients. But this is the simplest way to create, run, and test a bot.


GCast 12:

Azure Media Services: Live Streaming

Learn how to Upload, Encode, and Share a Video using Azure Media Services.


When and Why Chatbots?

Comments [0]

The Bots are taking over.

A chatbot is an automated process that can respond to questions or commands via voice or text. They are useful for simulating a conversation and handling some of the tasks that would ordinarily require a call center staffed with people. Uses include processing orders, checking status, and answering questions. If you can understand the question and figure out the answer, you can probably write a chatbot to handle it.

Advantages of Chatbots

Chatbots have some advantages over human interactions.

Operating Cost. Labor costs tend to be among the highest cost of any business and operators in a call center can be expensive. Once deployed, a chatbot's cost tends to be a fraction of the cost of paying a person.

Availability. Chatbots can scale up to increase demand, so that users, customers, and potential customers do not need to wait for the next available operator. If activity rises unexpectedly, it is far easier and faster to deploy new resources to support a chatbot than it is to bring in more people to answer calls.

Speed. A computer can often look up information much faster than a human can.

Flexibility. A chatbot can be wired up to a variety of communication channels, allowing you to use the same code base to connect to different clients in different ways. For example, you can write a chatbot and connect to users via Facebook, SMS, a web page, or any number of other platforms.

Disadvantages of Chatbots

Of course, chatbots will not solve all your problems. Here are some disadvantages.

Startup cost. There tends to be a larger startup costs for chatbots. They must be programmed, tested, and deployed. This cost is only justified if they will yield sufficient savings over the lifetime the chatbot is deployed. Tools like the Microsoft Bot Framework can reduce development time; but that early cost still exists.

Impersonal. Chatbots are not people and some customers prefer talking to a human being over talking to a machine. The cost of human interaction is worth it when you wish to cultivate a personal relationship with your customer or partner. 

Too human. With advances in natural language processing, it can be difficult for people to determine whether they are interacting with a person or a computer. Some people are turned off by this ambiguity. They feel cheated when a computer represents itself as a person.

Real-time flexibility. For many interactions, it is impossible to anticipate every potential question or command from your customers. Humans can react to these very well. Generally, you need to program a chatbot to anticipate each question or command.

Finally

There is no question that chatbots are becoming more and more important as companies interact with their customers. But how your company uses them can determine how successful your chatbot strategy is.

Some scenarios call for starting an interaction with a chatbot; then bringing in a person only if the chatbot cannot adequately help the customer.

Understanding the needs of your customer and the problem you are trying to solve is a key to effective use of chatbots.


BraveNewWorldThroughout history, many societies have enforced a caste system, kept in place by either top-down authority or socialization that convinces people it is the proper order.

In Aldous Huxley's dystopian future, the caste system is maintained by defining each individual's level prior to his or her birth and conditioning that person to accept that level. The conditioning begins immediately after birth with repeated messages and chemicals to influence what environmental conditions they will like or detest. Some conditioning even occurs before birth. Embryos destined to perform menial labor are poisoned enough to stunt their mental capacities, so they will not aspire to more.

The casts are labeled with the first 5 letters of the Greek alphabet: Alpha, Beta, Gamma, Delta, and Epsilon. At the top of the system are the Alphas, who enjoy a relatively large amount freedom. At the bottom are the Epsilons, who perform the most menial tasks.

All the people are kept distracted by mindless entertainment; by the encouragement of promiscuity; and by the consumption of euphoria-inducing drugs.

Everyone in this Brave New World accepts their level, because they have been conditioned since birth to do so. Well, almost everyone.

Alpha citizen Bernard Marx recognizes that humans have sacrificed elements of their humanity for a general feeling of contentment. He resents the shallowness of everyone around him. Of course, he is shunned by his peers for this.

When Bernard travels to an Indian reservation (now called a "Savage Reservation"), he finds a society outside the drug-numbed control of the government. He also finds Linda - a former Beta woman trapped in the reservation years ago when she was separated from her Alpha companion. Linda now has a son John, the offspring of her and her Alpha. John who knows he is different from the other reservation children, but he has nothing to which he can compare his life. Linda and John are ostracized by the people of the reservation. Linda's promiscuity is at odds with the beliefs of the locals. The women hate her for sleeping with their husbands and the men ridicule her, but still have sex with her.

Bernard brings Linda and John back to his world, where conflict results almost immediately. Linda retreats into the escapism of the freely-available drugs; John falls in love with a woman but is repulsed by her aggressive sexual advances.

For such a short novel, Huxley packs a great deal.

Religion and God have been abolished; yet, people revere Henry Ford as a god-like figure. He is given credit for the technological advances that brought society to its current state. People have common expressions like "Our Ford" and "His Fordship", and they long ago converted all crosses into T's in honor of Ford's famous Model T car. They have even convinced themselves that Sigmund Freud was a pseudonym for Henry Ford, giving him credit for all of Freud's psychology writings.

Henry Ford's influence is obvious in this world. The ultra-efficient in-vitro birthing center resemble the assembly lines of Ford's automobile factories.

It's not surprising the government has encouraged the worship of science over worship of God. All science is controlled by the government and released or manipulated to maintain contentment among the populace.

And that is what Brave New World is about. The people have chosen contentment and happiness over liberty, freedom, individualism, free will - anything that would make them human and allow them control over their own lives. Those in power support this to maintain their power. Authority is maintained by distraction, rather than by force.

In this world, people and entertainment are mass-produced. People seek contentment, but never challenge themselves and the government likes it that way. Citizens question nothing because they are distracted by sex and drugs and mindless media.

There is no love; No marriage; No families; No commitment. There is only a seeking of pleasure and most have accepted that. Art, literature, and philosophy, and religion are gone. Even science is stunted by the goals of those in power. Labor saving devices are suppressed if they would provide too much leisure to the working class.

We see some of this today. People ignore abuses of the government if the stock market rises.
Mind-numbing reality shows and situation comedies and other recreations fill our free time and distract us from thinking about the real problems of the world.

It is this idea of the struggle between individual liberty and acceptance of society and its rules that form the focus of this book. It is about how the state can influence us without our knowledge.

The characters and the story are simply a mechanism for driving home this concept. The reader expects that Bernard will be the story's hero, because he questions the morality of the order of this world early in the book. But eventually, Bernard embraces society's mores when his fellow Alphas finally praise him for bringing John the savage for them to ogle. In the end, it is John who provides an outside perspective on the dominant society of Brave New World.

Brave New World is often compared with 1984, written by Huxley's contemporary George Orwell, who also predicted a dystopian society controlled by the state. But Orwell's government ruled through fear, while Huxley's overlords ruled by keeping the people happy and distracted.

I found Brave New World a chilling parable of society that could exist - a world that in many ways we are heading toward now.

"And that," put in the Director sententiously, "that is the secret of happiness and virtue–liking what you've got to do. All conditioning aims at that: making people like their unescapable social destiny."



August 2018 Gratitudes

Comments [0]

9/2
Today I am grateful to John for loaning me a necktie when I forgot to bring one.

9/1
Today I am grateful I was able to celebrate Kara and Christian's wedding with them  yesterday.

8/31
Today I am grateful to the bank employee, who unlocked the door when she saw me walking up yesterday, even though it was a minute after closing time.


8/30
Today I am grateful to have Nick visit for a few days.

8/29
Today I am grateful for lunch with Donovan yesterday.

8/28
Today I am grateful to visit the Adler Planetarium for the first time yesterday.

8/27
Today I am grateful my coffee machine is fixed after a weeklong nightmare.

8/26
Today I am grateful for:
-Lunch with Dan and his friends yesterday
-My first visit to the Irish American Heritage Center last night

8/25
Today I am grateful for 24 hours in southwest Michigan.

8/24
Today I am grateful for a walk around North Lake Park in Stevensville yesterday.

8/23
Today I am grateful for a long bike ride yesterday.

8/22
Today I am grateful my son saw me speak at a user group for the first time.

8/21
Today I am grateful for dinner and drinks last night with Suzanna and Paul.

8/20
Today I am grateful for lunch with Tim yesterday.

8/19
Today I am grateful to attend the Evanston Art & Fork Festival last night.

8/18
Today I am grateful for breakfast yesterday with Debbie and Diane.

8/17
Today I am grateful to see Electric Light Orchestra in concert last night and to reconnect with old friends.

8/16
Today I am grateful to present at a user group last night for the first time in 5 months.

8/15
Today I am grateful to see Stacy Keach at the Goodman Theatre last night.

8/14
Today I am grateful that a bunch of people responded yesterday to the emails I sent last week.

8/13
Today I am grateful for a walk along Loyola Beach yesterday.

8/12
Today I am grateful for a visit from Doug and Sherree and Sterling and Dylan this weekend.

8/11
Today I am grateful to attend an exciting Cubs-Nationals game yesterday.

8/10
Today I am grateful for late-night beers with Ondrej

8/9
Today I am grateful to attend Sarah's Going-Away party last night.

8/8
Today I am grateful for an annual physical exam yesterday.

8/7
Today I am grateful to attend a celebration last night for Girl Develop It - Chicago.

8/6
Today I am grateful for my new Echo Dot.


The Galactic Empire has existed for thousands of years and seems to be powerful with a bright future. But not to psychohistorian Hari Seldon.

Using advanced mathematics and his newly-created science of "psychohistory", Seldon predicts that the Empire will soon collapse and be followed by a dark period lasting 30,000 years, until a new Empire will finally rise again to restore technology and culture to the galaxy. The collapse is inevitable, but Seldon has a plan to reduce the dark period to 1,000 years. That plan involves the Foundation - a colony of scientists placed on a remote planet at the edge of the galaxy and a set of crises that must be overcome over the next centuries.

This is the universe of Foundation by Isaac Asimov.

Long after Seldon's death, he continues to influence the society he founded. He periodically appears in a recorded holovision to announce the arrival and resolution of a "crisis" - crises that he predicted would occur and for which he accurately predicted the resolution.

Foundation is told in a collection of short stories, set many thousands of years in the future. Each story takes place a few decades after the one before it, so we have little time to get to know the characters - only how they influence their society. The characters are less interesting than Seldon's master plan and his application of psychohistory to each crisis. The forces that motivate society, such as politics, military force, religion, and commerce take center stage in these stories. Seldon knew he could not predict the behaviors of individuals not yet born, so he combined sociology, mathematics, and statistics to look at the behaviors of populations in aggregate and predict what how entire societies would react to the forces around them. Of course, this idea is applied today - both in the real world and in speculative fiction.

Three quarters of a century after its publication, Foundation remains a strong novel. It was published as part of a trilogy in the early 1950s, and Asimov later released many sequels and prequels. Eventually, he tied together these stories with his popular Robot novels, setting the Foundation, Empire, and Robot series all in the same universe.

Science fiction has been heavily influenced by Asimov and his Foundation series. Other writers have written about mankind's colonization of space and a galactic empire. Certainly, George Lucas was aware of this series when he created the Star Wars universe. And in 1966, the prestigious Hugo Award declared the Foundation trilogy to be the Best All-Time Science Fiction Series.

And it all began in the 1940s, when a 22-year-old Asimov published a short story that would later be compiled into a book that would be volume 1 of a trilogy that would launch a universe that would influence the world.


GCast 11:

Azure Media Services - Uploading, Encoding, and Sharing a Video

Learn how to Upload, Encode, and Share a Video using Azure Media Services.


Azure Storage allows several options for managing replication of your stored data. You can read about these options in this article.

You can set the Replication Type when you create an Azure storage account (Fig. 1)

Fig01-CreateStorageAccount
Fig. 1

But, at first glance, it appears that you cannot change the Replication Type after you create the account. The "Overview" blade (Fig. 2) lists the Replication Type, but you cannot change it here.

Fig02-OverviewBlade
Fig. 2

However, the "Configuration" blade (Fig. 3) also lists the Replication Type.

Fig03-ConfigurationBlade
Fig. 3

On this blade, you can click the "Replication" dropdown (Fig. 4) and change the type.

Fig04-ReplicationDropdown
Fig. 4

Click the [Save] button (Fig. 5) to make these changes permanent.

Fig05-SaveButton
Fig. 5


A caption file can enhance a video file by displaying any dialog as text at the bottom of the video. This is helpful for people who are hard of hearing, for people who do not understand the language spoken in the video and for those who want to play a video at low volume or muted.

Azure Media Services allows you to quickly create a caption file for your saved videos. The steps are:

  1. Create Azure Media Service
  2. Upload File
  3. Encode Asset
  4. Analyze Video
  5. Download VTT file
  6. Upload VTT file
  7. Share video

I described in detail how to perform steps 1-3 in this article.

Analyze Video

After you have encoded your video, you can use the "Analyze" function to generate the following files:

  • A caption file in the TTML format.
  • A caption file in the SAMI format
  • A caption file in the WebVTT format

I have no statistics to back this up, but I see WebVTT used more than the other 2, so I typically stick with this.

To run the "Analyze" function, open your Azure Media Service in the Azure Portal and open the "Assets" tag as shown in Fig. 1.

Fig01-AssetsBlade
Fig. 1

Click the Asset corresponding to the asset corresponding to the encoded video to open its blade, as shown in Fig. 2.

Fig02-EncodedVideoAssetBlade
Fig. 2

Click the [Analyze] button (Fig. 3) to open the "Media Analytics" blade, as shown in Fig. 4.

Fig03-AnalyzeButton
Fig. 3

Fig04-MediaAnalyticsBlade
Fig. 4

Check the checkboxes next to the Closed Caption file formats (and other files) you wish to crate; then click the [Create] button at the bottom to begin creating these files.

This creates and schedules a new job for this Azure Media Service. You can click the "Media Analytics job added" link (Fig. 5) at the top of the blade or you can open the "Jobs" blade for this Media Service and click the most recent job added. Either method will display the blade for this Job, as shown in Fig. 6.

Fig05-JobAdded
Fig. 5

Fig06-JobBlade
Fig. 6

Jobs run asynchronously in Azure Media Service, so you can continue to work or stay on the Job blade to monitor its status. The status changes from "Scheduled" to "Queued" to "Processing" to "Finished". While processing, the blade will display the percent complete.

When the job is finished, you will see a new asset in the "Assets" blade for the indexed video, as shown in Fig. 7.

Fig07-Assets
Fig. 7

Click this asset to open the blade for the Analytics files created by this job, as shown in Fig. 8.

Fig08-IndexedFileAsset
Fig. 8

To make these files available for download, you must publish them. To do so, click the [Publish] button (Fig. 9), which opens the "Publish the asset" blade, as shown in Fig. 10.

Fig09-PublishButton
Fig. 9

Fig10-PublishTheAssetBlade
Fig. 10

After you have published these files, you can download any or all of them. They are listed at the bottom of the Analytics files blade (Fig. 8)

Click the file with the ".vtt" extension to open a blade for this file, as shown in Fig. 11.

Fig11-VTTFileBlade
Fig. 11

The important information is the DOWNLOAD URL field. You can copy this value to your clipboard by clicking the icon to the right of this field.

### Download VTT file

Use CURL to download this file. If CURL is not installed on your computer, you can install it from https://curl.haxx.se/download.html.

Open a command prompt and type

curl -o "fffff.vtt" "http://xxxxxxxxxxxxxxx"

where http://xxxxxxxxxxxxxxx is the DOWNLOAD URL copied from the blade; and fffff.vtt is the name of the local file you want to create when you download this file.

Verify that a new file was created.

Upload VTT file

Now upload this VTT file to the video asset. Open the Azure Media Services "Assets" blade and select the Asset for the originally uploaded video to open the blade for this video asset, as shown in Fig. 12.

Fig12-AssetBlade
Fig. 12

Click the [Upload captions] button (Fig. 13) to open the "Upload caption file" blade, as shown in Fig. 14.

Fig13-UploadCaptionsButton
Fig. 13

Fig14-UploadCaptionFileBlade
Fig. 14

Click the [Select File] icon (Fig. 15) and select the VTT file you downloaded with CURL.

Fig15-SelectFileIcon
Fig. 15

Share video

Now, you can share the video, using a Media Player.

A simple one to use is the Azure Media Player, available at https://ampdemo.azureedge.net/

Information on using this player with Azure Media Services is in this article.  /2018/08/21/UploadingEncodingAndSharingAVideoWithAzureMediaServices.aspx.

You will need the URL of the video to play, which you can by selecting the Encoded Videos asset from the "Assets" blade to open the properties for this asset, as shown in Fig. 16.

Fig16-EncodedVideosAsset
Fig. 16

Copy the Streaming URL at the bottom of this blade under the "Published URLs" section. (NOTE: If nothing is in this section, you need to publish this asset.)

In Azure Media Player, copy this URL into the URL field, omitting the "http:", as shown in Fig. 17.

Fig17-AzureMediaPlayer
Fig. 17

The copied text should look something like this:

//dgtest2-usea.streaming.media.azure.net/d7d7eb93-9ef8-40fd-9c01-8253c9ca2126/Gratitude.ism/manifest

It will end with the name of your video asset, followed by ".ism/manifest".

Click the [Update Player] button and verify that your video plays properly.

If it plays properly, check the "Advanced Options" checkbox to display more options and scroll to the bottom, as shown in Fig. 18.

Fig18-AdvancedOptions
Fig. 18

Click the [Add Track] button to display new track information, as shown in Fig. 19.

Fig19-AddTrack
Fig. 19

At the "Kind" dropdown, select "Captions"

At the "Track Label" field, enter "English" or the name of the language in which the video is recorded. This text will display in the "Closed Captioning" control.

At the "Language" dropdown, select "English" or the language in which the video is recorded.

At the WebVTT URL, enter the URL of the uploaded VTT file. This will be identical to the video URL. The name of the VTT file will replace the name of the video asset, followed by ".ism/manifest".

It should look similar to this:

//dgtest2-usea.streaming.media.azure.net/d7d7eb93-9ef8-40fd-9c01-8253c9ca2126/Gratitude.vtt

Fig. 20 shows these fields completed for my video.

Fig20-VTTTrack
Fig. 20

Click the [Update Player] button.

Now, when you play the video, you should see a "CLOSED CAPTIONING" icon at the bottom right. Click this to reveal the CLOSED CAPTIONING setting and select the caption language you just added (English in the case of the video in Fig. 21)

Fig21-ClosedCaptioning
Fig. 21

With the captions enabled, you should see text below your video whenever anyone is speaking, as shown in Fig. 22.

Fig22-VideoWithCaptions
Fig. 22

In this article, I showed you how to create closed captioning and share a video that includes this captioning.



SIASLI do not hold Stranger in a Strange Land by Robert A. Heinlein as the science fiction classic that some readers rate it. But I give it an extra star for the introduction of the word "grok" - a word meaning many things, but mostly : "to understand something so well as to internalize its meaning". "Grok" has been adopted by geek culture - a culture in which I spend a great deal of time these days - to indicate comprehension of a complex technical topic.

Vernon Michael Smith ("Michael") was stranded on Mars as an infant when his spaceship crashed, killing all other crew and passengers. He was raised by Martians until he returned to Earth decades letter on the next manned ship to and from Mars.

The governments of Earth view Michael as an oddity -  a noble savage with an intelligent mind, who lacks the advantages of civilization. But Michael is civilized according to Martian culture. And he possesses great powers taught him by the Martians, including the ability to direct his consciousness to leave his body and the ability to make objects and people move or disappear with just a thought.

The government tries to keep Michael a prisoner; but he escapes with the aid of Jill - a nurse in the hospital where he is confined - and Jubal - a retired author living in seclusion. While on the run from the government, Michael joins a circus and then a church, where he rises to a position of leadership. The church preaches the pursuit of joy and free love, which pisses off many other Americans.

As time passes, Michael becomes more like his fellow Earthmen. But he also influences them to adopt many of his Martian ways.

Michael's parallel to the life of Jesus is unmistakable. He is first exposed to the public in his adulthood and he quickly enters the public consciousness, impressing people with his powers, before taking over and influencing a small religion - an action for which he is hunted down and persecuted.

There are some troubling bits of sexism in this book: "Nine times out of ten, if a girl gets raped, it’s at least partly her own fault", according to Jill, the main female character of the novel. One can chalk this up to the book's 1961 publication date or condemn the author as a misogynist. To its credit, Jill and other characters are stronger and more assertive than most characters appearing in novels of this era.

And there are long passages of preaching by Jubal, Michael, and others that sometimes grow tiresome. I would prefer the philosophy is told through the narration, rather than the characters making speeches.

But Stranger in a Strange Land is an enjoyable story, if you take the time to grok it.


In an earlier article, I showed how to create an Azure Media Service; then, upload, encode, and share a video with that service.

In this article, I will show how to live-stream video content using Azure Media Services.

You will need to install some streaming software on your computer to do this. I chose Wirecast by Telestream. You can download a free trial at https://www.telestream.net/wirecast/overview.htm. You may use any software you like.

The 3 steps to live streaming with Azure Media Services are:

  1. Configure an Azure Media Service
  2. Stream your content with streaming software
  3. Share the stream

STEP 1: CONFIGURE AZURE MEDIA SERVICE

First, create an Azure Media Service, as described in Step 1 of this article.

Open your Azure Media Service and select "Live Streaming" from the menu to open the "Live Streaming" blade, as shown in Fig. 1.

Fig01-LiveStreamingBlade
Fig. 1

In the "Live Streaming" blade, click the [Quick create] button (Fig. 2) to open the "Quick Create Channel" blade, as shown in Fig. 3.

Fig02-QuickCreateButton
Fig. 2

Fig03-QuickCreateBlade
Fig. 3

At the "Name" field, enter a name for this channel.

Verify that the "Automatically start the channel after creation" checkbox is checked.

Click the [Create] button to create the channel.

After a few minutes, the channel will display with a status of "Running" in the list on the "Live Streaming" blade, as shown in Fig. 4.

Fig04-LiveStreamingChannelList
Fig. 4

NOTE: The Quick Create option creates a channel with RTMP protocol, Pass Through encoding, and no IP restrictions on viewing the stream. This works fine in many cases; but, if you would like different settings, you can click the [Custom create] button instead.

Click the channel in the list to open a blade for that channel's details, as shown in Fig. 5.

Fig05-ChannelDetails
Fig. 5

Note the INGEST URL (Primary) field. You will need this in your streaming software. The icon to the right allows you to copy this value to your clipboard.

Click the [Live event] button (Fig. 6) at the top of the Channel blade to open the "Live Event" blade, as shown in Fig. 7

Fig06-LiveEventButton
Fig. 6

Fig07-LiveEventBlade
Fig. 7

At the "Name" field, enter a name for your Live Event. It must be unique for this channel.

Click the [OK] button to create and start the live event.

PART 2: STREAMING SOFTWARE

You will need to configure your streaming software to stream to Azure Media Service. The instructions below are for Wirecast, but you may use any streaming software you like.

Launch Wirecast.

From the menu, select Output | Output Settings.

If prompted, set the Destination to "RTMP Server" and click [OK], as shown in Fig. 6

Fig08-Destination
Fig. 8

The "Output Settings" window displays, as shown in Fig. 7.

Fig09-OutputSettings
Fig. 9

In the "Address" field, paste the INGEST URL (Primary) value from the Azure Media Service channel blade from Step 1.

The Layers are at the bottom of the Wirecast UI. Select the [+] icon to the left of the first layer, as shown inf Fig. 8.

Fig10-LayerIcon
Fig. 10

In the "Add Shot" dialog, expand video capture and select your front facing camera and click the [Add] button, as shown in Fig. 9.

Fig11-AddShot
Fig. 11

You will see the image from the camera in the Preview window, as shown in Fig. 10

Fig12-PreviewWindow
Fig. 12

NOTE: Alternatively, you may wish to share a screen capture or a different camera or one of the other options.

The image captured from your camera will display in the "Preview" window. Make this the live image by clicking the "Go" button (Fig. 11) below the Preview window.

Fig13-GoButton
Fig. 13

The image will now also appear in the Live window to the right of the Preview window, as shown in Fig. 14

Fig14-PreviewAndLive
Fig. 14

From the menu, select Output | Start/Stop Broadcasting | Start RTMP Server, as shown in Fig. 15.

Fig15-Start Broadcasting
Fig. 15

An error displays if the channel is not running or if you improperly copied the Ingest URL.

PART 3: SHARE YOUR LIVE STREAM

Return to the Azure portal and open the "Live Event" blade, as described above.

Click the [Watch] button (Fig. 16)

Fig16-WatchButton
Fig. 16

If successful, you should see your live stream in a preview window, as shown in Fig. 17.

Fig17-ChannelPreview
Fig. 17

You can share the video by copying the "PLAYBACK URL" into any player. I did so using the Azure Media Player The results are shown in Fig. 18.

Fig18-AzureMediaPlayer
Fig. 18

In this article, I showed you how to use Azure Media Services to live stream a video.


GCast 10:

Azure Linux Virtual Machines

Learn how to use the Chocolatey package manager to quickly install Windows applications and their dependencies.


"1984" by George Orwell

Comments [0]

19841984 by George Orwell describes a society in which everything is completely controlled by the government, which is controlled by "The Party". Not only are specific actions illegal, but so are many thoughts. Independent thinking, love, and questioning or even doubting the word of The Party are crimes dealt with in the harshest way. The Party has perfected ways of maintaining its authority.

In the giant country of Oceania, it is illegal to question anything the government says. If they tell you that 2+2=5, you must accept this without question.

Citizens routinely disappear, and all traces of their existence are wiped from the public record. Torture is a  common punishment for transgressions.

The country of Oceania is constantly at war with one of the other two countries in the world. No one has seen the war, but the threat of these enemies justifies oppressive measures against the citizens of Oceania.

Citizens are under constant surveillance - from pervasive electronic devices and from other citizens. Every home contains a Telescreen, that broadcasts party programs and watches and hears everything in the room 24 hours a day; Children are encouraged to inform on their parents and workers to turn in their colleagues.

The Party is developing a new language - "Newspeak", which eliminates dissident ideas by removing words that describe free thought as a way of eliminating the very concepts from the minds of the people.

The Party controls all communications, including newspapers, TV, and books. Books that do not glorify The Party are either destroyed or  rewritten.

When The Party changes its name or breaks a promise, or a prediction proves false, all previous news sources are modified to match the current dogma.

The mission of The Ministry of Truth is to rewrite newspapers and other historical records to match the current position of The Party.

Winston Smith is a low-level bureaucrat working in The Ministry of Truth. He has lost faith in the government, but his fear keeps him playing by its rules. Then, he meets and falls in love with Julia. Together they defy The Party by have a secret affair and, eventually, by plotting to actively work against The Party. Smith even keeps a secret diary of his thoughts and doubts - a serious offense.

Their affair gives them brief hope, but The Party is powerful, and its agents are far-reaching. And they know how to manipulate both actions and thoughts. Winston and Julia try desperately to maintain thier humanity, but The Party is desperate to maintain its power. Suffice it to say this is not a happy love story.

This book has maintained its importance in part because it is believable, despite the extremes of the society. It describes how those in power will do almost anything to maintain that power. Orwell's details are extraordinary. He builds a society with controls in place to suppress the populace completely.

If the book has any weakness, it is when it switches to explicit explanations of how the government is conspiring against its own people. For me, it was sufficient to watch Winston and Julia and the rest of the citizenry experience and suffer from these manipulations. But Orwell felt the need to spend pages detailing his warnings, which seems heavy-handed.

Orwell was a disillusioned ex-socialist and some of the novel touches on the failures encountered in socialist countries, such as shortages of essential goods. But 1984 is less about socialism than it is about the absolute corruption of absolute power.

The year 1984 has come and gone without the global dictatorship predicted by Orwell; but the warning signs listed in the book 1984 continue to haunt us today.

Orwell said, "The Party told you to reject the evidence of your eyes and ears" and we see politicians practicing this now. When people in power argue that "Truth is not truth" or "Alternative facts" are as valid as actual facts or that any news critical of themselves is "Fake news", they are exercising the same techniques about which Orwell warned us.  The concept of Thought Crime is still alive, if punishments are not as harsh as in Oceania. The far-right labels "unpatriotic" black men who peacefully protest; while the far left has successfully ruined the lives of people they deemed politically incorrect.

The bleak, dystopian future that Orwell describes has not come to pass. But its warning signs still exist. And 1984 reminds us that we must remain vigilant to avoid this future.


Azure Media Services allows you to manage video content in a highly-scalable, highly secure way.

Videos and associated files are saved as "Assets" and stored in Azure Blob Storage. You can live stream videos or upload video files from your local system.

In this article, I will walk through the steps to upload, encode, and share a video.

The steps are:

  1. Create a new Azure Media Service
  2. Upload a video
  3. Encode the video
  4. Play the encoded video in the Azure portal
  5. Share the video in another player

Create a new Azure Media Service

The first step is to create a new Azure Media Service. You will need an Azure account to do this.

Navigate to the Azure portal and log in.

Click the [Create a Resource] button (Fig. 1) at the top left of the portal.

Fig01-CreateNewResource
Fig. 1

From the menu, select Mobile | Media Services, as shown in Fig. 2.

Fig02-MobileMediaServices
Fig. 2

The "Create Media Service" blade displays, as shown in Fig. 3.

Fig03-CreateMediaServiceBlade
Fig. 3

At the "Account Name" field, enter a unique name for your Azure Media Service Account.

At the "Resource Group" field, select the "Create new" radio button and enter a unique name for the resource group in which to store this Media Service.

At the "Location" dropdown, select an Azure region that is close to you.

Click the arrow next to the "Storage Account" prompt to expand the "Choose storage account" blade; then, click "Create new" in this blade to display the "Create storage account" blade, as shown in Fig. 4.

Fig04-NewStorageAccount
Fig. 4

Enter a unique name for the storage account in which to store your media assets and click the [OK] button.

Click the [Create] button in the "Create Media Service" blade to begin creating the service. This may take a a minute or so.

Upload a video

After the Media Service is created, open the service and select "Assets" to open the "Assets" blade, as shown in Fig. 5.

Fig05-AssetsBlade
Fig. 5

Click the [Upload] button (Fig. 6) to display the "Upload a video asset" blade, as shown in Fig. 7.

Fig06-UploadButton
Fig. 6

Fig07-UploadAVideoAssetBlade
Fig. 7

Click the Folder icon (Fig. 8) and select a video from your local computer.

Fig08-FolderIcon
Fig. 8

A progress bar indicates when the video has been uploaded. After your video is uploaded, close the "Upload a video asset" blade and  return to the "Assets" blade. The video should now appear in the Asset list, as shown in Fig. 9.

Fig09-AssetList
Fig. 9

Encode the video

In the "Assets" blade list, click on the uploaded video asset to display a property blade for the video asset, as shown in Fig. 10.

Fig10-VideoAssetProperties
Fig. 10

Click the [Encode] button (Fig. 11) to open the "Encode an asset" blade, as shown in Fig. 12.

Fig11-EncodeButton
Fig. 11

Fig12-EncodeAnAssetBlade
Fig. 12

In the "Encoding preset" dropdown, you may select the desired output format, but the default ("Content Adaptive Multiple Bitrate MP4") works well for this demo.

Click the [Create] button to begin encoding.

You can close the property asset blade now.

By staring encoding, you created a new Job for this media service. View this job by selecting "Jobs" in the Media Service blade, which displays the "Jobs" blade, as shown in Fig. 13.

Fig13-JobsBlade
Fig. 13

Note the status of the job you created, which will first be "Queued"; then "Processing"; then "Finished".

When the job is Finished (Fig. 14), close the "Jobs" blade and return to the "Assets" blade, where you should see a new Asset, representing the encoded video.

Fig14-FinishedJob
Fig. 14

Click the encoded asset to open its property page, as shown in Fig. 15.

Fig15-EncodeAssetPropertyPage
Fig. 15

Click the [Publish] button to display the corresponding "Publish the asset" blade, as shown in Fig. 16.

Fig16-PublishTheAsset
Fig. 16

Check the checkbox next to "To begin streaming, start running 'default' streaming endpoint".

Click the [Add] button to publish the encoded video asset.

Play the encoded video in the Azure portal

When the endpoint has started, the [Play] button in the encoded Asset property page is enabled (Fig. 17). Click the [Play] button to open the Media Player blade within the portal, as shown in Fig. 18.

Fig17-PlayButton
Fig. 17

Fig18-MediaPlayer
Fig. 18

Copy the PLAYBACK URL to use in the next step. It will look something like this:

http://dgtestms-usea.streaming.media.azure.net/1acb35e1-373c-481a-b37d-3e0e10394b0a/TelephoneLine.ism/manifest

Share the video in another player

It is unlikely your users will have access to your Azure Portal, so you should send them a link with a player they can use. You can use the free Azure Media Player to share your video.

Navigate to https://ampdemo.azureedge.net/azuremediaplayer.html

The page in Fig. 19 displays.

Fig19-AzureMediaPlayer
Fig. 19

In the URL field, paste your PLAYBACK URL (without the "http://") that you copied from the Azure Portal. It should look something like this:

dgtestms-usea.streaming.media.azure.net/1acb35e1-373c-481a-b37d-3e0e10394b0a/TelephoneLine.ism/manifest

Click the [Update Player] button. Your video should start playing.

To share this video and its players with others, click the [get share url] button and the displayed code. It should look something like this:

https://aka.ms/azuremediaplayer?url=%2F%2Fdgtestms-usea.streaming.media.azure.net%2F1acb35e1-373c-481a-b37d-3e0e10394b0a%2FTelephoneLine.ism%2Fmanifest

You can email this link to others or create a link on your web page.

Click on the dropdown next to the "Code" tab to see other ways to share this video and player.

In this article, I showed you how to upload, encode, and share a video using Azure Media Services.



ELOticketIt has been a long time.

Electric Light Orchestra had not played a concert in Detroit in 37 years. And it has been about the same amount of time since an ELO single cracked the US top 40. 

But despite peaking in the studio in the 1970s, enough 50-something rock fans remembered them with enough fondness to pack Little Caesars Arena Thursday night in Detroit.

Only Jeff Lynne remains from the ELO of their heyday; but Lynne was always the face of the band, as the lead singer, songwriter, and producer of most of their songs and albums. At age 70, Lynne looks the same as he did decades ago, his aging face hiding behind long brown curls, a beard, and dark glasses, just as it did during the band's heyday. His voice is still strong, although he delegated some of the lead vocals to another singer.

I made the trek to Detroit from Chicago in large part to reunite with some old high school friends and enjoy a night of memories.

Mr. Lynne did not disappoint. Known for pop melodies over complex arrangements, he brought with him a string section and 4 keyboardists to accompany his rock band and backing vocalists.

ELOinconcertThe set list was strong on the hits of the late 70s. For about 90 minutes, he played songs like "Evil Woman", "Do Ya", "Rockaria", and "Sweet Talkin' Woman" took me back to my high school and junior high school days. The acoustics were surprisingly good for a hockey arena and the sellout crowd responded to each memory the band played. He even played "Handle With Care" from his days with the Traveling Wilburys supergroup, delighting the audience with videos of him recording with Tom Petty, Roy Orbison, George Harrison, and Bob Dylan. ELO closed the set with some of their biggest hits: "Don't Bring Me Down", "Turn to Stone", and "Mr. Blue Sky". They were gone from the stage for barely a minute before returning to play an extended version of Chuck Berry's "Roll Over Beethoven".

For me, it was a chance to reconnect with my past. Old memories, old friends, old songs, and my old home town made Thursday night a special memory.


By default, when I create and launch a UWP app in Visual Studio, a debugging toolbar displays, as shown in Fig. 1.

Fig 1-DebuggingToolbar
Fig. 1

This can be useful during development, but it also can get in the way. It hides elements on my form and it does not look good during a demo.

Suppressing this toolbar is simple, but it took me some time to find it.

From the Visual Studio menu, select Tools | Options, as shown in Fig. 2.

Fig 2-ToolsOptions
Fig. 2

The Options dialog displays. Expand the "Debugging" section on the left and select "General", as shown in Fig. 3

Fig 3-DebugGeneralOptions
Fig. 3

Within the Debugging / General section, clear the checkbox next to "Show runtime tools in application"

Click the [OK] button to apply these changes. The toolbar will not display when you run your project from Visual Studio.

To re-enable this toolbar, open the Options dialog and check the checkbox and click [OK].


GCast 9:

Azure Linux Virtual Machines

Microsoft Azure supports many open source and non-Microsoft technologies, including Linux VMs. Learn how to create and connect to a Linux VM hosted in Azure.


Here is my presentation "Building and Training your own Custom Image Recognition AI" that I delivered in June at NDC-Oslo in Norway.

Building and Training your own Custom Image Recognition AI

ClockworkOrangeA Clockwork Orange by Anthony Burgess is the story of Alex - a juvenile delinquent sociopath living in a dystopian society of the near future. Alex and his friends spend their days and nights  terrorizing anyone they can. Alex fills his life with rape, battery, robbery, and (eventually) murder. In prison, Alex becomes the subject of an experimental treatment that forces him to become violently ill at even the thought of violence or sex. He is released back into the violent society, where he is harmless, but has no way to defend himself.

This book is a morality play - primarily about whether removal of free will is justified if it results in greater lawfulness and whether the needs of society take precedence over the rights of individuals. The message is not subtle. Burgess fills the first third of the book with acts of extreme violence in order to emphasize Alex's corruption. When he is treated and released, his punishment comes quickly, harshly, and very violently.

One of the reasons I love this book is Burgess's creative use of language. It is told in the first person by Alex, who speaks in Nasdat, the slang of  his day. Burgess invented Nadsat by combining English and Russian words ("droog" for "friend"; "golova" for "head") with a bit of cockney rhyming ("pretty polly" for "money") and some childlike phrases ("appy polly loggy" for "apology"). This may slow down the reading as we must infer meaning of words from their context; but it adds a timeless quality to the book that it would not have had the author chosen an existing slang from a specific period. 

This book is not for everyone. The use of Nadsat makes it more difficult than most books of this length. Some readers will not be able to get past the violence. Some may think that, because of Alex's intelligence and charm, Burgess is glorifying him and his violence. But the author uses this violence as a setup for Alex's fall. Alex justifies his ultraviolent lifestyle because he lives in an ultraviolent society. But he takes this logic way too far, contributing mightily to the violence and blaming all his misfortunes on others. Still, he is proved right in a way, as he is completely unable to cope in a world when he becomes incapable of responding with any violence. Alex is a somewhat sympathetic anti-hero, but his soul is clearly corrupted - perhaps beyond redemption.

The book does not take a position on the moral questions it raises - particularly around the rights of individuals versus the safety of society. Clearly, Alex and his droogs were a great threat to their world and citizens feared even to go outside at night. But the government's solution was also a failure, causing them to re-think how they addressed crime.

Burgess himself did not count A Clockwork Orange among his best novels. He claimed he wrote it in just three weeks and he preferred stories with a subtler message.

But I loved it. I loved the language and the style. I loved the scenes that would mirror themselves in the beginning and end of the book. I loved the twisted sense of justice displayed in the story. And I loved how the beauty of the language contrasted so sharply with the ugliness of the actions it was describing. This tension kept me focused throughout the book.

It is a real horrorshow story that remains in the golova of me and my droogs.



Here is my presentation "How Cloud Computing Empowers a Data Scientist" that I delivered in June at IT Camp in Cluj-Napoca, Romania.

ITCamp 2018 - David Giard - How Cloud Computing Empowers a Data Scientist from ITCamp on Vimeo.


Here is my presentation “Own Your Own Career – Advice from a Veteran Consultant” that I delivered in June at IT Camp in Cluj-Napoca, Romania.

ITCamp 2018 - David Giard - Own Your Own Career – Advice from a Veteran Consultant from ITCamp on Vimeo.


I have a number of JavaScript projects that require an API key or other secret information that I don't wish to share with the outside world. This is a problem if I share the rest of the source code in a public GitHub repository.

Here is how I handle it.

  1. Create a getkey.js file with a single getKey function.
  2. Include getkey.js in my HTML document(s).
  3. Call getKey() from another JavaScript file, but wrap the call in a try/catch block. If an error occurs, warn the user that they must add this file / function.
  4. Add a .gitignore file to my project to exclude getkey.js
  5. Check the rest of the project into GitHub.

Create a getkey.js file

Here are the contents of my getkey.js file:

var getKey = function(){
    return "3899084ab2353243735944a95b0eba51";
}

Of course, the return value will be your appropriate key.

Include getkey.js in my HTML document(s)

JavaScript is called from script files referenced in my HTML documents. I typically have a file named "script.js", which contains the main functions for my page. So I include both that file and getkey.js within the tag as shown below.

<script src="scripts/script.js"></script>
<script src="scripts/getkey.js"></script>

Call getKey() from another JavaScript file

From script.js, I add code to call the getKey() function within a try/catch block. This will throw an exception if the script cannot find the getKey function (usually because it cannot find the getkey.js file). In this example, I output a useful error message in a DIV with an ID of "OutputDiv".

Here is the relevant code.

const missingKeyErrorMsg = `<div>No key found.<br>
	This demo will not work without a key.<br>
	Create a script.js file with the following code:.</div>
	<div style="color:red; padding-left: 20px;">
	var getKey = function(){<br>
		&nbsp; &nbsp; return "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";<br>
	}
	</div>
	<div>where xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx is your Azure Face API key</div>`

try {
	var subscriptionKey = getKey();
}
catch(err) {
	$("#OutputDiv).html(missingKeyErrorMsg);
	return;
}

Add a .gitignore file to my project to exclude getkey.js

I want to keep the getkey.js file locally, but I don't want to check it into GitHub. Adding a file named ".gitignore" in the root of my project allows me to list any files or folders that I don't want to include in my GitHub repository.

Add the following line to the .gitignore file

getkey.js

Check the rest of the project into GitHub.

Once the above steps are completed, it is safe to check it into GitHub. The getkey.js file will not be checked in. When another user checks it out, they will need to create this file. I recommend creating a read.me file and pointing this out.

Even if they forget, the error message should give them an idea why their code is not working.

There are other ways to address this issue, but this way works for me.


WatchmenWho watches the Watchmen?

I remember reading Watchmen by Alan Moore and Dave Gibbons 30 years ago, when it was originally released as a 12-issue series. I waited for each issue and it took me a year to get through the entire story. But this week, I read the complete saga as a single volume and I think this is how Moore and Gibbons intended it. The story is complex enough that mysteries are introduced in one chapter and resolved several chapters later.

Although published by DC Comics, the story takes place outside the DC superhero continuity.

The main difference from the DC universe is the impact that superheroes had on their world, since first appearing on the scene in the 1930s. Originally, they were a group of costumed people with excellent athletic abilities and desire to fight crime. But things changed when Dr. Manhattan appeared on the scene. Dr. Manhattan was a physicist caught in an atomic experiment that gave him nearly godlike powers of strength, invulnerability, the ability to transport himself and other people and objects; and the ability to see forward and backward in time.

Dr. Manhattan working for the U.S. government greatly shifted the balance of power during the Cold War. In this world, the U.S. won the Vietnam War and Richard Nixon remained president for decades (Woodward and Bernstein's bodies were found in a parking garage and the Watergate scandal never came to light).

Costumed heroes eventually lose favor among the general public, which distrusts their great power; and by the police, who are frustrated by them operating outside the law as vigilantes.

The story follows a number of costumed heroes and former heroes:

  • The aforementioned Dr. Manhattan
  • The cynical and amoral Comedian, who works for the government or whoever will pay him the most
  • Retired hero Nite Owl - the second of that name
  • Ozymandias, who hung up his costume to start a business and become a billionaire
  • Rorschach, a psychopath with a strong moral compass that justifies him murdering criminals.
  • The Silk Spectre, who inherited that name from her mother, who pressured her into the superhero business.

It's a fascinating story, made better by all the little details - the graffiti on the wall in the background; the minor subplots (Rorschach’s psychiatrist is so troubled by his interactions with the hero that his marriage begins to crumble); the easter eggs (The pages of Chapter 5 are symmetrical, such that the last page mirrors the first, page 2 mirrors the second last, and so on); and stories within stories (a minor character reads a pirate comic throughout the series, which tells a morality play, not dissimilar to the one acted out by the major characters). One gets the feeling that multiple readings would reveal even more layers to the story.

But the strength of Watchmen is in the conflicting morals of each of the characters and the conflict this causes among the group. Some, like Ozymandias and Rorschach are absolutely convinced of their moral high ground; Dr. Manhattan loses his connection with the human race as he loses his humanity, and this affects his morality; The Comedian and the first Silk Spectre are in the superhero business for the fun of it; while others, such as Nite Owl and the second Silk Spectre, wrestle with questions of right and wrong and how to respond to evil.

The reader is confronted with moral questions, most of which go unanswered:

  • Do the ends justify the means?
  • Is nuclear deterrent (or superhuman deterrent) enough to preserve peace?
  • Does the universe need humans? Is it better with or without them?
  • What obligations do the powerful have to protect the powerless?

It is the last question that drives this story forward.

Watchmen changed the perceptions many had about comic books and graphic novels in the 1980s. Its dark themes and complex plots and characters were more than other titles at the time. As a result, the entire industry was challenged to produce at least some more titles that were heavier and higher quality than their normal super hero fare.

3 decades later Watchmen still stands up - not just as a graphic novel, but as a novel.



July 2018 Gratitudes

Comments [0]

8/5
Today I am grateful to visit the American Writers Museum for the first time.

8/4
Today I am grateful to tour the Clarke House Museum yesterday.

8/3
Today I am grateful for my first visit to Rosa's Lounge for the Thursday night blues jam.

8/2
Today I am grateful for my first visit to Door County, WI.

8/1
Today I am grateful for a bike ride around Sturgeon Bay, WI yesterday.

7/31
Today I am grateful for my first visit to a Wisconsin Supper Club.

7/30
Today I am grateful for lunch yesterday with Tim, Natale, and Emilija.

7/29
Today I am grateful for the summer party at my condo building yesterday.

7/28
Today I am grateful for breakfast yesterday with Kevin and Dustin.

7/27
Today I am grateful for dinner last night with Brent, Carl, and Michael.

7/26
Today I am grateful for:
-an amazing week at the Imagine Cup World Finals
-Lunch with Becky at the Microsoft expo
-Coffee with Steve

7/25
Today I am grateful for dinner with Nino last night in Seattle.

7/24
Today I am grateful to chat with a couple members of my new team.

7/23
Today I am grateful for a party last night at the University of Washington.

7/22
Today I am grateful for my first Kindle.

7/21
Today I am grateful for a walk through the natural area of Winnemac Park last night.

7/20
Today I am grateful to have had Dan and Rowena and their family visit this week.

7/19
Today I am grateful to successfully rebuild my 2 laptops yesterday and for Sergiy's help with this.

7/18
Today I am grateful for a walk around Chinatown last night with Rowena.

7/17
Today I am grateful to Dan for cooking me a steak dinner last night.

7/16
Today I am grateful to go to B.L.U.E.S. Chicago last night with Nick, Tim, and Natale.

7/15
Today I am grateful for my first visit to the Upper Peninsula of Michigan.

7/14
‪Today I am grateful to spend the past 2 days with Dan and Rowena and their family. ‬

7/13
Today I am grateful for my first visit to Mackinac Island. .

7/12
Today I am grateful for dinner last night in Pellston, MI at the home of Patrick and Susan.

7/11
Today I am grateful to have Nick at my place last night and to Tim for picking us up and taking us to dinner last night.

7/10
Today I am grateful to work with some top Chicago high schools students yesterday through Northwestern Academy.

7/9
Today I am grateful for
-a visit to the National Museum of American History yesterday
-a weekend in Maryland and Washington, DC

7/8
Today I am grateful to attend a family reunion this weekend and re-connect with so many of my extended family.

7/7
Today I am grateful for a visit to the National Aquarium in Baltimore yesterday.

7/6
Today I am grateful for:
-a visit to the Smithsonian National Museum of Natural History
-my first visit to Nationals Park, where I saw the larges comeback in franchise history yesterday

7/5
Today I am grateful I managed to get these family photos organized before the reunion.

7/4
Today I am grateful to live in the United States of America.

7/3
Today I am grateful for:
-a tour of Southern Illinois University
-a drive through Crab Orchard National Wildlife Refuge

7/2
Today I am grateful for my first visit to Carbondale, IL.


TimeTravelersWifeHenry DeTamble has a genetic disorder that causes him to spontaneously be thrust backwards or forwards in time. This causes many problems. Henry often finds himself naked in unfamiliar surroundings where he must steal clothes, money and food to survive. He often returns to the same places - sometimes at a particular date and time; sometimes at varying points in time. For example, he has witnessed the death of his mother in a car crash dozens of times.

Henry is drawn repeatedly to a home near Grand Haven, MI, where he meets a little girl named Clare. Henry and Clare develop a friendship over the years as Henry appears in her life at random times and at random ages of Clare's childhood. Eventually, the two meet in real time, where they fall in love and marry.

When Henry and Clare meet in real time, it is Henry's first encounter with her; yet Clare has memories of a relationship with an older Henry that spans to her early childhood. 

The novel is written entirely in the first person, alternating between Henry and Clare's perspective - sometimes describing the same scene from each point of view. This gives us a good look at how Henry's disorder affects each of them differently and how they choose to deal with it.

The book is also written entirely in the present tense, as if they are narrating the events that are happening in their own timeline - wherever that happens to take them. This gives the story an immediacy and removes the certainty that either character will survive into old age.

Each chapter begins with the age of the characters who appear. Although Henry is 8 years older than Clare in real time, he is decades older in many of their encounters. Sometimes, Henry encounters a version of himself at different ages. The storytelling is necessarily far from linear. Often one character has memories of prior encounters that the other does not possess, which makes for an interesting dynamic.

The Time Traveler's Wife is one of the most imaginative novels I've read. In her first novel, Audrey Niffenegger has created both a science fiction story and a love story. As a time travel story, it covers the obligatory questions of free will, predestination, cause and effect, and the consequences of interacting with your own past. But those are secondary themes to the relationships of the people affected by Henry's sudden disappearances and appearances and the disruptions in their lives.

Much of the story covers how people deal with loss. Henry's father never recovers from the death of his wife; Henry deals with his disability by drowning in drugs, alcohol, and wanton sex - until he meets Clare, who inspires him to straighten himself out and live as normal a life as possible. Clare spends her life dedicated to and supporting Henry, even though he repeatedly disappears and she never knows if and when he will return.

I grew to care about this couple, who were blessed to be thrust together by destiny, but cursed by a unique affliction. Henry and Clare suffer through a relationship hampered by Henry's affliction and Clare's uncertainty; but they are held together by an honesty I found refreshing.

This was my second reading of The Time Traveler's Wife and it may not be my last.


OceanAtTheEndOfTheLaneThe narrator of The Ocean at the End of the Lane returns to his childhood home and is surprised by the return of repressed memories. He was a sad and lonely child; He preferred books over sports and no one came to his seventh birthday party and his parents mostly ignored him; He did manage to befriend his neighbor Lettie Hempstock and her mysterious family.

The story quickly turns much darker.

A family boarder steals the family car and commits suicide in it; then a monster uses the boy's body as a means to enter this universe and terrorize the local people. The monster takes on a human form, calling herself Ursula Monkton and injects herself into the boy's family, moving into the home and seducing the father.

Lettie's family proves to be more than they seem as they battle Ursula and protect the boy from her/its threats.

I really enjoyed this novella, which began as a childhood memory and turned into a horror / monster story. The characters could have come from the dark fairy tales of Roald Dahl and the creatures and magic could have been found in the fantasy animated films of Hayao Miyazaki

I liked the moral ambiguity Gaiman presented. Ursula arrives with good intentions. She wants to give people what they want; but when she discovers that people want money, she hurls coins at them and makes money appear in their throat. Lettie summons creatures to defeat Ursula, but they are all then threatened by these powerful creatures.

The Ocean at the End of the Lane is one of NeillGaiman's shortest novels, but he packs a lot into the story.


GCast 8:

Azure Virtual Machines

What is an Azure Virtual Machine? How do I create one?



IMG_1666Hundreds of people packed the ballroom at the Four Seasons ballroom in downtown Seattle for the World Finals of the 2018 Imagine Cup competition.

Hosts Kate Yeager and Corey Sanders paused.

"And the winner is…"

The crowd leaned forward in anticipation.

They stomped their feet in a simulated drumroll.

They had met the judges; they had heard from Microsoft CEO Satya Nadella and Olympic Gold Medalist Chloe Kim; and they had seen presentations from the three finalists.

IMG_1678Over 40,000 students from almost 200 countries around the world had signed up for this competition, but only the top 40 teams were invited to the Seattle area for the finals. These teams represented 33 different countries, and each pitched their projects - a combination of hardware, software, and business ideas - to a panel of judges. The judges culled the field to 18 semi-finalists; then to 3 finalists and these 3 delivered their final pitches on Day 3.

The 3 finalists were

  • iCry2Talk, a team from Greece that developed a system to analyze the crying of babies,  determine what triggered the crying, and communicate that to parents via text, image, and voice messages.
  • Mediated Ear, a team from Japan that developed software to help hearing-impaired people listen to a single voice in a room full of other voices and noises.
  • SmartARM, a team from Canada that built a prosthetic arm with a camera in the palm, capable of recognizing images and positioning the fingers to pick up the item correctly on a muscle flex.

And now it was time to learn the winner.

And the winner was…

"SmartArm!"

IMG_0659A cheer erupted. Confetti flew from the ceiling. Music played.

SmartArm consisted of Hamayal Choudhry and Samin Khan, students at the University of Ontario Institute of Technology and the University of Toronto respectively.

I was especially pleased to see them take home the world championship. Months ago, I helped mentor them at a hackathon at the University of Toronto, where they won a prize for best use of Microsoft technology; and I've followed them as they put in countless hours of work and great ideas to advance their project to where it is today.

SmartArm took home the top prize - $85,000 cash, $50,000 Azure credits, and a mentoring session with Satya Nadella; but there were many winners beyond them and the other 2 Finalist teams. Many of the teams will return home to turn their projects into business. And many will inspire their classmates to compete next year.

It was an amazing week filled with energy and ideas.


TheLastEnchantmentThe Last Enchantment by Mary Stewart's concludes the Merlin Trilogy begun with The Crystal Cave and The Hollow Hills.

The story begins just after young Arthur's ascension to the throne of Britain. It covers Arthur's first decade as high king as he battles the Saxons and unites Britain.

But Arthur is a minor character in this novel, as Stewart focuses on Merlin, the king's cousin, mentor, advisor, prophet, and friend.

Arthur is betrayed by both his half-sisters; but we hear much more about Morgause, because she tries to poison Merlin than about Morgan, who steals the king's legendary sword.

In The Last Enchantment, as in the previous novels, Merlin's mystical abilities are never as powerful as in the familiar legend; his abilities limited to his education, his wisdom, and the ability to occasionally see visions of the present and future.  In this novel, he loses his clairvoyant power, yet retains his value to Arthur as a trusted advisor and mentor.

Despite Merlin's power and stature within the new kingdom, he shows considerable humanity. He confronts the loss of his mystical powers; He confronts his own mortality and how the kingdom will fare when he eventually passes; and he falls in love for the first time in his life. He even deals with his accidental entombment after an Morgause's assassination attempt leaves him in a deathlike state.

I loved this whole series.

I loved Stewart's ability to take a story as familiar as the Arthurian legend and make it fresh and make it her own.

I loved the way she combined the different versions  of the Arthurian legend into a coherent tale.

I loved the humanity with which she injects all her characters - even those with special abilities.

I loved the action and the politics and the romance.

I loved the relationship and loyalty between Arthur and Merlin.

I was fortunate to have discovered this series and I'm happy to have seen the trilogy through to its conclusion.


A package manager is a tool to install desired software and any other components on which that software depends. They do so by reading from a pre-configured package file, which lists dependencies, required configurations, where to retrieve binaries, and the order in which each step must occur.

Many software developers are familiar with package managers, such as NuGet (for Microsoft applications), PIP (for Python) and RubyGems (for Ruby). These are used to add components to a software project.

Chocolatey is a Package Manager designed specifically for installing desktop applications onto a Windows computer, outside of any software project.

You can get started using Chocolatey by navigating to https://chocolatey.org/. Chocolatey requires Windows and PowerShell (which comes pre-installed on current versions of Windows).

Install Chocolatey by opening a Command prompt and typing

@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
  

or by opening a PowerShell prompt and typing

Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
  

You will likely need to open those prompts as an Administrator. Close the prompt when you are done.

choco install openlivewriter -y choco install googlechrome -y choco install firefox -y choco install notepadplusplus -y choco install nodejs -y choco install git -y choco install putty -y choco install nodejs -y choco install visualstudiocode -y choco install paint.net -y choco install dropbox -y choco install fiddler -y choco install azure-cli -y choco install audacity -y choco install visualstudio2017enterprise -y choco install slack -y choco install filezilla -y choco install handbrake -y choco install gitkraken -y choco install camtasia -y choco install snagit -y choco install unity -y choco install azure-cli -y choco install curl -y choco install everything -y choco install spotify –y
choco install icloud -y choco install docker -y
choco install kindle –y
choco install microsoft-teams –y
choco install postman –y
choco install microsoftazurestorageexplorer -y

Once Chocolatey is installed, you can install software with the command "choco install ", followed by the name of the package. Uninstall software with the command "choco uninstall ", followed by the name of the package. You can find existing packages and their names at https://chocolatey.org/packages.

"choco install" and "choco uninstall" have a number of command line switches. I found "-y" to be the most useful, which answers "Yes" to any prompts to download or run software, saving you a lot of time and intervention.

My number 1 use case for Chocolatey is to re-install all my desktop applications after I reset a PC (delete all data and applications and re-install Windows). I have created a batch file named "ChocolateyInstallScript.bat" to install many of my favourite desktop applications.

The script is listed below:

 

I ran this script this morning after resetting my laptop. It ran for about an hour with no intervention from me. After an hour, all the apps were installed.

Below is part of the output:

Ch01

The best part is that, for what I am doing, Chocolatey is completely free!

For more information, check out the the Chocolatey documentation here or watch my interview with Chocolatey creator Rob Reynolds here.

Chocolatey provides a a simple way to install and manage desktop applications. It saved me time and energy when I rebuilt my machine.



Azure blob storage is a good, inexpensive way to store files in the cloud.

Putting some thought into how you will use this data will save you some money.

Azure offers 3 tiers of blob storage access: Hot, Cold, and Archive. Your choice depends on how frequently you intend to access your data.

It is always free to upload data to Azure storage, but there may be a charge to retrieve data.

Hot storage and Cool storage each offers easy, quick access to your files if you want to read or download them. The difference is the price. There are 2 components of Azure storage pricing: storage and data transfer. Storage is the fee for using space on Azure hard drives. Data Transfer is the fee to access your data (for example, you may want to download a copy of a file or point to an image stored in blob storage). Hot storage has higher storage costs, but lower data access costs than cool storage. So, if you plan to access your data a lot, Hot storage makes more sense; for infrequently accessed data, cool storage is cheaper. 

There is a third Azure Storage tier called "Archive" that is designed for long-term storage data that is accessed very infrequently. Archive tier differs from the other two not only in price - but in how quickly you can access your data. The storage price is much lower, and the access price is much higher than the other two tiers. In addition, it may take hours between the time you request your data and the time you can access your data.

Hot and Cool tiers can be set at the storage account level, but Archive tier can only be set for individual blobs.

If you want to store 5TB data in Azure storage the cost per month (as of July 2018) would be:

Hot tier $104
Cool tier $76
Archive tier $10

The cost to retrieve 1 GB of data with each tier would be

Hot tier $0.00
Cool tier $0.01
Archive tier $0.02

To summarize:

Tier Monthly storage cost, 5TB Access cost / GB
Hot $104 $0.00
Cool $76 $0.01
Archive $10 $0.02

Of course, these prices can change over time. You can view the current prices at https://azure.microsoft.com/en-us/pricing/details/storage/blobs/ 

As you can see, the costs can vary significantly. Your choice depends on how frequently you plan to access your data. If you want to store images to display on your web site, the Hot Tier makes sense. If you want to store customer invoice PDFs and you expect people to only review them every month or two, Cool is probably the best choice. If you want to back up your video files just in case your local drive fails (like I did), Archive is more practical, because I might never retrieve those files.

As Azure evolves, these options become more and more driven by the demands of the customer.


HillbillyElegyJ.D. Vance was never a hillbilly. He isn't even from the hills. He was raised in the southwest Ohio city of Middletown - a rust belt town hit hard economically when a major employer left.

But his family migrated to Middletown from rural Kentucky and displays many of the attributes of the white working class of Appalachia. These people, Vance tells us, identify as "hillbillies". And in Hillbilly Elegy: A Memoir of a Family and Culture in Crisis, Vance describes the attributes of these hillbillies - sometimes through the stories of his own family and neighbors and sometimes through statistics drawn from studies and journals.

Most of those traits are not good. The undereducated, underemployed whites with roots in Appalachia (read "hillbillies) are verbally abusive and prone to violence and share a feeling of hopelessness. They tend to believe that they are not in control of their destiny - that those who succeed were born to better circumstances or were just born smarter. To make matters worse, hillbillies are often dishonest with themselves. They are convinced that they work harder than they actually do and that they attend church more often than they really do. They distrust outsiders; they distrust the government; they distrust the press. These factors combine to keep them poor and exclude them from the American Dream.

They do profess a fierce family loyalty, but only in the sense that they will attack any outsider who insults or otherwise threatens their family. They are generally not supportive of their own family and are often treat one another with cruelty. 

Hillbilly Elegy tells Vance's story of being raised by these folks, the effect it had on him and others like him, and how he was able to escape this culture and graduate from a prestigious law school.

Vance's mother was a drug-addicted single mother, who marched through a plethora of boyfriends and husbands as he was growing up. He nearly flunked out of high school while growing up and many of his friends and neighbors got into trouble and/or made nothing of their lives.

He was largely raised by his gun-toting, foul-mouthed grandmother (aka "Mamaw") and his grandfather (aka "Papaw").

Eventually, Vance graduated high school, enlisted in the US Marine Corps, earned a bachelor’s degree and a Yale law degree.

Three things contributed to Vance's eventual success.

Mamaw succeeded in instilling in him a willingness to work hard and improve himself.

He enlisted in the US Marines right after high school, where he learned discipline and many of the life skills not taught to him growing up.

He was accepted into Yale, where he learned the art of networking to achieve success.

Hillbilly Elegy is an interesting story, about a man who overcome adversity by taking control of his life and rejecting his circumstances.

But is also a social study of an American demographic that is often overlooked - the poor, white working class of Appalachia. These are people whose lifestyle is not well suited to adapting as the economy changed and felt left behind by the rest of America. This feeling of hopelessness may explain why so many of them shifted from the Democratic to the Republican party in less than a generation.

I cannot speak to the generalizations that Vance makes about his people. My ten years living in Kentucky were mostly not spent among the very poor. But I don't doubt his personal experiences and how he was able to overcome his own expectations and his perceived destiny. And I appreciate that he made me think about a group of people in a new light.


I decided I needed to re-image my laptop.

After more than two years, my laptop felt slow. Installing and uninstalling applications and forgotten / unneeded service that are still running made their presence felt in sluggish performance.

I was pleasantly surprised how easy it was do this on Windows 10.

Preparation

My goal was to completely wipe out everything on my PC and start fresh, so I wanted to know what I was removing and would have to add back.

Step 1 is to back up any data or documents on your laptop. If you are using tools like OneDrive, Dropbox, and GitHub, all your data might already be backed up. This was true for most of my files, but I found a few (most notably my PST email archive) that I needed to back up manually to an external hard drive.

Step 2 is to make note of the applications you will need to re-install after you reset the computer.

Reset PC

Once everything is backed up, you can reset your machine with a clean install.

Click the START button in the bottom left and type "Reset this PC", as shown in Fig. 1.

Reset01
Fig. 1

This should bring up the "Recovery" screen, as shown in Fig. 2. (Note: If this does not work, you can go to Windows Settings and search for "Reset this PC".)

Reset02
Fig. 2

On the "Recovery" screen, click the [Get Started] button to launch the "Reset this PC" wizard. The first screen ("Choose an option") of the Wizard is shown in Fig. 3.

Reset03
Fig. 3

Click the [Remove everything] button to advance the "Do you want to clean the drives, too?" screen, as shown in Fig. 4.

Reset04
Fig. 4

On this screen, select [Remove files and clean the drive] button to advance to the "Ready to reset this PC" screen, as shown in Fig. 5.

Reset05
Fig. 5

On this final wizard screen, click the [Reset] button.

This will delete all files, re-install windows, and launch a startup wizard to ask you about things like preferred language and keyboard layout.

When finished, you will have a PC with Windows 10 installed and little else. At this point, you will want to re-install any applications you need and restore desired files from your backup. I used Chocolatey to automate re-installing my applications.

I did this for 2 different laptops. The whole process took about 90 minutes on my 2-year-old Surface Book and about 3 hours on my 4-year-old Surface Pro 3.

The most stressful part was backing up everything and hoping I did not forget an important file. My next project is to make sure everything is included in Dropbox, so I won't need to worry about this.


GCast 7:

Azure SQL Database

Azure MySQL Database


"Fahrenheit 451"

Comments [0]

Fahrenheit451Guy Montag is a fireman. Unlike the world of today, firemen in Montag's dystopian near-future are charged with burning books. Books are illegal because books encourage free thought, which makes it difficult for the government to control its citizens.

One day, Montag meets Clarisse, a high school girl who is not afraid to think about the world and question what she sees. Montag enjoys his conversations with Clarisse and is jarred when she suddenly disappears - an apparent victim of an automobile accident. Montag begins to question his life and the morality of his job. He courts disaster when he steals a book he is supposed to burn.

Fahrenheit 451 is one of the great novels of  the twentieth century. Not only is it a compelling story; it is a warning against anti-intellectualism and those who mindlessly follow authority. It is a warning of choosing comfort and vapid entertainment over freedom; and allowing power to be too concentrated. 65 years after its publication, these issues are still relevant.

This is a book everyone should add to their reading list. It is a simple parable but packed with so much that I have read it three times.



TheJungleBrace yourself before reading Upton Sinclair's the The Jungle.

The Jungle tells the story of European immigrants lured to Chicago with promises of high-paying jobs in the meat packing industry. The promises of a good life turn out to be false - particularly for the family of Lithuanian immigrant Jurgis Rudkus. Jurgis arrives believing that he can handle the hard work and provide for his new wife and his extended family. He is strong and hard-working, and he quickly finds a job in the local stockyards.

But they have entered a world where the entire system conspires to keep down the poor. Wages are reduced downward and workers are not paid for time lost.

Even time lost to injury or illness.

Even injury or illness caused by unsafe and unsanitary working conditions, which is the norm in Chicago's meatpacking industry.

A dishonest realtor tricks the family into buying a home with hidden costs and his entire family must go to work to make ends meet. The meat trust exploits them all by keeping them in in unsafe and unhealthy conditions. Foremen, policemen, businessmen, judges, and politicians are all corrupt and use their power to prey on the powerless.

As time passes, the family falls farther into debt and deeper into despair. Some die, some are maimed, some are arrested, some are blacklisted by all the local companies, one is raped with impunity by her boss, and one disappears without a trace. Despite their best efforts, their fate seems almost inescapable. They work hard and play by society's rules but are cast aside anyway. Before long, the hope and optimism with which they arrived slips away.

Sinclair was a devout socialist and concludes the novel with a pitch for socialism as a cure for the dangers of unchecked capitalism. It's interesting to read this today over a hundred years after its publication and with the perspective of history. Socialism never took over the US and has produced mixed results in those nations where it was adopted.

But the novel did have an impact on society - mostly by calling attention to the unsanitary products sold by the meat packers. This led to increased regulation and the formation of what would become the Food and Drug Administration.

The preaching about socialism in the last few pages makes the ending feel a bit weak, but the story is a powerful one and I could not help but feel for the heartbreak experienced by Jurgis and his family. The reader feels both sympathy and outrage at the injustices they suffer.  There is a reason why this novel is considered an American classic.


GCast 6:

Azure SQL Database

How to create an Azure SQL database in the Azure portal.


I needed to convert a bunch of PDF files with pictures into image files.

I volunteered to create a slideshow for a family reunion and and one cousin sent me dozens of PDFs, which don't play nice with my editing software.

After playing around with several online converters, I settled on PDFtoPNG.

You don't need to install anything to use this tool.

Open a browser and navigate to https://pdftopng.online/

The start page shown in Fig 1 is  pretty intuitive.

P2P01-StartPage
Fig 1

Click the large green [Choose File] button to open a "File Open" dialog, as shown in Fig. 2.

P2P02-SelectPdf
Fig 2

Select a file and click [Open]. You can only convert one file at a time, but each file takes only a few seconds.

A "Converting file" message (Fig 3) displays, while the system does its thing.

P2P03-Converting
Fig 3

When the conversion process is complete, a [Download] button displays, as shown in Fig 4.

P2P04-Done
Fig 4

Click this button to save your newly-created PNG file to disc. If the PDF file contains multiple images, a ZIP file containing all the images is created.

Using this tool, I was able to quickly convert dozens of PDFs to PNG files and add them to my slideshow. It was simple, free, and I did not need to install or uninstall any software.



GCast 5:

Azure Databricks

Learn how to create a free library and Jupyter notebooks hosted in Azure.



June 2018 Gratitudes

Comments [0]

7/1
Today I am grateful for:
-My first pair of prescription eyeglasses
-A visit yesterday to the Chicago Women's Park and Gardens

6/30
Today I am grateful for my first visit to IKEA.

6/29
Today I am grateful to David for taking time yesterday to answer all my questions.

6/28
Today I am grateful that I can binge-watch TV shows on demand.

6/27
Today I am grateful to hear Laretha Weathersby and the JW Williams Blues Band at Blue Chicago last night on my first visit to the venue.

6/26
Today I am grateful for a conversation with a financial adviser yesterday.

6/25
Today I am grateful to attend the Chicago Food Truck Festival yesterday.

6/24
Today I am grateful to the organizers of #BeerCityCode for an excellent conference.

6/23
Today I am grateful for:
-Drinks with J. Tower at Founder's last night
-The hospitality of Chris and Tracy last night

6/22
Today I am grateful for a nice Italian dinner with friends last night to celebrate the end of the school year.

6/21
Today I am grateful
-to go to an optometrist yesterday after years of neglect
-to go to the Art Institute of Chicago for the first time this year.

6/20
Today I am grateful to celebrate Father's Day last night with my son Tim.

6/19
Today I am grateful to spend a night in my own bed.

6/18
Today I am grateful for a week in Norway - my first visit to this country.

6/17
Today, I am grateful for:
-a walk around Bergen, Norway
-a visit to 2 art museums
-a chance to try some exotic Norwegian foods

6/16
Today I am grateful for a train ride across Norway and a boat ride through the fjords.

6/15
Today I am grateful for my first time speaking at and attending NDC-Oslo.

6/14
Today I am grateful for the #ndcoslo after-party.

6/13
Today I am grateful for a boat ride around Oslo.

6/12
Today I am grateful to work on a Machine Learning project this week with a train company in Oslo.

6/11
Today I am grateful for BBQ in Norway with Jimmy, Adam, and Dominick.

6/10
Today I am grateful for a few days in Romania

6/9
Today I am grateful to play Dungeons & Dragons in Transylvania.

6/8
Today I am grateful for another excellent #itcamp

6/7
Today I am grateful to Dan for picking me up at the CLJ airport and driving me to my hotel late last night.

6/6
Today I am grateful for free wine on European airlines.

6/5
Today I am grateful to finish a bunch of blog posts and screencasts yesterday.

6/4
Today I am grateful for dinner with Tim last night and to Adam and his daughter for stopping by.


<< Older Posts | Newer Posts >>