[{"data":1,"prerenderedAt":527},["Reactive",2],{"navigation":3,"/posts/gitpod":204,"/posts/gitpod-surround":498},[4,192,200],{"title":5,"_path":6,"children":7,"icon":191},"Blog","/posts",[8,11,14,17,20,23,26,29,32,35,38,41,44,47,50,53,56,59,62,65,68,71,74,77,80,83,86,89,92,95,98,101,104,107,110,113,116,119,122,125,128,131,134,137,140,143,146,149,152,155,158,161,164,167,170,173,176,179,182,185,188],{"title":9,"_path":10},"Testing your API with REST Client","/posts/testing-your-api-with-rest-client",{"title":12,"_path":13},"HTML templating in Xamarin","/posts/html-templating-in-xamarin",{"title":15,"_path":16},"Goodbye Azure Portal, Welcome Azure CLI","/posts/welcome-azure-cli",{"title":18,"_path":19},"Coming across Gitpod","/posts/gitpod",{"title":21,"_path":22},"Handle token retrieval while querying an API","/posts/delegating-handler",{"title":24,"_path":25},"Clean up your local git branches.","/posts/cleaning-git-branches",{"title":27,"_path":28},"Automate configuration of Teams Tab SSO with PowerShell.","/posts/teams-sso-powershell",{"title":30,"_path":31},"How to do a technology watch? - Part 1","/posts/technology-watch-part1",{"title":33,"_path":34},"How to do a technology watch? - Part 2","/posts/technology-watch-part2",{"title":36,"_path":37},"You almost no longer need Key Vault references for Azure Functions.","/posts/azure-functions-custom-configuration",{"title":39,"_path":40},"How to do a technology watch? - Part 3","/posts/technology-watch-part3",{"title":42,"_path":43},"Forget DevOps, the future is already here!","/posts/devops-future",{"title":45,"_path":46},"Week 9, 2021 - Tips I learned this week","/posts/w09-2021-tips-learned-this-week",{"title":48,"_path":49},"Week 12, 2021 - Tips I learned this week","/posts/w12-2021-tips-learned-this-week",{"title":51,"_path":52},"Week 14, 2021 - Tips I learned this week","/posts/w14-2021-tips-learned-this-week",{"title":54,"_path":55},"Once upon a time in .NET","/posts/once-upon-a-time-in-dotnet",{"title":57,"_path":58},"Install your applications with winget","/posts/winget-import",{"title":60,"_path":61},"Customize your applications when installing them with winget","/posts/winget-override",{"title":63,"_path":64},"Week 22, 2021 - Tips I learned this week","/posts/w22-2021-tips-learned-this-week",{"title":66,"_path":67},"How to connect to an Azure SQL Database from C# using Azure AD","/posts/sqlclient-active-directory-authent",{"title":69,"_path":70},"Producing packages for Windows Package Manager","/posts/wingetcreate",{"title":72,"_path":73},"4 tips about GitHub Actions environment variables and contexts","/posts/github-actions-var-and-context",{"title":75,"_path":76},"AzureWebJobsStorage, the secret you don't need in your Function App.","/posts/azure-functions-without-azurewebjobsstorage",{"title":78,"_path":79},"ASP.NET Core - Lost in configuration","/posts/lost-in-configuration",{"title":81,"_path":82},"Week 39, 2021 - Tips I learned this week","/posts/w39-2021-tips-learned-this-week",{"title":84,"_path":85},"Week 41, 2021 - Tips I learned this week","/posts/w41-2021-tips-learned-this-week",{"title":87,"_path":88},"Migrating and open-sourcing my blog","/posts/migrating-blog",{"title":90,"_path":91},"Week 45, 2021 - Tips I learned this week","/posts/w45-2021-tips-learned-this-week",{"title":93,"_path":94},"Organize your GitHub stars with Astral","/posts/astral",{"title":96,"_path":97},"Pulumi with an Azure Blob Storage backend","/posts/pulumi-azure-backend",{"title":99,"_path":100},"IaC Hot Reload with Pulumi Watch","/posts/pulumi-watch",{"title":102,"_path":103},"Week 2, 2022 - Tips I learned this week","/posts/w02-2022-tips-learned-this-week",{"title":105,"_path":106},"Week 3, 2022 - Tips I learned this week","/posts/w03-2022-tips-learned-this-week",{"title":108,"_path":109},"Week 5, 2022 - Tips I learned this week","/posts/w05-2022-tips-learned-this-week",{"title":111,"_path":112},"How to provision an Azure SQL Database with Active Directory authentication","/posts/sqldatabase-active-directory-authent",{"title":114,"_path":115},"Why will I choose Pulumi over Terraform for my next project?","/posts/pulumi-vs-terraform",{"title":117,"_path":118},"Week 19, 2022 - Tips I learned this week","/posts/w19-2022-tips-learned-this-week",{"title":120,"_path":121},"Week 20, 2022 - Tips I learned this week","/posts/w20-2022-tips-learned-this-week",{"title":123,"_path":124},"Keeping secrets secure when using API Clients","/posts/http-clients-secrets",{"title":126,"_path":127},"What made me want to be a developer?","/posts/be-a-developer",{"title":129,"_path":130},"What can we do when stuck with a programming problem?","/posts/get-unstuck",{"title":132,"_path":133},"How did I automate the setup of my developer Windows laptop?","/posts/automate-developer-machine",{"title":135,"_path":136},"Discussion about API clients","/posts/http-clients",{"title":138,"_path":139},"Week 46, 2022 - Tips I learned this week","/posts/w46-2022-tips-learned-this-week",{"title":141,"_path":142},"When Pulumi met Nuke: a .NET love story","/posts/when-pulumi-met-nuke",{"title":144,"_path":145},"A year of learning and sharing - Dev Retro 2022","/posts/2022-retro",{"title":147,"_path":148},"Perform Dynamic Execution of an npm Package","/posts/pnpm-dlx",{"title":150,"_path":151},"Manage multiple Node.js versions","/posts/pnpm-env",{"title":153,"_path":154},"Introducing the Vue.js CI/CD series","/posts/vuecicd-introduction",{"title":156,"_path":157},"Execute commands using your project dependencies","/posts/pnpm-exec",{"title":159,"_path":160},"Vue.js CI/CD: Continuous Integration","/posts/vuecicd-ci",{"title":162,"_path":163},"Who is using pnpm?","/posts/pnpm-who-is-using",{"title":165,"_path":166},"Create an Azure-Ready GitHub Repository using Pulumi","/posts/azure-ready-github-repository",{"title":168,"_path":169},"Deploying to Azure from Azure DevOps without secrets","/posts/ado-workload-identity-federation",{"title":171,"_path":172},"Effortlessly Configure GitHub Repositories for Azure Deployment via OIDC","/posts/scripting-azure-ready-github-repository",{"title":174,"_path":175},"Playing with the .NET 8 Web API template","/posts/playing-with-dotnet8",{"title":177,"_path":178},"Another year of sharing and learning - Dev Retro 2023","/posts/2023-retro",{"title":180,"_path":181},"Week 4, 2024 - Tips I learned this week","/posts/w04-2024-tips-learned-this-week",{"title":183,"_path":184},"Using dependency injection with Azure .NET SDK","/posts/azure-sdk-di",{"title":186,"_path":187},"Having Fun With IT Event Calendars","/posts/it-event-calendars",{"title":189,"_path":190},"Call your Azure AD B2C protected API with authenticated HTTP requests from your JetBrains IDE","/posts/http-clients-oauth2","i-heroicons-newspaper",{"title":193,"_path":194,"children":195,"icon":199},"Goodies","/goodies",[196],{"title":197,"_path":198},"My Git Cheat Sheet","/goodies/gitcheatsheet","i-heroicons-gift-solid",{"title":201,"_path":202,"icon":203},"About","/about","i-heroicons-user-circle-solid",{"_path":19,"_dir":205,"_draft":206,"_partial":206,"_locale":207,"title":18,"description":208,"lead":209,"date":210,"image":211,"tags":213,"badge":217,"body":219,"_type":493,"_id":494,"_source":495,"_file":496,"_extension":497},"posts",false,"","The other day when I was looking for a way to automate my development environment setup, I came across Gitpod. Not really what I was looking for but I discovered an awesome tool for working on open source projects.","An IDE in the browser","2019-08-12T00:00:00.000Z",{"src":212},"/images/github-usbkey.jpg",[214,215,216],"GitHub","tooling","vscode",{"label":218},"Tooling",{"type":220,"children":221,"toc":490},"root",[222,241,246,277,282,296,319,348,363,368,383,388,393,402,420,438,443,485],{"type":223,"tag":224,"props":225,"children":226},"element","p",{},[227,230,239],{"type":228,"value":229},"text","The other day when I was looking for a way to automate my development environment setup, I came across ",{"type":223,"tag":231,"props":232,"children":236},"a",{"href":233,"rel":234},"https://www.gitpod.io/",[235],"nofollow",[237],{"type":228,"value":238},"Gitpod",{"type":228,"value":240},". Not really what I was looking for but I discovered an awesome tool for working on open source projects.",{"type":223,"tag":224,"props":242,"children":243},{},[244],{"type":228,"value":245},"Gitpod is an online service that aims at providing ready-to-code development environments in the browser for GitHub projects.",{"type":223,"tag":224,"props":247,"children":248},{},[249,251,258,260,267,269,275],{"type":228,"value":250},"Let's see that with one project I was contributing to a few months ago: the ",{"type":223,"tag":231,"props":252,"children":255},{"href":253,"rel":254},"https://github.com/voxxrin/voxxrin-companion-ui",[235],[256],{"type":228,"value":257},"Voxxrin Companion mobile app",{"type":228,"value":259},".\nFirst, let's go to the project GitHub's page, and prefix the URL of the page with ",{"type":223,"tag":261,"props":262,"children":264},"code",{"className":263},[],[265],{"type":228,"value":266},"gitpod.io/#",{"type":228,"value":268}," which gives us the following URL: ",{"type":223,"tag":231,"props":270,"children":273},{"href":271,"rel":272},"http://gitpod.io/#https://github.com/voxxrin/voxxrin-companion-ui",[235],[274],{"type":228,"value":271},{"type":228,"value":276},".",{"type":223,"tag":224,"props":278,"children":279},{},[280],{"type":228,"value":281},"As I am already logged in to the  Gitpod account I created (free for open source developers with a quota of 100 hours/month) Gitpod will start creating a development environment for me. That means pulling a Docker image with everything I need to code (for specific needs, you can also specify a custom docker image to use) and initializing a workspace for me with the code of the project.",{"type":223,"tag":224,"props":283,"children":284},{},[285,287],{"type":228,"value":286},"Less than 30s and here we are :\n",{"type":223,"tag":288,"props":289,"children":295},"img",{"alt":290,"className":291,"src":294},"Voxxr.in project opened in gitpod in browser.",[292,293],"rounded-lg","mx-auto","/posts/images/gitpod_voxxrin_1.png",[],{"type":223,"tag":224,"props":297,"children":298},{},[299,301,308,310,317],{"type":228,"value":300},"I have now a complete development environment running in the cloud with the code of my project already cloned. If the editor looks familiar to you it's because ",{"type":223,"tag":231,"props":302,"children":305},{"href":303,"rel":304},"https://www.theia-ide.org/",[235],[306],{"type":228,"value":307},"Theia",{"type":228,"value":309}," (the IDE's name) is very similar to ",{"type":223,"tag":231,"props":311,"children":314},{"href":312,"rel":313},"http://typefox.io/theia-vs-code-in-the-cloud",[235],[315],{"type":228,"value":316},"VS Code but in the cloud",{"type":228,"value":318}," (it reuses many parts from VS Code). This is great because it means I can use an IDE I am already familiar with, and even use vs code extensions (provided you have the .vsix files to install them).",{"type":223,"tag":224,"props":320,"children":321},{},[322,324,330,332,338,340,346],{"type":228,"value":323},"So let's run my project which is an ionic application. Node is already installed so I just have to type ",{"type":223,"tag":261,"props":325,"children":327},{"className":326},[],[328],{"type":228,"value":329},"npm install",{"type":228,"value":331}," and then ",{"type":223,"tag":261,"props":333,"children":335},{"className":334},[],[336],{"type":228,"value":337},"npm run-script serve",{"type":228,"value":339}," in the terminal opened in the editor exactly as if I was working on my local VS Code. My application is configured to be launched on port ",{"type":223,"tag":261,"props":341,"children":343},{"className":342},[],[344],{"type":228,"value":345},"8100",{"type":228,"value":347}," so Gitpod will suggest I expose this port for me to be able to view my application in my browser.",{"type":223,"tag":224,"props":349,"children":350},{},[351,357],{"type":223,"tag":288,"props":352,"children":356},{"alt":353,"className":354,"src":355},"GitPod suggestion of opening port to run the application.",[292,293],"/posts/images/gitpod_voxxrin_2.png",[],{"type":223,"tag":288,"props":358,"children":362},{"alt":359,"className":360,"src":361},"GitPod suggestion of opening live preview of the application.",[292,293],"/posts/images/gitpod_voxxrin_3.png",[],{"type":223,"tag":224,"props":364,"children":365},{},[366],{"type":228,"value":367},"I can now open in my computer browser the application running in my Gitpod workspace. I can also preview it directly in Gitpod.",{"type":223,"tag":224,"props":369,"children":370},{},[371,377],{"type":223,"tag":288,"props":372,"children":376},{"alt":373,"className":374,"src":375},"Voxxr.in application served in a browser tab.",[292,293],"/posts/images/gitpod_voxxrin_5.png",[],{"type":223,"tag":288,"props":378,"children":382},{"alt":379,"className":380,"src":381},"Voxxr.in application served in GitPod tab.",[292,293],"/posts/images/gitpod_voxxrin_4.png",[],{"type":223,"tag":224,"props":384,"children":385},{},[386],{"type":228,"value":387},"If I have some modifications to do I can push them directly from here to my GitHub repository as my Gitpod account is associated with my GitHub account.",{"type":223,"tag":224,"props":389,"children":390},{},[391],{"type":228,"value":392},"When I have finished, I can just stop the workspace and that's it.",{"type":223,"tag":224,"props":394,"children":395},{},[396],{"type":223,"tag":288,"props":397,"children":401},{"alt":398,"className":399,"src":400},"GitPod menu to stop the workspace.",[292,293],"/posts/images/gitpod_voxxrin_7.png",[],{"type":223,"tag":224,"props":403,"children":404},{},[405,407,418],{"type":228,"value":406},"I created the workspace for my project as-is but lots of things can be configured by having a ",{"type":223,"tag":231,"props":408,"children":411},{"href":409,"rel":410},"https://www.gitpod.io/docs/41_config_gitpod_file/",[235],[412],{"type":223,"tag":261,"props":413,"children":415},{"className":414},[],[416],{"type":228,"value":417},"gitpod.yml",{"type":228,"value":419}," file in the repository of your project",{"type":223,"tag":224,"props":421,"children":422},{},[423,425,436],{"type":228,"value":424},"With Gitpod you just need a browser and an internet connection to be able to work on any of your GitHub projects from anywhere. When you work on multiple open source projects the nice thing is that it allows you to easily switch from one to another. I wonder if the Browser-Based Web Companion ",{"type":223,"tag":231,"props":426,"children":429},{"href":427,"rel":428},"https://devblogs.microsoft.com/visualstudio/intelligent-productivity-and-collaboration-from-anywhere/",[235],[430],{"type":223,"tag":431,"props":432,"children":433},"strong",{},[434],{"type":228,"value":435},"Visual Studio Online",{"type":228,"value":437}," announced by Microsoft at Build 2019 will offer the same capabilities and how it will differ from Gitpod.",{"type":223,"tag":224,"props":439,"children":440},{},[441],{"type":228,"value":442},"This was just a quick introduction to Gitpod but there are far more things you can do with it:",{"type":223,"tag":444,"props":445,"children":446},"ul",{},[447,460,465,470,475,480],{"type":223,"tag":448,"props":449,"children":450},"li",{},[451,453,458],{"type":228,"value":452},"running scripts on the start-up of your environment  (an ",{"type":223,"tag":261,"props":454,"children":456},{"className":455},[],[457],{"type":228,"value":329},{"type":228,"value":459}," for instance)",{"type":223,"tag":448,"props":461,"children":462},{},[463],{"type":228,"value":464},"continuously auto-building your repository",{"type":223,"tag":448,"props":466,"children":467},{},[468],{"type":228,"value":469},"install a database",{"type":223,"tag":448,"props":471,"children":472},{},[473],{"type":228,"value":474},"use it for private projects (not free, there are multiple pricings available)",{"type":223,"tag":448,"props":476,"children":477},{},[478],{"type":228,"value":479},"share an environment with other users",{"type":223,"tag":448,"props":481,"children":482},{},[483],{"type":228,"value":484},"...",{"type":223,"tag":224,"props":486,"children":487},{},[488],{"type":228,"value":489},"But the best is you try and judge by yourself.",{"title":207,"searchDepth":491,"depth":491,"links":492},2,[],"markdown","content:1.posts:4.gitpod.md","content","1.posts/4.gitpod.md","md",[499,514],{"_path":22,"_dir":205,"_draft":206,"_partial":206,"_locale":207,"title":21,"description":500,"lead":501,"date":502,"image":503,"badge":505,"tags":507,"_type":493,"_id":512,"_source":495,"_file":513,"_extension":497},"In our daily job, we often have to query secure REST APIs that require our HTTP requests to have a valid access token in their Authorization header.\nOf course, many APIs come with an SDK that makes the job easier for us as it directly takes care of retrieving a token and sending the authenticated HTTP requests.\nHowever, it is not always the case and knowing how to implement that using HttpClient, IMemoryCache, and DelegatingHandler can become pretty useful.","Using a DelegatingHandler","2020-01-29T00:00:00.000Z",{"src":504},"/images/keyboard_1.jpg",{"label":506},"Development",[508,509,510,511],"HTTP","rest","ASP.NET Core",".NET","content:1.posts:5.delegating-handler.md","1.posts/5.delegating-handler.md",{"_path":16,"_dir":205,"_draft":206,"_partial":206,"_locale":207,"title":15,"description":515,"lead":516,"date":517,"image":518,"badge":520,"tags":521,"_type":493,"_id":525,"_source":495,"_file":526,"_extension":497},"Let's jum into Azure CLI to manage Azure resources. The article will show the syntax, the main functionalities and some less-known features like Azure CLI interactive mode.","Let's jump into Azure CLI!","2019-04-08T00:00:00.000Z",{"src":519},"/images/green-characters.jpg",{"label":218},[522,523,524],"Azure CLI","Azure","shell","content:1.posts:3.welcome-azure-cli.md","1.posts/3.welcome-azure-cli.md",1716749612156]