Du würdest nicht mal merken ob ein Stück von KI generiert wurde.

Computergenerierte Musik gibt es bereits seit den späten 50ern.

  • https://ccrma.stanford.edu/~blackrse/algorithm.html#:~:text=The%20earliest%20instance%20of%20computer,the%20Illiac%20Suite%20(1957).

https://youtu.be/fojKZ1ymZlo?si=29neQgfODC1g5AxT

Der wahrscheinlich erste Computer generierte Song:

https://youtu.be/QWYvVSVL-bA?si=OJwetXRCRVfvYAVr

Heutzutage wird aus Marketinggründen so ziehmlich auf alles das Label "KI" geklebt, was irgendwie von Computern generiert wird.

...und wenn Du jetzt den Rest des Tages "Daysie" für Dich hinsummst, möchte ich Dich auch aufklären warum....

Musikalische Harmonien sind pure Mathematik mit bekannten Formeln und Algorithmen. Mindestens in seit den 80er Jahren werden in der Mainstream-Popmusik gefällige Kadenzen per Computer zusammengewürfelt und lediglich von Arrangeuren auf die Hörgewohnheiten der Zielgruppe zugeschnitten. (Das soll natürlich nicht heisen, das Alles nur "Kadenzschnullie" ist, was wir im letzten halben Jahrhundert auf die Ohren bekamen)

Was bisher nur schwer möglich war, ...bestehendes zu analysieren und vollenden:

https://youtu.be/NGhIsYhBnBg?si=HO4er18lb3uQq2Vh

...aber auch bei der Vollendung von Beethovens 10. Waren es Musikwissenschaftler und Arrangeure welche entschieden, welche Versatzstücke einer möglichen Intention Beethovens am nächsten kommen.

Mehr zu diesem Thema:

  • https://www.deutschlandfunkkultur.de/computergenerierte-musik-es-faellt-den-leuten-schwer-das-100.html

https://youtu.be/HPigo4DGAic?si=Oh7oVpTcZ0Z4Nyq5

...zur Antwort

XML ist eine Sprache zur Beschreibung, universellen Speicherung und Austausch komplexer Datenstrukturen.

Ich kann mir nur wenige Situationen vorstellen, in denen ein "Nichtprogrammierer" mit dergleichen umgehen müsste.

Ansich ist es kein Problem XML zu lesen und sich dabei den Aufbau der beschriebenen Datenstrukturen zu versinnbildlichen. Ohne das Wissen was diese Strukturen im verarbeitenden Programm bewirken ist XML jedoch einfach nur ziehmlich sinnloser Text.

Viel zu lernen gibt es (an der Sprache selbst) nicht... (Die Syntax begreift man in 5 Minuten)

  • https://de.wikipedia.org/wiki/Extensible_Markup_Language#Physischer_Aufbau

Gewöhnlich wird XML von entsprechenden Programmen automatisiert ex-/importiert und es ist nicht vorgesehen derartige Daten manuell zu ändern (auch wenn dies, im Gegensatz zu binären Daten, möglich ist). Zudem reagieren einige XML-Parser ziehmlich sensibel, wenn das XML-Document manuell bearbeitet wurde.

Ich weiß nicht, was die Ersteller der Jobbeschreibung bewogen hat XML als Voraussetzung zu fordern. (wahrscheinlich wissen die selbst nicht genau was sie benötigen). Zum normalen Wissen von Verwaltungs-/Schreibkräften gehört das jedoch nicht.

...zur Antwort

Ich habe Deinen Disput mit WeissBrot965 gelesen.

Als Exprogrammierer/-entwickler frage ich mich, welches Vertrauensverhältnis in Eurer Firma herrscht.

Du hast unaufgefordert etwas in Deiner gesetzlichen "Erholungszeit" entwickelt. Soweit ist Dies erstmal rechtlich unproblematisch. Arbeitsrechtlich könnte dies jedoch relevant werden, wenn diese "Nebentätigkeit" einem gewerblichen Zweck dient und dabei mit anderen Regelungen kollidiert:

  • dem Arbeitszeitgesetz
  • dem Bundesurlaubsgesetz
  • der Gefährdung des Hauptarbeitsvertrags
  • der Konkurrenz zum Hauptarbeitgeber
  • arbeitsvertraglichen Regelungen

https://www.dgbrechtsschutz.de/recht/arbeitsrecht/arbeitsvertrag/themen/beitrag/ansicht/arbeitsvertrag/darf-arbeitgeber-nebenjob-verbieten/details/anzeige/

Je nachdem wie "böswillig" oder "wohlwollend" Dein Arbeitgeber ist, kann er Deine freiwilligen Überstunden honorieren oder Dir juristisch die Hölle heiß machen. Wenn sich Deine "Freizeitentwicklung" vorwiegend mit dem "Arbeitgegenstand" Deines Arbeitgebers beschäftigt, könnte diese unter Umständen auch mit bereits bestehenden Urheberrechten/Firmeninterna Deines Arbeitgebers kollidieren, dann darfst ohnehin niemand Anderem Deine Schöpfung anbieten.

...Aber malen wir nicht den Teufel an die Wand...

Wenn Du jemandem eine Software anbietest, musst Du diesem den Zweck nahebringen und die Funktion demonstrieren.

Wenn schon der Verwendungszweck geheim ist , versuchst Du die berühmte Katze im Sack zu verkaufen. 😅 Also musst Du Deinem Arbeitgeber zumindest deren potenziellen Nutzen schmackhaft machen. (...und dieser entscheidet ob Deine Schöpfung ihm Vorteile bringt, welche mit dem von Dir erwarteten Honorar vereinbar sind)

Das "Innenleben" Deiner Entwicklung (und deren interne Funktionsweise) musst Du ihm jedoch nicht offenlegen.

ich bin auch nicht als Softwareentwickler oder Ähnliches angestellt.

Wenn Deine "Nebentätigkeit" toleriert und Dein Produkt von Deinem Chef gekauft wird, bist Du natürlich auch , wie jeder selbstständige Softwareentwickler, für den Support Deiner Software verantwortlich... Solange Du die Urheberrechte für Deine Software beanspruchst, bist Du auch für potentiell verusachte Probleme/Ausfälle und für verantwortlich. (...und damit stehst Du wieder arbeitsrechtlich vor der Vereinbarkeit mit Deinem Angestelltenverhältnis)

Ansonsten kannst Du ja einen Kopierschutz und ein eine zeitliche Limitierung, Obfuskation einbauen, um Deine Rechte zu schützen.

Ganz Nebenbei...

Die meisten Hobbyprogrammierer überschätzen die Schöpfungshöhe Ihrer Produkte. Viele der von ihnen verwendeten Codes und Ideen, sind nicht so super einzigartig oder genial, wie sie meinen.

Dabei nehme ich mich selbst nicht aus. 😅 Ich habe beim "basteln im Ruhestand" auch so manchen mitternächtlichen "Heureka"-Moment. Bei näherer Betrachtung war's (am nächsten Morgen) doch eher nur eine Rekombination dessen, was ich irgendwann/irgendwo gelesen/gesehen habe. (Und es gab gute oft Gründe, weshalb andere Entwickler genau diese "geniale Lösung" verworfen haben)

...zur Antwort

...einen Arm weniger...😅 Bild zum Beitrag

...Es sei denn, er besticht die Beiden😅

Bild zum Beitrag

Im günstigsten Falle, würde ein potentieller Kühlschrankknacker seine Beute mit den Fellnasen teilen müssen. (die sind schrecklich Korrupt)

...aber mal ehrlich... Das letzte, was einen Einbrecher an meiner Wohnung interessieren würde, wäre der Inhalt des Kühlschranks:

Bild zum Beitrag

...😋 🤫🤫🤫

...zur Antwort
Stimmt diese Planetenlaufbahn-Approximation?

Heyy ich versuche seit einiger Zeit mit Python eine Animation für die Laufbahn von der Erde zu erstellen, aber ich wundere mich, ob mein Ansatz stimmt. 🤔

Ich will ein Python Programm erstellen, wo ich den Exponenten des Radius im Gravitationsgesetz ändern und somit neue Umlaufbahnen zeichnen kann. Dabei stütze ich mich auf die Formel: F = G * (m1 * m2)/r^x. Ich bin mir nicht sicher, ob mein Programm korrekte Laufbahnen zeichnet, da ich nicht sonderlich gut in Physik bin. Der Grundgedanke kann ich nachvollziehen: Bei abnehmender Kraft, wird die Umlaufbahn grösser. Aber ist es normal, dass die Umlaufbahn der Erde bei einer kleinen Exponenten-Änderung von 2 auf 2.02 so viel grösser wird? Falls ja, warum ist das so?

Danke im Voraus für eure Hilfe! 😊

LG Leonie

Ein Quadrat entspricht hier einer astronomischen Einheit.

Hier ist mein Programm:

Ich verwende für meine Animation pygame.

import pygame
import sys
import math

Das sind die Konstanten, die ich verwende und die Startwerte:

G = 6.67430e-11
M_SUN = 1.989e30 
M_EARTH = 5.972e24
AU = 1.496e11
TIME_STEP = 43200
x = AU
y = 0
vx = 0
vy = 29780
exp_r = float(input"Exponent:"))

Die Erstellung des Fensters:

pygame.init()
WIDTH, HEIGHT = 800, 800
SCALE = WIDTH / (20 * AU)  # Maßstab für die Darstellung
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()

Mit RK4 approximiere ich die Laufbahn der Erde. Hier sind die Funktionen:

def runge_kutta4(t, state, dt):
    k1 = deriv(t, state)
    k2 = deriv(t + 0.5 * dt, [state[i] + 0.5 * dt * k1[i] for i in range(4)])
    k3 = deriv(t + 0.5 * dt, [state[i] + 0.5 * dt * k2[i] for i in range(4)])
    k4 = deriv(t + dt, [state[i] + dt * k3[i] for i in range(4)])
    return [state[i] + (dt / 6) * (k1[i] + 2 * k2[i] + 2 * k3[i] + k4[i]) for i in range(4)]

def draw_grid():
    grid_size = AU * SCALE
    half_width = WIDTH // 2
    half_height = HEIGHT // 2
 
    for i in range(-19, 20):
        x_pos = int(half_width + i * grid_size)
        pygame.draw.line(screen, (50, 50, 50), (x_pos, 0), (x_pos, HEIGHT))
 
    for i in range(-19, 20):
        y_pos = int(half_height + i * grid_size)
        pygame.draw.line(screen, (50, 50, 50), (0, y_pos), (WIDTH, y_pos))

Hauptschleife:

running = True
t = 0
earth_path = []


while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    state = [x, y, vx, vy]
    x, y, vx, vy = runge_kutta4(t, state, TIME_STEP)
    t += TIME_STEP

    draw_x = int(WIDTH / 2 + x * SCALE)
    draw_y = int(HEIGHT / 2 + y * SCALE)
    earth_path.append((draw_x, draw_y))

    screen.fill((0, 0, 0))
    draw_grid()
    pygame.draw.circle(screen, (255, 255, 0), (WIDTH // 2, HEIGHT // 2), 20)
    pygame.draw.circle(screen, (0, 0, 255), (draw_x, draw_y), 5)

    for px, py in earth_path:
        pygame.draw.circle(screen, (0, 255, 0), (px, py), 1)

    pygame.display.flip()
    clock.tick(60)

pygame.quit()
sys.exit()
...zum Beitrag

Ich habe mir Deine Runge-Kutta-Funktion nicht näher angeschaut (und schon garnicht nachgerechnet).

Mir ist jedoch aufgefallen, das diese mit Floats nahe den Min/Max-Values operiert.

1.175494351E-38 und 3.402823466E+38

Float benutzt 32 Bit und "rundetc um so "aggressiver", je näher Resultate von Operationen an den Limits liegen. Dies kann zu massiven Rechenfehler führen, da jeweils nur eine stark begrenzte Anzahl an Bits für Exponent und Mantisse zur Verfügung stehen.

  • https://www.vectorsoft.de/blog/2012/12/rundungsfehler-bei-float-werten/

Versuche es statt dessen mal mit Double oder Decimal oder sogar BigInt (sollte auch Python haben).

Double rechnet mit 64Bit , Decimal mit 128 und Bigint sogar mit ca. max. 20Mrd Bit (extrem langsam auf Konsumerrechnern).

Für BigInt-Berechnungen musst Du gegebenenfalls kommazahlen manuell in (big)Integer scalieren.

Ich habe zu dieser frühen Stunde leider keine Zeit auf Deine Berechnungen näher einzugehen. Versuche es erstmal mit den übrigen (genaueren) Datentypen zu arbeiten. Sollte dies nicht klappen werde ich mich mal über Deine Funktion beugen.

...zur Antwort
Ich bin Programmierer 

...dafür bist Du aber ziemlich unbeholfen. Als Programmierer weiß man wie man Suchmaschinen benutzt.

also wo man halt so mal brauch wenn man gern programmiert

...sehr zielführende Definition, dessen was du brauchst...🤔😁

API bedeutet einfach Schnittstelle zum Datenaustausch.

Wenn Du nicht präzisieren kannst, auf welche Art von Daten Du zugreifen möchtest, ist Dir nicht zu helfen...

Es gibt Millionen solcher Schnittstellen.

Nur mal die API für Windows-Desktop : https://learn.microsoft.com/de-de/dotnet/api/?view=windowsdesktop-10.0

oder

OpenStreetmap: https://nominatim.org/release-docs/develop/api/Overview/

oder

Wetter: https://open-meteo.com/

...alles kostenlos... (manchmal muss man nur ein wenig suchen)

Hier mal ein kleines völlig simples Beispiel, wie man mit den Online-APIs von OpenStreetmap und OpenMeteo Wetterdaten für einen Platz abfragt.

getWeather.ps1

$ProgressPreference = 'SilentlyContinue'    # Consolefortschrittsbalken   aus
#WMO weather interpretation code descriptions (& images)
#full description: https://www.nodc.noaa.gov/archive/arc0021/0002199/1.1/data/0-data/HTML/WMO-CODE/WMO4677.HTM
#https://github.com/roe-dl/weathericons?tab=readme-ov-file#wmo-symbole--wmo-symbols
#https://www.meteopool.org/en/encyclopedia-wmo-ww-wx-code-id2
#https://artefacts.ceda.ac.uk/badc_datadocs/surface/code.html    (Present weather (from manned (code 4677) and automatic (4680) stations))


#versuch eines "sparsamen" Definitionsobjects,  Nicht  alle  4677/4680-Codes   werden  von  OpenMeteo verwendet!
$WMODev_Json = '{
    "0":{
        "day":{
            "description":"Sunny",
            "image":"http://openweathermap.org/img/wn/01d@2x.png"
        },
        "night":{
            "description":"Clear",
            "image":"http://openweathermap.org/img/wn/01n@2x.png"
        }
    },
    "1":{
        "day":{
            "description":"Mainly Sunny",
            "image":"http://openweathermap.org/img/wn/01d@2x.png"
        },
        "night":{
            "description":"Mainly Clear",
            "image":"http://openweathermap.org/img/wn/01n@2x.png"
        }
    },
    "2":{
        "day":{
            "description":"Partly Cloudy",
            "image":"http://openweathermap.org/img/wn/02d@2x.png"
        },
        "night":{
            "description":"Partly Cloudy",
            "image":"http://openweathermap.org/img/wn/02n@2x.png"
        }
    },
    "3":{
        "day":{
            "description":"Cloudy",
            "image":"http://openweathermap.org/img/wn/03d@2x.png"
        },
        "night":{
            "description":"Cloudy",
            "image":"http://openweathermap.org/img/wn/03n@2x.png"
        }
    },
    "45":{
        "day":{
            "description":"Foggy",
            "image":"http://openweathermap.org/img/wn/50d@2x.png"
        },
        "night":{
            "description":"Foggy",
            "image":"http://openweathermap.org/img/wn/50n@2x.png"
        }
    },
    "48":{
        "day":{
            "description":"Rime Fog",
            "image":"http://openweathermap.org/img/wn/50d@2x.png"
        },
        "night":{
            "description":"Rime Fog",
            "image":"http://openweathermap.org/img/wn/50n@2x.png"
        }
    },
    "51":{
        "day":{
            "description":"Light Drizzle",
            "image":"http://openweathermap.org/img/wn/09d@2x.png"
        },
        "night":{
            "description":"Light Drizzle",
            "image":"http://openweathermap.org/img/wn/09n@2x.png"
        }
    },
    "53":{
        "day":{
            "description":"Drizzle",
            "image":"http://openweathermap.org/img/wn/09d@2x.png"
        },
        "night":{
            "description":"Drizzle",
            "image":"http://openweathermap.org/img/wn/09n@2x.png"
        }
    },
    "55":{
        "day":{
            "description":"Heavy Drizzle",
            "image":"http://openweathermap.org/img/wn/09d@2x.png"
        },
        "night":{
            "description":"Heavy Drizzle",
            "image":"http://openweathermap.org/img/wn/09n@2x.png"
        }
    },
    "56":{
        "day":{
            "description":"Light Freezing Drizzle",
            "image":"http://openweathermap.org/img/wn/09d@2x.png"
        },
        "night":{
            "description":"Light Freezing Drizzle",
            "image":"http://openweathermap.org/img/wn/09n@2x.png"
        }
    },
    "57":{
        "day":{
            "description":"Freezing Drizzle",
            "image":"http://openweathermap.org/img/wn/09d@2x.png"
        },
        "night":{
            "description":"Freezing Drizzle",
            "image":"http://openweathermap.org/img/wn/09n@2x.png"
        }
    },
    "61":{
        "day":{
            "description":"Light Rain",
            "image":"http://openweathermap.org/img/wn/10d@2x.png"
        },
        "night":{
            "description":"Light Rain",
            "image":"http://openweathermap.org/img/wn/10n@2x.png"
        }
    },
    "63":{
        "day":{
            "description":"Rain",
            "image":"http://openweathermap.org/img/wn/10d@2x.png"
        },
        "night":{
            "description":"Rain",
            "image":"http://openweathermap.org/img/wn/10n@2x.png"
        }
    },
    "65":{
        "day":{
            "description":"Heavy Rain",
            "image":"http://openweathermap.org/img/wn/10d@2x.png"
        },
        "night":{
            "description":"Heavy Rain",
            "image":"http://openweathermap.org/img/wn/10n@2x.png"
        }
    },
    "66":{
        "day":{
            "description":"Light Freezing Rain",
            "image":"http://openweathermap.org/img/wn/10d@2x.png"
        },
        "night":{
            "description":"Light Freezing Rain",
            "image":"http://openweathermap.org/img/wn/10n@2x.png"
        }
    },
    "67":{
        "day":{
            "description":"Freezing Rain",
            "image":"http://openweathermap.org/img/wn/10d@2x.png"
        },
        "night":{
            "description":"Freezing Rain",
            "image":"http://openweathermap.org/img/wn/10n@2x.png"
        }
    },
    "71":{
        "day":{
            "description":"Light Snow",
            "image":"http://openweathermap.org/img/wn/13d@2x.png"
        },
        "night":{
            "description":"Light Snow",
            "image":"http://openweathermap.org/img/wn/13n@2x.png"
        }
    },
    "73":{
        "day":{
            "description":"Snow",
            "image":"http://openweathermap.org/img/wn/13d@2x.png"
        },
        "night":{
            "description":"Snow",
            "image":"http://openweathermap.org/img/wn/13n@2x.png"
        }
    },
    "75":{
        "day":{
            "description":"Heavy Snow",
            "image":"http://openweathermap.org/img/wn/13d@2x.png"
        },
        "night":{
            "description":"Heavy Snow",
            "image":"http://openweathermap.org/img/wn/13n@2x.png"
        }
    },
    "77":{
        "day":{
            "description":"Snow Grains",
            "image":"http://openweathermap.org/img/wn/13d@2x.png"
        },
        "night":{
            "description":"Snow Grains",
            "image":"http://openweathermap.org/img/wn/13n@2x.png"
        }
    },
    "80":{
        "day":{
            "description":"Light Showers",
            "image":"http://openweathermap.org/img/wn/09d@2x.png"
        },
        "night":{
            "description":"Light Showers",
            "image":"http://openweathermap.org/img/wn/09n@2x.png"
        }
    },
    "81":{
        "day":{
            "description":"Showers",
            "image":"http://openweathermap.org/img/wn/09d@2x.png"
        },
        "night":{
            "description":"Showers",
            "image":"http://openweathermap.org/img/wn/09n@2x.png"
        }
    },
    "82":{
        "day":{
            "description":"Heavy Showers",
            "image":"http://openweathermap.org/img/wn/09d@2x.png"
        },
        "night":{
            "description":"Heavy Showers",
            "image":"http://openweathermap.org/img/wn/09n@2x.png"
        }
    },
    "85":{
        "day":{
            "description":"Light Snow Showers",
            "image":"http://openweathermap.org/img/wn/13d@2x.png"
        },
        "night":{
            "description":"Light Snow Showers",
            "image":"http://openweathermap.org/img/wn/13n@2x.png"
        }
    },
    "86":{
        "day":{
            "description":"Snow Showers",
            "image":"http://openweathermap.org/img/wn/13d@2x.png"
        },
        "night":{
            "description":"Snow Showers",
            "image":"http://openweathermap.org/img/wn/13n@2x.png"
        }
    },
    "95":{
        "day":{
            "description":"Thunderstorm",
            "image":"http://openweathermap.org/img/wn/11d@2x.png"
        },
        "night":{
            "description":"Thunderstorm",
            "image":"http://openweathermap.org/img/wn/11n@2x.png"
        }
    },
    "96":{
        "day":{
            "description":"Light Thunderstorms With Hail",
            "image":"http://openweathermap.org/img/wn/11d@2x.png"
        },
        "night":{
            "description":"Light Thunderstorms With Hail",
            "image":"http://openweathermap.org/img/wn/11n@2x.png"
        }
    },
    "99":{
        "day":{
            "description":"Thunderstorm With Hail",
            "image":"http://openweathermap.org/img/wn/11d@2x.png"
        },
        "night":{
            "description":"Thunderstorm With Hail",
            "image":"http://openweathermap.org/img/wn/11n@2x.png"
        }
    }
}'
$WMODev_Object = $WMODev_Json|ConvertFrom-Json


#openMeteo arbeitet mit Geokoordinaten, ergo Länge und Breite  für  einen Orts/Adresse abfragen
#Geokoordinaten für  einen  Ort ermitteln
#Was  immer  an Adressdaten verfügbar  ist
$SearchStrings = @(
    'Leipzig'
    'Zentrum'
    'Petersbogen'
)


$queryStrings = $SearchStrings|%{[uri]::EscapeDataString($_)}
$Query = $queryStrings -join '+'
Write-Host " Coords - QueryString: $Query" -fo  green


#geodaten  für "Adresse"  abfragen (kann  mehrere Ergebnisse  liefern), deshalb als Array of Objects  behandeln
$GeoCoords = @()
$GeoCoords += ( Invoke-WebRequest "https://nominatim.openstreetmap.org/search?q=$Query&format=json&addressdetails=0").content | ConvertFrom-Json 
$GeoCoords #mal anshauen


#https://open-meteo.com/
#querystring  für Wetterapi basteln 
#$GeoCoords[0] ist hier  stumpf der erstbeste  Eintrag
$WeatherQuery=@(
    'latitude={0}'-f $GeoCoords[0].lat
    'longitude={0}'-f $GeoCoords[0].lon
    'current=temperature_2m,relative_humidity_2m,precipitation,rain,showers,snowfall,weather_code,cloud_cover,wind_speed_10m,wind_direction_10m'
    'hourly=temperature_2m,relative_humidity_2m,weather_code'
    #'models = icon'  #"icon" = nur Deuschland (DWD)  ,ohne Angabe des Wettermodels werden  automatisch die  zutreffensten  werte  verwendet!
)-join '&'
Write-Host "OpenMeteo - QueryString: $WeatherQuery" -fo  yellow
#Wetterdaten  für  ermittelten Geo-Tag abrufen
$html = Invoke-WebRequest "https://api.open-meteo.com/v1/forecast?$WeatherQuery"


$Weatherobject = $html.Content|ConvertFrom-Json
#$Weatherobject  #mal  angucken
Write-Host "aktuelles Wetter:" -fo green
$Weatherobject.Current
#$Weatherobject.hourly
Write-Host "7 Tage Wetter" -fo green
#die Wetterdaten  werden  als mehrere flache Arrays geliefer!
#in zu Objekten bündeln...
$Weatherobject.hourly.time|%{$cnt=0}{
    $WeatherCode = $Weatherobject.hourly.weather_code[$cnt]
    $LocalTime=(get-date $_).ToLocalTime()
    $CurrentHour = $LocalTime.Hour
    #Tag/Nacht: einfach 6..18 Uhr = Tag, sonst Nacht
    if ($CurrentHour -gt 5 -and $CurrentHour -lt 18) {
        $DayNight = 'day'
    } else {
        $DayNight = 'night'
    }
    [PSCustomObject]@{
        GMT_DateTime = $_
        Local_DateTime =$LocalTime
        Temperature_2m = $Weatherobject.hourly.temperature_2m[$cnt]
        RelativeHumidity_2m = $Weatherobject.hourly.relative_humidity_2m[$cnt]
        WeatherCode = $WeatherCode
        WeatherDescription = $WMODev_Object.$WeatherCode.$DayNight.Description
    }
    $cnt++
}|ft *
pause
...zur Antwort

Mit Powershell kann man einen einen kleinen schmutzigen Compiler basteln.

dirty_compile.ps1

$CS_Code = '
using System;
public class Prog{
    public static void Main(string[] args){
        Console.WriteLine("Hallo Welt");
        Console.ReadKey();
    }
}'
Add-Type -TypeDefinition $CS_Code  -OutputType ConsoleApplication -OutputAssembly "$pwd/Demo.exe"
pause

Ob man nun "Hallo Welt" als anzuzeigenden Text in die Exe-Datei compiliert, oder einen beliebigen anderen Text, ist dem Compiler eigentlich völlig egal.

Man muss lediglich im Powerschellscript die anzuzeigende Textdatei einlesen, eventuelle DoubleQuotes verdoppeln und den resultierenden String in die Zu compilerende Vorlage einfügen

demo.txt

"Grüße  vom Erzesel"
  ,- _~,                             ,, 
 (' /| /                             || 
((  ||/= ,._-_ /\\  _-_   _-_,  _-_  || 
((  ||    ||    /  || \\ ||_.  || \\ || 
 ( / |    ||   /\\ ||/    ~ || ||/   || 
  -____-  \\,   || \\,/  ,-_-  \\,/  \\ 
                /                       
               (,

compile_from_textfile.ps1

$DesktopPath = [Environment]::GetFolderPath("Desktop")
$OutputExe = "$DesktopPath\Meine Demo.exe"
$TextFile = "demo.txt"


$CS_Code = @'
using System;
class Program
{
  static void Main(string[] args)
  {
    string text = @"Text_Placeholder";
    Console.WriteLine(text);
    Console.ReadKey();
  }
}
'@ -replace "Text_Placeholder", ((gc $TextFile -enc UTF8 -Raw)-replace '"','""')


Write-Host 'C#-Code  to Compile:'  -fo green
Write-Host $CS_Code -fo yellow
Write-Host 'compiling...'  -fo green

#kleiner  schmutziger  C#-Compiler:
Add-Type -TypeDefinition $CS_Code -OutputType ConsoleApplication -OutputAssembly $OutputExe


Write-Host "executing ""$OutputExe""..." -fo magenta
& $OutputExe

Wenn Du eine Batchdatei in eine exe-umwandeln möchtest, solltest Du einen sogenannten Batch-Compiler verwenden. Allerdings hat das recht wenig mit compilieren zu tun, sondern ist lediglich ein Container welcher versteckt die enthaltene Batch ausführt, was durchaus von Virenscannern als Trojaner angesehen werden kann.

...zur Antwort

*Grummel*murmel*...

Bild zum Beitrag

Kaffeeautomat, Schwarz, bitter, 6 Stück Zucker, bitte nicht rühren (ich mag's nicht so süß)

Grummel* tststsss*...immer solch komplexe Fragen vor dem Aufwachen...

Oooookeeyyyyyy... Schöööhhhhnen Soooonntag an mein Treibstoff ist gleich fertig....

...zur Antwort

Ich persönlich würde gern mal mit "Alexander, König der Niederlande" (Ingognito) auf Kneipentour gehen.

Ich denke, dass ich mit jedem der Genannten locker plaudern könnte. Ohne Kamera sind die meisten "Prominenten" recht "bodenständig".

In meinem Leben bin ich bereits einigen mehr oder weniger berühmten Leuten privat begegnet. Das wichtigste in derartigen Situationen , man sollte tun, als hätte man die betreffenden Leute nicht erkannt.

Aus der Sicht einer Klobrille sind alle Menschen nur Ärsche
...zur Antwort

das Problem ist Dein Modulo!

Modulo ermittelt Rest einer ganzzahligen Division. das eigentliche Ergebnis der Division geht jedoch verloren.

9 % 10 = 9
19 % 10 = 9

aus dem Ergebnis "9" kann man jedoch nicht auf die Ursprünglichen Werte zurückführen.

Um binäre Daten reversibel ohne "Sonderzeichen" als String zu speichern oder darzustellen verwende Base64.

  • https://de.wikipedia.org/wiki/Base64
  • https://docs.python.org/3/library/base64.html
Zu Deinen Werten

wieso hat Dein Input 3 Ausrufezeichen und einen Zeilenvorschub? ...während dein String nur eines hat?

'Hallo Welt!' = [72,97,108,108,111,32,87,101,108,116,33]

und dein Key [83, 105, 103,109, 97, 32 ,66, 111, 121] ist "Sigma Boy" und nicht "ABCDEFGHI"

...na egal einen alten Trapper kann man nicht in die Flinte pissen😅

das gravierendste Problem an deiner Verschlüsselung durch Multiplikation ist das Du das Du die Ergebnisse irgendwie wieder in einen Bereich von 0..255 bringen musst ohne Verluste zu erleiden.

Modulo ist verlustbehaftet!

Statt de Multiplikation würde ich Dir XOR-Verknüpfung empfehlen:

72 ^ 65 = 9
9 ^ 65 = 72
  • https://techbeamers.com/python-xor-operator/

Verknüpft man Byte Mit Byte bleibt auch das Ergebnis ein Byte.

Ich bin kein Pythonprogrammierer, deshalb eine keine Demo in Powershell:

$Input='Hallo Welt!'
$InputBytes=[Byte[]][Char[]]$Input
$InputBytes -join ','
''
  # Passwort zu ByteArray
$PasswortBytes=[Byte[]][Char[]]'ABCDEFGHI'
$PasswortBytes
''
$BinaryResult=@() #leeres Array
$i=0;
  #XOR des Strings reihum mit den Elementen von $PasswortBytes
foreach ($Byte in $InputBytes){
    #modulo des fortlaufenden Index (implizit erhöht) mit der Anzahl der Zeichen im Passwort
    $PWIndex=$i++ % $PasswortBytes.length;
    #Bytes  XOR-verknüpfen
    $BinaryResult += $Byte -bxor $PasswortBytes[$PWIndex]
}


$BinaryResult
#convert zu Base64-String 
$StringResult=[Convert]::ToBase64String($BinaryResult)
$StringResult


Write-Host Rolle Rueckwaerts -fo green
$DecodeBinary=[Convert]::FromBase64String($StringResult)
$DecodeBinary
''
$DecodeResult=@()
#XOR ist  "Symetrisch" also  einfach  nochmal  mit den PasswortBytes verknüpfen
$i=0;
foreach ($Byte in $DecodeBinary){
    $PWIndex=$i++ % $PasswortBytes.length;
    $DecodeResult += $Byte -bxor $PasswortBytes[$PWIndex]
}
$DecodeResult
''
[Char[]]$DecodeResult -join ''
Pause
...zur Antwort

Ja das ist normal.

https://www.windows-faq.de/2023/02/26/was-ist-der-runtime-broker/

Was Dein "Shell host" angeht, so hast Du Dich etwas schwammig ausgedrückt. Meinst Du den "Windows Shell Experience Host"?

egal...

Seit Windows 10 wurden viele Aufgaben , welche die Kommunikation von Anwendungen mit dem Betriebssystemkern betreffen , an Module ausgelagert. Derartige Module erscheinen im Taskmanager mit Bezeichnungen wie ...host oder ...broker .

So lange die genannten Prozesse keinen Ärger machen solltest Du Dich nicht darum kümmern. Lass einfach die Finger davon

Im Allgemeinen ist es kein weltbewegendes Problem alle Instanzen des Runtimebrokers (vorübergehend) zu beenden...

taskkill /im "RuntimeBroker.exe" /f

Allerdings sind "Löcher im Sicherheitskonzept von Windows" der Preis dafür Spätestens mit dem nächsten Start einer Anwendung, wird dieser auch ein neuer Runtimebroker zugeordnet. Darüber hat der normale Anwender keine Kontrolle.

...zur Antwort

der Klassiker:

@echo off
title Admintest
chcp 65001 >nul & rem Umlaute anzeigen


  rem prüfen ob  wir im Adminmodus sind... wenn  ja mit :adminTasks weitermachen.
net session >nul 2>&1 && goto :adminTasks
set "self=%~f0"
 rem erzeuge  Hilfsscript
set "elevator=%temp%\%~n0.elevate.js"
echo new ActiveXObject("shell.application").ShellExecute('cmd','/c "%self:\=\\%" ' ,'','runas',4); >"%elevator%"
  rem ElevatorScript ausführen
wscript  "%elevator%"
exit /b


:adminTasks
 rem hier  alles  was  als Admin ausgeführt werden  soll
echo admin
pause

Wer sich jetzt fragt, weshalb ich für Dies noch auf den alten Scriptinghost (WSCRIPT) setze, statt Powershell zu nutzen: wscript lädt schneller!

zum vergleich die Variante mit Powershellunterstützung:

@echo off
title Admintest
chcp 65001 >nul & rem Umlaute anzeigen


  rem prüfen ob  wir im Adminmodus sind... wenn  ja mit :adminTasks weitermachen.
net session >nul 2>&1 && goto :adminTasks
powershell -c "start '%~f0' -v runas"
exit /b


:adminTasks
 rem hier  alles  was  als Admin ausgeführt werden  soll
echo admin

pause

um die UAC-Abfrage kommt man jedoch nicht herum.

...zur Antwort

Ich lebe mit meinem Mops auf 36 m² in einer energieeffizient sanierten "Platte" im Leipziger Westen. Das ist zwar kein Palast, aber für eine Einzelperson mehr als ausreichend.

Geheizt wird per Fernwärme. Dank einer guten Isolation muss ich allerdings nur selten meine Heizung nutzen. Dank geschützter Südlage scheint fast den ganzen Tag über die Sonne in meine Wohnung und heizt zum Nulltarif. Die beim Kochen und Backen entstehende Wärme tut ein Übriges.

In den 14 Jahren, welche ich hier lebe, musste ich noch nie Heizkissen nachzahlen.

...zur Antwort

Ganz simpel, Dein Nachfolger wird es fortsetzen.

Dein Arbeitgeber hat Dich, wärend Du bei im beschäftigt warst, für Deine Arbeit entlohnt. Ergo gehört das Produkt (und die Rechte daran der Firma) bzw. Deinem Arbeitgeber.

...zur Antwort

Ohne zu wissen ob und welche Properties für automatisierte Installationen in Deinem Package von deren Ersteller definiert wurden, hilft auch Powershell nicht.

Gegebenenfalls musst Du beim Ersteller des Installer-Packets erfragen, welche Properties für den automatischen 'Einsatz definiert sind.

z.B. für den Powershell Core Installer : https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.5#install-the-msi-package-from-the-command-line

Hier Noch ein Lösungsansatz um per Verbose-Infos den Einfluss von manuellen Settings in einem GUI auf Properties zu loggen:

  • https://serverfault.com/questions/350333/determine-the-name-of-a-feature-in-an-msi-to-install-from-the-command-line

..das erfordert natürlich zumindest eine Installation per Hand, damit der Logfile erzeugt wird.

...zur Antwort
eindeutig: Ja.

Ich bin inzwischen Ü60.

Es ist immer schwierig jungen Leuten schlaue Ratschläge zu geben. Schließlich kann ich mich nur auf meine ganz eigenen Lebenserfahrungen beziehen, welche sich oft grundsätzlich von den Anderer unterscheiden.

Viele, welche einen Beruf ergreifen gehen davon aus, irgendwas bestimmtes zu erlernen und nur dies bis zur Rente auszuüben. Aber so sieht Leben nunmal nicht aus.

Kaum eine andere Branche ist so in einer ständigen Entwicklung wie die IT. Wenn man seine persönliche Nische gefunden hat und bereit (und fähig) ist einigermaßen mit der Entwicklung Schritt zu halten, wird es weder stressig noch langweilig.

Ich weiß nicht an welchem Punkt "Deine Senior-Informatiker" psychische Komplikationen erlitten haben. Ich kann nur vermuten, das sie an einem gewissen Punkt die für diesen Job nötige intellektuelle (berufliche) Flexibilität verloren haben und das einmal "gesattelte Pferd" bis zum bitteren Ende geritten haben.

Ich bekomme nun zunehmend bedenken, ob...

Irgendwas muss Dich doch bewogen haben ein Studium im Bereich der IT zu absolvieren (hoffentlich nicht nur die zu erwartende Entlohnung)? Was hat Deine Meinung geändert, was ist schief gelaufen?(die Fragen sind rein rhetorisch...)

Die meisten davon waren Systemadministratoren. Ihr größtes Argument war es jeden Tag dasselbe zu tun. Scheinbar gab es bei denen so ziemlich gar keine Abwechslung.

Augenscheinlich bist Du momentan im Begriff Deine Zukunft an die Probleme anderer Leute zu binden, statt einfach zu probieren was Dir persönlich liegt. IT ist ja nicht nur "besserer Hausmeister" zu spielen (dafür brauch man auch kein Ingenieurstudium🤪). Wenn Deine Alt-Administratoren irgendwann unglücklich dem Alltagstrott ergeben haben, ist das einzig deren Problem.

Für mich sieht Deine Frage so aus, als wolltest Du bereits das Handtuch in den Ring werfen, noch bevor die erste Runde eingeläutet wird, nur weil Andere auf die Bretter gegangen sind. Wie abwechslungsreich Du Deinen Zukunft gestaltest ist nur Deine Sache. Das ganze Leben besteht aus Probieren, wenn irgendwas nicht funktioniert, versucht man eben etwas Anderes. Nichts ist in Stein gemeißelt.

Mach doch erstmal Dein Studium fertig und knüpfe ein paar nutzbringende Kontakte zu Leuten, die Dich weiterbringen (Nichts ist wichtiger als Beziehungen zu Leuten, welche Dir Türen öffnen können). Alles weiter kommt dann meist ganz von selbst.

...oje, Binsenwahrheiten, die Dir wahrscheinlich schon Dein Vater an die Backe genagelt hat...😅

Ich hab mir mal Dein "über mich" auf Deinem Profil angeschaut und das bietet eigentlich keine Zweifel an Deiner Flexibilität um Deinen eigenen Erfolgsweg zu gehen. lass Dich nur nicht von gescheiterten Existenzen kirre machen.

...zur Antwort

Am Ende des Scripts kannst Du nicht den bereits (standardmäßig) in den Fenstrpuffer geschriebenen Text in eine Datei kopieren. Es gibt (in Batch) kein Kommando welches (nachträglich ) auf den in die Console geschriebenen Text zugreifen kann.

cmd verfügt auch nicht über das von @JanaL161 erwähnte Tee-Kommando, welches die Ausgabe auf mehrere Outputs verteilen könnte. Allerdings würde Dir dieses auch nicht helfen, wenn es darum geht einen Fehler zu loggen, welcher einen Abbruch der Batch bewirkt. (Wird die Batch wegen eines Fehlers abgebrochen, werden auch alle Ausgabeumleitungen beendet)

Um "nicht abbrechende Fehler" zu loggen ohne jede Zeile einzeln umzuleiten, kannst Du alle funktionalen Zeilen in eine Subroutine verlegen und deren kompletten Output (Errorstream und Standardstream) in eine Datei umleiten. Anschließend gibst Du den Inhalt der Datei komplett im Fenster aus.

demo.cmd

@echo off
rem Ausgabe (Errorstream und Standardstream) der aufgerufenen Subroutine  in eine Datei umleiten
call :FunctionalCode 2>&1 >"log.txt"
rem Inhalt  der Log-Datei anzeigen
type "log.txt"
pause
exit /b


:FunctionalCode
set "Quellpfad=c:\beispieldatei.txt"
set "Zielpfad=d:\beispieldatei.txt"


echo "%Quellpfad%" -^> "%Zielpfad%"
copy "%Quellpfad%" "%Zielpfad%"
exit /b

Ein gleichzeitige Ausgabe auf den Bildschirm und in eine Datei ist nicht möglich, da der Commandointerpreter (cmd.exe) immer singltreaded arbeitet und einen Output erst ausgibt/weiterleitet, wenn das zuvor aufgerufene Kommando seine Arbeit beendet.

In Deinem Beispielcode sind die angegebenen Pfad falsch deklariert!

falsch:

set Quellpfad="c:beispieldatei.txt"
  • im angegebenen Pfad fehlt der Backslash nach dem "c:"
  • Auch wenn es zulässig ist einer Variable einen Pfad samt Quotes zu setzen, kann dies im weiteren Verlauf des Scripts zum Problem werden. Nach Möglichkeit sollten Pfade immer ohne umgebende Quotes gespeichert werden. Dazu übergibt man set die gesamte Deklaration innerhalb Quotes.

richtig:

set "Quellpfad=c:\beispieldatei.txt"
...soviel zu "Normal"...

bei mir gilt nachwievor : "Geht nicht gibts nicht"

...man kann auch zaubern und in einer Sprache (welche auf der Fensterbuffer zugreifen kann) einen eigenen Befehl programmieren. Der Einfachheit halber verwende ich Powershell:

demo.ps1

"Keine Gewähr, das dies auch in dem von Dir verwendeten neuen Windows-Terminal klappt!"
@'
zur Demo
das  ist ein
mehrzeiliger text
'@  # nur damit wir etwas haben  wa kopiert  werden kann  




# prüfe ob  wir  auf  den original ConsoleHost zugreifen.
if ($host.Name -ne 'ConsoleHost'){
  write-host -ForegroundColor Red "This script runs only in the console host. You cannot run this script in $($host.Name)."
  pause
  exit -1
}


# ermittle die Daten des Consolefensters
$bufferWidth = $host.ui.rawui.BufferSize.Width
$bufferHeight = $host.ui.rawui.CursorPosition.Y  # nur  bis  zur aktuellen Position des TextCursors in der Console lesen!!!! (sonst könnte  es zu recursionen kommen)
$rec = new-object System.Management.Automation.Host.Rectangle 0,0,($bufferWidth - 1),$bufferHeight
$buffer = $host.ui.rawui.GetBufferContents($rec)


# iteriere über Zeilen/Spalten des buffers
for($i = 0; $i -lt $bufferHeight; $i++){
  # initisalisiere für  jede Zeile einen neuen string builder.
  $textBuilder = new-object system.text.stringbuilder
  for($j = 0; $j -lt $bufferWidth; $j++)  {
    $cell = $buffer[$i,$j]  #lies Zeichen an der Position
    $null = $textBuilder.Append($cell.Character) #füge Zeichen zu unserem String
  }
  $textBuilder.ToString().TrimEnd(' ') # Zeile  ausgeben. !!!!wichtig Leerzeichen am Ende einer Zeile abschneiden! der FensterpufferBreite  wird immer mit mit Leerzeichen aufgefüllt
}
pause

Wie bekommt man das Script jetzt in eine Batch oder die cmd-Console? Ganz einfach... (solange man unter 8000 Zeichen bleibt) als Powershell-Einzeiler. (ich habe alles ein gekürzt was nicht nötig ist, solche BefehlsMonster kann sowieso niemand lesen):

powershell -c "if ($host.Name -ne 'ConsoleHost'){write-host  $('This script runs only in the console host. You cannot run this script in {0}.'-f $host.Name) -fo red;pause;exit -1};$RUI=$host.ui.rawui;$BW=$RUI.BufferSize.Width;$BH=$RUI.CursorPosition.Y;$rec=new-object System.Management.Automation.Host.Rectangle 0,0,($BW-1),$BH;$Bfr=$RUI.GetBufferContents($rec);for($i=0;$i -lt $BH;$i++){$TB=[text.stringbuilder]::new();for($j=0;$j -lt $BW;$j++){$null=$TB.Append(($Bfr[$i,$j]).Character)};$TB.ToString().TrimEnd(' ')}"

Jetzt tackere ich da ganze mal zu einer Batch zusammen:

Demo.cmd

@echo off

set "Quellpfad=c:\beispieldatei.txt"
set "Zielpfad=d:\beispieldatei.txt"
echo blubb %time%
echo "%Quellpfad%" -^> "%Zielpfad%"
copy "%Quellpfad%" "%Zielpfad%"

rem fieser Powershell One-Liner!
rem Lies den Zeilenpuffer der Console aus und screibe diesen in die datei "log.txt"
>>"log.txt" powershell -c "if ($host.Name -ne 'ConsoleHost'){write-host  $('This script runs only in the console host. You cannot run this script in {0}.'-f $host.Name) -fo red;pause;exit -1};$RUI=$host.ui.rawui;$BW=$RUI.BufferSize.Width;$BH=$RUI.CursorPosition.Y;$rec=new-object System.Management.Automation.Host.Rectangle 0,0,($BW-1),$BH;$Bfr=$RUI.GetBufferContents($rec);for($i=0;$i -lt $BH;$i++){$TB=[text.stringbuilder]::new();for($j=0;$j -lt $BW;$j++){$null=$TB.Append(($Bfr[$i,$j]).Character)};$TB.ToString().TrimEnd(' ')}"
rem die Datei mal im Standard-Editor öffnen
start "" "log.txt"
pause

...das ist natürlich nur Spielerei (machbar, aber sinnlos). Wenn man schon in einer mächtigeren Sprache programmieren kann, ist es Quatsch sich mit Batch herumzuschlagen! Wenn die Ausgabe vor dem Auslesen des Fensterpuffers dessen voreingestellte Größe überschreitet, werden die ersten Zeilen gelöscht. (also man kann programmtechnisch nur lesen, was man auch mit den Augen lesen könnte)

Wenn Du was richtiges machen möchtest, machs gleich mit Powershell, dann muss man sich nicht das Hirn verrenken um mit irgendwelchen Krücken zu hantieren.

1..100|
    ForEach-Object{
        '{0:D3} Missisippi'-f $_
    }|
    Tee-Object 'pslog.txt'
pause
...zur Antwort

Keine Ahnung in welcher Sprache Du die RegEx verwenden möchtest. wie auch immer, ohne Grouping (und explizites auswerten der Gruppen) wirst Du wohl nicht auskommen.

Der Ausschluss eines Bindestrichs/Minuszeichen, als Kriterium, ist in einem String, in welchem vorwiegend kein Bindestrich vorkommt, quatsch. (not/negativ-Kriterien sind in Regex schwer zu kontrollieren und immer ein Spiel mit dem Feuer.)

Die von @Waldi2007 erwähnten Lookbehinds fallen auch aus, da diese keine Subexpression akzeptieren.

@wrglbrmpft's Ansatz ist zwar erst mal vielversprechend, allerdings kommt dieser ins Schleudern , wenn statt 'NTN/4611Z/400V//TR1//I1_T1' , ein komplexeres Gebilde mi einzelnen / matchen soll: 'NTN/4611Z/400V//TR1//MPFH1M//L1|2/TI36|1'

Stattdessen würde folgendes mit späterer Auswertung der Gruppen (im Programmcode) verwenden

 (\/\/).*\1(.*)$

erklärt:

  • (\/\/) fängt das erste '//' und speichert es als Gruppe 1
  • .* beliebige Zeichen (muss greedy sein!) bis:
  • \1 letzte Wiederholung des Inhalts von Gruppe 1
  • (.*) ? speichert das Übrige bis Zeilenende in Gruppe 2

Das Ganze (Group 0) matched immer das gesamte Pattern. Der Trick besteht darin die im Patern definierten Guppen auszuwerten.

Wie man auf die einzelnen Gruppen zugreift, ist eine frage der Programmiersprache...

Powershell:

$Input = 'NTN/4611Z/400V//TR1//MPFH1M|L1|2/TI36|1'
$Pattern = '^.*(\/\/).*\1(.*)$'

$Result = [Regex]::Matches($Input,$Pattern)
$Result.Value  #entspricht  Group 0
$Result.Groups[2].Value

$Replaced = $Input -replace $Pattern,'$2'
"Ersetzung: {0}"-f $Replaced
pause

C#:

using System;
using System.Text.RegularExpressions;

class Prog{
  public static void Main(string[] args){
    String input = "NTN/4611Z/400V//TR1//MPFH1M|L1|2/TI36|1";
    String pattern = @"^.*(\/\/).*\1(.*)$";

    MatchCollection matches = Regex.Matches(input, pattern);
    foreach (Match match in matches) {
      Console.WriteLine(match.Groups[2].Value); 
    }

    // das Äquivalent zu Powershels -replace-Operator
    string replaced = Regex.Replace(input, pattern, "$2");
    Console.WriteLine( "Ersetzung: {0}", replaced);
    Console.WriteLine("press any key");
    Console.ReadKey();
  }
}
...zur Antwort