1000 posts–and counting
This is my 1001 post. I have begun this blog in 14 November 2009 with Jquery : http://msprogrammer.serviciipeweb.ro/2009/11/14/jquery-learning/ . In that time I was with WIndows Forms and MVC – but I have a penchant for BDD ( NBehave)
I am doing ( mostly) 2 blog posts per week. Occasionally, when I am deep fond with something , I have one blog post per day.
Anyway , thanks for following me!
Doi MVP si doua prezentari despre Xamarin , Machine Learning si Azure
Prezentare 1:
Titlu : Cross-platform mobile application with Xamarin and Integration with Azure DevOps`
Descriere: Just a few clicks and you will have your app up and running inside out favorite DevOps Tool. You can create your dedicated Xamarin pipeline from the portal. Join me to find out more!
Speaker: Codrina Merigo , https://mvp.microsoft.com/en-us/PublicProfile/5003771?fullName=Codrina%20Merigo
Prezentare 2:
Titlu:
Deploying a Machine Learning Model with Azure ML Pipelines
Descriere:
Azure Machine Learning pipelines are independently executable workflows of complete machine learning tasks. They are extremely flexible, and can be used for a large variety of scenarios, from simple offline scoring scenarios, to complex deep learning architectures.
During this talk Vlad will discuss the difference between online and offline scoring, the need for applying solid development principles such as SOLID in machine learning, and how pipelines help in that regard.
He will also show how to create a pipeline for deploying and running a simple model, and discuss possibilities for improvement.
Speaker: Vlad Iliescu, https://vladiliescu.net/
Va fi miine, 9 martie, ora 19:30: https://www.meetup.com/Bucharest-A-D-C-E-S-Meetup/events/275819326/
Friday Links 413
RSCG – Curry – Partial function – part 12
name | PartiallyApplied |
nuget |
https://www.nuget.org/packages/PartiallyApplied/ |
link | https://github.com/JasonBock/PartiallyApplied |
author | Andrei Ignat |
This will generate curry for your functions
The code that you start with is
public class Accounting { public static float Discount( float discount, float price) { var val= price * (1- discount); return val; } }
The code that you will use is
var disc10Percent = Partially.Apply(Accounting.Discount, 1/10f); Console.WriteLine(disc10Percent(disc10Percent(100)));
The code that is generated is
public static partial class Partially { public static Func<float, float> Apply(Func<float, float, float> method, float discount) => new((price) => method(discount, price)); }
Example Code: https://github.com/ignatandrei/RSCG_Examples/tree/main/PartiallyFunction
All RSCG
Roslyn Source Code GeneratorsRSCG- Method Decorator – part 11
name | Method decorator |
nuget |
https://www.nuget.org/packages/AOPMethodsCommon/ |
link | http://msprogrammer.serviciipeweb.ro/category/roslyn/ |
author | Andrei Ignat |
This will generate code to decorate methods with anything you want ( stopwatch, logging , authorization…)
The code that you start with is
[AutoMethods(template =TemplateMethod.CustomTemplateFile,MethodPrefix ="prv" ,CustomTemplateFileName ="MethodDecorator.txt")] public partial class Person { public string FirstName{ get; set; } public string LastName { get; set; } private string prvFullName() { return FirstName + " " + LastName; } }
The code that you will use is
var p = new Person(); p.FirstName = "Andrei"; p.LastName = "Ignat"; Console.WriteLine(p.FullName());
The code that is generated is
[GeneratedCode("AOPMethods", "2021.2.22.1125")] [CompilerGenerated] public partial class Person{ public string FullName ( [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0){ var sw=Stopwatch.StartNew(); try{ Console.WriteLine("--prvFullName start "); Console.WriteLine("called from class :"+memberName ); Console.WriteLine("called from file :"+sourceFilePath ); Console.WriteLine("called from line :"+sourceLineNumber ); prvFullName(); } catch(Exception ex){ Console.WriteLine("error in prvFullName:" + ex.Message); throw; } finally{ Console.WriteLine($"--------prvFullName end in {sw.Elapsed.TotalMilliseconds}"); } }//end FullName }
Example Code: https://github.com/ignatandrei/RSCG_Examples/tree/main/MethodDecorator
All RSCG
Roslyn Source Code GeneratorsRSGC- Dynamic Mock – part 10
name | MockSourceGenerator |
nuget |
https://www.nuget.org/packages/MockSourceGenerator/ |
link | https://github.com/hermanussen/MockSourceGenerator/ |
author | Robin Hermanussen |
This will generate Mock classes directly for any interface – with your implementation.
The code that you start with is
public interface IMatOps { public int Add(int a, int b); public int Division(int a, int b); }
The code that you will use is
var mock = (IMatOps)new MatOpsMock { MockAdd = (a, b) => a+b, MockDivision = (a,b)=> a/b };
The code that is generated is
public partial class MatOpsMock : global::MatOps.IMatOps { /// <summary> /// Set this to true, if you want members that don't have a mock implementation /// to return a default value instead of throwing an exception. /// </summary> public bool ReturnDefaultIfNotMocked { get; set; } private System.Collections.Generic.List<HistoryEntry> historyEntries = new System.Collections.Generic.List<HistoryEntry>(); public System.Collections.ObjectModel.ReadOnlyCollection<HistoryEntry> HistoryEntries { get { return historyEntries.AsReadOnly(); } } /// <summary> /// Implemented for type global::MatOps.IMatOps (Public, same assembly: False) /// </summary> public Func<int,int,int>? MockAdd { get; set; } public int Add(int a, int b) { historyEntries.Add(new HistoryEntry("Add", new [] { $"{a}", $"{b}" })); if (MockAdd == null) { if (ReturnDefaultIfNotMocked) { return default(int); } else { throw new NotImplementedException("Method 'MockAdd' was called, but no mock implementation was provided"); } } return MockAdd(a, b); } /// <summary> /// Implemented for type global::MatOps.IMatOps (Public, same assembly: False) /// </summary> public Func<int,int,int>? MockDivision { get; set; } public int Division(int a, int b) { historyEntries.Add(new HistoryEntry("Division", new [] { $"{a}", $"{b}" })); if (MockDivision == null) { if (ReturnDefaultIfNotMocked) { return default(int); } else { throw new NotImplementedException("Method 'MockDivision' was called, but no mock implementation was provided"); } } return MockDivision(a, b); } }
Example Code: https://github.com/ignatandrei/RSCG_Examples/tree/main/DynamicMocking
All RSCG
Roslyn Source Code GeneratorsRSGC- MetadataFromObject – part 9
name | Metadata from object |
nuget |
https://www.nuget.org/packages/AOPMethodsCommon/ |
link | http://msprogrammer.serviciipeweb.ro/category/roslyn/ |
author | Andrei Ignat |
This will generate code to retrieve the values of properties directly, not by reflection
The code that you start with is
[AutoMethods(template = TemplateMethod.CustomTemplateFile, CustomTemplateFileName = "GenerateFromPOCO.txt")] public partial class Person { public string FirstName { get; set; } public string LastName { get; set; } }
The code that you will use is
var p = new Person(); p.FirstName = "Andrei"; p.LastName = "Ignat"; var last = p.ValueProperty(Person_EnumProps.LastName); var first = p.ValueProperty("FirstName"); Console.WriteLine(last + " "+first);
The code that is generated is
public enum Person_EnumProps{ None ,FirstName // Public ,LastName // Public } partial class Person{ public object ValueProperty(Person_EnumProps val){ if(val == Person_EnumProps.FirstName) { return this.FirstName; } if(val == Person_EnumProps.LastName) { return this.LastName; } throw new ArgumentException("cannot find "+ val); } public object ValueProperty(string val){ if(string.Compare("FirstName",val,StringComparison.CurrentCultureIgnoreCase)==0) { return this.FirstName; } if(string.Compare("LastName",val,StringComparison.CurrentCultureIgnoreCase)==0) { return this.LastName; } throw new ArgumentException("cannot find "+ val); } }
Example Code: https://github.com/ignatandrei/RSCG_Examples/tree/main/MetadataFromObject
All RSCG
Roslyn Source Code GeneratorsFriday Links 412
RSGC-Builder Design Pattern – part 8
name | data-builder-generator |
nuget |
https://www.nuget.org/packages/DasMulli.DataBuilderGenerator/ |
link | https://github.com/dasMulli/data-builder-generator |
author | Martin Andreas Ulrich |
Implements the Builder Design pattern for any class. Useful , at least, for test projects
The code that you start with is
[GenerateDataBuilder] public class Person { public string FirstName { get; set; } public string? MiddleNames { get; set; } public string LastName { get; set; } }
The code that you will use is
var pOld = new Person(); pOld.FirstName = "Andrei"; pOld.LastName = "Ignat"; pOld.MiddleNames = "G"; var build = new PersonBuilder(pOld).WithoutMiddleNames().WithFirstName("Florin"); var pNew = build.Build(); Console.WriteLine(pNew.FirstName);
The code that is generated is
public partial class PersonBuilder { private string? _firstName; private string? _middleNames; private string? _lastName; public PersonBuilder() { } public PersonBuilder(PersonBuilder otherBuilder) { _firstName = otherBuilder._firstName; _middleNames = otherBuilder._middleNames; _lastName = otherBuilder._lastName; } public PersonBuilder(Person existingInstance) { _firstName = existingInstance.FirstName; _middleNames = existingInstance.MiddleNames; _lastName = existingInstance.LastName; } public PersonBuilder WithFirstName(string firstName) { var mutatedBuilder = new PersonBuilder(this); mutatedBuilder._firstName = firstName; return mutatedBuilder; } public PersonBuilder WithMiddleNames(string? middleNames) { var mutatedBuilder = new PersonBuilder(this); mutatedBuilder._middleNames = middleNames; return mutatedBuilder; } public PersonBuilder WithoutMiddleNames() { var mutatedBuilder = new PersonBuilder(this); mutatedBuilder._middleNames = null; return mutatedBuilder; } public PersonBuilder WithLastName(string lastName) { var mutatedBuilder = new PersonBuilder(this); mutatedBuilder._lastName = lastName; return mutatedBuilder; } public Person Build() { var instance = new Person(); if (!(_firstName is null)) instance.FirstName = _firstName; if (!(_middleNames is null)) instance.MiddleNames = _middleNames; if (!(_lastName is null)) instance.LastName = _lastName; return instance; } }
Example Code: https://github.com/ignatandrei/RSCG_Examples/tree/main/DP_Builder