Mark Everard

Hello, I'm Mark – a PhD physicist turned technologist / architect.

Archive for October, 2015

Chief2moro.ImageDataExtensions now available for EPiServer 9

without comments

Another short, sharp blog post to note that a version of the CHIEF2MORO.ImageDataExtensions package which is compatible with EPiServer 9 is now available in the EPiServer Nuget Feed. Fellow EMVP Marija Jemuovic did all the hard work, and I got the easy part in blogging about it.

There not much more to say, so here is a space filler…..

7d25cb66b18e1a6fbada9f630e84e2db

 

 

Written by mark

October 27th, 2015 at 9:00 am

Posted in ASP.NET,C#,EPiServer

Enhanced RSS / ATOM Feeds for EPiServer

without comments

I’ve released a new version of CHIEF2MORO.SyndicationFeeds. Along with upgrading to EPiServer 9, I’ve also taken the opportunity to add a few additional features based on some feedback and my own real usage.

Advanced Filtering

The library now contains the IFeedContentFilterer interface which provides an extension for any custom filtering you may want to achieve (for example – removing items with empty description’s). The default implementation filters via the EPiServer FilterForVisitor filters (Published status, Access rights, Has a template), though ignores the HasTemplate rule for blocks, so they can still be exposed. It also filters on EPiServer categories and ContentType, both of which are selectable by an editor on an instance of the Feed PageType.

Changing each Item’s summary in the feed.

You can now provide your own implementation of IFeedDescriptionProvider which is an interface that describes how a content item’s feed summary / description is derived. This allows you to provide your own implementation of where the items summary is stored. This may for example be from a common page property across all content types, or may be specific to each content type. By default, each item has a summary like ‘An src link to content with id = {content.ContentLink.ID} and name = {content.Name}’. The IFeedDescriptionProvider extension replaces the previous SetItemDescription delegate way of overriding the summary / description. The delegate is still available to maintain backwards compatibility but is marked as obsolete.

It’s on Nuget

The source code is available at https://github.com/markeverard/Chief2moro.SyndicationFeeds. I am happy to receive feedback and pull requests though I need to make a formal and public apology to Thomas Svensen who did indeed send me a pull request, which I ignored like an extremely bad open source steward….. Sorry :(

A package (currently v2.0.0.0) is available in the EPiServer Nuget Feed – http://nuget.episerver.com/ – search for CHIEF2MORO.SyndicationFeeds

 

 

Written by mark

October 26th, 2015 at 9:00 am

Posted in ASP.NET,C#,EPiServer

Adding GA tracking to Emails delivered using Adobe Campaign

with one comment

Adobe Campaign contains a formula that is executed in the delivery preparation phase which parses a delivery template and modifies all links, so that they are passed through a tracking server. This allows links to be individually tracked to a both an email recipient and a specific delivery.

Example
A link to the BBC news site, http://www.bbc.co.uk/news is changed to https://t.adobe-campaign.server/r/?id=hcc970,436a07,436a08. The latter url eventually resolves to BBC news, but first is passed through the tracking server, that issues a redirect and records that the link has been followed.

Google Analytics Tracking

Google Analytics can track inbound links to a site and attribute them to a source and an associated campaign. It does this in a number of ways, either via cookies, or for cross-domain links by checking querystring parameters. The following parameters are recognised

  • utm_content
  • utm_source
  • utm_medium

See the following link for further information about each parameter and the ‘meaning’ – https://support.google.com/analytics/answer/1033867?hl=en

Modifying the Click Tracking Formula

The click tracking formula in Adobe Campaign can be modified to include additional query string parameters within the forwarding record. This is achieved by modifying the NmsTracking_ClickFormula contained in Administration > Platform > Options

Warning
You should very carefully test the click tracking formula after making any modifications. Be very sure that the record you enter doesn’t include any spurious white space or line-breaks. Adobe Campaign is very ‘fussy’ about character encoding! As an example, when I first modified the below we discovered that modified outbound links were rendering incorrectly in Hotmail / Outlook.com email clients.

Links within the rendered email body had a line break before and after the URL which Hotmail interpreted as a link without a protocol and so added an additional protocol to the start of the url, so our links looked like https://https://t.adobe-campaign.server/r/?id=hcc970,436a07,436a08 . I’m sure this type of functionality is intentional from Hotmail / Outlook so they can turn www.bbc.co.uk entries in text into a fully-formed hyperlink. Regardless, it does show the complexity and why its vital to test your deliveries in a tool like Litmus – test email rendering.

Be very careful about cutting and pasting this as I’ve deliberately added line-breaks and white space to make it readable!

<% if( typeof strPurlTrackingServer!="undefined" && strPurlTrackingServer.toString() ) { %>
<%= strPurlTrackingServer %>
<% } else { %>

<%@ include option='NmsTracking_ServerUrl' %><% } %>/r/?id=<%= type.substr(0, 1) + (message.id<0 ? (message.id+4294967296) : message.id).toString(16).toLowerCase() %>,
<%@ value object="delivery" xpath="@idTracking" %>,<%= escapeUrl("$(urlId)") %>&utm_campaign=<%= variables.utm_content%>&utm_medium=email&utm_source=adobe_campaign
<%
if (document.mode == "forward")
{
 var d = message.getParameter("d")
 if( d )
 d = d.split(",")
%>
&ap_visitorId=<%=message.getParameter("visitorId") != '' ? message.getParameter("visitorId"):0 %>&ap_category=<%= d[0]?d[0]:'' %>&ap_deliveryId=<%=d[1]?parseInt(d[1],16):0%><%
} %>
<%
if( typeof proposition != "undefined" && proposition.length == undefined )
{ %>&ap_oid=<%= proposition.offer.id %>
<% } %>

The utm_medium and utm_source variables are hardcoded to be ’email’ and ‘adobecampaign’. These parameters are used by marketing analysts to understand the channel and source system that a visit can be attributed to.

Adding a variable to a delivery template

The above tracking formula depends on the delivery template having a variable named utm_content added into its context. If a template does not have this variable defined then the delivery will fail at the html compilation stage, and that’s always a pain to debug!

A good practise is to have the variable’s value taken from the internal delivery Id. This means your Google Analytics will be able to easily identify inbound links coming from specific emails sent from Adobe Campaign. It’s straightforward to set this within the delivery template as shown below.

 

add-delivery-template

Written by mark

October 8th, 2015 at 10:00 am

The real cost of owning a development team

without comments

This post was first published on LinkedIn Pulse on 18th September 2015 –The real cost of owning a development team


 

Development teams are expensive. There, I said it. If you want a high-performing development team then be prepared to invest.

I’m not just talking about salaries. You’ll also need to equip your team with high-quality hardware and the expensive software tools they need to deliver the solutions you want.

This isn’t news to many organisations. It’s actually not hard to get those bits right, and there are great benefits from having those skills on-tap in-house.

Just putting a bunch of developers in a room, shouting "Go!" and occasionally rewarding with pizza will rarely get you the high-quality solutions you desire.

 

It’s about the people

What many places struggle to get right is the investment needed in the core of a development team. The people.

Development teams require leadership, mentoring, structured career paths and personal development plans. Just putting a bunch of developers in a room, shouting “Go!” and occasionally rewarding with pizza will rarely get you the high-quality solutions you desire.

Other creative disciplines beyond development perhaps have this slightly easier, as it’s seen as ‘obvious’ that those teams need the room to think and learn.

Take for example a creative design team. They have to work to understand and consume the latest design trends, so they can stay current and produce great work. In my experience this learning need is rarely questioned, perhaps because the design output from those teams is more tangible than the abstract “code” output from a development team. Regardless, the underlying learning need for each team is identical and should be addressed.

Time and direction

The real key to growing your development team is time. This investment allows the team to step back from their primary output and dive into the new technologies and ways of working that could speed up delivery or increase the quality of the technology output. Both valuable outcomes.

Time alone though isn’t enough. You also need leadership and structure. That could be achieved by having a team with a broad mixture of experience, or via a more dedicated architect / lead role helping to bridge the gap between requirements and solutions, helping drive a coherent technology vision.

Again, to those of you working in the industry the above may not seem like rocket science; and really it shouldn’t be. However there are still too many places where there is a attitude of throwing more developers at a problem to get to a solution.

It doesn’t have to be expensive

There are many ideas and ways to give your technology teams the opportunity to learn and improve. Many of them are not as expensive as you might imagine.

  1. On the job training – code / peer reviews are an ideal opportunity to not only increase the quality of the solution but also to share knowledge and build team resilience.
  2. Coding katas – give the team the ability to constantly hone and sharpen their skills by setting aside time for them to regularly practise small development tasks. There are great examples online.
  3. Open source – encourage the team to contribute to an open source project. Here they will learn how to apply their skills in a different environment and learn from fellow contributors. This is even more valuable if your organisation uses open source software. What great karma; to be giving as well as receiving.
  4. Meetups – there are a growing number of outside events encouraging like-minded people to meet up and discuss common skills, techniques and frameworks. Why not encourage your team to participate? Better yet, get them to disseminate what they’ve learnt internally to the rest of the team.
  5. Certification and training – if you have some training budget then paid-for courses not only demonstrate the organisation’s commitment to growing individual skills but are beneficial to your delivery too. Online training courses are relatively cheap and offer a wide variety of subjects.

There’s value to getting it right

Development teams have a very specialised need for learning and growth. Owning a team comes with a heavy responsibility to get this right.

After all, I’m guessing mediocre isn’t your ambition and you want your development team to produce high-quality bug free software? In which case, isn’t it only reasonable to support them and make sure they have everything they need to succeed?

Written by mark

October 7th, 2015 at 10:00 am