Jump to content

Programmering, kodning och/eller scripting


dibel
 Share

Recommended Posts

Tjena, tjena.

Det här kan vara tråden för generell programmering oavsett språk. Jag får ibland känsla för att koda lite och sätter igång med något projekt. Just nu är det lite scripting i GDScript (Godot 4) som gäller, men jag går i banorna att programmera lite i C (med biblioteken SDL2, Vulkan, SQLite, ImGUI, cgltf?) för att det är roligt. Man kan ju börja med att få standardkuben i Blender att rendereras och ta det därifrån.

Som alla vet är det Open Source-mjukvara och bibliotek som gäller för mig, särskillt när det gäller programmeringsprojekt. Bara man ser till att licensen är vad man anser vara okej (aktar sig för GPL om man inte avser att GPL:a sin egen kod m.m.) så är det bra.

Här är lite stats för C, C# och Javascript på min dator för en for loop som räknar till hundra miljoner:

C

Dölj innehåll
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <inttypes.h>
#include <limits.h>

int main(int argc, char *argv[]) {
    for (int_fast32_t i = 0; i < 100000000; ++i) {
        printf("%"PRIu32"\n", i);
    }
    return 0;
}
[erik@erik-pc-01 iteration]$ time ./a.out &>/dev/null

real	0m3.302s
user	0m3.278s
sys	0m0.020s

 

C#

Dölj innehåll
for (int i = 0; i < 100000000; ++i) {
    Console.WriteLine(i);
}
[erik@erik-pc-01 Iteration]$ time bin/Release/net8.0/Iteration &>/dev/null

real	0m54.805s
user	0m28.733s
sys	0m26.001s

 

Javascript

Dölj innehåll
for (let i = 0; i < 100000000; i++) {
    console.log(i)
}
[erik@erik-pc-01 iteration]$ time node index.js &>/dev/null

real	2m23.249s
user	2m3.020s
sys	0m20.286s

 

Ignorera parametern &>/dev/null som bara betyder att omdirigera stdout till "ingenting" för att undvika att benchmarka terminalen/konsolen istället för koden.

Som ni ser är C King of Kings. C# fastnar i runtime (dotnet) alldeles för länge i Systemet innan själva koden körs och Javascript som simplast och dynamiskt typat tar väldigt mycket längre tid.

C-programmet är kompilerat i gcc 14.1.1 med -O3

C#-programmet är gjort med dotnet därför ser det så simpelt ut utan någon class och "main"-funktion. Enligt Microsofts Hello World-exempel som man får när man gör ett nytt projekt i dotnet.

Javascriptet körs i NodeJS 22.4.1.

Efter denna simpla benchmark är jag ganska besviken på dotnet/C# faktiskt. Visst, lite overhead med runtime får man räkna med, men att den är så stor var en negativ överraskning.

---

Nå, hur ser era programmeringsvanor ut? Studier, projekt m.m. kan tas i tråden.

HH (Happy Hacking)!

Redigerad av dibel
  • Gilla 1
Länk till kommentar
Dela på andra sidor

Det här är fortfarande min största bedrift och jag installerar det på alla jobbdatorer jag har eftersom de för det mesta saknar en hibernation-knapp. Men Ctrl-Alt-V för viloläge och sen denna prompt så är den släckt på direkten. Vill säga, om man bara trycker enter utan att trycka in någon tid så blir det automatiskt noll = nu.

2015-04-14 at 13:15, Henkibojj skrev:

Igår lärde jag mig lite nya kommandon i CMD, eller .bat-filer. Jag har sedan tidigare förstått mig på datoravstängningskommandot shutdown och timertillägget /t 300 vilket ger en fördröjning på 300 sekunder = 5 minuter. Med detta gjorde jag år 2011 en massa smarta entimmes-, tvåtimmars- och liknande timers, inklusive en avbrytar-bat.

Men jag har alltid saknat en /t för Viloläge: shutdown /h, för kommandot shutdown /h /t 300 existerar inte i CMD. Det har alltså varit omöjligt att göra en timer för vanligt viloläge. Poängen med viloläge är mest att jag ofta vill ha kvar de program jag har igång utan att göra en cold shutdown.

Igår lärde jag mig kommandot TIMEOUT /NOBREAK 300 för 300 sekunders väntan inför nästa kodrad, samt hur man sätter egna värden (dvs inte CHOICE) genom set /p siffervaerde. Man kan dessutom manipulera siffervaerde med den aritmetiska operatorn /a, vilket ger möjlighet att sätta siffervaerde+-*/ ett annat värde, till exempel 60 för att göra om minuter till sekunder. Vill man referera till värdet skriver man %siffervaerde%.

Som bonus lärde jag mig det väldigt enkla kommandot time /t för att visa klockan.

Resultatet var en betydligt smidigare och många gånger bättre batfil än de ~7 standardtider jag knåpade ihop 2011.

Kolla in och spara gärna ned på egen hårddisk för sena Netflix-kvällar i sängen med datorn på storbild! :)

 @echo off

:start

cls

echo Välj V för viloläge.

echo Välj A för avstängning.

echo Välj X för att avbryta.

choice /c:VAX

if errorlevel 3 goto Avbryt

if errorlevel 2 goto Shutdn

if errorlevel 1 goto Sleeping

:Avbryt

echo.

echo Jaså, då säger vi hejdå.

pause

goto end

:Shutdn

echo.

echo VARNING! Du har valt avstängning. Alla program kommer att stängas ned utan sparning vid timerns slut. Är du säker på att du vill fortsätta?

choice /c:jn

if errorlevel 2 goto start

cls

echo Om hur lång tid ska datorn stängas av?

set /p minuter="Tid i minuter: "

set /a sekunder=%minuter%*60

echo.

echo Timern har satts till %minuter% minuter = %sekunder% sekunder. Klockan är nu

echo.

TIME /t

echo ...och datorn kommer att stängas av efter följande tid. Se till att spara allt arbete!

TIMEOUT /NOBREAK %sekunder%

shutdown /f

goto end

:Sleeping

echo.

echo Om hur lång tid ska datorn försättas i viloläge?

set /p minuter="Tid i minuter: "

set /a sekunder=%minuter%*60

echo.

echo Timern har satts till %minuter% minuter = %sekunder% sekunder. Klockan är nu

echo.

TIME /t

echo ...och datorn kommer att försätts i viloläge efter följande tid:

TIMEOUT /NOBREAK %sekunder%

shutdown /h

:end

 

Och skratta inte åt mig, jag har aldrig programmerat något annat än BAT :unsure: Python under fem veckor på en obegriplig Unix-dator i gymnasiet tycker jag inte räknas.

 

Lite länkar:

http://www.robvanderwoude.com/wait.php

http://commandwindows.com/variables.htm

 

Tjing pling! :)

/1337

  • Gilla 1
Länk till kommentar
Dela på andra sidor

7 timmar sedan, Henkibojj skrev:

Det här är fortfarande min största bedrift och jag installerar det på alla jobbdatorer jag har eftersom de för det mesta saknar en hibernation-knapp. Men Ctrl-Alt-V för viloläge och sen denna prompt så är den släckt på direkten. Vill säga, om man bara trycker enter utan att trycka in någon tid så blir det automatiskt noll = nu.

/1337

Funkar det så funkar det. Hur blir det vid input vid choices? Om man skriver "gtasajten" när den vill ha V, A eller X t.ex.?

Knåpade ihop ett powershell-script baserat på ditt batch-script:

Dölj innehåll
Function get_user_input {
	return Read-Host "Choice"
}

Function w {
	Param
	(
		[Parameter(Mandatory=$true, Position=0)]
		[string] $msg
	)
	Write-Host $msg
	return
}

Function get_choice {
	$ret = "x"
	$choices = @{
		v="Hibernate";
		a="Shutdown";
		x="Cancel"
	}
	$continue = $true
	while ($continue) {
		foreach ($hash in $choices.GetEnumerator()) {
			w -msg "Choose $($hash.name) to $($hash.value)"
		}
		$p = get_user_input
		Switch -Regex ($p) {
			"^[Vv].*" {
				$ret = "v"
				$continue = $false
			}
			"^[Aa].*" {
				$ret = "a"
				$continue = $false
			}
			"^[Xx].*" {
				$ret = "x"
				$continue = $false
			}
			Default {
				w -msg "Fail"
			}
		}
	}
	return $ret
}

Function get_y_or_n {
	$ret = "default"
	$continue = $true
	while ($continue) {
		$p = get_user_input
		Switch -Regex ($p) {
			"^[Yy]|[Jj].*" {
				$ret = "y"
				$continue = $false
			}
			"^[Nn].*" {
				$ret = "n"
				$continue = $false
			}
			Default {
				w -msg "Fail"
			}
		}
	}
	return $ret
}

Function shutdown_or_hibernate {
	Param
	(
		[Parameter(Mandatory=$true, Position=0)]
		[string] $m
	)
	$timeout = get_timeout
	w -msg $timeout
	Get-Date
	Switch -Regex ($m) {
		"^v" {
			Timeout /NoBreak $timeout
			#Shutdown /h
			w -msg "Shutdown /h"
			
		}
		"^a" {
			Timeout /NoBreak $timeout
			#Shutdown /f
			w -msg "Shutdown /f"
		}
	}
}

Function get_timeout {
	$ret = 0
	$continue = $true
	while ($continue) {
		w -msg "Enter minutes (integer)"
		$p = get_user_input
		$i = $p -as [int]
		if ($i -is [int]) {
			$ret = $i
			$continue = $false
		}
		else {
			w -msg "$($p) is not an integer"
		}
	}
	return $ret * 60
}

$mode = get_choice

if ($mode -eq "x") {
	exit
}

shutdown_or_hibernate -m $mode

 

Vet inte om det är till någon nytta, men lite kul att koda sitt första PS-script åtminstone. Körde Windows 10 i en VM och den verkar funka (om man tar bort # som är en kommentar för själva shutdown-kommandona på de 2 ställena).

Funktionen w är helt onödig, men jag gjorde den som en helper för att slippa skriva Write-Host hela tiden, hehe. Trodde man skulle kunna köra w("string"), men i PS så är parametrar en flagga man lägger till.

Kopiera och ändra strängarna till svenska och lägg till och ändra hur mycket du vill. Public Domain License, haha.

Funktionaliteten att avsluta med X är dock helt onödig då man alltid kan avsluta med Ctrl-C i terminalen (vet inte hur det är i cmd.exe dock).

Nåväl, kul miniprojekt.

Länk till kommentar
Dela på andra sidor

49 minuter sedan, dibel skrev:

Funkar det så funkar det. Hur blir det vid input vid choices? Om man skriver "gtasajten" när den vill ha V, A eller X t.ex.?

 

Den piper två gånger eftersom G inte är ett valbart input, inte T heller, men sedan kommer man till Avstängning och resten av modulen.

  • Gilla 1
Länk till kommentar
Dela på andra sidor

  • 2 weeks later...
  • 3 weeks later...

Är inte speciellt komfortabel med några riktiga språk förutom Powershell, men det behärskar jag bra! Det blir lätt så när det är enda sättet att automatisera bort jobbiga jävla arbetsuppgifter. Min arbetsgivare är för snål för att köpa ett HRIS-system som kan integreras mot Active Directory, så fram tills jag började förra året satt en stackare på IT och skapade användarkonton manuellt. Tror det är 10-15 nya som börjar varje månad, så det är ett väldigt tradig arbete till slut. Alla anställda jobbar hemifrån också, så det var en jobbig manuell process. Det blir som upplagt för en bokstav fel här och där när man sitter och kopierar och klistrar mellan olika fönster, samt att att kommunicera lösenord.

Nu går det till såhär istället:

  1. Chefen för den nyanställda matar in en beställning i Jira.
  2. Jira kickar igång en Logic App på Azure
  3. Logic Appen kör ett Powershell-skript för att generera ett lösenord från en ordlista. Cirka 5000 ord. Lösenorden som kommer ut är typ "Glassmaskin bildäck?"
  4. Ett nytt Powershell-skript med inputten från Jira samt lösenordet från steg 3.
  5. Den kontrollerar om allting gick bra - om nej så kommenterar det i Jira-ärendet. Oftast är det skit bakom spakarna, men ibland kommer det in sådant som det är enkelt att lösa i skriptet i sig, och då gör jag det såklart. Som kodsnutten nedan t.ex. Vi fick in en nyanställd med ett väldigt långt efternamn, så den översteg maxgränsen på SamAccountName-attributet, så då fick jag lägga till det här för att det inte ska hända igen, t.ex
     
    if ($email.Length -gt 20) {
        $samaccountname = $email.Substring(0, 20)
    } else {
        $samaccountname = $email
    }
  6. Om det gick bra så går den vidare med att skicka ett välkomstbrev med användarnamn och lösenord till användarens privata e-postadress. Krypterat och tjusigt! Fick kämpa mot vår CISO länge innan han godkände det istället för att vi skulle skriva ut det på papper och skicka hem fysiskt.

    image.png.534aa93302c2d48b393318e69303dca4.png

  Kan inte dela något av skriptet som skapar användaren, det är för mycket som är specifikt till vår miljö, men i grund och botten är det bara New-ADUser, parametrarna som kom med Jira, samt en herrans massa grupptilldelningar som har lite olik logik beroende på anställningsort, närmsta chef, yrkesroll, etc.

Det jag arbetat med senast är att sätta inaktiveringsdatum på användare direkt från Jira också. Där frågar jag bara efter datumet som kontot ska inaktiveras, samt mejladressen till användaren. Eftersom vi har en sådan jävla ruljans på folk (som 10-15 nya per månad skvallrar om) så är det såklart många som måste inaktiveras också. Detta sätter inaktiveringsdatumet till det valda datumet. Om det datumet redan har passerats så inaktiveras kontot på en gång.

Nu måste jag bara kontakta vår CISO igen och försöka övertyga människan om att jag ska få sätta upp något schemalagt jobb som tar bort användare som har varit inaktiverade i mer än 6 månader varje natt... heja.
 

Redigerad av Gof
  • Gilla 1
  • Tack! 1
Länk till kommentar
Dela på andra sidor

Jag hade faktiskt inte ens hört talas om PowerShell förrän chefen hos min kund plockade in sommarjobbare som använde det till att automatisera namnhantering på bulkskannade dokument. Det låter som att mycket av det jag gör manuellt på heltid skulle kunna prova försiktiga små steg i PS, men jag är å andra sidan anlitad för att hålla på med saker där nästan allt som görs är undantag från normen, vilket är varför jag inte använt mig av klickmakron ens. Dock makron i W0rd, men bara för att snabba på det redan alltför manuella jobbet.

Länk till kommentar
Dela på andra sidor

2024-08-19 at 12:38, Henkibojj skrev:

Jag hade faktiskt inte ens hört talas om PowerShell förrän chefen hos min kund plockade in sommarjobbare som använde det till att automatisera namnhantering på bulkskannade dokument. Det låter som att mycket av det jag gör manuellt på heltid skulle kunna prova försiktiga små steg i PS, men jag är å andra sidan anlitad för att hålla på med saker där nästan allt som görs är undantag från normen, vilket är varför jag inte använt mig av klickmakron ens. Dock makron i W0rd, men bara för att snabba på det redan alltför manuella jobbet.

Skapa en kopia på ett av dina arbetsdokument och testa! Beroende på din arbetsplats så kan Powershell vara ganska nedlåst om du inte har adminaccess, men det går att påverka det mesta i en Windows-miljö.

Länk till kommentar
Dela på andra sidor

Får man räkna sånt man skapar med AI som sitt eget, förresten? I sådanafall kan jag stoltsera med den här dunderhemsidan: https://tyrannosaurus.se

Bakgrunden är jättesimpel - våra nyanställda tyckte det var så svårt att komma på egna lösenord, samt att förstå lösenordskraven. Internt har jag en funktion där dom loggar in med sitt Microsoft-konto så den tar namnet därifrån, men det kändes olämpligt att publicera, så alla (hela 83 någonsin!) besökare till den publika biten får fylla i sitt namn på egen hand.



 

Länk till kommentar
Dela på andra sidor

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gäst
Skriv inlägg...

×   Innehåll kopierat inklusive formatering.   Ta bort formatering

  Only 75 emoji are allowed.

×   Din länk har expanderats till ett media-block.   Visa länk istället

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...