MS certificering: 70-483, deel 12

Ingediend door Dirk Hornstra op 14-jul-2018 23:28

Het is zo makkelijk. Ik kom er nu niet uit, later maar even bekijken. Maar dan blijft het liggen en blijft het dus een zwak punt. Daarom deze blogpost om even dieper in die punten te duiken;

Verschil tussen Parallel.ForEach en een Task.Run

Als je even op Google zoekt, kom je al heel snel uit bij StackOverflow, de site waar je als programmeur toch regelmatig naar informatie speurt (en ook vindt!). In het voorbeeld wordt een array met 3 strings verwerkt. Bij Parallel.ForEach verwerk je alle 3 items, bij de Task.Run blijk je 3x het laatste item te verwerken. In het artikel wordt verwezen naar een blog waar een uitgebreid verhaal gehouden wordt over PLINQ. Dit is de link: http://reedcopsey.com/series/parallelism-in-net4/ . Kort samengevat lijkt de Parallel.ForEach beter met zijn resources om te gaan, is die wel "blocking", dus kan je UI laten bevriezen.

[Flags] voor aangepaste .ToString(), wat doet het?

Ik wist zo niet meer wat voor vraag hier over ging, maar ook hier hielp StackOverflow me weer uit de brand. Verwijst ook weer naar een MSDN-pagina. Hiermee kun je enums die OR-acties kunnen uitvoeren naar een string om laten zetten. Eigenlijk een zelfde voorbeeld als op de MSDN-pagina om te laten zien hoe je in 1 veld bijvoorbeeld rollen zou kunnen inrichten, zonder een uitgebreide rollentabellen met koppeltabellen in te zetten:


  [Flags] 
   enum Roles : short
   {
      Visitor = 0,
      Editor = 1,
      Publisher = 2,
      Administrator = 4,
      GodAccount = 8
   };

   static void Main( )
   {
      // Display all combinations of values, and invalid values.
      Console.WriteLine( 
           "\nAll possible combinations of values with FlagsAttribute:");
      for( int val = 0; val <= 16; val++ )
         Console.WriteLine( "{0,3} - {1:G}", val, (Roles)val);
   } 
 

//       All possible combinations of values with FlagsAttribute:
//         0 - Visitor
//         1 - Editor
//         2 - Publisher
//         3 - Editor, Publisher
//         4 - Administrator
//         5 - Editor, Administrator
//         6 - Publisher, Administrator
//         7 - Editor, Publisher, Administrator
//         8 - GodAccount
//         9 - Editor, GodAccount
//        10 - Publisher, GodAccount
//        11 - Editor, Publisher, GodAccount
//        12 - Administrator, GodAccount
//        13 - Editor, Administrator, GodAccount
//        14 - Publisher, Administrator, GodAccount
//        15 - Editor, Publisher, Administrator, GodAccount
//        16 - 16

Maak een self-signed SSL-certificaat, omschrijf de stappen

De stappen die je volgens het boek opeenvolgend moet uitvoeren zijn:

- maak een self-signed root authority certificaat en een private key bestand
- genereer een certificaat die gesigned (gesigneerd?) is door een root authority certificaat 
- importeer het certificaat in trusted certificate authorities
- stel in je configuratie bestand bij clientCertificate instelling dat je dit certificaat gebruikt

Verschillen tussen private, internal, protected, public

Je krijgt wat voorbeeldvragen met toelichting en dan begin je te twijfelen. Is het nu internal of private? Dan ga je meestal op je gevoel af, maak de variabelen maar private, je getters en setters public en kijk dan maar wat je met je class zelf gaat doen. Toch nog eens even goed op de MSDN-pagina naar de omschrijvingen kijken: link.

public
The type or member can be accessed by any other code in the same assembly or another assembly that references it.
Zeg maar "open voor alles en iedereen". 

private
The type or member can be accessed only by code in the same class or struct.
Zeg maar "afgesloten, écht intern in de class/struct".

protected
The type or member can be accessed only by code in the same class, or in a class that is derived from that class.
Zeg maar "private, maar dan ook beschikbaar voor geërfde klassen".

internal
The type or member can be accessed by any code in the same assembly, but not from another assembly.
Zeg maar "open voor het hele project". Ik vind het een instinker omdat je bij internal aan "intern" denkt en dat het een soort private-declaratie is. Niet dus!

protected internal
The type or member can be accessed by any code in the assembly in which it is declared, or from within a derived class in another assembly.
Zeg maar "open voor het hele project en open voor geërfde klassen ook buiten dit project".

private protected
The type or member can be accessed only within its declaring assembly, by code in the same class or in a type that is derived from that class. 
Zeg maar "private, maar ook beschikbaar binnen de declarerende assembly (wat moet ik me hierbij voorstellen?)". Volgens het voorbeeld hier kun je de hoofdclass niet meer aanmaken als deze een private protected variabele bevat, alleen maar subclasses. Meer info: link.

Verschillen  ProtectedMemory, Scope.SameProcess met ProtectedData.Protect, DataProtectionScope.CurrentUser

ProtectedMemory, je data in het geheugen opslaan. Maar met Protect / Unprotect kun je zorgen dat je data daarin veilig opgeslagen wordt. Een MDSN-link
Op dit security blog (link) staat meer uitleg. Als de pc reboot is je protectedmemory niet terug te halen, bij ProtectedData is dat wel het geval. Ook staat hier de uitleg van de verschillende scopes:

MemoryProtectionScope.SameProcess: Only the current process will be able to decrypt the data
MemoryProtectionScope.CrossProcess: Applications running in different processes can decrypt the data
MemoryProtectionScope.SameLogon: Applications running in different processes, but running as the same user, can decrypt the data.

Overzicht van de verschillende encrypty-methoden

Dan krijg je weer een vraag met een lijstje en dan moet je kiezen. Hmm... welke kon ik nu wel of juist niet gebruiken? Ene heeft symmetrische encryptie, de andere juist niet. Weer een ander genereert een hash. 

Even de types. Je hebt symmetrisch. Daarbij gebruiken de partijen een zelfde gedeelde sleutel. Bij asymmetrische cryptografie maak je gebruik van een public en private key. Cryptografische "signing", Met een hash functie maak je een digitale handtekening die uniek voor jou is. En je hebt nog cryptografische hashing, Je maakt een hash van de data, de hash is altijd uniek. 

 

Symmetrisch:

- AesManaged (introduced in the .NET Framework 3.5).

- DESCryptoServiceProvider.

- HMACSHA1 (This is technically a secret-key algorithm because it represents message authentication code that is calculated by using a cryptographic hash function combined with a secret key. See Hash Values, later in this topic.)

- RC2CryptoServiceProvider.

- RijndaelManaged.

- TripleDESCryptoServiceProvider.

 

Asymmetrisch:

- DSACryptoServiceProvider

- RSACryptoServiceProvider

- ECDiffieHellman (base class)

- ECDiffieHellmanCng

- ECDiffieHellmanCngPublicKey (base class)

- ECDiffieHellmanKeyDerivationFunction (base class)

- ECDsaCng

 

Digitale Handtekeningen:

- DSACryptoServiceProvider

- RSACryptoServiceProvider

- ECDsa (base class)

- ECDsaCng

 

Hash-waardes:

- HMACSHA1

- MACTripleDES

- MD5CryptoServiceProvider

- RIPEMD160

- SHA1Managed

- SHA256Managed

- SHA384Managed

- SHA512Managed

- HMAC variants of all of the Secure Hash Algorithm (SHA), Message Digest 5 (MD5), and RIPEMD-160 algorithms

- CryptoServiceProvider implementations (managed code wrappers) of all the SHA algorithms

- Cryptography Next Generation (CNG) implementations of all the MD5 and SHA algorithms

 

Deze gegevens zijn afkomstig van deze Microsoft-pagina: link.

Waarvoor gebruik je een SafeHandle?

Na een korte Google-zoekactie kom ik uit op deze MSDN-pagina. Ik zag al iets over InterOp, en hoe je met IntPtr-handles acties uitvoert op het register, ini-bestanden, zeg maar de oude WIN32 functies. Het .NET-framework is redelijk aggressief qua opschonen van resources en wil deze handles nogal gauw opruimen. Door de SafeHandle te gebruiken kun je dat voorkomen en zorgen dat alles na gebruik netjes opgeruimd wordt.

Positional Parameter en Named Parameter

Je definieert een functie public void ConcatStrings(string voornaam, string achternaam) en vervolgens als je de functie aanroept, dan doe je een ConcatStrings("Dirk", "Hornstra"). Dat komt doordat je de posities weet (en Intellisense in Visual Studio je netjes teruggeeft wat de parameters zijn. Maar wil je het "in één keer zien", zonder de intellisense, dan kun je het ook met de namen doen (en daardoor kun je ook van positie wisselen). Dus dan zou het kunnen worden ConcatStrings(achternaam: "Hornstra", voornaam: "Dirk"). Meer info op deze pagina van Microsoft: link.

Disponse(true), dispose(false), wanneer aangeroepen en hoe unmanaged objecten te benaderen

Uitleg via deze StackOverflow-pagina. Als de normale Garbage-Collector langs komt, dan roept ie m aan met "false". Dan moet je dus gaan opruimen. Als je een destructor hebt, dan roep je de functie aan met parameter "true". In dat geval doe je eigenlijk niets, behalve het opruimen van unmanaged objecten, die ruimen we altijd op. 

Verschil fixed en unchecked code in je applicatie

Fixed gebruik je om pointers te "fixen" naar een managed object, zodat de Garbage Collector er niet meer gaat schuiven (en je hem niet meer kunt vinden). Dit is een behoorlijk kort-door-de-bocht uitleg van iets wat hier beter uitgelegd staat: link. Unchecked zorgt ervoor dat je compiler niet gaat klagen als een variabele een overflow kan krijgen. Het is een stukje performance-verbetering.  Nog even beter doorgelezen. Standaard wordt in .NET unchecked gebruikt. Wil je een overflow-exceptie als getallen boven maximum (of minimum) waardes uitkomen, dan kun je een checked-statement gebruiken. Dit is echter intensief, gebruikt de CLR en daarom is het nie de standaard. Uitleg staat hier: link.

Wat is een BlockingCollection?

Je gebruikt het bij multi-threaded code. Het zorgt ervoor dat je met Add en Take vanuit verschillende processen items kunt toeoegen en weghalen. Verdere uitleg staat hier: link.