AOP cu Roslyn–partea 1

 

Ce ma intereseaza este sa fa un tool care sa logheze cind programul intra si iese dintr-o metoda.

E bun pentru identificarea problemelor in cod si pentru logging.

Ce exista deja pe piata:

  1. PostSharp – unul din cele mai bune – vezi https://www.postsharp.net/alternatives
  2. Cecil http://www.mono-project.com/docs/tools+libraries/libraries/Mono.Cecil/
  3. Fody https://github.com/Fody
  4. NConcern : https://github.com/Virtuoze/NConcern

Ce nu imi place este ca sunt greoi de configurat. Asa incit, in loc sa scriu un configurator, o sa scriu un AOP bazat pe Roslyn  astfel incit sa fie usor de folosit la POST build event in cazul unui scenariu de CI

M-am inspirat de la https://github.com/KeenSoftwareHouse/SpaceEngineers – vedeti https://github.com/KeenSoftwareHouse/SpaceEngineers/tree/master/Sources/VRage.Scripting . Nu mai compileaza in VS2017, insa puteti analiza codul…

A doua sursa de inspiratie a fost http://cezarywalenciuk.pl/blog/programing/post/roslyn-kompilator-net-rewrite-z-csharpsyntaxrewriter – e in poloneza, insa puteti vedea codul …( se complica la sfirsit)

Codul meu o sa fie pe https://github.com/ignatandrei/AOP_With_Roslyn

Roslyn versus Expression / Func

Am avut nevoie sa serializez  o clasa ce continea o variabila de tipul Func . De ce sa serializez? Ca utilizatorul ( gen DevOps ) sa poata sa modifice parametrii si/sau sa creeze functii diferite ( ginditi-va la o clauza de genul  where id =7 ). Pe de alta parte , acest Func trebuie aplicat ( dupa deserializare) unei liste de obiecte …. dinamic adica.

Cum sa fac?

Am citit de nu am mai putut – evident un Func de genul

(addDate) =>
                {
                    var secs = double.Parse(addDate);
                    return new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(secs);
                }

 

e destul de greu de serializat / deserializat.

Asa ca am ajuns la Expression<Func> . Func-ul dinainte poate fi scris ca un Expression asa:

 (addDate) => 
                new DateTime(1970, 1, 1, 0, 0, 0, 0)
                .AddSeconds(double.Parse(addDate))

)

 

Si poate fi serializat cu Newtonsoft.json si Aq.ExpressionJsonSerializer(https://github.com/UizzUW/EJS.Core , https://github.com/aquilae/expression-json-serializer )

Problema este modul de serializare – absolut ingrozitor de citit…

Asa ca am citit mai mult si am ajuns la Roslyn – https://github.com/dotnet/roslyn/wiki/Scripting-API-Samples .

Cu Roslyn trebuie doar sa trec parametru globals si conditia de where – si am terminat.

Asa ca , in loc sa serializez un Expression, serializez doar un string – si gata!

Revin : cititi https://github.com/dotnet/roslyn/wiki/Scripting-API-Samples si o sa va vina la idei ….

The State of .Net–miine, 1 August, ora 19

Titlu: A free , unbiased look at current and future development of .NET ecosystem.

Descriere:

The industry is in a state of flux. What does that mean for your software projects today and tomorrow? Will your skills be outdated? Will your current investment become obsolete? What should you focus on right now? And what will become important a year or two down the road? What technologies do you need to learn?

Join Tiberiu Covaci (http://tibi.me/), Microsoft Regional Director, for a two-hour interactive session about where .NET is heading. This session attempts to answer all the above questions and more, by taking an unbiased look at current and future development with .NET and other relevant technologies.

—-

Adresa este Bulevardul Expoziției nr.2 . Ne gasiti in Sala de Relaxare – intrarea in cladire se face prin lateralul cladirii, acolo unde este parcarea Ubisoft.

Inscrierea la https://www.meetup.com/Bucharest-A-D-C-E-S-Meetup/events/241326414/

SqlServer temporal tables ca indicator al 3rd normal form

 

Am observat ca SqlServer temporal tables( sau , generic, orice forma de temporal tables – fie prin trigger-e sau  cod ) are o indicatie destul de buna asupra cum ar trebui organizata baza de date.

De exemplu  , avem tabela Employee cu legatura la Department:

Id Name IDDepartment
10 HRManagerasad 1
13 HRManagerasad 2
18 HRManagerasad 2
22 HRManagerasad 21

 

Ce e gresit aici? Pai, ce se schimba de obicei la un Employee ? Departamentul … Numele mai rar ( ma rog, odata …)

Hai sa vedem cum arata tabela cu datele temporale dupa schimbarea Departamentului:

select* from Employee FOR SYSTEM_TIME  BETWEEN ‘2017-07-01’ AND ‘2017-09-01’   where Id=22

Id Name IDDepartment
22 HRManagerasad 21
22 HRManagerasad 2
22 HRManagerasad 25
22 HRManagerasad 23
22 HRManagerasad 21

 

Acum pare evident : IDDepartment trebuie sa stea intr-o alta tabela. Caram dupa noi numele Angajatului in temporal tables de fiecare data – fara sa fie nevoie.

Si acesta este un exemplu simplu. Uitati-va la cea mai CUD tabela   – si vedeti ce se schimba cel mai des….

Design Patterns – Factory in C# and Sql Server Table Partitioning–eveniment ADCES

 

Cind: Miine, 11 iulie 2017. 

1 Design Patterns – Factory
Prezentator: Andrei Ignat, http://msprogrammer.serviciipeweb.ro/

2. Sql Server Table Partitioning 

Prezentator: Bogdan Sahlean, Software Developer and PhD Lecturer , http://aboutsql.net/

Locatie:  Electronic Arts – Afi Park 2

Inscrieri: https://www.meetup.com/Bucharest-A-D-C-E-S-Meetup/events/240024178/

GUI + DB+ Deployment

Am reusit sa iau WorldBank API.Ar trebui sa iau indicatorii – si apoi sa fac un API/ o interfata grafica si sa o pun undeva. Am nevoie de o baza de date pentru asta si de un framework de ORM.

E clar ca o sa aleg .NET Core ( pentru ca il stiu) ca framework de aplicatie/ORM.

Pentru deployment o sa aleg:

  1. Docker
  2. https://appharbor.com/applications – free hosting
  3. Auto-Contained application : https://docs.microsoft.com/en-us/dotnet/core/deploying/deploy-with-vs , https://docs.microsoft.com/en-us/dotnet/core/deploying/deploy-with-cli

Pentru baza de date ma gindesc sa aleg intre:

  1. XML /Json
  2. SqlServer (/ in memory)
  3. SqlLite

Cam atit deocamdata- trebuie sa incep sa muncesc ….

Testing Tasks

Am avut probleme cu task-urile si List<T> . Mai exact, List<T> nu e thread safe – dar tinzi sa uiti asta. Vedeti si http://msprogrammer.serviciipeweb.ro/2017/05/22/task-and-generic-list/ .

Cum sa fac un test care sa testeze cazurile acestea? Nu am ajuns la o concluzie buna, insa cred ca brute force ar trebuie sa fie de ajuns:

 

        [Fact]
        public async Task TestTasks()
        {
            var list= new List<Task>();
            for(int i = 0; i < 10; i++)
            {
                list.Add(GetAndInterpretData());
            }
            await Task.WhenAll(list.ToArray());
            Assert.False(list.Exists(t => t.Exception != null));
        }

Cu citirea de pe hard si 10 iteratii , ajunge la 5 secunde. Cred ca e destul de bun…