E dificil sa tin doua bloguri de programare ( si al treilea persona)
Asa ca o sa renunt la acesta in romana. O sa ramina doar http://msprogrammer.serviciipeweb.ro/
Va multumesc
E dificil sa tin doua bloguri de programare ( si al treilea persona)
Asa ca o sa renunt la acesta in romana. O sa ramina doar http://msprogrammer.serviciipeweb.ro/
Va multumesc
Organizez ITDevConnect pe 30 septembrie .
Detalii aici: http://www.adces.ro/itdevconnect-2017/.
Poti face share la cei interesati sau poti participa .
Miine, Marti 12 septembrie, ora 19, Design Patterns – Facade in C# and Introducere în ReactJS
https://www.meetup.com/Bucharest-A-D-C-E-S-Meetup/events/241657306/
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:
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
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 ….
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/
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….
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/
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:
Pentru baza de date ma gindesc sa aleg intre:
Cam atit deocamdata- trebuie sa incep sa muncesc ….
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…