Good Monday, it's the last ReadingNotes of 2022! So many great articles, podcasts, and blog posts. More than 350 of those catch my interest this year...
If you think you may have interesting content, share it!
Good Monday, time to share my reading notes. Those are a curated list of all the articles, blog posts, podcast episodes, and books that caught my interest during the week and that I found interesting. It's a mix of the actuality and what I consumed.
If you think you may have interesting content, share it!
Cloud
Setup the Auto-shutdown on VM using Bicep template (Massimo Bonanni) - VMs are so useful. One of the best ways to save money is to turn them off when you are not using them. Part 6 about Bicep explains how to do it in your IaC script.
Azure SQL Database Overview (Daniel Calbimonte ) - This post is a great one to get started on Azure SQL Database. It answers many of the initial questions and provides the answers.
[Improving Your Desktop Applications—ToolTips in .NET MAUI](Leomaris Reyes ) (https://www.telerik.com/blogs/improving-desktop-applications-tooltips-dotnet-maui?utm_source=readingnotes) - Tooltips are now here!
Azure Service Bus Performance - Azure SDK Blog (Paul Michaels) - A nice post that explores the edge of the service Bus services in terms of speed and size of the messages. It could have a big impact on your design, depending on your business scenarios.
Celebrating the Second Edition of Code with Charles Petzold (Hanselminutes with Scott Hanselman) - What an amazing interview with the author of the book Code. I heard so much about this book, and now with this new edition++, I think I should put it on my reading list.
Unreasonable Hospitality with Will Guidara (A Bit of Optimism) - Whaaat?! This is such a great idea! I need to read that book and go to that restaurant. I love the idea.
Good Monday, it's time to share new ReadingNotes. Here is a list of all the articles, podcasts, and blog posts, that catch my interest during the week.
If you think you may have interesting content, share it!
Programming
Blazor WASM Custom 404 Page on GH Pages (Justin Yoo) - This is a lovely double tutorial. Learn first how to write a 404 not found page in Blazor then learn how to use custom 404 when using GitHub as a hosting platform.
I changed my mind about writing new JavaScript frameworks (Salma Alam-Naylor) - JavaScript is its own universe with so many options and variations. Looking forward to seeing the WTF tool and learning more about how she builds it.
Introducing Spectre.Console (Steve Smith) - It's for sure a library that I will try. Console applications are a very useful tool so anything that can speed up the creation process is a must.
Developing .NET on AWS with Isaac Levin (.NET Rocks!) - Yes!! Of course, .NET is everywhere but now we hear about it! A captivating episode where Isaac makes a quick tour of all the possibilities for .Net developers on ASW.
137. Anti-Time Management with Richie Norton (Part 1)-id2920271-id538368995) (The Greg McKeown Podcast) - I was not sure what to expect from "Anti-Time Management" and I like what I heard. looking forward to listening to part two.
How to Use the Alpine Docker Official Image (Tyler Charboneau) - Alpine is a must to know for all dev and DevOps people (and probably many more}. This post is perfect for getting you started.
Why the C64 Demoscene matters with Clay Token's Bilgem Çakır (Hanselminutes with Scott Hanselman) - Scott has been sharing content about the Commodore 64 these days and that make me wanna jump back as it was my first computer... But this time I would understand English without having to search for each word in a dictionary.
Good Monday, time to share my reading notes. Those are a curated list of all the articles, blog posts, podcast episodes, and books that caught my interest during the week and that I found interesting. It's a mix of the actuality and what I consumed.
You think you may have interesting content, share it!
Azure Virtual Machines vs App Services (Michael Shpilt) - The pros and cons of both are listed in this post with some advice. Everything you need to help you to make your choice.
Already time to share new reading notes. Here is a list of all the articles, and blog posts that catch my interest during the week.
If you think you may have interesting content, share it!
Cloud
Introduction to DevSecOps on Azure (Daniel Krzyczkowski) - DevSecOps is a real thing and it's accessible for all. This post explains what it is and provides examples of how it could be implemented at a high level.
Adding color to bracket pairs (Mads Kristensen) - A call for feedback on an up common feature of Visual Studio. Rainbow Brackets yes it will colorize the brackets but what should be the options?
DevOps monitoring: The Why, What, and How of DevOps monitoring (Hiren Dhaduk) - This is an excellent post to get us to think about our first step. It explains the reason why we should care and briefly lists a few tools available today on the market to help.
Extending Docker’s Integration with containerd (Djordje Lukic) - Docker team shares the roadmap for their adoption of containers as basic components in image management. Learn more about it and how you can try it today in this post.
How I made an ai to watch my cats poop for me (Estefannie) - Great project using Raspberry Pi, node, C, and a lot of creativity. The video is a must, it provides a better overview of the journey, and the story is gold.
588: How to Help Your Manager Shine, with David Gergen (Coaching for Leaders) - Interesting discussion about how to help your manager with a very special guest. David Gergen is the author of Hearts Touched With Fire, and talks about the importance of the relationship between a manager and a direct report.
Good Monday, Already time to share new reading notes. Here is a list of all the articles, blog posts, and podcast episodes that catch my interest during the week.
If you think you may have interesting content, share it!
Cloud
MySQL and PostgreSQL… in Azure! (Sarah Dutkiewicz) - This short post shares information about our different SQL options in Azure.
GitHub Pages now uses Actions by default (Chris Patterson, Yoann Chaud) - That's excellent news! I have a few GitHub pages and Jekyll too. Look like fun little projects are coming up.
Heap Sort in C# (Code Maze) - It was nice to refresh my memory about this sort of algorithm. Remembering the details and performance; nice post.
Prompting Developers to Install Recommended Azure Tools (John Kilmister) - I started to do this to make it easier when working on that project from a different machine and to ease the onboarding experience. It is simple and it makes a difference.
Podcast
Measuring DevSecOps with Victoria Almazova (.NET Rocks!) - DevSecOps, what's that? Security, yes, but to what limit, so many great questions are discussed in this nice episode.
Photographing Home with Mylo Fowler (Wild Ideas Worth Living) - This post is a great example that there are so many completely different journeys to reach your destination. Follow yours and enjoy it as much as you can.
Good Monday, it's time to share new ReadingNotes. Here is a list of all the articles, and blog posts, that catch my interest during the week.
If you think you may have interesting content, share it!
Cloud
Azure App Containers (Kevin Logan) - An interesting post that shares the first contact and spets with Azure container Apps. Where to learn, how to build what is included.
Good Monday, it's time to share new reading notes. Here is a list of all the articles, blog posts, and podcast episodes that catch my interest during the week.
If you think you may have interesting content, share it!
Keep your experiments separate (Jessica Joy Kerr) - This post shares good practices when adding features to our app... Because we never know the full impact when we start.
Static code analysis with NDepend (Andreas Nesheim) - I'm always curious about those tools. I think they could also be useful when connected to your CICD and automation processes.
When WebAssembly Replaces Docker (B. Cameron Gain) - Interesting post that explains why WASM is indeed more interesting than docker in some scenarios.
Yes I know one day later, but it's still time to share my reading notes.
Those are a curated list of all the articles, blog posts, podcast episodes, and books that catch my interest during the week and that I found interesting. It's a mix of the actuality and what I consumed.
If you think you may have interesting content, share it!
Cloud
50 shades of .NET on AWS (François Bouteruche) - A nice, like-real, story that helps understand how decisions are taken when planning in cloud architecture (here AWS).
Development Container CLI (Brigit Murtaugh) - Oh! This is fantastique, I need to try that, I'm assuming we will be able to give a name to the instance and that it will make reopening a container easier.
The Azure Cosmos DB Journey to .NET 6 - .NET Blog (Vinod Sridharan) - Learn how Azure Cosmo DB API gateway is low latency and use .Net in many different scenarios to achieve great performance, in this post.
Good Monday, Already time to share new reading notes. Here is a list of all the articles, blog posts, and podcast episodes that catch my interest during the week.
If you think you may have interesting content, share it!
I love Dev Containers, I use them a lot for most of my development. One of my favorite options is to clone a repository directly in a docker volume.
It takes a few seconds and you can work on your code without installing any SDKs or language that your current machine doesn't have. Marvelous!
Ideally, at the end of your session, you push your code to another repository (ex: GitHub). However, sometimes I forget or am interrupted I start working on something else, and my changes are not pushed.
How do you re-open that environment?! In this post, I want to share two ways that I use.
Open Recent
The first method is to use the history of the editor! For example, here in Visual Studio Code, select the File menu and Open Recent.
If you didn't open too many files since you used that dev container, it should be present as displayed in the image. It should look like: <Name of the repository> in a unique [Dev Container].
Make sure docker is already running and select it. Voila, in a snap you are back into the dev environment with your last changes waiting for you.
Open the Container
There are a few different options to do the next solution, I will share the one I consider the easiest for the people who are not Docker experts.
First, if not already present to your VSCode, add the Docker extension identifier:
ms-azuretools.vscode-docker. Then from this new extension in the top section named containers search for your container. It should start with "vsc", for Visual Studio Code, then hyphen the name of the repository you cloned. Right-click on it and select start. After a few seconds, the container should have a little green triangle on its side and be ready to continue.
The next step consists of attaching the container to VSCode. Once more, from the Docker extension, right-click on the container and select Attach Visual Studio Code.
This will open a new VSCode window, we are mostly done but there is one last step to do. You will notice that the file explorer is empty. No worries we will fix everything with this last step. The terminal should be open in the home folder of the root user. Let's open our project folder by executing the command:
cd /workspaces/<repository-name>
Then the final command is to re-open VSCode in this folder and let the Dev Container do his magic. Execute the command:
code . -r
(the -r is to re-use the same VSCode windows. It's optional, if not provided it will open a new VSCode instance.)
And voila! The Dev Container is just as it was before.
If you know other ways to achieve this, leave a comment or reach out, I'm always happy to learn more.
Good Monday, Already time to share new reading notes. Here is a list of all the articles, blog posts, and podcast episodes that catch my interest during the week.
If you think you may have interesting content, share it!
Build configuration for Azure Static Web Apps (craigshoemaker, anthonychu, Reshmi-Sriram, changeworld) - Continuous deployment is so powerful it is very useful to understand the options and how you can set your things together.
It's Monday, time to share my reading notes. Those are a curated list of all the articles, blog posts, podcast episodes, and books that catch my interest during the week and that I found interesting. It's a mix of the actuality and what I consumed.
If you think you may have interesting content, share it!
Configure Azure Cosmos DB Continuous Backups (Rajendra Gupta) - Backup can be so powerful! You could return in time just before an error to understand what happens... Or so many other scenarios.
How To Run PowerShell Scripts (Brien Posey) - A script can be frightening at first, but this nice post will help you to understand them better. Perfect for less technical people.
Introducing Qodana for Azure Pipelines (Anastasia Khramushina) - Qodana is can analyze your code in CICD on many platforms, and now also in the Azure DevOps.
I recently wanted to create animated GIFs from videos. The idea was to get video previews, in a very lightweight file. After a quick search online, I found FFMPEG, a fantastic multimedia framework to manipulate media. There is also a few wrappers that exists in different languages (ex: C#, JavaScript) but you still need to install FFMPEG locally, and I didn't want that. In fact, I wanted a simple solution that doesn't require any installation locally and something in the cloud. In this post, I want to share how I achieved the first one.
All the code and the container are available on Github and Docker Hub.
First Contact
The ffmpeg framework is very powerful and can do so many things; therefore it's normal that it has a ton of possible parameters and extensions. After time spent on the documentation and a few trials and errors, I found how to do exactly what I needed calling it this way:
This will create a five second animated GIF from a video. It speeds up the video and lowers the framerate of the GIF to keep the output lightweight. Here is an example.
This is great, but this is not very friendly. How can someone who only creates a video once in a while be expected to remember all those parameters?! And even harder, when the video is vertical some parameters have different values. It was time to simplify, and here is how I did it. Note that I'm a Docker beginner and if you think there is a simpler or better way to do some steps, let me know, and let's learn together.
The Plan
The plan is simple: execute a simple Docker command like docker run fboucher/aciffmpeg -i NotInTheSky.mp4 and generate a video preview. To build our ephemeral container we will start with something lightweight like alpine, install ffmpeg and add a script that would be executed as the container runs. That sounds like an excellent plan, let's do it!
Writing the Script
The script is simple, but I learned a few things writing it. This is why it's included in this post. The goal was simple: execute the ffmpeg command using some values from the parameters: file path, and if the video is vertical. Here is the script:
#!/bin/sh
while getopts ":i:v" opt; do
case $opt in
i) inputFile="$OPTARG"
;;
v) isVertical=true
;;
\?) echo "Invalid option -$OPTARG" >&2
exit 1
;;
esac
case $OPTARG in
-*) echo "Option $opt needs a valid argument"
exit 1
;;
esac
done
if [ -z "$isVertical" ]; then isVertical=false; fi
# used for bash
#IFS='.'
#read -a filePart <<< "$inputFile"
#outputFile="${filePart[0]}.gif"
# used for dash
filename=$(echo "$inputFile" | cut -d "." -f 1)
outputFile="$filename.gif"
if $isVertical
then
ffmpeg -r 60 -i $inputFile -loop 0 -vf scale=-1:320 -c:v gif -f gif -ss 00:00:00.500 -r 10 -t 5 - > $outputFile
else
ffmpeg -r 60 -i $inputFile -loop 0 -vf scale=320:-1 -c:v gif -f gif -ss 00:00:00.500 -r 10 -t 5 - > $outputFile
fi
Things I learned: Parameter without values
The script needs to be as friendly as possible, therefore any unnecessary information should be removed. Most videos will be horizontal, so let's make the parameter optional. However, I don't want users to have to specify the value script.sh -i myvideo.mp4 -v true but instead script.sh -i myvideo.mp4 -v. This is very simple to do, once you know it. On the first line of code when I get the parameters: getopts ":i:v" notes that there is no ":" after the "v". This is to specify that we are not expecting any values.
Things I Learned: Bash and Dash
As mentioned earlier the container will be built from Alpine. And Alpine doesn't have bash but instead uses dash as a shell. It's mostly the same, but there are some differences. The first one will be the shebang (aka "#!/bin/sh" on the first line). And the second was the string manipulation. To generate a new file with the same name but a different extension of the script, split the file name at the ".". This can be done IFS ... read... <<< command (commented in the script) on bash but this will give syntax error: unexpected redirection and this is because there is no <<< in bash. Instead, you need to use the command cut -d "." -f 1 (where -d specifies the CHAR to use as the delimiter, and -f return only this field).
Building the image
It's now time to connect all the dots in the dockerfile.
FROM alpine:3.13
LABEL Name=aciffmpeg Version=0.0.2
RUN apk add ffmpeg
COPY ./src/myscript.sh /
RUN chmod +x /myscript.sh
ENTRYPOINT ["/myscript.sh"]
The file is not extremely complex but let’s pass through it line by line.
We start FROM Alpine version 3.13 and apply a LABEL.
RUN Will execute the command to install ffmpeg. The apk is the default utility on Alpine to install apps just like apt on Ubuntu.
COPY Is copying the script from our local machine into the container at the root.
The second RUN command is to make sure the script is executable.
Finally, ENTRYPOINT will allow us to configure the container to run as an executable in this case as the script. All parameters passed to Docker will be passed to the script.
The only things left now are to build, tag, and push it on Docker Hub.
And now to create a preview of any video you just need to map a volume and specify the file path and optionally mention if the video is vertical.
On Linux/ WSL the command would look like this:
docker run -v /mnt/c/dev/test:/video fboucher/aciffmpeg -i /video/sample.mp4 -v
And on PowerShell like that:
docker run -v c/dev/test:/video fboucher/aciffmpeg -i /video/sample.mp4 -v
I learned a lot about Docker doing that project and now I have a very useful tool. What are the tools you built using containers that simplify your life or work?
It's been five hundred weeks, this is more than nine years! Who knew I will keep doing that for so long...
If you are new around here, welcome, The Reading Notes are a curated list of all the articles, blog posts, podcast episodes, and books that catch my interest during the week and that I found interesting. It's a mix of the actuality and what I consumed.
If you think you may have interesting content, share it!
Cloud
Bicep Access policies and Managed Identity (Gregor Suttie) - This is a nice post that connects docs pages and different blog posts and information so we have the big picture.
Cloud-Native Application Security (Samir Behara) - This post is listing so many best practices, patterns, and anti-patterns, it is a must for any "cloud-native people".
Greg on The Genius of Routine (What's Essential) - Habits are very powerful tools in our toolbox for so many things... It's worth learning more about it.