Borbin the 🐱

  • Katzentreppe

    📅 3. August 2022

    My cat asked me for a staircase. After a long design discussion he finally said: "meow"! Project is on!


    All parts except the round material were cut from those boards.


    The boards were cut in length.


    And to thinner size.


    The staircase has an angle of 30°



    With a fixed vise all the holes in the treads were drilled.





    One of the wooden rounds broke and and I had to cut one manually. Took longer than expected.


    The railing holes are cut with a 30° alignment using one of the cut offs as a guide.



    Two parts assembly.




    Construction finished. Painting!


    Customer is happy!


    It is his staircase.

  • Cafe Roussillon, Paris, France

    📅 26. Juli 2022 · Panorama

    Typical french cafe in this neighborhood: Cafe Roussillon. Right in the center of Paris between the Eiffel tower and the Louvre.


    Interaktives Panorama Cafe Roussillon

  • Scan text with regex in PowerShell

    📅 24. April 2022 · Software

    The named group capture (?exp) in a regex is an easy way to scan content. In this example, to get the text enclosed in quotes in a string. This is how it is done in PowerShell:

    # Get the text enclosed in quotes.
    [string]$text = 'This is an "example text".'
    [string]$textRegex = '\"(?<Text>.*?)\"'
    
    if ($text -match $textRegex) {
        $matches['Text']
    }

    This outputs
    example text


    Or split a formatted string into parts. For example the assignment structure 'id=value':

    # Parse the id and value of the text.
    [string]$text = '  id123 = abc  '
    [string]$idValueRegex = "^\s*(?<id>\w+?)\s*=\s*`"?(?<value>.+?)`"?\s*$"
    
    if ($text -match $idValueRegex) {
        "id=$($matches['id']), value=$($matches['value'])"
    }

    This outputs
    id=id123, value=abc


    Or parse a pattern, for example the content of each bracket in " abc { 123 } { def } 456 {xyz}"

    [string]$text = " abc { 123 } { def } 456 {xyz}"
    [string]$bracketRegex = "[{]\s*(?<Text>.*?)\s*[}]"
    
    ([regex]$bracketRegex).Matches($text) | % {
        [System.Text.RegularExpressions.Group]$match = $_
        [string]$value = $match.Groups["Text"].Value
    
        $value
    }

    This outputs
    123
    def
    xyz

  • Using List in PowerShell

    📅 24. April 2022 · Software

    PowerShell has lots of array and lists support, but changing or creating a list with dynamic data recreate the list on each change which is inefficient for large lists.
    The most simple solution is to use the .NET List class:

        [System.Collections.Generic.List[string]]$content = [System.Collections.Generic.List[string]]::new()
    
        $content.Add("line1")
        $content.Add("line2")
  • Text file encoding with PowerShell

    📅 24. April 2022 · Software

    Text files contain Text with a certain encoding. The usual symbols can be displayed with one byte and encoded as such in the file. But extended chars or other glyphs need more than one byte for representation. The standard for this is Unicode.


    Common Unicode encodings are utf-8 and utf-16.
    utf-8 encodes 7bit chars as it is and is one of the most used formats out there because it results in small file sizes as most text is 7bit anyway. All non 7bit chars are encoded with a sequence.
    utf-16 uses the surrogate pairs to encode char points out of the basic plane, but for most cases it is 2 byte per char. Also known as 'Unicode' with the option for big/little endian order of the byte sequence. The .NET string class is also using utf-16 encoding. As with the file format, don't assume each char is two bytes.


    The PowerShell functions Get-Content and Set-Content need an encoding to properly read/write the file.
    Without any encoding, this loops through all bytes in the text file instead of the encoded chars, and the loop variable is only the byte part of the original encoding and not very useful.

    # No encoding.
    Get-Content $textFile | % { 
        $_
    } | Set-Content $textFileOut


    If the encoding is missing when the file is read, the original text content in utf-8:
    😺abcパワーシェル
    will be stored as this instead:
    😺abcパワーシェル

    # Encoding missing, wrong content in output file.
    Get-Content $textFile | % {
        $_
    } | Set-Content -Encoding UTF8 $textFileOut


    The encoding is needed to properly read the chars in a text file:

    # Read utf-8 file and write as utf-8.
    Get-Content -Encoding UTF8 $textFile | % {
        $_
    } | Set-Content -Encoding UTF8 $textFileOut


    # Read utf-8 file and write as Unicode (utf-16).
    Get-Content -Encoding UTF8 $textFile | % {
        $_
    } | Set-Content -Encoding Unicode $textFileOut


    Note: The Get-Content will read a unicode file even when the utf-8 encoding is used, but it won't read a utf-8 file when the unicode encoding is used. Do not rely on this.
    But when the encoding is not known, it is difficult to use Get-Content. Best practice is to use the ReadLines API from .Net to read any file encoding:

    # Read any file encoding and write as utf-8.
    [System.IO.File]::ReadLines($textFile) | % { 
        $_
    } | Set-Content -Encoding UTF8 $textFileOut


    By default, Set-Content -Encoding UTF8 is not writing a BOM.
    Use the Text.UTF8Encoding to control how if the BOM should be used.
    If the Byte Order Mask (BOM) is not needed, use this to write out as utf-8 without BOM:

    # Read any file encoding and write as utf-8 without BOM.
    [string[]]$contentLines = [System.IO.File]::ReadLines($textFile)
    [Text.UTF8Encoding]$encoding = New-Object System.Text.UTF8Encoding $false
    [IO.File]::WriteAllLines($textFileOut, $contentLines, $encoding)

    If the Byte Order Mask (BOM) is needed, set the first constructor arg of the encoding to $true:

    [Text.UTF8Encoding]$encoding = New-Object System.Text.UTF8Encoding $true


    The ReadLines API does not load all content into memory at once and allow for very large files to be processed line by line. If you need the file in one string, use this:

    # Read text as one string with any file encoding and write as utf-8 without BOM.
    [string]$content = [System.IO.File]::ReadAllText($textFile)
    [Text.UTF8Encoding]$encoding = New-Object System.Text.UTF8Encoding $false
    [IO.File]::WriteAllText($textFileOut, $content, $encoding)


    XML files are also text files using an encoding. Most XML files use utf-8, but if the encoding is different, this commonly used code is not working anymore:

    # Do not use.
    [xml]$xml = Get-Content -Encoding UTF8 $xmlFile


    Use this instead:

    # Read XML file.
    [xml]$xml = New-Object xml
    $xml.Load($xmlFile)


    The default output file encoding is utf-8 with a BOM:

    # Save xml as utf-8 with signature (BOM).
    $xml.Save($xmlFileOut)


    To not write a BOM, use this:

    # Save xml as utf-8 without BOM.
    $encoding = [System.Text.UTF8Encoding]::new($false)
    $writer = [System.IO.StreamWriter]::new($xmlFileOut, $false, $encoding)
    $xml.Save($writer)
    $writer.Dispose()
← Neuere Beiträge Seite 29 von 50 Ältere Beiträge →
ÜBER

Jürgen E
Principal Engineer, Villager, and the creative mind behind lots of projects:
Windows Photo Explorer (cpicture-blog), Android apps AI code rpn calculator and Stockroom, vrlight, 3DRoundview and my github


Blog-Übersicht Chronologisch

KATEGORIEN

Auto • Fotografie • Motorrad • Paintings • Panorama • Software • Querbeet


Erstellt mit BitBlog!