Searching for Truncated Files in GitHub Folder

I’m sharing out this tip as I ran into this scenario recently.  If you are ever browsing through the GitHub website for files in a repo folder but get the warning “Sorry we had to truncate this directory… files were omitted from the list.” then this post may help.

 

Solution

I was recently browsing the Microsoft Graph .Net SDK repo through the GitHub website looking for the various Message functions.  Unfortunately the folder I was browsing has 6,000+ files and only the first 1,000 files are displayed (see highlighted box in following screenshot).  The first step in the solution is to click the “Find file” button in the upper right.

TruncatedFilesGHFolder1

 

On the following screen I typed “message” to filter the results for any files starting with that keyword.  Now I found the file I was looking for, “../MessageRequest.cs”.

TruncatedFilesGHFolder2

 

Conclusion

Looking back this may seem like an intuitive solution but I was stumped at first.  Hopefully this will help someone (or myself again) if they run into this.

-Frog Out

PowerShell Script to Create Office 365 Security and Compliance Center eDiscovery Case and Holds

This week my customer and a peer both asked for a sample PowerShell script to automate the creation of an Office 365 Security and Compliance Center eDisovery case, hold, and content search.  This post will share out that script and a few things to be aware of (ex. deprecating basic authentication) that are important.

Background

The below script accomplishes the following tasks:

  • Create a Security and Compliance Center eDiscovery case
  • Place an in-place hold on multiple users’ Exchange Online mailboxes
  • Create a content search within eDiscovery case for any folders named “Legal Hold” and the child folders under them

Important Note

As of the publish date (Mar 4th, 2020) the Security and Compliance Center remote PowerShell module relies on basic authentication.  The Exchange team has publicly shared that basic authentication for Exchange Online will be deprecated by Oct 2020.  As such that means the below script may not be usable in its current form in ~6 months.  When a replacement or update is available I will attempt to update this sample to reflect that.

Exchange Online deprecating Basic Authentication
https://support.microsoft.com/en-us/help/4521831/exchange-online-deprecating-basic-auth

In terms of the Exchange Online remote PowerShell module there is a v2 module being developed (active development, not ready for production) which you can find on the PowerShell Gallery.  This new module support OAuth authentication which resolves the issue of deprecated basic authentication.

ExchangeOnlineManagement module on PSGallery
https://www.powershellgallery.com/packages/ExchangeOnlineManagement

Solution

Before running this script, ensure that the account you log in with has the appropriate permissions to both Exchange Online as well as Security and Compliance Center.  My sample uses a single admin account but you may adapt the script to use separate accounts if needed.  See the following articles for more details.

Connect to Exchange Online PowerShell
https://docs.microsoft.com/en-us/powershell/exchange/exchange-online/connect-to-exchange-online-powershell/connect-to-exchange-online-powershell?view=exchange-ps

Connect to Office 365 Security & Compliance Center PowerShell
https://docs.microsoft.com/en-us/powershell/exchange/office-365-scc/connect-to-scc-powershell/connect-to-scc-powershell?view=exchange-ps

Note: If you do not see the below Gist please refer to code at this location: EXO_New-SCCeDiscoveryCaseAndHold.ps1

Conclusion

In this post I shared a sample script for automating the creation of an Office 365 Security and Compliance Center eDiscovery case, hold, and folder scoped content search.  The folder scoping was an interesting detour as I had to track down the way to gather folder IDs from a product group engineer sample (linked in the above sample).  I hope you find this useful and good luck scripting.

-Frog Out

Newsletter #5 – Video game analogies, Live life asynchronously, and MakeCode Arcade

“The goal isn’t just to finish the race of life, but to finish the race with nothing left to give”
-John R. Wood: Ordinary Lives, Extraordinary Mission

Video game analogies

Thought experiment time.  If you had to describe your life as a video game (pick a gameplay mechanic, theme, story, character, etc.) what would you choose?  For me it would be one of the earliest games I ever played, the “Mario Bros” Game and Watch multi-screen game.  In the game (pictured below) you control Mario and Luigi at a bottling plant filling boxes that are moving back and forth on multiple vertical levels before finally loading them on a truck.  The gameplay mechanic of controlling each brother up and down separately, thinking ahead to when a box would need to be caught by one of the brothers, and the patterns of movement clicked with me from an early age.  How do you see your life as a video game analogy?

TinyLetter-5-3

Every week / month I hear developers, public speakers, etc. discussing “don’t live your life by default“, “start with why“, and more.  I’ll propose my own “phrase to live by” into the mix.

Live life asynchronously.

Live life asynchronously

Let me expand upon this idea a little bit further.

Asynchronous means not occurring at the same time, as in computers and programming when a method begins but releases control until it signals back to the system that the asynchronous method is finished.

In real life there are many tasks that can be started and then picked up when they have completed: laundry, cooking a meal, charging batteries, compiling code, etc.  The interesting part is to figure out when you can start one task and know that it will be ready to pick back up when it is done.

Personally I know that I can start a load of dishes in the dishwasher right after dinner and have them ready to put away shortly before bed.  When I get home from work I can play a game of chase around the house with my older kids and find toys / books / clothes that need to be picked up (doubles as some exercise for all of us).

The other aspect of doing things asynchronously is that it forces you to think about your future self (and others).  By doing X now I know that in Y hours / days / weeks I’ll be ready to finish it.  This ties in to investing (financially, academically, etc.) as well.  I could buy a fancy new electronic gadget now, or I could put that money towards my retirement account / kids’ school costs / donation to charity or plenty of other future needs.

Despite the natural tendency for some folks to minmax the optimal set of tasks that can be completed in a given 24 hr period, the first two words of the phrase mean the most: “live life”.  I’ve never thought to myself “I’m glad I fit in those additional 5 chores around the house today at the expense of spending time with my wife or kids”.  Go on and live life with people first.

MakeCode Arcade

TinyLetter-5-5

Recently I found a cool retro game programming platform called MakeCode Arcade.  MakeCode Arcade is free, open-source, and entirely accessible through a browser with no installs required.  Similar to MIT’s Scratch offering you can build games using predefined blocks (or JavaScript if you feel like going advanced) that include game logic, sprites, animations, controller input, and more.  You can also play your own games or a whole host of community games through the browser or download your games to a number of hardware devices (most cost less than $40 last I checked).  If you feel like collaborating you can also share your projects on GitHub for others to enjoy and work on.  I’m looking forward to introducing MakeCode Arcade to my daughter this year to see what she comes up with.

On a similar note I’ve also grown very interested in chiptune music and how it is created.  One of my favorite “artists” is Rich Vreeland who goes by the name Disasterpeace.  I highly recommend these albums:

If you are interested in creating your own chiptune music you can find a handful of tools below. Even though this article says for Windows 10 there are offerings that also have versions for Mac and Linux.

Chiptune music creators for Windows 10
https://www.ilovefreesoftware.com/19/windows-10/chiptune-music-creator-windows-10.html

Have you tried out any fun retro gaming platforms or found good chiptune music?  Share back if so.

-Frog Out

Looking Ahead To 2020

For many of the past years I’ve written a retrospective (2016, 2015, 2013, 2012, 2011, 2010) or look ahead (2019, 2014, 2013, 2012, 2011, 2010) post to walk through my goals.  This year I am a little behind but with some encouragement from my mentor Sean McDonough I will look ahead at what I have planned for 2020.

board-1647323_1280

Ahead in 2020

Live life for others

A clip of Keanu Reeves on a late night show answering the question “What happens when we die?” has been popular on social media lately.  If you haven’t gotten to watch this short clip take a minute to do so now:

In the clip Keanu doesn’t focus on himself (or his future self.)  Instead he talks about those who love us and how their lives will be impacted by our passing.

This has been something that I’ve thought about more in the past years as my children have been born.  I enjoy taking an hour or two once a week to do something with one of my kids such as going for a swim at the local gym, a library visit, grocery store run, or similar activity.  I could / should do this more often, especially activities with my wife like our monthly date nights.

Hobbies (and music)

Speaking of my wife, we recent went to a marriage ministry event at a local church.  In one of the videos for the night the couple presenting discussed keeping a dreams journal together.  This dreams journal would contain things that you would like to do in the near term as well as the long term.  My wife and I discussed each of our personal and collective dreams which opened some interesting insights.

For me personally I would like to get back into playing a musical instrument.  In my younger years I played piano for 8 years and guitar for a few.  I won’t claim to be good at either today, but I’ve always been drawn to music as a means to relax or inspire creativity.  I’ve tossed around ideas of starting up drumming but that may wait until my kids are older and we have space to put equipment like that.  For now though I’m looking into creating chiptune or MIDI music on my laptop.

Chiptune music creators for Windows 10

https://www.ilovefreesoftware.com/19/windows-10/chiptune-music-creator-windows-10.html

MidiPiano

http://www.midipiano.net/

STEAM education for girls

Now that I’m the father of 2 girls (in addition to my son) I’m interested in ways to encourage both of my daughters in science, technology, engineering, arts, and mathematics (STEAM) education.  My oldest daughter is already very interested (and good at) art and math.  As for the other areas we’ve bought a few Elenco Snap Circuits kits and I’m looking at a few coding applications that she can use in a year or two.

At a broader level, the Stir Trek Conference that I help organize has a related Stir Scholarship that is awarding young women with scholarships to enter into a degree in software.  If you feel inclined, please donate and spread the word about this scholarship.  I look forward to helping this program grow and continuing to encourage all young women to explore a STEAM education.

Stir Scholarship

https://stirscholarship.org/

Building community at work

In addition to my normal customer work I have also been involved in building an internal community of sorts around Microsoft Graph.  This community is focused on answering questions from my peers in the field as well as connecting people with product group members.  Aside from the technical aspects of this community I’ve also been interested in helping others contribute to documentation (primarily Microsoft’s).  In 2018 I wrote a blog post on the topic but I’m also looking at doing a workshop or recorded video to help others see the process.

How To Edit Microsoft Documentation on GitHub

http://aka.ms/HowToUpdateMsftDocs

Conclusion

While this list is not complete nor are they all measurable goals, this is a starting point for the direction I’ve pointed myself in for the 2020 year.  If you have set your own goals or personal directions I’d love to hear what they are.  Feel free to leave a comment and share.  Thanks and have a great start to 2020.

-Frog Out

Newsletter #4 – Worthwhile gifts, MFA / password managers, and books

TinyLetter-4-1

Worthwhile gifts

Before I start, Christmas / birthdays / anniversaries / other important events != giving gifts as the primary focus in our house.  With that said, my wife and I have been reflecting on the gifts that we give to each other or other people.  For our kids we’ve been looking into more “experience” type gifts.  This could be a bowling night out, art classes, tickets to a kids musical, etc.  So far this is working well and helps our kids not to become consumed with “things” but instead making memories.  It helps that we take lots of pictures and then upload them to a digital frame that rotates through pictures from past years.

For my wife and I we’ve been looking into gifts that give both of us more time to spend with each other or help keep us in the moment.  I’ll share some examples.

  • Smart home garage door opener – auto-closes at night if accidentally left open, provides peace of mind when going to bed.
  • Cordless Dyson vacuum – can move from room to room and vacuum in half the time it used to take with corded, heavy canister-style vacuum we previously had.
  • WeMo smart switches for lights – we are slowly helping our 2 older kids learn to turn off lights when they leave a room.  In the meantime the ability to turn off all the basement lights without needing to go up and down the stairs while cooking dinner / feeding baby / doing ten other things is a big help.  I think I’ll be adding more of these over time to other rooms.

 

MFA / password managers

Another worth-while gift that you can give to your family / friends / coworkers / etc. is the (strong) encouragement to turn on multi-factor authentication (MFA) and use a password manager.  I’ve recently read two interesting articles online that highlight the need to secure your digital / online accounts:

  1. Your Pa$$word doesn’t matter
    • In majority of credential theft scenarios, password doesn’t matter as bad actor can obtain them
    • Don’t focus on password limitations, instead implement MFA and threat detection processes
    • If using password manager, then max out the length of password
    • Use of MFA reduces credential theft by 99.9% [this was enough to cement my thoughts]
  2. All your creds are belong to us!

Regarding a password manager, I registered the majority of the accounts that my wife and I share (Netflix, banking, mortgage, retirement plan, etc.)  If she needs to access them (heaven forbid if I were in a coma, passed away unexpectedly, or similar) she would need to access them.  By using a shared password manager (currently Lastpass family plan) those shared accounts can be accessed by either of us.  For any accounts that aren’t shared (personal email, etc.) my wife is also the emergency contact who can gain admin access in the event that would be needed.  Overall this gives both of us more peace of mind about planning for the future.

 

Books

Reading (blogs, online magazines, books, etc.) can introduce you to new ideas and keep your brain active to help you boost your creativity (see newsletter #2).  In the past few months I’ve had the pleasure to read (still in progress on the 3rd one) 3 books that have had a profound impact on me.  I want to share these with you in the hopes that you read them, incorporate their ideas into your own life, and if you feel moved to do so pass them along to others.

  • Leadership and Self-Deception: Getting Out of the Box
    • We “put ourselves into a box” when we let our own emotions or thoughts obscure our view of other people.  We can get out of this box and see others clearly when we shift our attitudes.  The applications of these concepts can apply to family, work, and other relationships / environments.  I highly recommend this book and I plan to re-read this again in the future.
  • Bullshit Jobs: A Theory
    • Excuse the language in the title of this book, but this book has profoundly changed the way I see my own work and the work of others.  As we as a human race move towards more automation and less reliance on manual labor the rise of BS jobs has increased.  This book goes into the history and current state of jobs, how people as a whole value their job / life, and ways to address the changing nature of jobs in the future.  I’m still internalizing many of the ideas brought up in this book but can see this making large changes to my life / work.
  • Be the Master (4th edition)
    • I am 2/3 of the way through this book but wanted to list it as well.  Be the Master focuses on how to become a master (does not mean a “know it all” or “expert in everything“) in your career and also how to share that with the next generation of workers.  You may have heard of many of the concepts discussed in this book, but Don does an excellent job of succinctly reviewing them and sharing stories / analogies to illustrate all of the points.

Do you have any worthwhile gifts (or books) that have made an impact for you?  Please share back if so.

-Frog Out

Creating a C# Azure Function to Call Microsoft Graph

This post is a part of The Third Annual C# Advent.

Building on my “Introduction to Calling Microsoft Graph from a C# .Net Core Application” post from the 2018 C# Advent event, this year we’ll take what we learned and adapt that code to run in an Azure Function.  I recommend reading that post (and the linked resources in it) first to get the background on creating and authenticating an Azure AD application.

Prerequisites

Background

Azure Functions is one of the serverless options within Azure (read here for more about Azure serverless solutions).  Azure Functions consist of a trigger (HTTP, timer, storage event, etc.) and optionally one or more input / output bindings.  I especially appreciate how triggers and input / output bindings reduce, or even completely remove, the need to write what I call “internal plumbing” code.  “Internal plumbing” code is the code required to connect to an Azure storage account, monitor for a webhook request, or similar event based functionality.  Having that functionality taken care of allows you as the developer to focus on writing the core business logic where the most value can be provided.

Speaking of bindings, you may notice on the Azure Functions documentation that there are Microsoft Graph bindings for Azure Functions as of version 2+.  I’m not on the product group but as far as I’m aware these bindings have been in preview for over 2 years and are not planned to move past preview.  As such this blog post will walk through calling Microsoft Graph using the Microsoft Graph .Net SDK.

The below steps can be seen in the sample repo at BTJ.CSAdvent.AZFunc on GitHub. Additionally the Develop Azure Functions by using Visual Studio Code documentation gives a good overview of the VS Code development process.

Create Azure Function

Open Visual Studio Code and open the Command Pallete (⇧⌘P or F1 on Mac, Ctrl+Shift+P or F1 on Windows).

  1. Search for “Azure Functions: Create New Project…” and select it.CSAdvent-MSGAZFunc1
  2. Choose a folder to create the project in (preferably not in a Visual Studio Code workspace).
  3. Select the language of the project as C#.
    CSAdvent-MSGAZFunc2
  4. Create an empty function project by selecting “Skip for now” when prompted for the trigger type.
    CSAdvent-MSGAZFunc3
  5. Open the Command Palette again and search for “Azure Functions: Create Function…” and select it.
    CSAdvent-MSGAZFunc4
  6. Select a TimerTrigger.
  7. Name the function “GetUserMicrosoftGraph” (or any name you wish, but later references will be impacted).
    CSAdvent-MSGAZFunc5
  8. Provide a namespace for the function.
  9. Use the default timer schedule “0 */5 * * * *” which is the CRON representation of running every 5 minutes.
  10. On the terminal at the root of the project run “dotnet build” to build the project.
    • If you are prompted to choose a storage account and are using Windows, select “Use local emulator”.
    • If you are on Mac / Linux, select “Select storage account” and specify a cloud Azure storage account.CSAdvent-MSGAZFunc6

At this point you should have an Azure Function project that should build successfully.

Add NuGet Packages

Since we’ll be calling Microsoft Graph and the MSAL .Net SDK libraries we’ll add the supporting NuGet packages with the following:

  1. Run “dotnet add package Microsoft.Graph” from the terminal.
  2. Run “dotnet add package Microsoft.Identity.Client” from the terminal.

Add Azure AD App Authentication

Open the local.settings.json file.  It should look similar to the following (AzureWebJobStorage may be different depending on choices above for storage).

CSAdvent-MSGAZFunc7

Add the following key/value pairs to the Values section.  Use the values from the Azure AD application that was created using the references in the linked articles above.

   "timerSchedule": "0 */5 * * * *",
   "AzureADAppTenantId": "YOUR_TENANT_ID_HERE",
   "AzureADAppClientId": "YOUR_CLIENT_ID_HERE",
   "AzureADAppClientSecret": "YOUR_CLIENT_SECRET_HERE",
   "AzureADAppRedirectUri": "YOUR_REDIRECT_URI_HERE"

Implement the sample code (link here) from last year’s post as helper classes to the project.  See AuthHandler.cs and MsalAuthenticationProvider.cs from the example repo.

CSAdvent-MSGAZFunc11

Call Microsoft Graph

Implement the following code (adapted from last year’s post, link here) inside the GetUserMicrosoftGraph.cs file.

 public static class GetUserMicrosoftGraph
    {
        private static GraphServiceClient _graphServiceClient;

        [FunctionName("GetUserMicrosoftGraph")]
        public static void Run([TimerTrigger("%timerSchedule%")]TimerInfo myTimer, ILogger log)
        {
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");

            //Query using Graph SDK (preferred when possible)
            GraphServiceClient graphClient = GetAuthenticatedGraphClient();
            List<QueryOption> options = new List<QueryOption>
            {
                new QueryOption("$top", "1")
            };

            var graphResult = graphClient.Users.Request(options).GetAsync().Result;
            log.LogInformation("Graph SDK Result");
            log.LogInformation(graphResult[0].DisplayName);
        }

        private static GraphServiceClient GetAuthenticatedGraphClient()
        {
            var authenticationProvider = CreateAuthorizationProvider();
            _graphServiceClient = new GraphServiceClient(authenticationProvider);
            return _graphServiceClient;
        }

        private static IAuthenticationProvider CreateAuthorizationProvider()
        {
            var clientId = System.Environment.GetEnvironmentVariable("AzureADAppClientId", EnvironmentVariableTarget.Process);
            var clientSecret = System.Environment.GetEnvironmentVariable("AzureADAppClientSecret", EnvironmentVariableTarget.Process);
            var redirectUri = System.Environment.GetEnvironmentVariable("AzureADAppRedirectUri", EnvironmentVariableTarget.Process);
            var tenantId = System.Environment.GetEnvironmentVariable("AzureADAppTenantId", EnvironmentVariableTarget.Process);
            var authority = $"https://login.microsoftonline.com/{tenantId}/v2.0";

            //this specific scope means that application will default to what is defined in the application registration rather than using dynamic scopes
            List<string> scopes = new List<string>();
            scopes.Add("https://graph.microsoft.com/.default");

            var cca = ConfidentialClientApplicationBuilder.Create(clientId)
                                              .WithAuthority(authority)
                                              .WithRedirectUri(redirectUri)
                                              .WithClientSecret(clientSecret)
                                              .Build();

            return new MsalAuthenticationProvider(cca, scopes.ToArray());;
        }
    }

Test Azure Function

Test out the Azure Function by doing the following:

  1. Run “dotnet build” from the terminal.
  2. Assuming the build is successful you can then execute the Azure Function locally by pressing the F5 key.

See below for sample output.

CSAdvent-MSGAZFunc12

Deploy Azure Function

The Azure Functions extension for Visual Studio Code makes the deployment process much easier.  Search for “Azure Functions: Deploy to Function App…” and select it.

CSAdvent-MSGAZFunc9

I already have a consumption based, Windows hosted Function App deployed in my Azure subscription but you can also create a new one if needed.  Select the subscription and Function App to deploy to.

Upload App Settings

When you develop the Azure Function locally you make use of the local.settings.json file which is automatically loaded as environment variables.  In Azure though you will need to create those configuration values as app settings on the Function App.  Rather than manually add / edit those values, search for “Azure Functions: Upload Local Settings…” and select it.  This will upload any values you have in your local.settings.json as app settings on the Function App.

IMPORTANT: If you specified the AzureWebJobsStorage key to use local storage, do not overwrite that value in Azure.  Instead use the cloud Azure storage account already specified.

CSAdvent-MSGAZFunc10

(Bonus) Add Key Vault Integration for Client Secret

While it is possible to specify the Azure AD app secret in the Function App configuration settings (stored encrypted), anyone with read / edit access to the Function App will be able to view that value as plain text through the Azure portal.  As such it is recommended to store the value in Azure Key Vault or similar location.  To specify a location in Azure Key Vault following the documentation on Use Key Vault references for App Service and Azure Functions.

The reference in your Function App configuration will now look something like the following:

@Microsoft.KeyVault(SecretUri=https://yourvault.vault.azure.net/secrets/yoursecret/ec96f02080254f109c51a1f14cdb1931)

 

Conclusion

In this blog post we walked through the process to create, test, and deploy a C# compiled Azure Function that calls Microsoft Graph.  The sample repo can be found on GitHub at BTJ.CSAdvent.AZFunc.  Thank you for reading along and please open an issue on GitHub repo if you run into any issues with the sample project.  Enjoy the rest of The Third Annual C# Advent.

-Frog Out

Newsletter #3 – Tools / automation and the right song

Tools / Automation

I’m not an anthropologist or kinesiologist, but using a broad definition tools can be thought of as an extension of the human body.

  • A hammer allows you to swing your arm and impart more force than your hand could
  • A knife / scissors lets you cut apart materials with more precision than tearing with your bear hands
  • A bicycle lets you travel faster / more distance than your feet can carry you

I like to apply similar logic to computers, automation tools, etc.

  • PowerShell / Bash / can automate processes or tests rather than needing to manually run them
  • Automated alerting / bill pay keeps my financial accounts in check without needing to manually monitor them
  • My blog engine (WordPress at the current time) handles cross posting to Twitter and LinkedIn as well notifying any followers instead of my manually taking those actions
  • Azure DevOps allows my customer to create build and release pipelines to automate the tedious work of building and deploying an application with little to no manual steps

There is (almost) always an upfront investment in configuring, purchasing, etc. these types of tools or automating processes but the end result is generally an improvement in productivity / time to complete / etc.  Well-defined and / or simplistic processes are great targets for automation, but be careful that you don’t fall into the trap of automating the wrong things or spending more time building the automation than you’ll gain.  When in doubt check XKCD for funny examples like below.

Don Jones has a good article on “What’s not worth automating?” if you are interested in reading more on this topic.

The right tool (song) for the job

My dad is an electrical engineer who moved into sales many years ago.  He is also very handy around the house and likes to help me with house projects when he visits.  On many occasion a part, a bolt, or some other thing will get stuck.  Rather than trying to force what we are working on he always seems to know the right tool, compound, etc. to solve the problem with the least amount of effort needed.

Since I personally work with computers more than I do with my hands I find it helpful to get in the right mindset when I have a task to complete.  The task could be a blog post to write, some code to review, a set of screenshots to edit, etc.  Rather than fighting with myself (i.e. forcing it too much), I find it better to tune out my brain and let the words, code, or ideas flow more easily.

In order to help tune out my brain I have a playlist (called “Repeat All Songs”, link here) that I’ve moved with me from music service to service (now Spotify).  This playlist contains dozens of songs that I can (and frequently do) listen to on single-song repeat over and over.  These span classic rock, techno / house, instrumental, and other genres.  I don’t categorize the songs on my playlist but when I need inspiration or help getting into a specific mindset I browse through there, find a song that fits what I’m looking for, and hit play.

For those looking for some new songs to listen to on repeat here are a few from my recent rotation:

  • Achilles Last Stand – Led Zeppelin (rock)
  • In My Mind – Dynoro (electronica / dance)
  • Fly – Ludovico Einaudi (contemporary piano)
  • Nostos – Jean-Michael Blais (contemporary piano)
  • Lazy Eye – Silversun Pickups (rock, one of my fav bands)
  • Amsterdam – Guster (alternative / rock)
  • Brighton Rock – Queen (rock)
  • This World [Westworld Season 1] – Ramin Djawadi (instrumental)

How about you, do you have any favorite songs for single-song repeat?  Feel free to share back a link or recommendation.

-Frog Out