Co-creating your agency’s project definition & client onboarding toolkit

• Delivery-approach shaping tools
• Risk review & rebalancing process

As an accomplished Agile coach, agency business owner, strategist and developer, I have spent over two decades at the intersection of technology, business, humans, and creative problem-solving. My journey began in the trenches of software development, where I honed my technical skills and developed a passion for building elegant, user-centric solutions. This technical foundation has been crucial in understanding the complexities of product development and delivery.

In founding and leading a digital agency, I navigated the challenges of scaling a service-oriented business, mastering the art of client relations delivering high-quality digital products and transitioning projects to value focused support agreements. This experience taught me the nuances of managing client expectations and the importance of transparent, effective communication in building long-lasting partnerships.

As an agile coach, I’ve guided teams and organisations in adopting agile methodologies, focusing on continuous improvement, flexibility, and delivering value quickly. My approach emphasises collaboration, adaptability, and empowering teams to make decisions that lead to better project outcomes.

In my role as a strategist, I focused on business processes and technological innovation. I help client-facing agencies refine their sales approaches and product delivery methods, ensuring they align with market needs and client expectations. My strategy work is informed by hands-on experience in software development, commercial approaches and product delivery in client-facing agencies.

With a client-centric mindset, I support agencies in crafting compelling value propositions, streamlining operations, and fostering a culture of excellence and innovation. My goal is to help agencies not just survive but thrive in the ever-evolving digital landscape by becoming more resilient, agile, and client-focused.

Get in touch

.htaccess redirects based on date and time

A useful trick for implementing maintenance windows and redirects without having to use a php or similar script is to check date and time in .htaccess files or use it to build a redirect url.

Date and time values in .htaccess come in the form %{TIME_XXXX} where XXXX is the type of date or time you want.

So if you want to redirect a generic url to one which contains today’s date, you might use:

RewriteRule ^posts/today$ /posts/%{TIME_YEAR}-%{TIME_MON}-%{TIME_DAY}

That would result in /posts/today being redirected to something like /posts/2015-08-27

If you wanted redirect a page after a date (and time) is passed you could use something like the following, where if the date and time is passed 9am on 27th August 2015 the redirect will happen. We use a simple number comparison of turning the date into an integer and then comparing it.

RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY}%{TIME_HOUR} >2015082709
RewriteRule ^$ /destination/url.html [R=301,L]

The following would only redirect until a specific time (10.22am on 27th August 2015)

RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY}%{TIME_HOUR}%{TIME_MIN} <201508271022
RewriteRule ^$ /destination/url.html [R=301,L]

The following would only redirect between two specific dates (20th July 2015 and 27th August 2015)

RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY} <20150828
RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY} >20150719
RewriteRule ^$ /destination/url.html [R=301,L]

The options you have for %{TIME_XXXX} values are:

TIME_YEAR // current four-digit year
TIME_MON // current month
TIME_DAY // current day of month
TIME_HOUR // current hour (24 hour clock) of day
TIME_MIN // current minute of hour
TIME_SEC // current second of minute
TIME_WDAY // current week-day
TIME // a formatted string representing the date and time down to seconds. e.g. 20150827112234

MySQL roughly random string generation for inserting or updating rows

Ever wanted to inject hashes into new or existing rows of a MySQL database?

Two slightly different methods, but the same result…

Insert

The code below allows you to generate a different hash for each row you’re inserting. You can tweak to choose the string’s length. No unique checks are done.

INSERT INTO table_name (
column_name
) VALUES (
    (SUBSTRING(MD5(RAND()) FROM 1 FOR 20))
)

Update columns and values to suit your needs

Update

The code below allows you to generate a different string for each row affected by the update and choose the random string’s length from 1 to 32 character.

I’m aware it’s not the most random of generators but for url hashes etc, it works well. Be sure to then check for duplicates, which are possible!

Change 20 to a length between 1 and 32 that suits your needs.

Update the WHERE condition to suit your needs

UPDATE table_name
SET column_name = (
    SELECT substring(MD5(RAND()), -20)
)
WHERE condition_column = 1;