How To Remove A Merge Candidate From The Merge Tool in Visual Studio

Create a new workspace containing the two branches for which you want to remove merge candidates (*). For example:

  • Name: Temp
  • Source Control Folder: $/Foo/Delivery - Local Folder: C:\TFS\Temp\Delivery
  • Source Control Folder: $/Foo/Production - Local Folder: C:\TFS\Temp\Production

Open the “Developer Command Prompt for VS 2019”

Change the directory to the root of your newly created workspace: C:\TFS\Temp

Run this command to see which candidates are available for merge:

> tf merge /candidate Production Delivery  /recursive

This will return a list:

Changeset User  Date        Comment
--------- ----- ----------- ---------- -------------------------------------
121911 J, Joe 2019-08-12 Merge DLV -> PRD
117308 Z, Han 2019-02-27 rollback rollback
117284 J, Joe 2019-02-26 Rollback Merge because of required hotfix
117270 Z, Han 2019-02-26 merge dlv-> prod (part 1)

The changesets 117308, 117284 and 117270 are the ones that I want to remove as merge candidates.

For each of the changesets you don’t want as merge candidates run a command like this to remove them:

> tf merge /discard Production Delivery /recursive /version:117270

To push this change to TFS you must perform a check-in:

> tf checkin /comment:"Discarded Prd > Dlv merge candidates for CS 117270"

Do not try to do multiple > tf merge /discard commands followed by a single tf checkin: doing that failed to remove the unwanted merge candidates for me!

*) This was needed to overcome an error running tf merge:

All specified files must reside in the same workspace. Workspace Delivery contains C:\TFS\Foo\Delivery.

Check out the TF Merge Command documentation here:

Photo by Edward Ma on Unsplash

Test Automation Day 2019

Two weeks ago I went to the Test Automation Day 2019 conference in Utrecht, together with my colleague Diego Fung-Loy (Senior Test & Requirements Analyst). Here are some of the take-aways from this inspiring conference.

(I love the number on my badge: 242)

09.30 - Keynote: Balancing your test automation with exploratory testing

The opening keynote by Mirjana Kolarov (from Novi Sad, Republic of Serbia) had “Learn & Explore” as the motto.

  • Beware of inattentional blindness (the gorilla can be a huge bug).
  • Exploratory testing is like a question game (“is it alive? is it …”) so the first question often determines how quick you get to the solution.
  • For E2E (end-to-end) testing you shouldn’t test everything, just the the flows that are important to your business.
  • The classical test automation pyramid with a wide Unit Test base, followed by a narrower Integration Tests layer and a small E2E top might look different for your business: like a diamond or even an inverted pyramid with lots of E2E testing and few unit tests.
  • Controversial statement: testers need to be able to read code to see what needs to be tested.
  • Before automating tests first do lots of manual testing to learn about the new feature.

When to use Exploratory Testing

  • Functional testing
  • Performance testing
  • Load testing
  • Stress testing
  • Security testing
  • Usability testing
  • Preparation for automated tests

When to use Automation In Testing (= better term than “Automated Testing”)

  • Regression testing
  • Smoke testing
  • Data driven testing
  • Load testing
  • Security testing
  • CI and CD

She ended here presentation with a GIF showing the experience of tester vs client, which inspired me to look for one myself:

Which may be funny but is of course not a good representation of the average Nextens customer, who are more of the athletic type as demonstrated by this recent marketing video:

10.10 - Keynote: Continuously Shipping Web Apps with Confidence

Amir Rustamzadeh - senior engineer for JavaScript End to End Testing Framework Cypress - showed me that everything that we struggle with in Selenium might be solved by Cypress!

The web went from document viewer to application platform, but the test tools did not adept to a web that went from stateless to stateful.

Because testing is hard it’s important to remove friction.

Some features of Cypress:

  • Reliable in-browser testing
  • Free, open source
  • “Makes testing an enjoyable experience, and generated developer happiness”
  • > npm install -D cypress
  • API is English-like, chainable and easy to read
  • Offers reusable custom commands
  • Where Selenium queries the browser Cypress lives inside the browser, with a Node.js backend
  • Faster tests
  • Direct native access to the DOM and your application enables new types of testing
  • You can login to your app without using the form - use a login function instead
  • Offers automatic waiting
  • Promises flake free testing (no false negatives)
  • Via the backend you can execute Javascript on the system to clear a database, create users or seed a db
  • You can run Cypress headless as part of your CI with video recording out-of-the box!
  • Record results to a dashboard website
  • Supports parallelization (to optimize CI usage)

If you make testing simple enough people will start writing tests!

11.20 - Breakout Session: The Story of the Little Jenkinsfile that Could

Shelley Lambert is the Test Lead for IBM Runtime Technologies team and told about her journey from inheriting legacy test code to running 87 million tests every night.

Some principles:

  • reduce friction: fewer dependencies, files and locations requiring change
  • restrict new test features to only those that drive next actions

Human Challenges:

  • Feature creep
  • Ownership & access
  • Technical ego
  • Naysayers

Technical Challenges:

  • Open tools churn (updates, defects, skew)
  • Unstable machine layer

These sessions did not generate any notes worth reproducing here

  • 12.10 - Verifying micro services in chains without chain testing?
  • 14.00 - Keynote: Will robots replace testers?
  • 14.50 - Installing a test automation infrastructure at a Swiss bank
  • 16.00 - Why Automated Performance Testing is a must (I did not write down this consultant’s advice to hire a professional consultant when implementing automated performance testing)

16.50 - Keynote: A Continuous Life in Test Automation

Dorothy Graham is amazing - she has been at the forefront of many discoveries in software testing (and might not have always gotten credit for it because of her gender):

Dorothy has worked in software testing for over 40 years. Originally from the US, her first job was developing testing tools for Bell Labs in New Jersey. She then worked as a developer for Ferranti Computer Systems in Manchester before moving to the National Computing Centre where she developed training courses in software engineering.

She later became an independent consultant specialising in software testing and founded Grove Consultants in 1988. Over the next 20 years, Grove gained a reputation for the high quality of their training courses, materials and presentations establishing a world-wide client base. In 2008 she left Grove to work again as an independent consultant. Dorothy now uses her experience to help educate and motivate others through her popular and entertaining conference presentations.

She is co-author of five books: an introductory book for software testing together with more in depth books on Software Inspection and Test Automation.Recently she has worked with Seretta Gamba developing a Wiki of software testing patterns. Their latest book has now been published showing how patterns can be used to help solve testing problems.


This was (probably) her final keynote on the continent - some quotes:

  • Be open to the unexpected
  • Writing things that are shared around is great
  • Asking questions is very powerful
  • Forgiveness is better than permission - if you have a good idea just do it!
  • Automating chaos is just faster chaos
  • Managers don’t understand testing
  • Continuous everything
  • Danger: pressure for testers to learn coding

The essence of testing:

  • What could go wrong?
  • What if it isn’t?
  • Have you thought of…
  • Asking “stupid” questions

Microsoft Ignite - The Tour - Amsterdam 2019 - Day 2 - Part 3

Part 3 of my second day of the Microsoft Ignite - The Tour conference in Amsterdam on Thursday march 21 in RAI Amsterdam. See my post on the first day here, part one and part two of the second day here.

Scaling for growth and resiliency

14:10 - 15:10 | SRE40 | Elicium 2 | Jeramiah Dooley

“Tailwind Traders has realized that it will need to focus on scaling their application and infrastructure to both handle more traffic than originally expected as well as increase resiliency in the case of failures. Their business demands reliability, so we’ll explore how Azure products can help with delivering it. In this module, you will learn about scaling our application and infrastructure for increased loads as well as how to distribute workloads with Azure Front Door and Azure Availability Zones to protect against localized failures.”

  • Vertical scaling = scaling up: making your box bigger
  • Horizontal scaling = scaling out: adding more boxes to the pool (and the opposite of scaling out is scaling in)

“There’s a spectacular deploy script in the Northwind Trader repo” - Couldn’t find it - @jdooley_clt is looking for it after I asked him via Twitter.

  • “cool down” is an important setting for auto-scaling (depends on how fast your new instance spins up)
  • Azure Paired Regions: “Each Azure region is paired with another region within the same geography, together making a regional pair. Across the region pairs Azure serializes platform updates (planned maintenance), so that only one paired region is updated at a time. In the event of an outage affecting multiple regions, at least one region in each pair will be prioritized for recovery.”. We deploy many of our key apps across the two paired regions in Europe: North Europe and West Europe. That means that if for example a SQL Server update causes problems for one of our sites (which actually happened to us some time ago) we can direct all traffic to the region where the SQL Server update has not been applied yet!
  • Azure Front Door Service is Microsoft’s highly available and scalable web application acceleration platform and global HTTP(s) load balancer. It provides built-in DDoS protection and application layer security and caching.” Sounds like an alternative for Incapsula!
  • Right now we are struggling with naming the two regions/environments that we’re deploying to: one is unnamed and the other is called fail-over (because that was the original plan - having an environment to switch to in case of an outage). Jeramiah showed me a better naming convention: primary & secondary.

Responding to and learning from failure

15:30- 15:30 | SRE50 | Elicium 2 | Emily Freeman

“Tailwind Traders has done a tremendous amount of good work using modern operations principles and practices to create, deploy, monitor, and troubleshoot their applications and infrastructure in the cloud. As an initial effort, this has been superb, but the engineers know that putting processes in place for continuous learning and continuous improvement are the only sure way to provide continuous value to the customers. In this module, we’ll do more than just talk about these processes, we’ll see how they work in action. We pick up the story right in the middle of Tailwind Traders first significant outage. Everything is on fire (metaphorically) and the engineers are struggling to understand the problem and remediate it as fast as possible. We’ll demonstrate not just how the outage is brought under control, but even more importantly, how Tailwind Traders is able to learn from their experience after the fact and improve their systems while doing so. Understanding this process is one of the most important keys to continuous improvement, “leveling up” our operational practices, and getting the most value from our cloud investments.”

This was my second talk of the day by Emily. She started her talk with an image showing a variation on the This Is Fine meme. This is the original:

Some terms:

  • Mean Time To Recover (MTTR): On average (excluding outliers), how long does it take to restore service when a service incident occurs?
  • Cost of downtime: Deployment frequency * Change failure rate * Mean to to recover * Hourly cost of outage
  • Time to restore service: for elite teams it’s “less than one hour” (from the DORA: State of DevOps Report 2016)

Some quotes:

  • E-mail is no place for alerts
  • Alert fatigue is a real thing, don’t do anything to cause that!
  • When it comes to incidents chat is the best channel (Teams, Slack)
  • Create separate incident channels for each incident - it provides focus
  • Try to record video, if you use that

Demo: using Azure Logic App and Application Insights Action Groups
to create a Teams channel with incident number, and post a message to it using string interpolation. Which looked somewhat like this:

incident: {incident-number}
severity: critical
person on-call: {on-call}

Severity of an incident

Sev1 critical Complete outage
Sev2 critical Major functionality broken, and revenue affected
Sev3 warning Minor problem
Sev4 warning Redundant component failure
Sev5 info False alarm or unactionable alert

Incident response roles

  • First Responder (That would be the person on stand-by duty for us)
  • Incident Commander (Lead coordinator and decision maker during an active incident)
  • Subject Matter Expert (Engineers with expertise and knowledge relevant to the recovery of service)
  • Scribe (Responsible for documenting what is not captured in team chat)
  • Communication Coordinator (Responsible for communicating regularly with internal and external stakeholders)

Post incident review

  • How: Here to learn
  • When: ASAP
  • Where: Welcoming, judgement free space


Something Emily inspired me to try to organize: just like we have our yearly fire drill - collectively walking down 16 flights of stairs - we should practice our incident response! Just randomly break on of our dev environments and let the teams fix it ASAP without calling in the help of OPS. Award a prize to the team that has the lowest MTTR.

Microsoft Ignite - The Tour - Amsterdam 2019 - Day 2 - Part 2

Part 2 of my second day of the Microsoft Ignite - The Tour conference in Amsterdam on Thursday march 21 in RAI Amsterdam. See my post on the first day here and part one of the second day here.

Diagnosing failure in the cloud

12:10 - 13:10 | SRE30 | Elicium 2 | Jason Hand

“Tailwind Trader’s modern monitoring and alerting processes are working great. So great they have detected some issues with our application and how it is behaving in the cloud. It’s time to make sense of what’s going on and how to resolve trouble. In this module, we will explore the processes and tools available to us to troubleshoot issues as they come up with running applications and infrastructure on Azure. Participants will gain exposure to querying log data found in Log Analytics as well as what to look for within Application Insights and Network Monitor to lead engineers to understanding and solving problems quickly.”

Jason did not forget to tweet a selfie with the audience for this session:

Besides some open doors (check if it’s only you via his demo of creating alerts via Service Health was really interesting!

The “Service Health“ service (“Personalized alerts and guidance when Azure service issues affect you.”) - never been there!

His demo inspired me to try to create an alert via a Webhook to our Operations channel of Teams whenever an Azure service issues affects us. That’s something I tried before via the RSS feed of Azure status but that contained too much noise (and not enough Actionable Alerting) because we couldn’t filter on region and resource type. The webhook has been created, so hopefully we have some Azure outages soon to see the posts in our Teams channel! :-)

Creating the perfect Azure Service Health Alert

This part is not in the Powerpoint so I hope my notes reflect his points correctly!

  • Don’t create too many or too few - try to find the sweet spot
  • Make sure they don’t overlap
  • Alert on production issues preferentially
  • Create them people-first
  • Separate alerts from planned maintenance and advisory notifications

Application Map

From my notes: “slow requests by name”. Sounds good, but where is that then dear notes? :-)

Log Analytics Queries

Looking at this demo (and the power of the Kusto query language) I made a mental node that I could use these whenever the log queries of our Management Portal let us down!

Azure monitor workbooks and troubleshooting guides

  • Combine text, queries, metrics and parameters into rich interactive reports.
  • Create Azure Monitor Troubleshoot Guides for people who are on call
  • You should deliver the workbook with the actionable alert
  • It supports editing with Markdown! (+1)
  • “One of the greatest best kept secrets of Azure”

The other two of the sessions of this day are covered in part three of this blog post.

Microsoft Ignite - The Tour - Amsterdam 2019 - Day 2 - Part 1

My second day of the Microsoft Ignite - The Tour conference in Amsterdam on Thursday march 21 in RAI Amsterdam. See my post on the first day here.

GitHub sticker!

Modernizing your infrastructure: moving to Infrastructure as Code

09:30 - 10:30 - SRE10 - Auditorium RAI Theater - Emily Freeman

“Deploying applications to the cloud can be as simple as clicking the mouse a few times and running “git push”. The applications running at Tailwind Traders, however, are quite a bit more complex and, correspondingly, so are our deployments. The only way that we can reliably deploy complex applications (such as our sales and fulfillment system) is to automate it. In this module, you’ll learn how Tailwind Traders uses automation with Azure Resource Management (ARM) templates to provision infrastructure, reducing the chances of errors and inconsistency caused by manual point and click. Once in place, we move on to deploying our applications using continuous integration and continuous delivery, powered by Azure DevOps.”

Emily Freeman

Site Reliability Engineering is an engineering discipline devoted to helping an organization achieve the appropriate level of reliability in their systems, services, and products.

“A characteristic of great teams is that everyone trusts each other.”

The Small Batches Principle

Emily talked about the importance of small batches (when every release contains small amounts of new code the lines causing the problem are easier to find), but that got me thinking: doesn’t that introduce a new problem? When you have many deployments in a short period of time how can you be sure which of these introduced the bug or regression?

Added to my reading list: The Small Batches Principle - Reducing waste, encouraging experimentation, and making everyone happy

Demo: deploying Resource Manager templates from Azure Cloud shell. That’s also to be found in docs.

Monitoring your infrastructure and applications in production

10:50 - 11:50 - SRE20 - Hall 11 - Jason Hand

“Tailwind Traders runs its entire business in the cloud and we need to understand what is happening with our cloud resources 24/7. To do that, we’ve implemented Microsoft Azure’s monitoring solutions. In this module, you’ll learn how we use Azure Monitor to understand and visualize time series data using Application Insights and Log Analytics. We’ll also monitor the health of our cloud services using Azure Service Health. With a more observable and data rich system Tailwind Trader’s engineers are now poised to know about, respond to, and resolve problems in real-time before they impact users and the business’ bottom line.”

Jason Hand

It looks like that this might be a good book to read (for free, online: since both Emily and Jason seem to be quoting it extensively:

“Site Reliability Engineering - Members of the SRE team explain how their engagement with the entire software life cycle has enabled Google to build, deploy, monitor, and maintain some of the largest software systems in the world.”

Jason took Mikey Dickerson’s Service Reliability Hierarchy (elements that go into making a service reliable, from most basic to most advanced) from that resource:

Some quotes:

  • “you can’t have root-cause analysis on a complex system” (You should do a post-incident review instead.)
  • “slow is the new down”

What’s your definition of reliability?

This slide illustrates the many ingredients of reliability - food for thought:

Service Level Indicators (SLIs)

I’ve been looking at it everyday but I’ve never knew there was a term for it! Will be using that…

Service Level Objectives (SLOs)

The same goes for SLI’s sibling: I know for sure I’ll be talking about “the SLI dropping below the SLO” in the years to come!

Quote (paraphrased):

  • “Don’t paint yourself into a corner by setting a too high a SLO” (based on historic performance - like the disclaimer in ads for financial products in the Netherlands warns: “results from the past are no guarantee for the future”).


His demo of querying App Insights to return charts with an SLI dropping below the SLO at some points really made me want to go out and do those myself. One of the first things I thought of was using it for analytics for this blog, because I find Google Analytics to be almost completely unusable. It looks it’s only useful for tracking the sales your Google Ads have generated, and not very useful to see things like what posts get the most engagement.

Here’s one of the sample queries (in the Kusto query language):

// Top 10 countries by traffic
// Chart the amount of requests from the top 10 countries
| summarize CountByCountry=count() by client_CountryOrRegion
| top 10 by CountByCountry
| render piechart

Bizarrely my blog is more popular in Czechia than Serbia (were some of my team members live):

Actionable Alerting

Bottom line: an alert is only useful when there’s someone who can do something about it, i.e. when it’s actionable. Don’t alert stuff that always fails, don’t alert stuff that succeeds.

A proper actionable alert should have this information:

  1. Where the alert is coming from
  2. What expectation was violated
  3. Why this is an issue (for our customers)
  4. Steps to resolve the problem

Jason demonstrated these principles in a demo where he showed how to have Azure send an automated voice call (“because Ï don’t wake up to e-mail”) when an SLO drops below an SLI. He also showed how you could at the same time send more context about the problem to a Teams Channel (containing the context with the 4 points mentioned above).

I was recently asked to join the rotating stand-by team for Nextens, and I will only agree if we have this set up! ☺

Monitoring the monitoring

That’s a very important point: not receiving beautifully composed actionable alerts might not be good news - it might mean that your monitoring is broken.

He also stated that in case of outage the first thing that must be restored is the monitoring, before anything else! That’s probably very good advise that I can foresee being ignored by a panicked manager in case of a crisis…

I liked the first talks of the day - which were both part of the Site Reliability Engineering track - so much that I decided to change my schedule for the rest of the day. These three talks (one of which was a 15 minute one) were dropped:

So my third talk of the day was also by Jason Hand.

Read about that in part two of this blog post!

Microsoft Ignite - The Tour - Amsterdam 2019 - Day 1

My first day of the Microsoft Ignite - The Tour conference in Amsterdam on Wednesday march 20 in RAI Amsterdam. See my post on the second day here.

The image above is taken from Microsoft’s Ignite site. It’s obvious that they took inspiration from the header of my blog! ;-)

The RAI convention center in Amsterdam

Orientation and Learning in the Hub

08:30 - 09:10 | OP001 | Theater 1 | Neil Peterson and Christina Warren

“Check in, grab breakfast, and join us in The Hub to kick off your learning in a casual atmosphere with your peers. Get a preview of what’s to come over the next two days and check out real world demos from Microsoft experts.”

Azure Pipelines for web, container and mobile apps

09:30 - 10:30 | BRK3695 | G104-G105 | Houssem Dellai

“Azure DevOps comes with a feature for building and releasing apps, called Azure Pipelines. It makes it easy to create CI-CD pipelines that supports multiple platforms (Java, NodeJs, Go, Swift, .NET…). In addition to that, it can deploy to multiple cloud providers (AWS, Heroku, Azure…). This session will guide you on how to create pipelines for different apps: web, dockerized and mobile apps. Not only that, we’ll add also the database. All these cases are with live demos ! And because DevOps is not complete without automation, we’ll have demos for how to create and deploy the infrastructure using ARM templates. Agenda: ASP.NET Core MVC app with Database Angular app using Docker containers Mobile app using Xamarin & App Center Dev-Test-Prod environments Tasks for integration with 3rd parties Deployment to Azure using Infrastructure as Code”

Observation: before starting his demo of using Azure Pipelines to deploy a Java app Houssem asked the - relatively small - room how many Java developers, and only two raised their hands. Fifteen years ago that would have been many, many more. #java-is-dead

Some points I’ve picked up during this talk/demo:

  • Microsoft is supposedly working on enabling caching of packages (like NuGet) in Azure DevOps Services builds. I think that this will take away one the advantages that builds running on our on-premises build servers have over running them on hosted agents.
  • He showed how you can configure code coverage as part of a Maven build task. I’ll have to look into whether this is also available for VS build tasks
  • The new terminology for builds and releases (deployments) is “CI pipeline“ and “CD pipeline“.

Viewing the YAML configuration that a CI pipeline runs on and saving it to your repository allows you to create a build that runs on that YAML file. Your build definition will live next to your code, and can be different across branches!

Example of how this would work for the build pipeline of this blog

When you create a CI pipeline from a YAML file you no longer see tasks in the definition (because it runs on a single file), but when you run the build the separate tasks will appear in the logs.

Example of how this would work for the build pipeline of this blog

I can see us using this a replacement for the build and release definitions templates that we currently store as JSON files in source control at Nextens.

Another thing I noticed was the “Application and Configuration Settings“ of the release pipeline - that’s not in the Azure App Service Deployment task that we have on our on-premises Team Foundation Server 2017, and looks really useful!

Something else that I can see us starting to use when we move away from code-first migration is the SQL Server Database Deploy that was demoed: it looks like you can do idempotent schema changes - Houssem talked of database schemas being compared - using a Dacpac generated as a build task.

The Cloud-based Web Performance Test task is something I also look forward to taking for a ride:

Since I saw a colleague struggling to get SonarQube running last week we should have a look at SonarCloud: “the leading product for Continuous Code Quality online, totally free for open-source projects. It supports all major programming languages, including C#, VB .Net, JavaScript, TypeScript, C/C++ and many more. [..] This Azure DevOps extension provides build tasks that you can add in your build definition. All branches and pull-requests are automatically analyzed, allowing you to discover early any bug or vulnerability in the code. A widget is also available to track the health of the overall application.”

All in all: this talk was really useful and inspiring!

Deploying your application faster and safer

10:50 - 11:50 | DEV20 | Elicium 1 | Damian Brady

“Application deployment has changed drastically over the years, with tedious, manual tasks being replaced by scripted routines. It’s even easier today with cloud services to help you out. In this talk, we’ll take a deep dive into automating and continuously deploying your application using Azure Services. We’ll start with the basics, discussing automated operations that developers control (DevOps) like A/B testing and automated approval gates. We’ll then take that entirely to the cloud using Azure’s new DevOps project, showing you how you can automate the deployment of a frontend web application, backend web service and database, and mobile application with a few clicks of a button.”

Damian started his talk with a video to illustrate the situations before and after the adoption of DevOps:

Donovan Brown’s (Principal DevOps Manager with Microsoft) definition of DevOps:

DevOps is the union of people, process, and products to enable continuous delivery of value to our end users.

Some of my notes:

  • the #4 reason for adopting DevOps: reducing human error
  • I should read the 2018 Accelerate:State of DevOps Strategies for a New Economy report and quote from it to my managers
  • devs are incentivized by change, ops by stability
  • I saw Intellisense in YAML configuration in an Azure pipeline editor!
  • “An agentless job executes tasks on the server without requiring an agent.”
  • “A deployment group job executes tasks on machines defined in a deployment group.”

Damian also showed storing the YAML build definition in source control. What I would like to know if there’s an option to replace tokens in those YAML files to enable using the same file across different development branches that deploy to their own dev environments in Azure (we currently have 6 of those for our dev teams!).

I really liked the concept of having canary slots to deploy to as the last step before going to production. You configure to send a small percentage of your users to that slot, to have them test your latest release in production. When the canary environment works well you deploy to production.

  • LaunchDarkly: feature flag as a service
  • Blue-green deployment is a technique that reduces downtime and risk by running two identical production environments called Blue and Green.

I really liked the concept of having someone sign off for a deployment to production: it’s done via a gate in the Pre-deployment conditions of a CD pipeline that runs on an Azure Function invocation. The Azure function sends a mail to a manager with a link to do a DocuSign, and when that’s done the release is triggered!

Discovering Azure tooling and utilities

12:10 - 13:10 | FUN30 | Hall 11 | Neil Peterson

“Microsoft Azure allows you to build your applications with the full power and resilience of the cloud. But how do you do that? In this module, we’ll show you the tools that Tailwind uses on a daily basis, including the VS Code editor and its available Azure extension. We’ll also introduce you to the Azure Cloud Shell, which allows you to work with Azure resources without the need for the Portal. Finally we’ll show you how Azure Resource Management (ARM) templates can save you time and help you automate infrastructure, reducing the chance of errors during manual human input.”

Neil Peterson

  • I should try editing PowerShell code in Visual Studio Code.

Azure Cloud Shell

  • One of the things you can Azure Cloud Shell for is to test if the code only fails on your machine.
  • Cloud Shell has session-bases filesystem, but you can also save files to its clouddrive which is persisted in a storage account.
  • There’s Visual Studio Code-like editor in Azure Cloud Shell. Start it up with code ..

Cloud Shell code editor

You can run code samples from (like in a sand-boxed Cloud Shell:

It’s all about .NET Core

14:10 - 15:10 | BRK3703 | Emerald Room | Alexej ******

“ASP.NET Core is not just MVC with Controllers and Views or API. Sure there is a lot of usual things that are different from ASP.NET. But there are also some things that good developer should know. Like: IoC/DI, Middleware/Filters, Azure Apps, API, Docker, security, new features and much more.”

This talk was a disaster. Without any introduction the speaker showed slide after slide with seemingly random code samples. When he showed how to minify a CSS file using one of Mads Kristensen VS extensions - in a .NET Core talk! - I left.

There wasn’t really an good alternative session, but I did see half of “Leveraging the power of Microsoft Threat Protection to secure the modern workplace across identities, endpoints, and more”, which was okay but not really useful for me.

Investing in Serverless: less servers, more code

15:30 - 16:30 | DEV50 | Elicium 1 | Jeremy Likness

“Sometimes all you need is a few routines to run in response to a series of events - so why do you need to choose a development framework, deployment strategy and server setup for such a simple need? Wouldn’t it be great if you could just write the simple routines you need and have them run exactly when you need them and scale automatically? Turns out you can with the right cloud services. In this talk we’ll create a set of routines that run on Azure Functions and respond to events in Azure Event Grid. We’ll then orchestrate these functions and messages using Azure Logic Apps.”

  • PaaS reduces waste (servers doing nothing while waiting for a spike in traffic)
  • I had to Google what an SKU was (“a stock keeping unit is a product and service identification code for a store or product, often displayed as a machine-readable bar code that helps track the item for inventory”)


Artillery is a tool that you can use to run load tests.

PS C:\windows\system32> npm install -g artillery
PS C:\windows\system32> artillery quick --count 100 -n 20
Started phase 0, duration: 2s @ 23:13:44(+0100) 2019-03-20
Report @ 23:13:54(+0100) 2019-03-20
Elapsed time: 10 seconds
Scenarios launched: 100
Scenarios completed: 16
Requests completed: 1331
RPS sent: 134.91
Request latency:
min: 24.5
max: 3335.3
median: 42.8
p95: 2351.4
p99: 3032.5
200: 1331

Report @ 23:13:59(+0100) 2019-03-20
Elapsed time: 15 seconds
Scenarios launched: 0
Scenarios completed: 84
Requests completed: 669
RPS sent: 131.01
Request latency:
min: 16.1
max: 459.2
median: 38.2
p95: 57.3
p99: 154.2
200: 669

All virtual users finished
Summary report @ 23:13:59(+0100) 2019-03-20
Scenarios launched: 100
Scenarios completed: 100
Requests completed: 2000
RPS sent: 133.24
Request latency:
min: 16.1
max: 3335.3
median: 41.4
p95: 2034.8
p99: 2945.4
Scenario counts:
0: 100 (100%)
200: 2000

I love this!

Event Grid & Logic Apps

This part of the talk had a demo that got the first applause of my day: the upload of an image of a hammer to blob storage triggered an analysis of the image on the Computer Vision API which resulted in the text “close up of a tool” to be inserted in the “machine description” column of a table storage record.

I did not have a look at Event Grid and Logic Apps yet but it looks really useful. Great stuff for making hackathon demos to impress people too: creating events based of mails in a Gmail or Outlook inbox, a Tweet being posted, Azure infrastructure being provisioned (Azure Automation), webhooks.

Durable functions are great for saving money when you have processes that spent most of their time waiting (Task.WhenAll).

Free beer!

That concluded the first day of Ignite. Some observations:

  • The organization is great. Only when I was in the queue to get into my first talk I overheard the people at the door scanning our passes telling them the two people in front of me that there were no more empty seats in the room, which caused them to leave. It turned out that there were ample empty seats scattered around the room, so that was a shame.
  • Hearing people talk I noticed that there were a lot of nationalities at the event. So not only the Dutch are interested in anything that’s free!
  • All my speakers today were male, and I estimate that less than 5% of the audience is female.

Art Week Rotterdam 2019

Today I went to Rotterdam with my wife to visit three art fairs in one day. We were invited to the VIP openings for all three because of my wife being both an artist and an art collector. I brought a camera to take pictures of anything that piqued my interest.

Haute Photographie

The first fair was Haute Photographie, the art photography fair organized by Roy Kahmann of Kahmann Gallery in Amsterdam:

[…] a new photography fair with a concept unlike any other. Haute Photographie is centred around a group exhibition, featuring works by the grand masters from the history of photography, to the youngest and most exciting young talents working with the medium today. Haute Photographie is a boutique photography fair with the allure of a museum.

Langdon Clay (1949) - King’s Inn Car, Chevrolet Caprice, Hoboken, NJ, 1975

Barry Kornbluh - Torso (Undressing) 2006 - silver gelatin print

Marvin E. Newman (1927, US)

Christer Strömholm - Paris, Montparnasse (late 50’s, silver gelatin print, vintage)

Nora Papp - Instagram Toaster (2018) - Archival pigment print on glass

We bought this one! This work you really have to see in real life to enjoy it - it’s printed on glass that’s mounted with space behind it so the work acquires a lot of dynamic from the shadows that move as you go past the work. Compare it with the way the artist shows the work on her @nora___papp Instagram timeline:

What we like about it that it’s at the same time both the result of a very conceptual approach to making art, and a very aesthetically pleasing dynamic work of art that we probably won’t grow tired of soon.

Inspired by Instagram, Nora Papp uses the deconstruction of a digital image to collect “aesthetic data”. Every digital image is divisible into luminosity, levels, brightness, contrast, texture, warmth, saturation, colour, highlights, sharpness, creation and reproduction, distribution, storage. With the help of imaging software, she uses the data she collected from Instagram images. The choice of combining or applying these elements in a certain way, while listing the values that she considers artistically significant, creates a new abstract image.

Nora Papp graduated from the Gerrit Rietveld Academy, Amsterdam in 2018.


Hellen van Meene showing something on her phone to Roy Kahmann (probably pictures of her dogs 😉) with the work of Nora Papp in the background.

Christopher Anderson - Bleu Blanc Rouge No. 4: Cherries, 2014

Shen Wei (China, 1977) - James (2007)

Does this work look like a Hellen van Meene or is it just me?

Two older works made in Korea by our friend Julia Fullerton-Batten and two works from her super-ambitious Old Father Thames series. These faithful copies of famous paintings are not my favorites from that series: I like the re-enacted events related to the river Thames found in old newspaper more.

Julia Fullerton-Batten - Serie Corea 2013 - Portrait: Le Go Eun 2013 - C-Type Print

Sascha Weidner (German photographer who died four years ago at the age of 40)

A detail of a work by our friend Carla van de Puttelaar that features a marble-like fabric which might indicate a (shared) love of the work of the Baroque style of sculpture by Bernini.

Ahn Jun - One Life (2018)

Eiji Ohashi - Roadside Lights III #042 (2018)

A wall of works by Kahmann Gallery poster-boy and Alkmaar (Hellen’s hometown) citizen Bastiaan Woudt.

It’s quite likely that no hardworking taxpaying citizen’s euros were spent on supporting this fair.


New Current

The ground floor of the Cruise Terminal at the Wilhelminapier was dedicated to the work of 15 artist who graduated in the last 5 five year.

I liked this work by Quinda Verheul. It looks like it’s just made from mirror, sand and light, and could be made by any of your nephews, but hey: they don’t think of making anything like this!

Qade (Qontemporary Art and DEsign) Solo Project

Twenty-five galleries showing two solo exhibitions each. I hate the name of this fair. I don’t know to pronounce it (“quade”? “kaa-duh”?), and “Qontemporary”? Come on!

Francois du Plessis - Book Objects.

I loved this! It worked on many levels - only when you got real close you could make up how it was made.

Two nice intricate skulls by our friend Carolein Smit.

A view of a rainy and misty New Meuse river and Erasmus Bridge from the Cruise Terminal at the Wilhelminapier.

Art Rotterdam

Art Rotterdam is the biggest contemporary art fair of the Netherlands. The location is the great Van Nelle factory.

a prime example of the International Style based upon constructivist architecture. It has been a designated UNESCO World Heritage Site since 2014. Soon after it was built, prominent architects described the factory as “the most beautiful spectacle of the modern age” (Le Corbusier in 1932) and “a poem in steel and glass”

I’d love to link to their website but unfortunately it’s broken right now (with a quite familiar Yellow Screen Of Death):

When we arrived at this fair we first had to drop off my wife Hellen van Meene’s polaroids at We Like Art, but thankfully this year they were inside of the fair just left of the entrance!

You can buy this one of a kind instant photo (yes, it’s not really a multiple of the kind We Like Art sells - you buy a unique photo of a series of many taken of one of our daughters lying in our bathtub surrounded by flowers).

Heringa/Van Kalsbeek - Hurry Slowly (2017) - Resin and metal @ We Like Art

Hans Houwing. They look like Bic pen drawings and that’s all I need.

Robert Barta - 100 years, 2019 (electric motor, lead battery, magnets, beer coaster, classical foldable table, 80 x 113 x 50cm) at Rutger Brandt Gallery. It’s a typical Dutch round paper beer coaster magically rotating on top of a vintage table.

Maria Roosen @ Galerie Fons Welters

A work and a close-up of a work by our friend Awoiska van der Molen (silver gelatin prints).

Hellen van Meene posing with Katja Mater - one of her models in the early days her career - who was an our later to become the winner of the NN Group (a too big to fail Dutch financial giant) Art Award 2019!

A page from Hellen van Meene’s first monograph (sought after by collectors, especially since it appeared in ‘The Photobook, A History Volume II’ by Martin Parr en Gerry Badger) featuring a portrait of Katja Mater.

Luis Felipe Ortega

Johan De Wit. It’s paper, but it doesn’t look like it. We are close to buying one of his works.

Tom Woestenborghs Belgian. #boobies

A work by an unidentified artist, but emblematic of a lot of other works featuring weaving.

Pim Palsgraaf

Diana Roig

Couleurs II (9luik), 2018, schuursponsjes, 8,5 x 80 x 3 cm, D.D. Trans

The Van Nelle Fabriek is a great place: my photo.

Paola Ciarska


A Crate-Digger's Dream

Last week I was on the road with my wife to the south of Netherlands and Belgian Limburg, and along the way we decided to stop at a thrift store in Zaltbommel that was just of the highway.

Cat Ranja checking out the stack of records bought in thrift stores during our trip to the south of Netherlands and Belgian Limburg.

In that store I encountered a crate digger’s dream: an untouched complete collection of records owned by someone with great taste, dumped in the €0.50-a-record crates of a second hand store. The collection could be recognized by small stickers with a catalog number written on it and contained mainly 60’s-70’s Blues/Classic/Country/Folk Rock, but also some Psychedelic and Prog Rock, some Ambient and even New Wave: Buffalo Springfield, Crosby, Stills & Nash (& Young), The Doobie Brothers, The Doors, Emerson, Lake & Palmer, Emmylou Harris, Jackson Browne, Janis Joplin, Jon And Vangelis, Klaus Schulze, The Mama’s & The Papa’s, Mike Oldfield, Neil Young, Patti Smith, Pink Floyd, Steely Dan, Stephen Stills, and Steve Harley And Cockney Rebel.

All of the records I bought at De Spullewaard. Seven records are not from the collection with the small stickers, like Al Martino, Eartha Kitt, Simple Minds and the two records from Brazil.

The funny thing was that a regular customer of the store, who was going through the stacks of b-movie DVD’s, asked me somewhat derogatorily whether there was anything in those crates that he had long ago stopped looking at because they only contained “James Last & friends records”. I told him there was, and when he saw me picking up record by record he started paying attention. When he saw me putting a Crosby, Stills And Nash record on my stack he could not keep himself from saying that he was looking for that record for a long time.

In the end I walked away with 35 records for € 20 (10 for € 5, and € 1 a piece)! For karma I gave the CSN record to the poor guy…

I’ve just finished adding the Zaltbommel records to my collection on Discogs (the world’s “biggest and most comprehensive music database and marketplace”), and it has calculated the value of the 35 records for me, based on the last 10 records sold (with the same grading):

  • min. price: €147.95
  • median price: €241.74
  • max price: €402.87

So based on the median price I should have paid more than 12 times the amount I had to pay. That’s a pretty good bargain!

Search for occurrences of Azure Service Management PowerShell cmdlets using a regular expression

I got an e-mail from Microsoft Azure today warning me of the imminent retirement of the Service Management REST APIs for Azure Automation. It will be no longer supported on April 30, 2019:

Required action

Migrate any Service Management REST APIs and PowerShell cmdlets for Azure Automation to Resource Manager REST APIs or the latest PowerShell cmdlets by April 30, 2019, to take advantage of advanced capabilities and avoid any service disruptions.

More information

If you’re unsure whether you’re using Service Management REST APIs, check the URI referenced in your code or service. If it’s, you’re using Service Management REST APIs and you should migrate to Resource Manager REST APIs.

If you’re unsure whether you’re using Service Management PowerShell cmdlets, check whether the cmdlet name includes AzureRM (for example, Get-AzureRmAutomationAccount) or Az (for example, Get-AzAutomationAccount). If it doesn’t include AzureRM or Az (for example, Get-AzureAutomationAccount), you should migrate to Resource Manager PowerShell cmdlets.

Searching for ‘Get-Azure’ not followed by ‘Rm’ using a regular expression

I checked our collection of Powershell scripts used in our Build & Release pipeline for this with the following regular expression:


This returns all occurrences of Get-Azure not followed by Rm.

(?!) is a ‘negative lookahead’.

I wrote my regex in Rad Software Regular Expression Designer (which has a website that no longer works but can still be downloaded - read a review of it on a blog post):

Searching for this regular expression in Visual Studio only returned multiple occurrences of Get-AzureDeployment, like this:

$productionSlot = Get-AzureDeployment -ServiceName $serviceName -Slot Production