DevDays 2008 (vrijdag)

Afgelopen vrijdag was het mijn beurt om ook eens naar de DevDays te gaan. Ik had mezelf redelijk goed voorbereid door al een paar weken vantevoren de sessies op te schrijven waar ik heen wilde gaan. De sessies die mij het meest interessant leken waren: 1. Data protection with .NET Framework 3.5 and Cryptography Next Generation (Rafal Lukawiecki) 2. Is LINQ your data access layer? (Anko Duizer) 3. Understanding ADO .NET data services (Mike Taulty) 4. More intelligent applications using data mining (Rafal Lukawiecki) 5. Leveraging C#3.0 and LINQ (Best practice) (Krishnan Subramanian) De ene sessie leek me wel leuker als de andere, maar dat blijf je toch houden. Gelukkig stonden er afgelopen vrijdag nagenoeg geen files richting Amsterdam RAI, dus was ik nog net op tijd om de eerste sessie te volgen. Rafal begon hier eerst met een ‘basis’ van cryptografie. Voor m’n MCTS examen heb ik hier ook het een en ander voor moeten leren, dus de basis begreep ik redelijk goed. Hij had het over wat momenteel de meest veilige manier was om je applicatie te beveiligen, bijvoorbeeld met smart cards. Ook noemde hij nog de twee functies ProtectData en ProtectMemory die je zeker moet kennen als je heel eenvoudig stukken code van je applicatie wilt beveiligen. Deze twee functies zijn beschikbaar vanaf versie 2.0 van het .Net Framework. Vanaf versie 3.5 van het .Net Framework zijn er echter veel betere encryptie methoden beschikbaar. Verder kwam er nog een lijstje met methoden die je nu nog wel en niet meer mag gebruiken voor encryptie.

Het wel lijstje bestond uit: - Rijndael / AES 128 - RSA 3072 - SHA-2 (als het moet) - DSA Wat je niet meer moet gebruiken is: - DES (Kerberos) - IDEA - RC2 / RC5 - Blowfish, Twofish (nou ja, deze zijn wel goed, maar niet standaard) Ook noemde hij nog 2 functies welke je tegenwoordig kunt gebruiken voor encryptie. In het 3.0 Framework is dit bijvoorbeeld RijndaelManaged en het 3.5 Framework is de functie AesManaged geintroduceerd. Van wat ik begrepen heb zijn het beide implementaties van Rijndael. Dit bovenstaande was echter nog maar het begin en er waren ook nog maar 20 minuten voorbij.

Het leek trouwens wel alsof Rafal aan speed-talking deed zo snel ging het. Nu begon het moeilijke gedeelte van de sessie. Hij begon ineens over Suite-B, een ’nieuwe’ encyryptie methode welke onder andere is ontwikkeld door de NSA. De NSA zelf maakt gebruik van Suite-A wanneer iets boven het level ’top-secret’ komt. Hierop maakte hij nog de opmerking dat Suite-B dus eigenlijk helemaal niet zo veilig was, maar gewoonweg het beste was wat er momenteel door het publiek kan worden gebruikt. Suite-B maakt gebruik van ‘Elliptical Curve Cryptograph’. Dit houdt in het kort in dat het sneller is, je hebt minder bits nodig en is minstens zo veilig als ‘oude’ methoden met meer bits. Vanaf dit moment werd het me allemaal een beetje te technisch en heb ik het niet meer zo goed kunnen volgen. Wel heb ik nog een aantal aantekeningen kunnen maken van de stukken die ik wel snapte, maar het hele Suite-B verhaal heb ik zelf een beetje overgeslagen. Tegen het einde aan noemde Rafal nog dat het gebruik van hashes helemaal niet zo veilig meer is, als je dit tenminste voor cryptografie wilt gebruiken. Hij stelde voor om een heel bericht te encrypten en dat dan te gebruiken als ‘hash’.

Het nadeel hiervan is dat wanneer je een bericht van 1GB hebt, je ook een ‘hash’ van 1GB hebt. Ik was blij dat dit bijna het einde was van die sessie, zodat ik even kon bijkomen van wat hij allemaal te zeggen had. Een kort filmpje van de sessie is op Tweakers.net te vinden: https://tweakers.net/advertorials/devdays/video/20/data-protection-with-net-frameworks-35.html De tweede sessie was voor mij al een stuk eenvoudiger om te volgen. Zelf ben ik namelijk al een tijdje bezig met LINQ te implementeren in m’n data access layer, dus was ik wel benieuwd wat anderen hiervan vonden. Anko vertelde hier over de twee verschillende maniere hoe je L2SQL kunt gebruiken in je n-tier applicatie. Ten eerste als data layer en ten tweede als toevoeging in je data layer. De eerste methode ben ik zelf niet zo’n enorme fan van. Het kwam er op neer dat je je dbml-bestand als DAL gebruikt en zo dus gelijk (in welke laag dan ook) je wijzigingen kunt wegschrijven. Hij gaf zelf ook al aan dat dit meestal niet echt gewenst is, aangezien je overal in je project DA code hebt staan en je bij wijzigingen dus je gehele project moet doorlopen. Het was daarentegen wel snel te implementeren. De tweede methode, L2SQL gebruiken in je DAL, vind ik zelf de beste oplossing voor nu. Je kunt zo beter je objecten afstemmen op wat je wilt gebruiken in je applicatie en je hebt maar op 1 plek in project de DA code staan. Het kost echter wel weer meer tijd om te maken in vergelijking tot de eerste methode. Tijdens deze sessie kwam ik nog enkele leuke opties tegen die je kunt gebruiken met L2SQL. Dit waren bijvoorbeeld de mogelijkheden om ContinueOnConflict te gebruiken, een soort On Error Resume Next, ResolveAll, om een soort rollback te doen en ChangeConflicts. Deze waren volgens Anko nodig omdat L2SQL er van uit gaat dat het opslaan goed gaat en dat hoeft natuurlijk niet zo te zijn, aangezien het systeem aan dirty-reading doet, sowieso wanneer je een n-tier applicatie hebt. Zelf was ik het niet met Anko op alle fronten eens, maar daar was ik er ook voor, om te kijken wat andere ontwikkelaars nou precies vinden van L2SQL en hoe te gebruiken. De derde sessie ging over ADO.Net. Dit vond ik een enorm leuke sessie om bij te wonen. Mike kon het allemaal goed vertellen en ik werd enorm enthousiast om dit systeem te gaan gebruiken in een van mijn projecten. Waar het in het kort op neer kwam is dat je via een soort webservice (via WCF) queries kon doen via je webbrowser. Niet alleen simpele queries, maar ook behoorlijk geavanceerde queries. Als je je data service enigszins goed opzet dan kun je via foreign keys zo alles opzoeken van iemand. Wanneer ‘medewerker ’ bijvoorbeeld enkele klanten heeft die op hun beurt orders hebben geplaatst bij het bedrijf waar ‘medewerker ’ werkt, dan kun je via de querystring in je browser alle orders opzoeken die bij ‘medewerker ’ zijn geplaatst. Ook kan er worden gegroepeerd en derdelijke. Dit werkt allemaal met collecties die AsQueryable zijn. Je wilt natuurlijk niet altijd via een browser naar informatie zoeken en aangezien de collecties queryable zijn, kun je ook met het Entity Framework of L2SQL/L2O je gewenste objecten zoeken. Ik vond dit de meest interessante sessie van de dag. Rodi zat ook bij deze sessie, hij zag echter gelijk al de nadelen van de methode die Mike aan het vertellen was. Een van die nadelen was het beveiligen van je WCF webservice. Dat kan natuurlijk niet en je wilt niet je hele data omgeving blootleggen aan de buitenwereld. Dit is zeker een valide punt om het niet te gebruiken. Misschien dat ze daar nog over na gaan denken, of dat hier al lang een oplossing voor is. De techniek is in ieder geval ontzettend gaaf. Enkele links met meer informatie die Mike nog gaf waren https://www.datadeveloper.net, https://www.miketaulty.com en https://blogs.msdn.com/astoriateam De sites heb ik zelf nog niet bekeken, maar zodra ik weer eens tijd over heb zal ik dat zeker doen. Mijn vierde sessie werd weer gegeven door Rafal, dit keer ging het over data mining. Eigenlijk wist ik niet precies wat ik moest verwachten, maar dat werd al snel duidelijk. Het ging er namelijk om dat door de gebruiker ingevoerde gegevens strookt met de werkelijkheid. Rafal gaf als een voorbeeld een formulier met soortgelijke gegevens als deze: Naam: John Geslacht: Female Leeftijd: 900 Thuissituatie: Zoon van ouders De Analysis Services van SQL Server geven nu een melding dat de gegevens waarschijnlijk niet kloppen. De leeftijd is bijvoorbeeld veel te hoog en het is onwaarschijnlijk dat iemand een vrouw is en tegelijk een zoon. Deze onwaarschijnlijkheden worden niet zo uit de lucht gevist, maar worden berekend door Analysis Services aan de hand van honderden/duizenden/tienduizenden records die als verificatie dienen. AS vind namelijk patronen in die records en aan de hand daarvan berekend hij hoe waarschijnlijk het is dat de ingevoerde data klopt. Het grote voordeel van dit systeem is dat je je logica voor een formulier niet meer zelf hoeft te maken, dat doet SQL wel voor jou. Dit scheelt uiteraard enorm veel ontwikkeltijd, omdat je dus niet meer tig if-statements hoeft te schrijven. Het nadeel dat ik al snel kon bedenken is dat wanneer je een paar grapjassen hebt die een paar keer foute data in je database stoppen, je AS denkt dat dit valide is en op een gegeven moment dus niet meer meldingen geeft bij situaties als hierboven beschreven. Hier zul je dus alsnog alert om moeten zijn. Dit is dus een leuke techniek, maar ik denk niet dat je het nu al kunt gebruiken in een productie omgeving bij een druk bezochte website. De laatste sessie die ik heb gevolgd ging weer over LINQ en C# 3.0. Deze sessie vond ik wel iets interessanter dan die van Anko eerder die vrijdag. Je kon wel merken dat Krishnan een ontwikkelaar is en geen vertegenwoordiger of iets dergelijks, dat hoop ik tenminste, want het ontbrak hem een beetje aan presentatie skills. Dat geeft verder niet, want z’n verhaal was wel goed. Hij gaf enkele voorbeelden hoe je je partial methods kunt gebruiken met LINQ. Zelf gebruik ik die ook al, maar met de hij gaf ook als voorbeeld om de OnValidate functie te gebruiken in je partial method. Hier had ik zelf nog niet aan gedacht, maar is wel een goede suggestie. Je kunt dan tijdens het valideren al zien of de data in een object wel of niet juist is. Ook gaf hij een mooie oplossing om N:N-relaties te maken met L2SQL. Officieel kan dit niet, maar hij gaf er een mooie work-around voor. Hierdoor heeft hij wel wat credits van me gekregen. Wat wel jammer is, is natuurlijk dat hij de gegevens alleen maar ophaalde uit de database en niet weer terug schreef. Echter, zal het in de praktijk waarschijnlijk niet vaak voorkomen dat je in 1 mutatie N:N inserts wilt doen, dus op zich was het wel te begrijpen. De oplossing die hij gaf was om een property te maken van IEnumerable en die in je partial class te zetten waar je dat object in wilde hebben. Dit was wel een goed idee van hem waar ik zelf nog niet aan had gedacht, dus was het toch ook weer nuttig om deze sessie bij te hebben gewoond. Om je query dynamisch te maken maakte hij gebruik van predicates in de where-clause van je L2SQL query. Dit is niet gelijk fout natuurlijk, maar het geniet toch mijn voorkeur om hiervoor echt Lambda expressies te gebruiken, waar ik al eerder over heb geschreven ( https://www.jan-v.nl/ViewPost.aspx?PostID=aeb2009d-2624-dd11-afa4-003048874dd5 ) Een filmpje van een eerdere sessie van Krishnan is hier te vinden: https://tweakers.net/advertorials/devdays/video/21/linq-trekt-volle-zaal!.html De mensen in het commentaar daar vinden hem een goede spreker, nou ja, meningen kunnen verschillen natuurlijk. Wat ze wel goed opmerken is dat het goed is dat hij live code klopt, je zou dit ook als nadeel kunnen opmerken trouwens. Op zich was ik blij dat de dag voorbij was, want het was toch zwaarder dan ik had verwacht. Al met al heb ik behoorlijk wat informatie opgedaan. In eerste instantie ga ik waarschijnlijk niet gelijk met alles aan de slag, maar het is wel goed om het in het achterhoofd te houden. Op naar volgend jaar!


Share