Scheijgrond.com

Ik Google mijzelf

Update Februari 2024

Kleine gaatjes bij 3d prints

Een van de leuke projecten in de 3d print wereld is Gridfinity een modulair opbergsysteem voor vanalles en nog wat. Het is met uitstek geschikt voor het netjes opbergen van al je gereedschap. Zo wilde ik ook voor een schroevendraaier met bitjes een mooi gridfinity opbergbakje printen maar de bitjes pasten niet. Het warme plastic maakte de gaatjes gewoon kleiner dan het ontwerp. Om dit tegen te gaan heb ik in Cura Slicer de horizontal offset een negatieve waarde gegeven en dan met name de offset voor holes, die moet dan echter weer positief.

Powershell Snippits

Denk er aan powershell is script en niet gecompileerd. Als je een stuk code dus wilt kunnen hergebruiken moet het eerder in het script voorkomen anders kent de parser het nog niet.

Validate input

[CmdletBinding()]
param (
    [Parameter(Mandatory = $true)]
    [ValidateSet("tst", "acc", "prd")]
    [string]
    $environment,

    [Parameter(Mandatory = $false)]
    [ValidateLength(4, 8)]
    [string]$LengthBetween4And8

)

Powershell query voor het achterhalen van een naam op basis van objectid

az ad sp show --id {objectid}

Force refresh

When importing a module ensure you have the latest version. Add the -Force parameter.

Import-Module .\Get-EnvironmentSettings.psm1 -Force;

Read-Host for user input

Get input from the user using Read-Host.

            Write-Host "Do you wish to update this this file :" $fileName
            $userResult = Read-Host "Enter (Q)uit, (Y)es, (N)o or (A)ll"

Create custom object for settings

Add a custom object to easily transfer multiple properties.

$settings = New-Object PSObject -Property @{
    subscriptionid = '{someid}'
    account = '{someaccount}'
    keyVault       = '{somekeyvault}'
}

Errorhandling

When catching an error you have two options $Error[0] will contain the last error. It can contain multiple errors. The last error can also be identified with $_

    catch [System.Exception] {
        # Use $Error[0] to check the last error
        Write-Warning $Error[0]
        $errorMessage = $_.Exception.Message
    }

Tracked properties zoeken

In Azure Logic apps is het mogelijk om tracked properties toe te voegen zodat deze vindbaar worden in de logging. Onderstaande query vindt de tracked properties en zet ze in eigen kolommen.

//Only search the logic apps in the parameters SelectedLogicApp
letlogicappnames=dynamic([{SelectedLogicApp}]); 

AppTraces 
|wherePropertiescontains"trackedProperties" 
|wherearray_length(logicappnames)==0  orAppRoleNamein~(logicappnames) 
|projectTimeGenerated,Properties,AppRoleName 
|extendtp=parse_json(tostring(parse_json(tostring(Properties.prop__properties)).trackedProperties)) 
|extendRunID=tostring(Properties.prop__clientTrackingId) 
|evaluatebag_unpack(tp) 
//Search for the parameter SearchValue
|where"{SearchValue}"==""or*contains"{SearchValue}" 
|orderbyTimeGenerateddesc 
|project-awayProperties 

Let en Lambda in Excel

LET kan je tussenresultaten gebruiken ook meerdere inline.
altijd eerst de naam dan de waarde. De waarde kan ook weer een formule zijn.
De laatste is altijd een formule waar de waarde van teruggegeven gaat worden.

Goed voorbeeld, als we een bepaalde waarde meermaals willen gebruiken in een formule. Bijvoorbeeld als een gemiddeld cijfer onder de 6 is, dan is het een onvoldoende. Tussen 6 en 7 voldoende, tussen 7 en 8 goed en boven de 8 prima. In "Normaal" Excel zou je het gemiddelde of in een tussencel zetten of meermaals uitrekenen. Met Let kan je 1 keer uitrekenen en dan hergebruiken zonder het in een tussencel te zetten.

"Hier wordt gemiddelde aangemaakt als variabele"
=Let(Gemiddelde, Average(B2:F2), IF(Gemiddelde < 6 "Onvoldoende", IF (And(Gemiddelde >= 6, Gemiddelde <7 ), "Voldoende", enz........) )

https://www.ablebits.com/office-addins-blog/let-function-formula-examples/

Lambda gebruik je in de Names om een functie met parameters te maken.

In de name manager een naam maken met als waarde de formule die je wilt hergebruiken

=LAMBDA(a;b;c;d;e;(INDEX(a;MATCH(d;e;0);MATCH(b;c;0)))) 

In dit geval 5 parameters die gebruikt worden voor de funtie die als laatste staat. In de excel cel zet je dan MyFunction (a,b,c,d,e) en je krijgt de uitkomst.

https://www.ablebits.com/office-addins-blog/excel-lambda-function-write-calculate-use/

Oauth Confidential Client login in Postman toegevoegd.

Authorization op Basic Auth Username is clientid Password is client secret POST URL is de token url van de Oauth server Body heeft als form values: grant_type client_credentials en de scope (.default) Dan komt er een access token terug

"item": [
    {
        "name": "Login",
        "event": [
            {
                "listen": "test",
                "script": {
                    "exec": [
                        "pm.test(\"Authentication Succeeded\", function () {\r",
                        "    pm.response.to.have.status(200);\r",
                        "});\r",
                        "    var jsonData = pm.response.json();\r",
                        "\r",
                        "\r",
                        "pm.collectionVariables.set(\"oauth-token\", jsonData.access_token);\r",
                        "pm.variables.set(\"oauth-token\", jsonData.access_token);\r",
                        "\r",
                        ""
                    ],
                    "type": "text/javascript"
                }
            }
        ],
        "request": {
            "auth": {
                "type": "basic",
                "basic": [
                    {
                        "key": "password",
                        "value": "{{oauth-password}}",
                        "type": "string"
                    },
                    {
                        "key": "username",
                        "value": "{{oauth-user}}",
                        "type": "string"
                    }
                ]
            },
            "method": "POST",
            "header": [],
            "body": {
                "mode": "urlencoded",
                "urlencoded": [
                    {
                        "key": "grant_type",
                        "value": "client_credentials",
                        "type": "text"
                    },
                    {
                        "key": "scope",
                        "value": "{{oauth-scope}}",
                        "type": "text"
                    }
                ]
            },
            "url": {
                "raw": "https://login.microsoftonline.com/{{oauth-subscription}}/oauth2/v2.0/token",
                "protocol": "https",
                "host": [
                    "login",
                    "microsoftonline",
                    "com"
                ],
                "path": [
                    "{{oauth-subscription}}",
                    "oauth2",
                    "v2.0",
                    "token"
                ]
            }
        },
        "response": []
    }

Middle API en on behalf of token Microsoft identity platform and OAuth2.0 On-Behalf-Of flow | Microsoft Learn

Indien de ene API een andere API aan moet roepen waarbij de tweede API (ook) beveiligd is met een Oauth token kan je een on behalf of token gebruiken van de user. Hieronder de snippet om dat op te halen.

private async Task<string> GetOnBehalfOfToken(string token)
{
    // Create a confidential client application with the client credentials of the middle-tier API
    var app = ConfidentialClientApplicationBuilder.Create(ClientId)
        .WithClientSecret(ClientSecret)
        .WithAuthority($"https://login.microsoftonline.com/{TokenTenant}")
        .Build();

    // Create a user assertion from the bearer token
    var userAssertion = new UserAssertion(token, "urn:ietf:params:oauth:grant-type:jwt-bearer");

    // Acquire a token on behalf of the user for the downstream API
    var result = await app.AcquireTokenOnBehalfOf(Scopes, userAssertion).ExecuteAsync();

    // Return the access token
    return result.AccessToken;
}

PR Templates

Het is mogelijk om bij pull requests automatisch een template toe te voegen zodat de PR goed gevuld wordt. Plaats hiervoor een pull_request_template.md bestand in de .azuredevops of de root van de repository. Klein nadeel, dit moet voor iedere repo. Het werkt ook voor Github.