.NET Rocks - podcast 121 tot en met 130

Ingediend door Dirk Hornstra op 22-may-2023 21:49

Als je zelf de podcasts van .NET Rocks wilt beluisteren, die zijn hier te vinden: https://dotnetrocks.com/

Let op: dit zijn oude afleveringen over .NET 1.0, .NET 1.1 en .NET 2.0. De meeste zaken zullen dus redelijk verouderd zijn. Laten we het erop houden dat je de afleveringen kunt overslaan en als er een echt interessante uitzending is, dan noem ik dat expliciet.

N.B. Carl, Rory en Richard Campbell gebruiken shrinkster.com URL's om lange URL's in verkorte versie te kunnen delen... maar de site werkt niet meer. Via Google gezocht en ik zie dat dit sinds 2011 al zo is. Anders had ik die links hier kunnen delen, maar dat heeft weinig nut nu dat niet meer werkt. Update: sommige zijn via archive.org nog te vinden, dus als de link er nog is voeg ik die toe.

PC 121: Kathleen Dollard is deze aflevering te gast en spreekt over Generics. Kathleen is eerder in de uitzending geweest, in podcast 63 (link). Kathleen noemt BindingList of T (ik heb dat nog niet eerder gebruikt), dus even een artikel van Microsoft erbij gezocht: link. Dat zegt me nog niet heel veel, maar StackOverflow geeft ook goede uitleg: link. Het lijkt erop dat als je met datagrids werkt en de data die je inlaadt uit en lijst ook moet kunnen werken en teruggekoppeld wordt, dat je hier dit type voor gebruikt. Kathleen noemt ook dat je een combobox binnen een datagrid wilt kunnen gebruiken. Kathleen legt uit dat de functies tijdens runtime aangemaakt worden, omdat void Add<T>(T p) where T : class, new() aangeroepen worden met meerdere "types". Dit heb ik inderdaad zelf ook wel gebruikt. Partial classes worden genoemd, waardoor je een class over meerdere bestanden kunt verdelen en meerdere personen gelijktijdig kunnen ontwikkelen. Rocky is nog even aan de telefoon, hij komt terug in aflevering 126. Tracing komt nog ter sprake. Kathleen is daar niet over te spreken, het is een "ander soort printf-functie".

PC 122: Russ Nemhauser spreekt onder andere over "mobiliteit". Het Compact Framework komt voorbij. Hoe hij iets gebouwd heeft met een soort boodschappenlijstje die zijn vrouw en hij op de telefoon hebben. Een app om zijn lease-kosten bij te houden. Russ komt nog met een voorbeeld van een app waarbij een memory-leak zat. De medewerker van Microsoft gebruikte "Homer" voor een load-test. Russ noemt ook de "static analysis" waarin hij zich wil verdiepen, waarbij code wordt gevalideerd. Russ wordt gek van de SPAM die hij krijgt, hij heeft goede ervaringen met SpamBayes. Ik neem aan dat het (flink) verouderd is, maar de code is hier nog te vinden: link.

PC 123: Chris Kinsman spreekt in deze uitzending over Data Warehousing en andere onderwerpen. Chris heeft ook een app gemaakt, heeft problemen met alle files. Hij haalt een binair bestand binnen (Washington State Department of Transportation), die gegevens bevat van de sensoren in de weg, zodat je kunt zien of het ergens stil staat e.d. Dus hij houdt zich ook bezig met het Compact Framework. Ook "hardcore-code", een applicatie die interactie met een gok-machine uitvoert, je ziet een scherm van 320 x 240 met interactie. Interactie met het systeem gaat via "messages", SendMessage, PeekMessage. Via broadcast-messages. De "handle" bemachtigen om uit de Windows-loop te komen kwam beschikbaar in het nieuwe CF framework. Anders had het in embedded C++ gebouwd moeten worden. Want ze werden gebeld.. het moest binnen 3 weken klaar zijn. Ook komt een app ter sprake die door een soort broker van verzekeringsmaatschappijen gebruikt wordt. Ook Citrix wordt genoemd. Dat was in het verleden makkelijk/goed om zo werknemers een "vaste ingerichte" werkplek te bieden, maar op het moment dat er 100-en werknemers zijn en er voor elk een Citrix-omgeving ingericht moet worden, dan ga je bijna een datacenter vullen. Daarom gaat spul steeds meer "naar de cloud" en kom je volgens mij Citrix ook steeds minder tegen. Chris benoemt ook alle problemen die ze tegen kwamen. Want er moesten zaken ingescand worden, hoe krijg je dat dan weer "binnen" die Citrix-omgeving? Chris noemt hoe het eerst op 1.400 Citrix-servers draaide en nu als web-app op 6 servers. Dat scheelt flink wat kosten! Chris komt nog met het voorbeeld van de wereldwijde verkopen van Microsoft. Dat duurde soms 30 dagen voordat een overzicht beschikbaar was. Microsoft wilde dit binnen 2 minuten binnen krijgen. Chris legt uit hoe ze data aggregeren naar andere databases en tabellen, de-normaliseren, waar de DBA's met hun ogen rolden: "zo moet dat niet", maar dit was wel dé oplossing om snel de resultaten aan te kunnen leveren. Moraal van het verhaal: voor je rapportage wil je dus niet altijd op de live-data je query's uitvoeren! Ook hoorde ik volgens mij in deze uitzending dat in een oudere versie van SQL Server (2000?) je maximaal 16 of 17 JOINS kon gebruiken. Als je dat zo ziet denk je: dat zijn er belachelijk veel, maar vaak is om data bij elkaar te krijgen (en dit moet er nog bij, en dat nog) het geen uitzondering dat er flink wat JOINS gebruikt worden. SQL Integration Services is de vervanger van DTS-services. Ik heb dat ook nog wel in een bestaande omgeving gebruikt (importeren van een Excel-bestand op FTP en importeren in een tabel). Ook SQL Connecties in plain-text in de config-bestanden, Chris noemt een tool die dit kan afhandelen (Enterprise Library, mogelijk verouderd: link). Ik weet niet hoe relevant dat nog is, maar er is wel een artikel over .NET Core, dat moet ik nog maar eens lezen: link. De coolste tools die Chris gedownload heeft zijn tools van een Duits bedrijf, Hassler, ipcheck en prtgtrafficgrapher. Hij gebruikte daar eerst andere tools voor, maar dat bedrijf werd overgenomen en de prijzen werden "sky-high". Deze tools kun je met een trial eerst testen en daarna voor iets van 50 dollar kopen. Ik kan dit zo niet vinden, maar als ik de uitleg hoort, lijkt het alsof Zabbix dit ook kan (en Zabbix is gratis): link.

PC 124: Richard Costall en Andy Brown. Richard en Andy zijn beide ontwikkelaars, ook al met .NET en laten de boel ook al draaien op BETA2. Dan heb je wel lef, productie-systemen op een beta. Smart-cliënts, data lokaal opslaan en dan later uploaden naar de server.

PC 125: Jeffrey Palermo spreekt over ASP.Net. Jeff is ontwikkelaar bij Dell en heeft in Irak gediend. Hij had toen nog geen laptop, maar had wel 2x 600-pagina boeken mee. Zijn "beste download" (standaard vraag) is Tortoise SVN. Die hoor ik hier voor het eerst. Het is de SVN cliënt die ik ook jaren gebruikt hebt voordat we over gingen naar GIT.

PC 126: Carl en Richard spreken met Rocky Lhotka over zijn csla.net framework. Hij heeft hier een boek over geschreven, het framework zelf is gratis te gebruiken. Rocky is eerder in afleveringen geweest, bij dev-connections (aflevering 106) en in aflevering 66. Het project heeft een eigen website (link), daar staan ook de verwijzingen naar Github en Nuget. In de uitzending komt naar voren dat je programmeurs hebt die met datagrids werken en andere programmeurs die veel meer object georiënteerd werken. Afhankelijk van het probleem wat opgelost wordt kan het ene een betere oplossing zijn dan het andere. CSLA is voor object georiënteerd werken, Rocky noemt OLTP: OnLine Transaction  Processing, de persoon die continu gegevens van personen en producten aan het invoeren en aanpassen is. Hiermee maak je "business-objecten" die zelf hun eigen logica bevatten. Zo wordt bijvoorbeeld benoemd dat je in een datagrid op "escape" kunt drukken en daarmee jouw wijzigingen ongedaan maakt. In dit framework van Rocky ondersteunt hij ook het ongedaan maken van wijzigingen. Rocky geeft aan dat de objecten een soort "gespleten persoonlijkheid" hebben. Ze moeten om kunnen gaan met het opslaan en opvragen van de gegevens uit de database. Maar ook in de interface zaken doen, hetzij in een Windows Form object of in een online formulier. IBindingList wordt gebruikt voor het "binden" van objecten aan de interface. Ook komt hier nog iets naar voren over serialisatie, in de 1.0 .NET Framework-versie zit een bugje in VB, als je iets gaat serialiseren, wordt ook het formulier geserialiseerd (en dat mag/kan niet). Dus daar wordt een  stuk C# code voor gebruikt. Je erft van BusinessBase uit het CSLA-framework. Deze implementeert IEditable en IDataErrInfo (zit in System.Component). Ook een event wordt uitgevoerd als data aangepast wordt. Code-generators komen ook nog even ter sprake. CodeSmith, LLBL-Gen, DeclareIT.

PC 127: In deze uitzending spreken Joel Pobar en Brad Abrams over de CLR. CLR staat voor "Common Language Runtime".  Dus als je in C# of VB (of andere taal die het implementeert) je code typt, compileert, dan wordt de code in een bepaald formaat aangeboden aan de CLR die er uitvoerbare code van kan maken. Want als developer denken we er niet over na, in Visual Studio Code of Visual Studio typ je jouw C# commando's en code in, je build je code en start de boel op, of publiceert het naar je webserver. "Onder water" gebeurt er natuurlijk een heleboel. Want "vroeger" zijn we ooit begonnen met ponskaarten, wat je nu ook nog wel in draaiorgels ziet. Op een bepaald moment kon je in Assembly je code bouwen (met een bepaalde instructieset). Dat vond ik een heel interessant (en leuk) vak bij de opleiding Hogere Informatica, maar het is natuurlijk "niet te doen" om je programma's daar nu mee te bouwen. Ik denk dat je al bijna een dag bezig bent om één knopje in je programma te maken. Carl noemt nog even het boek wat Don Box geschreven heeft,  Essential .NET waarin over de CLR geschreven wordt. Zo komt ook "dispose" voorbij. Je kunt zoals in C zorgen dat objecten "direct verwijderd" worden, bijvoorbeeld door een teller bij te houden van referenties naar een object. Is dat 0: dan kan het weg. In .NET is gekozen voor Garbage Collection, waarbij je verschillende fases hebt waarin een object kan zitten. Een object "zou er nog kunnen zijn", ook als er geen verwijzingen meer zijn, omdat het systeem het bijvoorbeeld "druk" heeft. Om dan ook nog extra belasting te introduceren door objecten te verwijderen, pointers in het geheugen aan te passen naar een andere locatie, een soort defragmentatie in het geheugen, dat is de reden dat voor garbage collection gekozen is. Chris Sels schijnt met dat punt gekomen te zijn (wilde graag deteministisch opruimen van objecten die niet meer gebruikt worden), heeft volgens Joel of Brad ook een soort proof-of-concept gemaakt, maar dat bleek toen nogal traag te zijn. Ook wordt NGEN genoemd. Ik zie niet exact wat je hiermee kunt, het schijnt een soort optimalisatie te zijn, waarbij je code ergens in de GAC zet en daardoor "meteen kunt starten". Normaal wordt je code door de Just In Time compiler opgestart. Nog even gezocht, hier is wat documentatie: uitleg Microsoft (mei 2006) en documentatie/informatie over de syntax en gebruik door Microsoft (2022). Code Access Security wordt nog genoemd, ik kende het niet. Maar schijnbaar kon je als systeembeheerder op server-niveau instellen welke code/acties wel of niet toegestaan waren. Carl heeft het er al over dat veel developers het te moeilijk/teveel gedoe vinden. En in .NET 4 heeft Microsoft deze feature laten vervallen (link). Gevonden via dit blog: link. En Joel/Brad noemen ook nog Reflection. Ik heb dat zelf ook redelijk uitgebreid gebruikt, om dynamisch je objecten te bepalen, aan te maken, eigenschappen en functies te bekijken. Hier noemen ze nog een bug in een oude .NET Framework-versie: vroeg je een bepaalde eigenschap op, dan werden alle eigenschappen opgevraagd. En in cache gezet. Gebeurt allemaal synchroon (niet asynchroon). Dat is al niet zo fijn. En toen bleek ook nog dat die cache nooit opgeruimd werd! Memoryleak-introductie...! Reflection is herschreven van unmanaged naar managed code. Carl vraagt wat de beste features zijn in de nieuwe .NET 2 versie. Joel noemt dat het type waarmee een delegate uitgevoerd kan worden kan afwijken (declareerde je eerst met object, dan kon je het later niet met een string aanroepen), dat kan nu wel. Brad komt ook met een hele goede: string.Contains(...). In het oude VB moet je altijd .IndexOf("...") > 0 of iets dergelijks uitvoeren. En nog een mooi verhaal over hoe er bij Microsoft ontwikkeld wordt. Als je in code een Foo[T] declareerde (of zoiets, code en podcasts is altijd moeilijk), de code die gegenereerd werd, daarbij werd de typenaam Foo!1. Deze code werd uitgegeven. Drie of vier maanden later belden de collega's die aan Windows ontwikkelden: de integratie van jullie code van de CLS in onze code laat alles kapot gaan! Al hun testen gingen kapot. Dat bleek dus door die "bang" (het uitroepteken) te komen. In WinDbg (en andere debuggers) geef je met een ! de scheiding tussen de Module-naam aan!!! Het CLR-team heeft gauw hun code aangepast, die ! is vervangen met een "tick" (vinkje?). En Brad noemt nog een easteregg die er in heeft gezeten, hij zou gaan trouwen, dus als je een DateTime.Parse("Brads weddingdate") uitvoerde, dan kreeg je een echte datum terug. Dat is er later wel uitgehaald ;) En een collega die vroeg wat hij moest doen bij bepaalde fouten moest doen die optraden doordat mensen met opzet foutieve data invoerden. Bij controle bleek hij een YouMoronException() te genereren. Dat hoort natuurlijk niet, dus dat is een "normale" exceptie geworden. 1 van de mannen komt uit Australië, dus ze laten nog even een MP3 horen van Vick Bitter biertje, op Youtube gevonden: link. Hele interessante uitzending!

PC 128: Michael Palermo heeft het in deze uitzending over code snippets. De show start eerst met de PDC 2005 show-off, 15 september 2005. Daarbij wil Microsoft laten zien wat mensen met .NET maken, dus insturen maar! Hierna komt Michael aan het woord. Deze snippets worden op basis van XML gemaakt. En bepaalde sjablonen bevatten zelf ook een soort uitvoerbare sjablonen (functies), bijvoorbeeld een enumerator binnen een switch-statement. Door cla in te typen, komt class in beeld via auto-complete. Lijkt erg op coderush dus! Door prop-tab-tab in te voeren kun je snel een property toevoegen.  Om die XML aan te passen, dan pak je waarschijnlijk een bestaande versie en kopieer je die voor een eigen versie. Michael noemt nog een editor die iemand gemaakt heeft, deze staat niet meer online, maar is via archive.org wel terug te vinden. De site (link) en het zip-bestand met de code (link). En er is een C# versie, Snippy. Pagina: link, geen code want daarvoor moet je aangemeld zijn. Dat is niet zo erg, want dit lijkt allemaal redelijk verouderd. Michael heeft een site opgezet hiervoor: http://www.gotcodesnippets.net/, maar dat toont nu alleen Chinese meuk, dus die hoef je niet meer te bezoeken. De coolste laatste download van Michael is SlickRun: link.

PC 129: In deze periode is orkaan Cathrina over New Orleans heen gegaan en heeft veel schade aangericht. Richard noemt nog even de "Fats Domino-story", het verhaal dat hij zijn huis niet wilde verlaten. Carl dacht dat Fats al dood was, maar dat was pas 12 jaar later: in 2017 is Fats Domino overleden. Carl en Richard spreken met Joel Semeniuk over Team System. Joel spreekt over de verschillende ontwerpers, de Application Designer, Datacenter Designer, source-control wat er in zit, statische code-analyse, rapportage die gemaakt wordt, zodat je het zelf niet meer hoeft te doen. Hoe productief zijn mensen? Dat komt voorbij. Geen 8 uur, volgens Joel 5.5 uur. Koffie, messenger, overleg met collega's, mails. Andere tools worden nog genoemd, Nant, Cruisecontrol. Maar je hebt nu automated builds (TeamBuild is MSBuild op steroïden), unit-testing, load-testing, profiling.

PC 130: En daar was ie weer, Jackie Goldstein. Deel 2, over ADO.NET. Eerder in de uitzending geweest (podcast 115). De uitzending start eerst met een gesprek met Greg Brill, eigenaar van Infusion Development in New York (waar Nick Landry ook werkt, die zat in podcast 12).  De URL werkt niet meer en ik zie dat ze overgenomen zijn door Avanade: link. Tijdens het gesprek van Jackie komt de TableAdapter voorbij. Die kende ik nog niet, tenminste, dat meende ik. Ik weet het niet meer zeker, ik meende dat ik namelijk DataAdapter gebruikte. In ieder geval, Microsoft zegt zelf dat dit allemaal legacy is en je over moet naar het Entity Framework: link. Optimistic Concurrency komt voorbij, je weet wel, dat 2 mensen gelijktijdig een record aanpassen en dan de vraag is: welke versie gaat nu opgeslagen worden? Richard kwam met het punt dat er iets met een TIMESTAMP was en dat dit zou vervallen, hij zoekt nog even verder en ziet dan dat alleen de naam aangepast wordt, dit wordt ROWVERSION. En Jackie komt nog met het voorbeeld van een demo. Standaard werden de query's stuk-voor-stuk uitgevoerd. Dat zie je in de profiler. Met batch-size kun je instellen dat er 50 in 1x gaan. Je ziet dus een flinke versnelling. Maar toen zag hij net voor een demo (en na installatie van een update) dat alle statement er weer los in stonden! Contact opgenomen met het team, dat is bewust gedaan, dat is namelijk verplaatst naar de database waar zaken gegroepeerd worden, TDS-level. Er waren namelijk problemen, met caching en de buffer had een 2.100 karakter-limiet. Dus als je statement boven dat aantal kwam, dan kreeg je een foutief SQL-statement en werden zaken niet uitgevoerd.