abonnement Unibet Coolblue Bitvavo
pi_220217290
Vandaag weer zo'n dag... werd wakker met een idee... kijken of ik met AI een C# programma kan maken, gewoon door vragen te stellen en kopiëren en plakken.

Het idee komt van Traffic Monitor en xMeters (wat helaas niet werkt onder Windows 11)

quote:
TrafficMonitor / XMeters is een lichte systeemmonitor voor Windows die real-time netwerk-, CPU-, geheugen-, schijf- en GPU-gebruik toont via taakbalk- of bureaubladwidgets, met aanpasbare meters en waarschuwingen.
Wat wilde ik, ik wil een programma wat zich in de startbalk nestelt (zoals een widget) links van de icon tray, rechts op het startmenu. Het programma moet een aantal statistieken laten zien (internet snelheid, hdd snelheid, cpu en mem gebruik)

Dus lekker vroeg begonnen op deze ochtend met chatGPT te bevragen en samen met hem een C# programma te schrijven vanaf scratch (vanaf installatie visual studio), stap voor stap.

Nu een paar uur later is het programma zo goed als een feit, toch best knap hoor die AI.


Net naast de tray.


I't groot.

Misschien leuk voor de spelers onder ons, deel ik de code gewoon! :+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using System.Net.NetworkInformation;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Collections.Generic;

namespace TaskbarMonitor
{
    public partial class Form1 : Form
    {
        // Metrics
        private float cpuUsage = 0;
        private float memUsage = 0;
        private float uploadAvg = 0;
        private float downloadAvg = 0;
        private float diskReadAvg = 0;
        private float diskWriteAvg = 0;

        private PerformanceCounter cpuCounter;
        private PerformanceCounter memCounter;
        private PerformanceCounter diskReadCounter;
        private PerformanceCounter diskWriteCounter;

        private long prevBytesSent = 0;
        private long prevBytesReceived = 0;

        // Rolling queues for averaging
        private Queue<float> uploadSamples = new Queue<float>();
        private Queue<float> downloadSamples = new Queue<float>();
        private Queue<float> readSamples = new Queue<float>();
        private Queue<float> writeSamples = new Queue<float>();

        private const int sampleInterval = 100;      // 100 ms
        private const int samplesToAverage = 10;     // average over 1 second

        private System.Windows.Forms.Timer refreshTimer;
        private System.Windows.Forms.Timer topMostTimer;
        private Color textColor = Color.White;

        // Celbreedtes: icoon, waarde, icoon, waarde, icoon, waarde
        private readonly int[] cellWidths = { 15, 60, 15, 60, 25, 49 }; // pixels

        public Form1()
        {
            InitializeComponent();

            this.FormBorderStyle = FormBorderStyle.None;
            this.ShowInTaskbar = false;
            this.TopMost = true;
            this.BackColor = Color.Black; // use solid background for stable clicks
            this.StartPosition = FormStartPosition.Manual;

            this.Load += Form1_Load;

            cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
            memCounter = new PerformanceCounter("Memory", "% Committed Bytes In Use");
            diskReadCounter = new PerformanceCounter("PhysicalDisk", "Disk Read Bytes/sec", "_Total");
            diskWriteCounter = new PerformanceCounter("PhysicalDisk", "Disk Write Bytes/sec", "_Total");
        }

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                int WS_EX_TOPMOST = 0x00000008;
                int WS_EX_TOOLWINDOW = 0x00000080; // hide from Alt+Tab
                cp.ExStyle |= WS_EX_TOPMOST | WS_EX_TOOLWINDOW;
                return cp;
            }
        }

        private void Form1_Load(object? sender, EventArgs e)
        {
            Rectangle taskbarRect = GetTaskbarBounds();
            Rectangle trayRect = GetTrayBounds();

            int width = cellWidths.Sum();
            int height = taskbarRect.Height;

            int x = trayRect.Left - width;
            int y = taskbarRect.Top;

            this.Location = new Point(x, y);
            this.Size = new Size(width, height);
            this.TopMost = true;

            // Force TopMost continuously
            topMostTimer = new System.Windows.Forms.Timer();
            topMostTimer.Interval = 500;
            topMostTimer.Tick += (s, ev) => this.TopMost = true;
            topMostTimer.Start();

            // Initial network snapshot
            prevBytesSent = NetworkInterface.GetAllNetworkInterfaces()
                .Where(n => n.OperationalStatus == OperationalStatus.Up)
                .Sum(n => n.GetIPv4Statistics().BytesSent);
            prevBytesReceived = NetworkInterface.GetAllNetworkInterfaces()
                .Where(n => n.OperationalStatus == OperationalStatus.Up)
                .Sum(n => n.GetIPv4Statistics().BytesReceived);

            // Refresh timer
            refreshTimer = new System.Windows.Forms.Timer();
            refreshTimer.Interval = sampleInterval;
            refreshTimer.Tick += RefreshTimer_Tick;
            refreshTimer.Start();
        }

        private void RefreshTimer_Tick(object? sender, EventArgs e)
        {
            long totalSent = NetworkInterface.GetAllNetworkInterfaces()
                .Where(n => n.OperationalStatus == OperationalStatus.Up)
                .Sum(n => n.GetIPv4Statistics().BytesSent);
            long totalReceived = NetworkInterface.GetAllNetworkInterfaces()
                .Where(n => n.OperationalStatus == OperationalStatus.Up)
                .Sum(n => n.GetIPv4Statistics().BytesReceived);

            float deltaUpload = (totalSent - prevBytesSent) / (float)sampleInterval * 1000f;
            float deltaDownload = (totalReceived - prevBytesReceived) / (float)sampleInterval * 1000f;
            prevBytesSent = totalSent;
            prevBytesReceived = totalReceived;

            EnqueueSample(uploadSamples, deltaUpload);
            EnqueueSample(downloadSamples, deltaDownload);
            uploadAvg = uploadSamples.Average();
            downloadAvg = downloadSamples.Average();

            float readCurrent = diskReadCounter.NextValue();
            float writeCurrent = diskWriteCounter.NextValue();
            EnqueueSample(readSamples, readCurrent);
            EnqueueSample(writeSamples, writeCurrent);
            diskReadAvg = readSamples.Average();
            diskWriteAvg = writeSamples.Average();

            cpuUsage = cpuCounter.NextValue();
            memUsage = memCounter.NextValue();

            this.Invalidate();
        }

        private void EnqueueSample(Queue<float> queue, float value)
        {
            queue.Enqueue(value);
            if (queue.Count > samplesToAverage) queue.Dequeue();
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Graphics g = e.Graphics;
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;

            Font font = new Font("Segoe UI", 9, FontStyle.Regular);

            string FormatSpeed(float speed)
            {
                float value;
                string unit;
                if (speed < 1024) { value = speed; unit = "B/s"; }
                else if (speed < 1024 * 1024) { value = speed / 1024f; unit = "K/s"; }
                else if (speed < 1024 * 1024 * 1024) { value = speed / (1024f * 1024f); unit = "M/s"; }
                else { value = speed / (1024f * 1024f * 1024f); unit = "G/s"; }
                return (value >= 100f) ? $"{Math.Floor(value)}{unit}" : $"{value:F1}{unit}";
            }

            string[] row1Labels = { "↑", "R", "CPU" };
            string[] row1Values = { FormatSpeed(uploadAvg), FormatSpeed(diskReadAvg), $"{cpuUsage:F0}%" };
            string[] row2Labels = { "↓", "W", "MEM" };
            string[] row2Values = { FormatSpeed(downloadAvg), FormatSpeed(diskWriteAvg), $"{memUsage:F0}%" };

            float y = 10;
            float lineHeight = g.MeasureString("Test", font).Height;

            void DrawRow(string[] labels, string[] values)
            {
                float x = 0;
                for (int i = 0; i < 3; i++)
                {
                    g.DrawString(labels[i], font, new SolidBrush(textColor), x, y);
                    x += cellWidths[i * 2];
                    SizeF textSize = g.MeasureString(values[i], font);
                    float valueX = x + cellWidths[i * 2 + 1] - textSize.Width;
                    g.DrawString(values[i], font, new SolidBrush(textColor), valueX, y);
                    x += cellWidths[i * 2 + 1];
                }
            }

            DrawRow(row1Labels, row1Values);
            y += lineHeight;
            DrawRow(row2Labels, row2Values);
        }

        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
            if (e.Button == MouseButtons.Left)
            {
                try { Process.Start(new ProcessStartInfo("taskmgr.exe") { UseShellExecute = true }); }
                catch { }
                this.TopMost = true; // ensure still on top
            }
            else if (e.Button == MouseButtons.Right)
            {
                if (refreshTimer != null) { refreshTimer.Stop(); refreshTimer.Dispose(); }
                if (topMostTimer != null) { topMostTimer.Stop(); topMostTimer.Dispose(); }
                this.Close();
                Application.Exit();
            }
        }

        // --- Taskbar ---
        [DllImport("shell32.dll", CallingConvention = CallingConvention.StdCall)]
        static extern uint SHAppBarMessage(uint dwMessage, ref APPBARDATA pData);
        const int ABM_GETTASKBARPOS = 0x00000005;
        [StructLayout(LayoutKind.Sequential)]
        struct APPBARDATA { public int cbSize; public IntPtr hWnd; public uint uCallbackMessage; public uint uEdge; public RECT rc; public int lParam; }
        [StructLayout(LayoutKind.Sequential)]
        struct RECT { public int left, top, right, bottom; }

        private Rectangle GetTaskbarBounds()
        {
            APPBARDATA data = new APPBARDATA();
            data.cbSize = Marshal.SizeOf(data);
            SHAppBarMessage(ABM_GETTASKBARPOS, ref data);
            RECT r = data.rc;
            return new Rectangle(r.left, r.top, r.right - r.left, r.bottom - r.top);
        }

        [DllImport("user32.dll", SetLastError = true)]
        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [DllImport("user32.dll", SetLastError = true)]
        private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string? lpszWindow);
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

        private Rectangle GetTrayBounds()
        {
            IntPtr trayWnd = FindWindow("Shell_TrayWnd", null);
            if (trayWnd == IntPtr.Zero) return Rectangle.Empty;
            IntPtr trayNotify = FindWindowEx(trayWnd, IntPtr.Zero, "TrayNotifyWnd", null);
            if (trayNotify == IntPtr.Zero) return Rectangle.Empty;
            if (GetWindowRect(trayNotify, out RECT r)) return new Rectangle(r.left, r.top, r.right - r.left, r.bottom - r.top);
            return Rectangle.Empty;
        }
    }
}

En wat hebben jullie allemaal voor moois met AI gedaan?

Verder heb ik al honderden scripts gemaakt voor allerlei acties/toepassingen

-edit- programmatje zitten her en der nog wat kleine foutjes, maar leuk begin al zeg ik het zelf! :o
The people who lost my respect will never get a capital letter for their name again.
Like trump...
pi_220221423
quote:
Het programma moet een aantal statistieken laten zien (internet snelheid, hdd snelheid, cpu en mem gebruik)
Hartsikke fijn dat je het progje deelt; Top!

Die statistieken kan je overigens ook verkrijgen met Taakbeheer/Prestaties, wat overigens niks afdoet aan jouw werkt. :)
pi_220221709
Ik gebruik ze om al mijn modules te maken. Ben de best getrainde werknemer op de vloer.
pi_220221970
quote:
0s.gif Op zaterdag 28 februari 2026 17:30 schreef gepromoveerT het volgende:

[..]
Hartsikke fijn dat je het progje deelt; Top!

Die statistieken kan je overigens ook verkrijgen met Taakbeheer/Prestaties, wat overigens niks afdoet aan jouw werkt. :)
Correct, maar dan moet ik taakbeheer standaard open hebben. Nu zie ik deze statistieken altijd! :Y
The people who lost my respect will never get a capital letter for their name again.
Like trump...
pi_220225207
quote:
0s.gif Op zaterdag 28 februari 2026 18:45 schreef Chandler het volgende:

[..]
Correct, maar dan moet ik taakbeheer standaard open hebben. Nu zie ik deze statistieken altijd! :Y
Ook top. Vroeger had Nvidia zo'n progje. Overigens... Taakbeheer aan de taakbalk vastzetten :@
pi_220225468
Ik gebruik het wekelijks om macro's te schrijven in Excel.
Cindy De Vuyst
  zondag 1 maart 2026 @ 16:42:23 #8
40566 Ericr
Livewrong
pi_220231104
In andere topic al gemeld maar net in no time Agentic in VS Code met Claude dit gebouwd

quote:
A local Delta Lake medallion architecture pipeline built with PySpark and delta-spark, running in Docker. Ingests retail sales CSV files and processes them through bronze, silver, and gold layers.

Built as a portfolio project to demonstrate modern data lakehouse patterns — designed to be extended to cloud storage (ADLS, S3) or Databricks with minimal changes.

Ga het hierna verder uitbouwen naar daadwerkelijke cloud omgevingen. Nu draait het nog allemaal lokaal.
pi_220257433
En weer 2 daagjes wezen spelen met een projectje voor mijn prive video's. Ik heb nogal een archief en gelukkig staan deze wel op basis van jaar maar niet welke gebeurtenis of soort video.

Nu is mijn bedoeling om ieder jaar in submappen te verdelen waarin de video's uit dat jaar komen. Bv Dieren, filmpjes van mijn dieren van toen. Zomerhuisje, alle filmpjes van het huisje, de tuin etc.

Maar het is best een werk als je dit allemaal handmatig moet doen, soms wil ik een stukje van de video afhalen (begin of eind) of wil ik hem gewoon verwijderen. Vaak verplaats ik ze naar een bestaande map maar soms moet er ook een nieuwe gemaakt worden. Dus dacht ik, laat ik met chatGPT eens spelen...

En voilla, het resultaat na 2 dagen coderen (1700+ regels en 65+Kb)


Initiële opties waren beperkt maar de mogelijkheden groeiden en zo deed ook de codebase :+

Nu bij de eerste keer opstarten moet je opzoek naar FFMPEG en daarna de bron directory selecteren. Dan kom de mainwindow met de geladen video's waarbij hij de eerste afspeelt.



De opties zijn nu:
Random, Vorige, Volgende, Nieuwe folder aanmaken, Verwijderen, Verwijder intro, 90 graden draaien, in een externe speler openen, geluid uit, nieuwe directory laden. lijst weergeven (zie je het overzicht aan de rechterkant) en instellingen (waar je de taal, ffmpeg directory en nog wat instellingen kunt aanpassen).

Alle instellingen worden continue opgeslagen in een json bestand met daarbij ook welke video je speelt. Dus stop je het script dan start hij de volgende keer op daar waar je gebleven bent.

Kan in de toekomst simpel de taal veranderen of een taal toevoegen aangezien alles in een grote array staat!

Veel controles in het script om errors op te vangen (want liever niet in gui, maar ook genoeg informatie naar console voor debugging).

Werkt bijna helemaal vlekkeloos.
PS. Ga de code niet posten aangezien 67kb niet veel toevoegt op het forum. Mocht iemand interesse hebben stuur gerust een PB
The people who lost my respect will never get a capital letter for their name again.
Like trump...
  woensdag 4 maart 2026 @ 16:48:32 #10
40566 Ericr
Livewrong
pi_220257435
En gisteren een volledig RAG systeem gemaakt. Niet alleen de backend maar ook een werkende frontend waarmee je vragen kan stellen over de inhoud van documenten. Best wel bizar snel gemaakt. Output geeft in Node/js en React frontend ook nette geformateerde output.

Oh en code gewoon op Github knallen anders


Hier bijvoorbeeld mijn pipeline project

https://github.com/ericreitsma13-star/delta-lake-retail-pipeline
pi_220257483
quote:
1s.gif Op woensdag 4 maart 2026 16:48 schreef Ericr het volgende:
En gisteren een volledig RAG systeem gemaakt. Niet alleen de backend maar ook een werkende frontend waarmee je vragen kan stellen over de inhoud van documenten. Best wel bizar snel gemaakt. Output geeft in Node/js en React frontend ook nette geformateerde output.

Oh en code gewoon op Github knallen anders

Hier bijvoorbeeld mijn pipeline project

https://github.com/ericreitsma13-star/delta-lake-retail-pipeline

Leuk idee, moet ik maar eens doen! Code delen is super leuk man!

En knap wel... als je het zo bedenkt... als ik dit zelf helemaal had moeten schrijven was ik nog niet eens op 10% geweest.. :+
The people who lost my respect will never get a capital letter for their name again.
Like trump...
  woensdag 4 maart 2026 @ 16:57:43 #12
40566 Ericr
Livewrong
pi_220257498
quote:
0s.gif Op woensdag 4 maart 2026 16:56 schreef Chandler het volgende:

[..]
Leuk idee, moet ik maar eens doen! Code delen is super leuk man!

En knap wel... als je het zo bedenkt... als ik dit zelf helemaal had moeten schrijven was ik nog niet eens op 10% geweest.. :+
Heb je al MCP geïntegreerd?
pi_220257569
quote:
0s.gif Op woensdag 4 maart 2026 16:57 schreef Ericr het volgende:
Heb je al MCP geïntegreerd?
Nee, denk ik niet aangezien ik geen flauw idee heb wat je daarmee bedoeld..
The people who lost my respect will never get a capital letter for their name again.
Like trump...
  woensdag 4 maart 2026 @ 17:18:22 #14
40566 Ericr
Livewrong
pi_220257620
quote:
86s.gif Op woensdag 4 maart 2026 17:09 schreef Chandler het volgende:

[..]
Nee, denk ik niet aangezien ik geen flauw idee heb wat je daarmee bedoeld..
Communicatie met tools. Heb het nu voor github. Model commit en pusht zelf
pi_220257891
quote:
0s.gif Op woensdag 4 maart 2026 16:56 schreef Chandler het volgende:

[..]
Leuk idee, moet ik maar eens doen! Code delen is super leuk man!

En knap wel... als je het zo bedenkt... als ik dit zelf helemaal had moeten schrijven was ik nog niet eens op 10% geweest.. :+
Had je wel veel meer van geleerd.
  woensdag 4 maart 2026 @ 19:34:34 #16
232494 Boca_Raton
Voor al uw no nonsense
pi_220258458
Kleine probleempjes of vragen voorgelegd. En werkelijk, de antwoorden zijn soms de spijker op z’n kop. Ik ben er wel blij mee.
pi_220259461
quote:
1s.gif Op woensdag 4 maart 2026 18:08 schreef Farenji het volgende:
Had je wel veel meer van geleerd.
Waarheid als een koe, ware niet dat dat niet specifiek het doel is. Ik leer er zeker van. *)
The people who lost my respect will never get a capital letter for their name again.
Like trump...
pi_220620830
Ik heb net een soortement van Fitness App gemaakt door een uurtje of 8 te spelen met CoPilot.

https://bumpy-apricot-amnjoksuis.edgeone.app/

Wat vinden jullie er van?

Is om mij te motiveren om meer te gaan trainen, werkt 100% zonder internet. Slaat je data op het device zelf op.
The people who lost my respect will never get a capital letter for their name again.
Like trump...
  Moderator donderdag 30 april 2026 @ 19:51:53 #19
56843 crew  onlogisch
Forumbeest
pi_220685269
quote:
0s.gif Op maandag 20 april 2026 16:45 schreef Chandler het volgende:
Ik heb net een soortement van Fitness App gemaakt door een uurtje of 8 te spelen met CoPilot.

https://bumpy-apricot-amnjoksuis.edgeone.app/

Wat vinden jullie er van?

Is om mij te motiveren om meer te gaan trainen, werkt 100% zonder internet. Slaat je data op het device zelf op.


Echt.... fantastisch :)
Recordhouder aantal posts op één dag.
4045
onlogisch
pi_220685319
quote:
9s.gif Op donderdag 30 april 2026 19:51 schreef onlogisch het volgende:

[..]
[ afbeelding ]

Echt.... fantastisch :)
http://mijnonlinespeeltuin.nl/testapp1.html
The people who lost my respect will never get a capital letter for their name again.
Like trump...
  Moderator donderdag 30 april 2026 @ 20:00:42 #21
56843 crew  onlogisch
Forumbeest
pi_220685335
Recordhouder aantal posts op één dag.
4045
onlogisch
pi_220685607
quote:
0s.gif Op donderdag 30 april 2026 20:00 schreef onlogisch het volgende:

[..]
[ afbeelding ]

Topper.
Wat heb je gedaan om dat te zien te krijgen? :@
The people who lost my respect will never get a capital letter for their name again.
Like trump...
pi_220685614


dit is wat ik zie als ik hem gewoon opstart ;-)
The people who lost my respect will never get a capital letter for their name again.
Like trump...
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')