[{"data":1,"prerenderedAt":852},["Reactive",2],{"navigation":3,"aAII9Cz3yR":204,"tags-Application Insights":397},[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",[205,207,209,211,214,217,220,223,226,229,231,234,237,240,242,244,247,250,253,255,258,261,264,267,270,273,276,279,282,285,287,289,292,294,297,300,303,305,308,310,313,316,319,322,325,327,329,332,335,338,341,344,347,350,353,356,359,361,363,366,369,372,375,377,380,383,385,388,391,394],[206,206],"tooling",[208,208],"vscode",[210,210],"rest",[212,213],"http","HTTP",[215,216],"razor","Razor",[218,219],"xamarin","Xamarin",[221,222],"templating","Templating",[224,225],"azure-cli","Azure CLI",[227,228],"azure","Azure",[230,230],"shell",[232,233],"github","GitHub",[235,236],"asp-net-core","ASP.NET Core",[238,239],"net",".NET",[241,241],"git",[243,243],"nushell",[245,246],"microsoft-teams","Microsoft Teams",[248,249],"powershell","PowerShell",[251,252],"azure-active-directory","Azure Active Directory",[254,254],"learning",[256,257],"azure-functions","Azure Functions",[259,260],"azure-key-vault","Azure Key Vault",[262,263],"configuration","Configuration",[265,266],"devops","DevOps",[268,269],"it","IT",[271,272],"tips-learned-this-week","tips learned this week",[274,275],"windows-terminal","Windows Terminal",[277,278],"azure-pipelines","Azure Pipelines",[280,281],"application-insights","Application Insights",[283,284],"azure-iot","Azure IoT",[286,286],"records",[288,288],"refit",[290,291],"development-box-setup","development box setup",[293,293],"winget",[295,296],"package-manager","package manager",[298,299],"azure-sql-database","Azure SQL Database",[301,302],"azure-sdk","Azure SDK",[304,304],"wingetcreate",[306,307],"github-actions","GitHub Actions",[309,309],"jq",[311,312],"pulumi","Pulumi",[314,315],"iac","IaC",[317,318],"azure-storage","Azure Storage",[320,321],"azure-signalr","Azure SignalR",[323,324],"visio","Visio",[326,326],"csharp",[328,328],"jest",[330,331],"statiq","Statiq",[333,334],"open-source","open source",[336,337],"visual-studio","Visual Studio",[339,340],"vue-js","Vue.js",[342,343],"azure-devops","Azure DevOps",[345,346],"vite","Vite",[348,349],"code-analysis","Code analysis",[351,352],"diagram","Diagram",[354,355],"terraform","Terraform",[357,358],"typescript","TypeScript",[360,360],"thoughts",[362,362],"pnpm",[364,365],"nuke","Nuke",[367,368],"pipelines","Pipelines",[370,371],"cicd","CI/CD",[373,374],"openid-connect","OpenID Connect",[376,376],"security",[378,379],"github-cli","GitHub CLI",[381,382],"microsoft-entra-id","Microsoft Entra ID",[384,384],"advent",[386,387],"finops","FinOps",[389,390],"anglesharp","AngleSharp",[392,393],"oauth2","OAuth2",[395,396],"azure-ad-b2c","Azure AD B2C",[398],{"_path":49,"_dir":399,"_draft":400,"_partial":400,"_locale":401,"title":48,"description":402,"lead":403,"date":404,"image":405,"badge":407,"tags":409,"body":410,"_type":847,"_id":848,"_source":849,"_file":850,"_extension":851},"posts",false,"","This week I learned a few things related to versioning an application","Version in git tag with Azure Pipelines and in application insight logs.","2021-03-26T00:00:00.000Z",{"src":406},"/images/surface_1.jpg",{"label":408},"Tips",[272,241,278,281],{"type":411,"children":412,"toc":843},"root",[413,420,427,441,446,471,476,570,607,620,666,678,684,697,709,714,741,832,837],{"type":414,"tag":415,"props":416,"children":417},"element","p",{},[418],{"type":419,"value":402},"text",{"type":414,"tag":421,"props":422,"children":424},"h2",{"id":423},"create-a-git-tag-from-an-azure-pipeline",[425],{"type":419,"value":426},"Create a git tag from an Azure Pipeline.",{"type":414,"tag":415,"props":428,"children":429},{},[430,432,439],{"type":419,"value":431},"Creating a git tag for your repository stored in Azure DevOps can be done quite easily by creating a tag in your local repository and pushing it to Azure DevOps or by simply manually creating it from the ",{"type":414,"tag":433,"props":434,"children":436},"code",{"className":435},[],[437],{"type":419,"value":438},"Tags",{"type":419,"value":440}," page in Azure DevOps. So why bother creating a tag from an Azure Pipeline?",{"type":414,"tag":415,"props":442,"children":443},{},[444],{"type":419,"value":445},"Doing things manually is error-prone and takes time, so for repetitive tasks, it is a good idea to automate them. And Azure Pipelines are great at automating things especially when it is relative to building or deploying code. In my team what we wanted was to have our CI/CD pipeline compute in what version was the code we were building and automatically tag the commit built with that version.",{"type":414,"tag":415,"props":447,"children":448},{},[449,451,460,462,469],{"type":419,"value":450},"Computing the version in an azure pipeline is not the topic here, so let's just say there are multiple ways to do that like using ",{"type":414,"tag":452,"props":453,"children":457},"a",{"href":454,"rel":455},"https://docs.microsoft.com/en-us/azure/devops/pipelines/process/expressions?view=azure-devops#counter",[456],"nofollow",[458],{"type":419,"value":459},"variables and the counter expression",{"type":419,"value":461}," or using the ",{"type":414,"tag":452,"props":463,"children":466},{"href":464,"rel":465},"https://marketplace.visualstudio.com/items?itemName=gittools.gittools",[456],[467],{"type":419,"value":468},"gitversion task",{"type":419,"value":470},".",{"type":414,"tag":415,"props":472,"children":473},{},[474],{"type":419,"value":475},"Once you know the version you can use the git command line in a script task to create the tag and push it.",{"type":414,"tag":477,"props":478,"children":482},"pre",{"className":479,"code":480,"language":481,"meta":401,"style":401},"language-yml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","- script: |\n    git tag $(VersionPreviouslyComputed)\n    git push origin $(VersionPreviouslyComputed)\n  displayName: Tag version\n  workingDirectory: $(Build.SourcesDirectory)\n","yml",[483],{"type":414,"tag":433,"props":484,"children":485},{"__ignoreMap":401},[486,515,525,534,552],{"type":414,"tag":487,"props":488,"children":491},"span",{"class":489,"line":490},"line",1,[492,498,504,509],{"type":414,"tag":487,"props":493,"children":495},{"style":494},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[496],{"type":419,"value":497},"-",{"type":414,"tag":487,"props":499,"children":501},{"style":500},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[502],{"type":419,"value":503}," script",{"type":414,"tag":487,"props":505,"children":506},{"style":494},[507],{"type":419,"value":508},":",{"type":414,"tag":487,"props":510,"children":512},{"style":511},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF;--shiki-light-font-style:italic;--shiki-default-font-style:italic;--shiki-dark-font-style:italic",[513],{"type":419,"value":514}," |\n",{"type":414,"tag":487,"props":516,"children":518},{"class":489,"line":517},2,[519],{"type":414,"tag":487,"props":520,"children":522},{"style":521},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[523],{"type":419,"value":524},"    git tag $(VersionPreviouslyComputed)\n",{"type":414,"tag":487,"props":526,"children":528},{"class":489,"line":527},3,[529],{"type":414,"tag":487,"props":530,"children":531},{"style":521},[532],{"type":419,"value":533},"    git push origin $(VersionPreviouslyComputed)\n",{"type":414,"tag":487,"props":535,"children":537},{"class":489,"line":536},4,[538,543,547],{"type":414,"tag":487,"props":539,"children":540},{"style":500},[541],{"type":419,"value":542},"  displayName",{"type":414,"tag":487,"props":544,"children":545},{"style":494},[546],{"type":419,"value":508},{"type":414,"tag":487,"props":548,"children":549},{"style":521},[550],{"type":419,"value":551}," Tag version\n",{"type":414,"tag":487,"props":553,"children":555},{"class":489,"line":554},5,[556,561,565],{"type":414,"tag":487,"props":557,"children":558},{"style":500},[559],{"type":419,"value":560},"  workingDirectory",{"type":414,"tag":487,"props":562,"children":563},{"style":494},[564],{"type":419,"value":508},{"type":414,"tag":487,"props":566,"children":567},{"style":521},[568],{"type":419,"value":569}," $(Build.SourcesDirectory)\n",{"type":414,"tag":415,"props":571,"children":572},{},[573,575,581,583,589,591,597,599,606],{"type":419,"value":574},"For this script to work, you have to ensure that the identity that executes your pipeline has the right to push a tag on your repository. Concretely you have to give the ",{"type":414,"tag":433,"props":576,"children":578},{"className":577},[],[579],{"type":419,"value":580},"contribute",{"type":419,"value":582}," permission to the ",{"type":414,"tag":584,"props":585,"children":586},"strong",{},[587],{"type":419,"value":588},"user",{"type":419,"value":590}," named ",{"type":414,"tag":433,"props":592,"children":594},{"className":593},[],[595],{"type":419,"value":596},"Project Collection Build Service ({your organization})",{"type":419,"value":598}," as described ",{"type":414,"tag":452,"props":600,"children":603},{"href":601,"rel":602},"https://docs.microsoft.com/en-us/azure/devops/pipelines/scripts/git-commands?view=azure-devops&tabs=yaml#grant-version-control-permissions-to-the-build-service",[456],[604],{"type":419,"value":605},"here",{"type":419,"value":470},{"type":414,"tag":415,"props":608,"children":609},{},[610,612,618],{"type":419,"value":611},"Moreover, you need to add an extra checkout task at the beginning of your pipeline. By default, you don't have to add this task, pipelines automatically do a checkout. But in this case, you want to set to true the parameter ",{"type":414,"tag":433,"props":613,"children":615},{"className":614},[],[616],{"type":419,"value":617},"persistsCredentials",{"type":419,"value":619}," to reuse the same credentials used for the initial checkout in the following other git operations in your pipelines.",{"type":414,"tag":477,"props":621,"children":623},{"className":479,"code":622,"language":481,"meta":401,"style":401},"- checkout: self\n  persistCredentials: true\n",[624],{"type":414,"tag":433,"props":625,"children":626},{"__ignoreMap":401},[627,648],{"type":414,"tag":487,"props":628,"children":629},{"class":489,"line":490},[630,634,639,643],{"type":414,"tag":487,"props":631,"children":632},{"style":494},[633],{"type":419,"value":497},{"type":414,"tag":487,"props":635,"children":636},{"style":500},[637],{"type":419,"value":638}," checkout",{"type":414,"tag":487,"props":640,"children":641},{"style":494},[642],{"type":419,"value":508},{"type":414,"tag":487,"props":644,"children":645},{"style":521},[646],{"type":419,"value":647}," self\n",{"type":414,"tag":487,"props":649,"children":650},{"class":489,"line":517},[651,656,660],{"type":414,"tag":487,"props":652,"children":653},{"style":500},[654],{"type":419,"value":655},"  persistCredentials",{"type":414,"tag":487,"props":657,"children":658},{"style":494},[659],{"type":419,"value":508},{"type":414,"tag":487,"props":661,"children":663},{"style":662},"--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC",[664],{"type":419,"value":665}," true\n",{"type":414,"tag":415,"props":667,"children":668},{},[669,671,677],{"type":419,"value":670},"If you are not using a Microsoft-hosted agent but your own on-premise agent, you can have a problem when you delete a tag that was created by a pipeline. Indeed tags in the local repository of an on-premise agent are not automatically fetched and pruned so your following build can fail if it tries to create a tag that still exists locally (even if does not on the remote repository). To avoid that you can do add following command in your script ",{"type":414,"tag":433,"props":672,"children":674},{"className":673},[],[675],{"type":419,"value":676},"git fetch origin refs/tags/*:refs/tags/* --prune",{"type":419,"value":470},{"type":414,"tag":421,"props":679,"children":681},{"id":680},"application-version-in-logs-in-application-insights",[682],{"type":419,"value":683},"Application version in logs in Application Insights",{"type":414,"tag":415,"props":685,"children":686},{},[687,689,695],{"type":419,"value":688},"When developing applications in Azure, Application Insights is a key component to monitor these applications. But as for many components, we sometimes do not know how to use it to its full potential.\nThis week a colleague told me about a very basic feature that I did not know about: logs in Application Insights contain the version of the application that sends the logs. Indeed there is a property ",{"type":414,"tag":433,"props":690,"children":692},{"className":691},[],[693],{"type":419,"value":694},"application_Version",{"type":419,"value":696}," in each log with the version number of the application.",{"type":414,"tag":415,"props":698,"children":699},{},[700],{"type":414,"tag":701,"props":702,"children":708},"img",{"alt":703,"className":704,"src":707},"Application Insights logs.",[705,706],"rounded-lg","mx-auto","/posts/images/w122021tips_ai_1.png",[],{"type":414,"tag":415,"props":710,"children":711},{},[712],{"type":419,"value":713},"It might look not very interesting but it can be really useful to have that in order to filter logs to a specific version in Log Analytics queries.",{"type":414,"tag":415,"props":715,"children":716},{},[717,719,725,727,732,734,739],{"type":419,"value":718},"One thing to note though is that by default Application Insights sets the ",{"type":414,"tag":433,"props":720,"children":722},{"className":721},[],[723],{"type":419,"value":724},"AssemblyVersion",{"type":419,"value":726}," in the ",{"type":414,"tag":433,"props":728,"children":730},{"className":729},[],[731],{"type":419,"value":694},{"type":419,"value":733}," property. So if you keep that by default, do not forget to set the ",{"type":414,"tag":433,"props":735,"children":737},{"className":736},[],[738],{"type":419,"value":724},{"type":419,"value":740}," with the correct version number when you build the application code. In Azure Pipelines it can be done like that:",{"type":414,"tag":477,"props":742,"children":744},{"className":479,"code":743,"language":481,"meta":401,"style":401},"- task: DotNetCoreCLI@2\n  displayName: Build\n  inputs:\n    command: build\n    arguments: -p:AssemblyVersion=$(VersionPreviouslyComputed)\n",[745],{"type":414,"tag":433,"props":746,"children":747},{"__ignoreMap":401},[748,769,785,798,815],{"type":414,"tag":487,"props":749,"children":750},{"class":489,"line":490},[751,755,760,764],{"type":414,"tag":487,"props":752,"children":753},{"style":494},[754],{"type":419,"value":497},{"type":414,"tag":487,"props":756,"children":757},{"style":500},[758],{"type":419,"value":759}," task",{"type":414,"tag":487,"props":761,"children":762},{"style":494},[763],{"type":419,"value":508},{"type":414,"tag":487,"props":765,"children":766},{"style":521},[767],{"type":419,"value":768}," DotNetCoreCLI@2\n",{"type":414,"tag":487,"props":770,"children":771},{"class":489,"line":517},[772,776,780],{"type":414,"tag":487,"props":773,"children":774},{"style":500},[775],{"type":419,"value":542},{"type":414,"tag":487,"props":777,"children":778},{"style":494},[779],{"type":419,"value":508},{"type":414,"tag":487,"props":781,"children":782},{"style":521},[783],{"type":419,"value":784}," Build\n",{"type":414,"tag":487,"props":786,"children":787},{"class":489,"line":527},[788,793],{"type":414,"tag":487,"props":789,"children":790},{"style":500},[791],{"type":419,"value":792},"  inputs",{"type":414,"tag":487,"props":794,"children":795},{"style":494},[796],{"type":419,"value":797},":\n",{"type":414,"tag":487,"props":799,"children":800},{"class":489,"line":536},[801,806,810],{"type":414,"tag":487,"props":802,"children":803},{"style":500},[804],{"type":419,"value":805},"    command",{"type":414,"tag":487,"props":807,"children":808},{"style":494},[809],{"type":419,"value":508},{"type":414,"tag":487,"props":811,"children":812},{"style":521},[813],{"type":419,"value":814}," build\n",{"type":414,"tag":487,"props":816,"children":817},{"class":489,"line":554},[818,823,827],{"type":414,"tag":487,"props":819,"children":820},{"style":500},[821],{"type":419,"value":822},"    arguments",{"type":414,"tag":487,"props":824,"children":825},{"style":494},[826],{"type":419,"value":508},{"type":414,"tag":487,"props":828,"children":829},{"style":521},[830],{"type":419,"value":831}," -p:AssemblyVersion=$(VersionPreviouslyComputed)\n",{"type":414,"tag":415,"props":833,"children":834},{},[835],{"type":419,"value":836},"And that's it for this week, happy learning!",{"type":414,"tag":838,"props":839,"children":840},"style",{},[841],{"type":419,"value":842},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":401,"searchDepth":517,"depth":517,"links":844},[845,846],{"id":423,"depth":517,"text":426},{"id":680,"depth":517,"text":683},"markdown","content:1.posts:14.w12-2021-tips-learned-this-week.md","content","1.posts/14.w12-2021-tips-learned-this-week.md","md",1716749600772]