Skip to content
Ed Freeman - Software Engineer I

Ed is the 4th person to have graduated from our award winning Apprenticeship scheme.

Meet Ed

Ed is a Software Engineer helping to deliver projects for clients of all shapes and sizes, providing best of breed technology solutions to industry specific challenges. He focusses primarily on cloud technologies, data analytics and business intelligence, though his Mathematical background has also led to a distinct interest in Data Science, Artificial Intelligence, and other related fields.

He also curates a weekly newsletter, Power BI Weekly, where you can receive all the latest Power BI news, for free.

Ed won the Cloud Apprentice of the Year at the Computing Rising Star Awards 2019.

Sharing access to synchronized Shared Metadata Model objects in Azure Synapse Analytics

Sharing access to synchronized Shared Metadata Model objects in Azure Synapse Analytics

Ed Freeman

The "Shared Metadata Model" is a powerful feature within Synapse Analytics that synchronizes Spark database objects with SQL Serverless. This article describes how to give non-admin users access to these synchronized objects in a least-privileged manner.
What is the Shared Metadata Model in Azure Synapse Analytics, and why should I use it?

What is the Shared Metadata Model in Azure Synapse Analytics, and why should I use it?

Ed Freeman

A lesser known feature of Azure Synapse is the "Shared Metadata Model". Synapse has the capability to automatically synchronize tables created via Synapse Spark with objects you can query via the usual SQL Serverless endpoint, without any additional configuration. This article brings attention to this capability, highlighting the benefits and tradeoffs vs rolling your own SQL Serverless VIEWs.
How to safely reference a nullable activity output in Azure Synapse Pipelines and Azure Data Factory

How to safely reference a nullable activity output in Azure Synapse Pipelines and Azure Data Factory

Ed Freeman

Did you know that there's a null-safe operator in Azure Data Factory's expression syntax? No? Well, now you do. Here's how you can safely reference an activity output that might not always exist.
How to update credentials for an on-prem Power BI data source using PowerShell

How to update credentials for an on-prem Power BI data source using PowerShell

Ed Freeman

Automating the updating of Power BI data source credentials is a common requirement in the application lifecycle management of a Power BI solution. However, on-premises data sources throw an extra spanner in the works: you must encrypt your credentials using the RSA-OAEP encryption algorithm before sending off the request to update the data source. There is currently no PowerShell module that encapsulates this logic into a set of handy cmdlets, so you must either implement the algorithm's logic yourself, or you can use the helper classes in the existing .NET SDK to do all the heavy lifting for you. This blog shows how to do the latter.
How to consume a NuGet package in PowerShell

How to consume a NuGet package in PowerShell

Ed Freeman

Sometimes the logic for the bit of work you're doing in PowerShell won't be packaged into a handy PowerShell module with cmdlets to perform the operations you need to perform. But what if there is a .NET package listed on NuGet that does contain the assemblies you need for your work? How can we import that into PowerShell and make use of its classes and methods? This blog explains how to do just that, avoiding current pitfalls in PowerShell's implementation of the NuGet package provider.
How to fix the "You need permission to access workspace..." error in Azure Synapse Analytics

How to fix the "You need permission to access workspace..." error in Azure Synapse Analytics

Ed Freeman

Data Engineers/Developers want to get access to Azure Synapse Analytics as quickly as possible to start designing and creating their data solutions. Being denied access to Synapse Studio can be frustrating and slows matters down. This article will address the "You need permission to access workspace..." error, discuss what causes it, and describe how to fix it.
How to use the Azure CLI to manage access to Synapse Studio

How to use the Azure CLI to manage access to Synapse Studio

Ed Freeman

Azure Synapse Analytics developers need to be assigned a role within Synapse Studio in order to access the GUI. The Azure CLI provides one way of programmatically achieving this, which can be done by any Owner or Contributor of the Azure Synapse Analytics resource.
Deploy an Azure Synapse Analytics workspace using an ARM Template

Deploy an Azure Synapse Analytics workspace using an ARM Template

Ed Freeman

Azure Synapse Analytics is Microsoft's new unified cloud analytics platform, which will surely be playing a big part in many organizations' technology stacks in the near future. For many organizations, Azure Resource Manager (ARM) templates are the infrastructure deployment method of choice. This blog explains how to deploy an Azure Synapse Analytics workspace using an ARM template.
Using Azure Key Vault for Encryption in C# - A Simple Tutorial

Using Azure Key Vault for Encryption in C# - A Simple Tutorial

Ed Freeman

Do you need to encrypt a piece of data in your application? Do you want Azure Key Vault to secure the key? Well, using C# along with a couple of libraries from the Azure SDK, it couldn't be easier to get up and running. This blog explains how to do just that.
How to dynamically choose the correct font colour based on a background colour in Power BI tables.

How to dynamically choose the correct font colour based on a background colour in Power BI tables.

Ed Freeman

Making your Power BI reports accessible is crucial, and one important aspect is legibility. If you're using background colours to represent certain categories, then you need any text that's used in conjunction with that background to be as clear as possible. This blog demonstrates how to dynamically select the best font colour to overlay on any chosen background colour.
Power BI Embedded: Convention-based dynamic Row-level Security

Power BI Embedded: Convention-based dynamic Row-level Security

Ed Freeman

Power BI Embedded is a great tool for ISVs offering a BI product for their customers. Generally, the reports exposed to the customers are personalized to some extent - one can use the Power BI JavaScript library to interact with the reports and tweak the visuals based on the logged-in user. Another way reports differ from user to user is the underlying data that user is allowed to see. This is controlled using Row-level Security. A standard method to implement Row-level security is to pass the user's email address to the data model, and have rules filter the data model appropriately based on the data that user is permitted to see. However, sometimes it can be useful to filter the data model based on more than just a user's email address. This blog indicates how to modify an Embed Request (made by Power BI Embedded) to provide additional context on what data the embedding application would like to be returned for a user to view on a report.
Power BI Dataflow refresh polling

Power BI Dataflow refresh polling

Ed Freeman

If you're a frequent user of the Power BI REST API and Power BI Dataflows, you may have come across the problem that there's seemingly no programmatic way to get the refresh history of a Dataflow. The ability to know the status of a refresh operation is useful when you're performing automated operations, and you need to know that something has succeeded or failed before deciding what to do next. For example, a desired feature in the Power BI Service is to be able to refresh a dataflow, and automatically refresh a dataset that depends on that dataflow. Without a refresh history endpoint, this is made more complicated than necessary. This blog outlines a way to programmtically retrieve a Dataflow's refresh history in order to poll a refresh operation's status, useful for any fully automated scenario.
Power BI Data Type Mappings

Power BI Data Type Mappings

Ed Freeman

If you've worked with Power BI at all, you'll have probably realised that there are numerous mediums through which you work with (potentially the "same") data. Data types across these mediums can be called different things, but actually refer to the same thing. They can also (unsurprisingly) be called different things and actually mean different things. It's useful to know what the corresponding data types are across these mediums, as you may need to, for example, convert queries from one format to another. This blog and containing report intend to clarify what the corresponding data types are across each of the separate mediums within Power BI.
NDC London 2020 - My highlights

NDC London 2020 - My highlights

Ed Freeman

Ed attended NDC London 2020, along with many of his endjin colleagues. In this post he summarises and reflects upon his favourite sessions of the conference including; "OWASP Top Ten proactive controls" by Jim Manico, "There's an Impostor in this room!" by Angharad Edwards, "How to code music?" by Laura Silvanavičiūtė, "ML and the IoT: Living on the Edge" by Brandon Satrom, "Common API Security Pitfalls" by Philippe De Ryck, and "Combatting illegal fishing with Machine Learning and Azure - for less than £10 / month" by Jess Panni & Carmel Eve.
Troubleshooting "NotImplemented / Access is denied" error when integrating Azure App Service with Azure Virtual Network (VNet)

Troubleshooting "NotImplemented / Access is denied" error when integrating Azure App Service with Azure Virtual Network (VNet)

Ed Freeman

Are you configuring your Azure App Service to use a VNet? The regional VNet integration for an Azure App Service is a preview feature, and so comes with some quirks. One of the documented limitations of this preview feature is that "The feature is only available from newer App Service scale units that support PremiumV2 App Service plans." This has interesting implications as to how you need to deploy your App Service, otherwise you could end up with a rather perplexing pattern of errors. Read about how we came about this error, and how we ended up fixing it.
Import and export notebooks in Databricks

Import and export notebooks in Databricks

Ed Freeman

Sometimes it's necessary to import and export notebooks from a Databricks workspace. This might be because you have some generic notebooks that can be useful across numerous workspaces, or it could be that you're having to delete your current workspace for some reason and therefore need to transfer content over to a new workspace. Importing and exporting can be doing either manually or programmatically. In this blog, we outline a way to recursively export/import a directory and its files from/to a Databricks workspace.
Azure Databricks CLI "Error: JSONDecodeError: Expecting property name enclosed in double quotes:..."

Azure Databricks CLI "Error: JSONDecodeError: Expecting property name enclosed in double quotes:..."

Ed Freeman

Quite often it's beneficial to work with pre-built CLIs/SDKs to interact with your favourite tools, instead of making requests to the underlying REST API. Much of the complexity around constructing requests has been abstracted, and authentication is often easier. The Databricks CLI makes it easier to interact with your Databricks instance, but sometimes you can run into strange errors when constructing the values passed in as arguments. In this blog, we take a look at a JsonDecodeError that can occur when speaking to the Clusters CLI, and look at a way we can avoid this error.
The Power BI Weekly newsletter has published its fifth edition!

The Power BI Weekly newsletter has published its fifth edition!

Ed Freeman

Subscribe to Power BI Weekly, our new free weekly newsletter for all things Power BI!
Explicit interface implementation

Explicit interface implementation

Ed Freeman

Two of the main use-cases for explicit interface implementation are: 1. to hide members of the interface in a class which inherits from that interface, and 2. to work around the scenario when a class is inheriting from two interfaces which share a member of the same name. Take a look at this blog to go into more depth about each of those scenarios.
Using Step Argument Tranformations in SpecFlow to pass null values into scenarios

Using Step Argument Tranformations in SpecFlow to pass null values into scenarios

Ed Freeman

A good test suite should validate behaviour across your code base, testing as many edge cases as reasonably possible. A common "edge case", is passing a null value when a value isn't expected to be null. In Specflow, all values used in scenario examples are treated as strings, so it isn't possible (by default) to pass in a null value. However, using "Step Argument Transformations", we can achieve the desired behaviour. Read this blog to learn how this can be implemented.
Branches, builds and modern data pipelines. Let's catch-up!

Branches, builds and modern data pipelines. Let's catch-up!

Ed Freeman

As an apprentice engineer at endjin, you cover a lot of ground, especially at a consultancy which works with the latest and greatest tools to solve its clients' problems. Learn about endjin's Modern Data Platform, which is a culmination of IP, processes and knowledge built from years of implementing high-performance data-driven solutions. Also learn about the types of tools an apprentice gets to use, and the types of things an apprentice learns along the way.
Using CALENDAR vs CALENDARAUTO to generate 'Date' table for year-on-year comparisons

Using CALENDAR vs CALENDARAUTO to generate 'Date' table for year-on-year comparisons

Ed Freeman

Are you performing time-intelligence calculations in your Power BI report? Are you using either the CALENDAR or CALENDARAUTO DAX function to create your date table? Care needs to be taken when choosing the generation method for your date table when performing time-based comparisons. This is where it becomes important to understand the implications of generating a date table using the CALENDAR function and CALENDARAUTO function in Power BI. This blog will outline the considerations you need to make whilst designing the measures in your report.
Using Python inside SQL Server

Using Python inside SQL Server

Ed Freeman

Do you have a bunch of data in SQL Server that you're using ODBC/JDBC to pull data to work with in Python? Using SQL Server's Python integration, you can connect to a SQL Server instance within your preferred IDE and perform the computations on the SQL Server Machine. No more clunky data transferring. Operationalizing a Python model/script is as easy as calling a stored procedure. Any application that can speak to SQL Server can invoke the Python code and retrieve the results. Easy! This blog will provide a few, simple examples which make use of this capability to carry out some simple Python commands, so you can get up and running as quickly as possible.
Snap Back to Reality – Month 2 & 3 of my Apprenticeship

Snap Back to Reality – Month 2 & 3 of my Apprenticeship

Ed Freeman

Learn what types of things an apprentice gets up to at endjin a few months after joining. You could be learning about Neural Networks: algorithms which mimic the way biological systems process information. You could be attending Microsoft's Future Decoded conference, learning about Bots, CosmosDB, IoT and much more. Hopefully, you wouldn't be in hospital after a ruptured appendix!
My first month as an apprentice at endjin

My first month as an apprentice at endjin

Ed Freeman

Structured apprenticeships provide a great way to build skills whilst getting real-life experience. Endjin's apprenticeship scheme has been refined over years, with an optimal mixture of training, project work, and exposure to commercial processes - a scheme which is designed to build strong foundations for a well-rounded Software Engineering consultant. This post explains the transition from university to an apprenticeship at endjin, including the types of work an apprentice could end up doing, and some examples of real-life learnings from a real-life apprentice.
Welcome to an internship at endjin!

Welcome to an internship at endjin!

Ed Freeman

A career in software engineering doesn't need to start with a Computer Science degree. The underlying traits of problem solving, a willingness to learn and the ability to collaborate well can be built in any field. Internships provide a great way to get your foot-in-the-door in the professional world, and arm you with some real-life experience for future endeavours. This post describes an internship at endjin, including the type of work you could be asked to do and what you could learn.