Beyond CRUD: A Practical Guide to Modeling Business Processes in REST APIs
Five patterns for modeling complex business processes in REST APIs, from nesting sub-resources to accepting RPC-style verbs when CRUD falls short.
Practical guides and deep dives on software engineering, architecture and AI.
Five patterns for modeling complex business processes in REST APIs, from nesting sub-resources to accepting RPC-style verbs when CRUD falls short.
Eight NDepend CQLinq rules automate Domain-Driven Design enforcement in .NET, protecting architectural boundaries, entities, and aggregate roots.
The IL code behind the C# 14 field keyword reveals how it removes property boilerplate, and which caveats matter before refactoring an existing codebase.
Reliable resource management in C# depends on IDisposable. Implementing it correctly cleans up unmanaged resources like file handles and connections, and prevents leaks.
Postgres common table expressions break tangled queries into clear, named steps. A music streaming app on Supabase demonstrates how much more readable they become.
C# 14 adds null-conditional assignment, a feature that safely assigns values to properties or indexers without long chains of if statements.
C# 14 lets types define their own compound assignment operators, avoiding unnecessary object creation. The feature is explained along with the pitfalls to avoid.
Logging expenses in YNAB by hand is tedious. A Docker-based service now uses Google Gemini to read receipt images and import and categorise transactions automatically.
Security-sensitive code needs true randomness. Here, .NET's RandomNumberGenerator class is used to produce cryptographically secure random values instead of Random.
C#'s null-conditional and null-coalescing operators handle null values gracefully, resulting in cleaner and more robust code. Each is explained with examples.
Mapster is a high-performance object mapping library for .NET. A beginner-friendly introduction highlights the key features behind efficient data mapping in C#.
Extension methods let C# developers add functionality to existing classes, even sealed third-party ones, without resorting to inheritance or wrapper classes.
PowerShell offers separate operators for case-sensitive and case-insensitive string comparisons, such as -eq, -ceq, -like, and -clike. Each is explained with examples.
NLog can ship .NET application logs straight to AWS CloudWatch. This guide covers installation, CloudWatch configuration, and settings for better performance.
Serilog can write .NET application logs to AWS CloudWatch. Setup, CloudWatch integration, and log settings for better performance are covered in detail.
The AWS SDK can send .NET application logs directly to CloudWatch. Log groups and streams are created, and log messages are sent programmatically, step by step.
Aspect-Oriented Programming improves modularity and readability in .NET. Autofac interceptors are set up and used to apply AOP principles in practice.
Three methods for converting strings into enums in C# are compared, with guidance on which approach best suits different performance and safety requirements.
Config.Net offers an interface-based way to manage settings in .NET and .NET Core applications with minimal boilerplate. A follow-up to the App.config article.
C# offers several ways to turn a DateTime into a string. Custom format specifiers give full control over the output, and each one is explained with examples.
Native SQL Server backups can be created and restored in AWS RDS once an S3 bucket and the right access are in place, as this walkthrough shows step by step.
Every language supported by AWS Lambda reads environment variables through its own native API. Code snippets for each are collected in one place, with no extra dependencies.
A Slack bot with an incoming webhook can notify a team channel when a process fails. Setup is shown step by step, with Postman used to send a test message.
Running VirtualBox or other virtualization software on Windows 10 often means turning Hyper-V off. Two PowerShell commands make enabling and disabling it quick.
The final part of the SData 2.0 series for Sage CRM, comparing the available authentication methods and when each one is the best choice.
Part four of the SData 2.0 series for Sage CRM, showing how to delete records with the DELETE verb, using examples such as removing a company.
Part two of the SData 2.0 series for Sage CRM, showing how to update existing records with the PATCH verb and a JSON request body, using examples.
Part three of the SData 2.0 series for Sage CRM, showing how to insert new records with the POST verb, using examples such as creating a company.
The first in a series on SData 2.0 in Sage CRM, introducing the RESTful API, how it differs from SData 1.1, and how to query records with Postman.
A quick reference of the SMTP, IMAP, and POP server addresses, ports, and security settings for popular email providers, handy for email integrations.
Renewing or upgrading a client's Sage CRM license means relicensing the system. The short process is laid out step by step, along with its prerequisites.
Synchronizing contacts, appointments, and tasks between Sage CRM and Exchange/Office 365 starts with configuring the integration in Sage CRM, as shown here.
Before Sage CRM can sync with Exchange, Office 365 needs a dedicated user and an impersonation role. The setup is covered step by step.
A build error caused by the Mark of the Web can block Visual Studio projects. Several fixes are covered, from unblocking files to more obscure solutions.
Logging into Sage CRM over HTTPS with Internet Explorer can trigger a "Browser session mismatch" error. The cause and the fix are explained.
A domain change can leave the Sage CRM application pool without file permissions, causing a "Cannot create file" error in reports. Granting access fixes it.
A mysterious humbs.db attachment can get Sage CRM emails flagged as spam. Disabling thumbnail caching and removing existing attachments resolves it.
A single line of code in a Nancy module enables CORS, allowing a REST API built with Nancy to be called from JavaScript hosted on other domains.
Hyper-V's automatic checkpoints can slow down shutdowns and corrupt virtual drives when merging fails. Disabling them per virtual machine avoids the problem.
A July 2018 Windows update can break Sage CRM .NET pages with a "Class not registered" error. A small IIS authentication change resolves it.
Sage CRM document uploads can fail with an "UnexpectedEvent" error when document type codes are too long. The cause and the fix are explained here.
After the CredSSP security patch, RDP connections to unpatched servers fail with an encryption oracle error. A temporary registry change gets connections working again.
A Visual Studio extension speeds up .NET development for Sage CRM, bundling project templates, item templates, and snippets for commonly used components.
SQL Server cursors process data one record at a time, much like a loop in code. A worked example imports companies and their people from a staging table.
Moving a virtual machine between Hyper-V and VirtualBox often means converting its drive. StarWind V2V Converter handles VHDX to VHD conversion for free.
Reflection lets a C# application load DLL assemblies at runtime, extract methods from them, and execute those methods without compile-time references.
Custom configuration sections let a .NET app read structured settings from its App.config file. The classes needed to define and read them are demonstrated.
Python virtual environments keep project dependencies isolated, and Visual Studio makes them easy to manage. Creating and using them is covered step by step.
Python comprehensions build lists and dictionaries from existing data or generated sequences in a single readable expression, as these examples show.
Pythonista brings a full Python editor and runtime to iPad and iPhone. A hands-on review of its code editor, custom keyboard, and other features for coding on the go.
A short welcome to the blog, which was started to share thoughts, tutorials, and lessons learned on programming and other hobby-related topics.