Developer Dagboek #12 – AI-tools deel III

Developer Dagboek #12 – AI-tools deel III

Auteur: Danny Holstein

Pasgeleden was er in het nieuws dat de modellen Claude Fable en Claude Mythos door de Amerikaanse overheid waren opgeschort vanwege zorgen over de nationale veiligheid. In de tussentijd zijn deze AI-modellen weer vrijgegeven. AI-tools zijn niet meer uit de dagelijkse werkpraktijk weg te denken. De verschillende AI-tools bieden vaak snelle antwoorden en effectieve oplossingen. Hoewel niet alles helemaal perfect is, wordt er vaak veel tijd bespaard. Ook in de afgelopen maanden zijn er nieuwe LLM’s (Large Language Models) uitgekomen die zowel nieuwe mogelijkheden bieden als nog effectiever zijn.

Angular applicaties en het gebruik van AI-tools

Bij een gebruikerszaak was het nodig om een aangepaste interceptor te maken. Mijn gedachte was om zowel een request- als response-interceptor te maken, maar dit bleek niet te werken en een bepaalde state van de applicatie veranderde niet. De code is voorgelegd aan een AI-tool en er is gevraagd hoe een bepaalde state wel is te veranderen. De AI-tool Claude Sonnet kwam binnen no time met een werkende oplossing, waar de twee interceptors met elkaar werden gecombineerd en daarbinnen door een geïnjecteerde service de state wel juist werd veranderd. Opnieuw is er veel tijd bespaard, wat anders een traject zou worden van trail-and-error.

De AI-tools zijn behulpzaam wanneer er issues zijn met Angular Material. Een bug in Angular Material, komt voor met het gebruik van meerdere tabbladen waarbij in bepaalde situaties de input-velden niet de juiste grootte aannemen. De AI-tools kwamen met een werkende oplossing en een bevestiging dat dit een bug is in Angular Material. Deze bug is gerelateerd aan de timing en initialisatie wanneer componenten in verschillende tabs worden geladen. Dit probleem doet zich voor wanneer Angular Material de positie van een label moet herberekenen nadat het component is weergegeven, maar wanneer de content in een verborgen tab zit, dan kunnen de berekeningen incorrect zijn. De oplossing was een combinatie van viewChild met de setTimeout functie – en ook kon voor de desbetreffende tabs de animationDuration op 0 milliseconden worden gezet.

Het gebruik van Angular Material’s MatDialog kan problemen veroorzaken wanneer er niet wordt uitgeschreven op een listener. In een applicatie had ik dit klassieke symptoom weten te realiseren van het aanmaken van meerdere event listener subscriptions zonder een juiste opruiming hiervan. De oplossing was om gebruik te maken van de geschikte RxJS (Reactive Extensions JavaScript) operator take waarmee  tegelijkertijd er op een juiste manier wordt uitgeschreven. Alsook dit op te nemen in ngOnDestroy (dat is een life-cycle hookmethode in Angular) wanneer het component wordt vernietigd.

En er zijn tal van andere kleinere zaken waarbij de AI-tools niet alleen bijzonder behulpzaam zijn, maar ook veel tijd besparen. Zaken zoals: wanneer er in Angular Material het ripple-effect van knoppen uitgezet moet worden. Of bij iets complexere problemen waarbij een al vernietigd component toch nog zaken blijft uitvoeren – met als oplossing dat er meer gebruik gemaakt moet worden van ngOnDestroy. De verschillende AI-tools bieden vaak effectieve oplossingen voor problemen met zowel het Date-object als de Datetime pipe waarbij datums op de juiste en gewenste manier worden getoond.

C#/.NET applicaties en het gebruik van AI-tools

In een gebruikerszaak was het nodig om een bestaande database om te zetten in entities voor een WebApi. Het eerste dat in mij te binnen schoot, dat was om gebruik te maken van de zogenaamde Scaffold die beschikbaar is in het EntityFramework en de dotnet tool. Alleen had ik de Scaffold nog nooit eerder gebruikt. De setup was zo gedaan, maar al snel deden zich allerlei problemen met de connectie voor. Een beproefde oplossing is om een checklist te genereren door een AI-tool. Hier kwamen bruikbare tips uit, zoals: het controleren van de versies, de geïnstalleerde packages, verbeteringen in de connection string en extra commando’s toe te voegen. Dankzij de checklist was te achterhalen dat de database luisterde naar de standaardpoort en adres in plaats de named instance (de Docker container waar de database werd uitgevoerd). Het resultaat was dat er veel entities automatisch zijn gemaakt. Het is ook mogelijk om zelf de entities van een bestaande database te maken, maar dan liggen typefouten en andere fouten met de datatypen op de loer.

Waar ik de AI-tools ook vaak voor gebruik en wat veel tijd bespaard, dat is om C# modellen om te zetten in SQL-statements om een nieuwe tabel te maken. Deze SQL-statements zelf uittypen is vaak gevoelig voor typefouten. De AI-tools genereren foutloze SQL-statements voor zowel MSSQL als PostgreSQL databases. En houden rekening met zaken zoals ‘auto increment’ waarbij een index na het toevoegen van een nieuw record automatisch wordt verhoogd, alleen dit laatste heet anders in de verschillende SQL ‘dialecten’ (AUTOINCREMENT voor MySQL, IDENTITY voor MSSQL Server en SERIAL voor PostgreSQL). Ook excelleren de verschillende AI-tools om SQL-statements van het ene ‘dialect’ om te zetten in het andere ‘dialect’. Hetzelfde geldt voor Alter-Statements, waarbij een bestaande database tabel wordt aangepast.

In een andere gebruikerszaak, waar gebruik gemaakt wordt van Postmark, waren eerst zaken niet helemaal duidelijk om bulk-emails (voor nieuwsbrieven) te sturen. De vraag hierover is voorgelegd aan Claude Sonnet  en het antwoord was helemaal duidelijk. Er is in Postmark namelijk een verschil tussen transactional- en broadcast-streams, waarbij de eerste betrekking heeft op e-mails voor de applicatie en de tweede geschikt is voor bulk e-mails of nieuwsbrieven. Als bonus, en daar was ik me niet van bewust, is er een maximum van 500 e-mails per bulk-verzending in Postmark. De oplossing van dit laatste is recht vooruit: in C#/.NET is er binnen LINQ (Language Integrated Queries) de methode Chunk die grote collecties kan opdelen in kleinere delen van de gewenste grootte. Ook waren de AI-tools bijzonder behulpzaam bij het effectief aanpassen van Postmark templates.

Een andere grotere gebruikerszaak was om bepaalde informatie uit een database om te zetten in een PDF-bestand. Omdat ik dit nog niet eerder had gedaan, is verschillende AI-tools om raad gevraagd. Er was consensus dat PupeteerSharp hiervoor een geschikte library is. Deze library is bovendien gratis en niet te moeilijk in het gebruik. Aan de hand van de documentatie en het experimenten in een losse Console App, deed zich het probleem voor dat de kleuren veel donkerder waren dan verwacht. De AI-tool heeft meerdere oplossingen aangedragen, waarvan het toevoegen van opties en properties aan de CSS-stylesheet de meest simpele en effectieve was. Een ander verhaal was om deze applicatie uiteindelijk werkend te krijgen in een Docker container. Hier waren zaken gemist, want PupeteerSharp heeft de Chromium (webbrowser) dependencies nodig en ook moest de Dockerfile hiervoor verder worden aangepast. Ook moest de code verder worden aangepast en bepaalde flags worden aangezet, waarbij de Chromium browser in Headless mode wordt opgestart en dit is cruciaal in een Docker container. Zonder al te veel trail-and-error is dit deel van de applicatie succesvol werkend gekregen.

Ook zijn er talrijke andere kleinere gebruikerszaken waarbij de AI-tools om hulp is gevraagd. Voorbeelden daarvan zijn: effectieve manieren om Enums om te zetten in vertalingen (door gebruik te maken van het Display-attribuut en een static method te gebruiken om dit om te zetten). Bij projecten waar ik de code voor een eerste keer onder ogen krijg, doen zich ook vaak problemen voor met het starten van de applicatie en hierbij was de AI-tool behulpzaam om bepaalde onderdelen van de applicatie te laten opstarten. Soms raken bepaalde gebruikerszaken bij mij in vergetelheid en een voorbeeld daarvan is het gebruik van SignalR en de endpoints hiervan. Hiervoor moest iets worden aangepast, maar ik wist even niet meer waar ik dit kon vinden. De AI-tool wees erop dat er in Program.cs gekeken moest worden en vervolgens een niveau hoger gegaan kon worden, dat de oplossing bleek te zijn.

Bewerken en genereren van afbeeldingen

Waar de verschillende AI-tools (GPT, Claude Sonnet, etc.) in excelleren is het aanpassen van afbeeldingen of om compleet nieuwe afbeeldingen te genereren op basis van andere afbeeldingen. Bij dit laatste is er wel een verschil, want GPT blijft meer trouw aan de aangeleverde attachments, terwijl Claude Sonnet de input soms verder dirigeert aan Nano Banana (van Google) waardoor er een compleet andere afbeelding wordt gegenereerd. GPT image 2 is een bijzonder krachtige nieuwe tool die beschikbaar is om meerdere afbeeldingen te combineren. Verschillende AI platformen (Abacus.ai, Fotor.com, Litmedia.ai en anderen) bieden de mogelijkheid om deze tool te gebruiken. Op het AI-platform Litmedia.ai is er in het prompt van GPT image 2 een extra feature, namelijk: er kan extra verwezen worden naar een bepaalde afbeelding (de attachments) door een apenstaart ervoor te zetten (zoals: @Image1, @Image2, enz.), waardoor de nieuw gegenereerde afbeelding beter aan de verwachting zal voldoen.

Een relatief nieuw en interessant effect is het ‘metal badge’ effect op Fotor waar ik dankbaar gebruik van heb gemaakt. Voor een van mijn eigen repositories heb ik dit omgedoopt in ‘decoratieve magneten’. Het resultaat van dit effect is altijd verrassend en opvallend. Wat wel vaak gebeurd dat is dat personen bruine ogen krijgen in plaats van blauwe ogen. Een probleem van het ‘metal badge’ effect is dat dit effect moeite heeft om handen op een juiste manier weer te geven (typisch voor AI-tools: meerdere vingers aan handen of vervormde handen). Met andere AI-tools zijn de oogkleuren te veranderen en de handen van de figuren te fixen.

fotor_original_metal_badge_effect

Tot slot

Het werken met AI-tools is een groot en breed onderwerp dat bovendien in beweging is. Verschillende en nieuwe LLM’s worden steeds krachtiger en effectiever. Hoewel er stemmen opgaan dat de ‘AI-bubble’ zal gaan barsten, zetten ontwikkelingen zich steeds verder voort. Wat betreft artistieke effecten komen verschillende AI-tools de creativiteit zeer ten goede. In een toekomstig blogbericht zullen verdere ontwikkelingen nader worden behandeld.