Disclaimer: the author does not condone piracy but this may be used as a temporary measure
As readers of my work-sided blog posts will be aware, I’ve had some recent problems with spectrometers and their control PCs. As a result I’ve been swapping computers and network cards right, left and centre to try and get things working. As a temporary measure and so as to avoid contacting Bruker every 20 minutes for a new Xepr license file for the latest network card I’m trying I’ve written a little script to get around the Xepr license check.
Basically when Xepr is started, there is a small pop-up window which quickly appears but displays the Xepr version number. At this time Xepr is checking for a valid license file, if the license file is not valid/nonexistent then the program quits.
The validity is a simple check of the MAC address of the eth0 port (which you can view as a super user with ifconfig).
Now I am not condoning piracy in any way, and Bruker are usually very good at giving out new license files if you justify yourself. To reiterate this is a short-term measure to stop annoying Bruker.
Create a new file in your favourite text editor, and copy and paste the following:
#!/bin/sh
## Xepr2 -- Morgan's xepr startup script## This script changes the network port eth0 to the MAC address# required for Xepr to start. Waits 2 seconds and then changes# the MAC address back.## This script currently requires a license file to be installed# and for it to be in date. The script could be editted for# finding the license file expiry date and changing the system# clock accordingly but this risks other programs and requires# a lot more coding. Just ask Bruker for a valid one.## This script should be run as a normal user but can be called# as a super user. If it is called as a normal user then the# script will ask for an administrator password as it needs# super user privileges to access ifconfig and change the# hardware address## M. Bye v12.8## Author: Morgan Bye# Work address: Henry Wellcome Unit for Biological EPR# University of East Anglia# NORWICH, UK# Email: morgan.bye@uea.ac.uk# Website: http://www.morganbye.net/EPRtoolbox# Aug 2012; Last revision: 17-August-2012# === CHANGE THESE VARIABLES ===# MAC address for the license file, ie what your computer is notMAC="XX:XX:XX:XX:XX:XX"# Path to license file (for checks on expiration date)LICENSE="/usr/Bruker/flexlm/licenses/license.dat"# === DO NOT CHANGE PAST THIS POINT ===# Get userUSER=$(whoami)# Get license expiry date# EXP=$(cat /usr/Bruker/flexlm/licenses/license.dat ....)# Get current MAC address and save it as a variableOLD=$(sudo -i ifconfig eth0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}')# Change machine MAC address# ==========================sudo -i ifconfig eth0 down
sudo -i ifconfig eth0 hw ether $MACsudo -i ifconfig eth0 up
NEW=$(sudo -i ifconfig eth0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}')# Call Xepr - taken from standard Xepr file# =========================================Xepr &# Wait to allow Xepr's license checksleep 2# Change machine MAC address back# ===============================sudo -i ifconfig eth0 down
sudo -i ifconfig eth0 hw ether $OLDsudo -i ifconfig eth0 up
This assumes that Xepr has been aliased into the shell correctly. Change the MAC address in the variable section to your license file MAC address (it should be at the end of the XEPR line). Save the file, I personally called it Xepr2.
Close the file, it can now be called with
1
./Xepr2
It will ask for the administrator password. Xepr should start with no problems and the terminal will be returned to the user and can be closed if wanted.
As normal you can alias this if you like, so that you can call Xepr2 from anywhere (including desktop launchers)
# Troubleshooting
If Xepr gives you error messages then check the MAC address entered in the variable section matches that in the license file. If you’re on an older PC then try adjusting the sleep time. By default I’ve used 2 seconds (as my network pings the PC every 5 seconds and I dont want the dynDNS server changing getting confused and trying to report the port), but on older PCs 2 seconds may not be enough for Xepr to start, so try changing it to 10.
This morning on the way to work I got down to the road, plugged in my earphones to my phone and hit play on Spotify. Only for some horrible, tinny, quiet music to come out. It seemed that the phone just simply would not recognise that anything had …
Recently in the lab we’ve had some problems thanks to a helpful software update rendering it impossible to connect to a spectrometer. This troubleshooting provides a record of my steps to diagnosing the problem. Hopefully shortening the process …
LEADERSHIP, SCALE, AND THE HUMAN ELEMENT
Principles & Perspectives
How do you define successful engineering leadership?
The Philosophy
Many view technical leadership as being the “smartest architect in the room.” I see it as the opposite. My job is to build a room where I don’t have to be the smartest person because the systems, culture, and communication are so robust that the team can out-innovate me.
The Strategy
Alignment: Does every engineer understand how their sprint task impacts the company’s bottom line?
Velocity vs. Stability: We aren’t just “shipping fast”; we are building a predictable, repeatable engine that doesn’t collapse under its own weight at the next order of magnitude.
The Human Growth Curve: Success is when the engineering team’s capability evolves faster than the product’s complexity. If the team feels stagnant, the tech stack will soon follow.
What is your approach to scaling technical organizations?
The Philosophy
Scaling isn’t just “hiring more people” - that’s often how you slow down. Scaling is about moving from Individual Heroics to Organizational Systems.
The Strategy
The 3-Continent Perspective: Having managed global teams, I focus on “High-Signal Communication.” As you grow, the cost of a meeting triples. I implement “Asynchronous-First” cultures that protect deep-work time while ensuring no one is blocked by a timezone.
Modular Autonomy: I advocate for breaking down monolithic teams into autonomous units with clear ownership. This reduces the “communication tax” and allows us to scale the headcount without scaling the bureaucracy.
Automation as Infrastructure: At petabyte scale, manual intervention is a failure. I treat the developer experience (CI/CD, observability, self-service infra) as a first-class product to keep the “path to production” frictionless.
How do you balance high-growth velocity with technical stability?
The Philosophy
Technical debt isn’t a “bad thing” to be avoided; it’s a set of historical decisions that no longer serve you. Like any loan, leverage can accelerate growth when investments payoff. But if velocity and returns are slowing you need a payment plan before the interest kills you.
The Strategy
The ROI Filter: I don’t refactor for the sake of “clean code.” I don’t refactor a micro-service with no users. I refactor when the pain on that debt - measured in bugs, downtime, or developer frustration - starts to exceed the cost of the fix.
Zero-Downtime Culture: Especially at scale, stability is a feature. I implement “Guardrail Engineering” where the system is designed to fail gracefully, ensuring that a Series B growth spike becomes a success story rather than a post-mortem.
The 70/20/10 Rule: I typically aim to dedicate 70% of resources to new features, 20% to infrastructure/debt, and 10% to R&D. This ensures we never stop innovating, but we never stop fortifying either.