Web analytics tools are used to understand the behaviour of website visitors, and A/B testing is a technique that uses such tools to optimise a site. The tools facilitate this by giving you a means to measure and analyse site traffic and conversion.
Adobe Target is a real-time metrics-collection and reporting tool that is one of the most widely-used client-side analytics platforms available. In this blog, I'm going to talk about how to create an A/B test using Adobe Target and AngularJS, where the 'B' version is swapped-in using Angular decorators.
WHAT A WEEKEND! I’m still recovering from the 24 hours of coding and the unhealthy amount of coffee and snacks I’ve ingested during this hackathon.
Two weeks ago, Melbourne was host to the first Battlehack of 2015. “What’s a Battlehack?” I hear you ask. Well Battlehacks are competitions sponsored by Braintree (a Paypal company) where teams of developers face off over 24 hours to create the most creative hack that benefits the local or global community. The venue, which was the Plaza Ballroom on Collins St was well worth a mention. The vast ballroom was decked out with food stations, sleep and massage stations, and most importantly, our hacking stations, or tables of 4 for the long night ahead.
I recently did some preliminary work adding accessibility support to an existing Angular application. At the start of this work I knew very little about website accessibility, and I suspect the evolution of my thinking during the process would be common amongst other developers who have been in the same situation. Specifically:
In my previous post on getter methods and Angular.js I showed how complex calculations can be hidden behind simple Javascript properties. One downside to this technique is that we can start to get a little blasé about when calculations are actually being executed. This can in-turn lead to performance issues.
In this post I'm going to talk about expensive calculations in rich object models - be they hidden behind getter methods or just regular methods - and how we can use memoization to reduce the impact that these calculations have on performance. Memoization isn't something that you should use all the time, but for use-cases involving long chains of calculations it can be an effective optimization technique, especially within a framework like Angular.
If you don't feel like reading, you can always jump to the part of my ng-conf presentation that covers memoization, or go straight to the Github project. Either way, I'm assuming that you're familiar with the foundational concepts I introduced in the first post in this series.
Sadly not all getters can be giant robots[/caption]
In my earlier posts on Rich Object Models and Angular.js and Angular Identity Maps I've shown how, by introducing a rich object model to your Angular.js application, you can begin to employ more sophisticated techniques for modelling your business domain.
In this post I'm going to demonstrate how we can simplify business logic by using getter methods to hide complex calculations behind properties. Furthermore, we'll do it in a way that slots in nicely with our existing rich-object model. If you don't feel like reading, you can check out the section of my ng-conf presentation that covers this or go straight to the Github project.
In my previous post on Rich Object Models and Angular.js I introduced a simple strategy for setting up rich object-models in Angular.js. It turns out that once we've introduced the notion of a rich object-model, a number of more advanced object-oriented programming techniques become easy to implement. The first of these that I'm going to discuss is identity maps.
In this post I'm going to talk about what an identity map is, why you might need one, and I'll introduce a simple identity map implementation for Angular.js. I'm going to assume you've already read my foundational post. If you'd like to see the portion of my talk at ng-conf devoted to identity maps, jump to the video.
Another sort of rich model[/caption]
Angular.js is deliberately un-opinionated about how you should structure your data models. Whilst it lays out very clear guidelines for directives, controllers and services, it also makes a selling-point of the fact that it can bind to plain-old Javascript objects with plain-old properties.
Services are singletons, so it can be unclear as to if and how you can group per-object state and behaviours. Consequently, people tend to fall back to services that deal in very simple JSON objects - i.e. objects that contain only data, not behaviour. However, building the sorts of rich interfaces that our users demand means that we sometimes need to more fully leverage the MVC pattern. Put differently, for some problems it can be useful to have a rich object model that provides both data and behaviour.
Recently at ng-conf, I presented a simple approach I've used for using rich object models with Angular.js. This technique leverages existing frameworks, maintains testability, and opens up a range of possibilities for more succinct and easy-to-understand code. In this post I'll outline the underlying approach, but you can also find some (very simple) helper code here.
Shine Senior Consultant Ben Teese spoke last week at ng-conf, the world's first Angular.js conference. The two-day event was held in Salt Lake City and featured both the Angular core team and Angular experts from around the world. Being a single-track event, Ben had the attention...
“It’s the leadership that makes Shine a great place to work. The founders of Shine are…wait for it…’real people’! I have always felt that they are genuinely caring of their staff – approachable, honest, open. They definitely want to see their staff be the best they can be and provide the support and guidance needed to do just that. I love working here.”
“Since I joined Shine in 2017, I have been surrounded by brilliant, friendly and talented people, where work-life balance is a priority.
I always seek new challenges in my career and Shine gave me the opportunity to become a People Lead last year and I have been promoted recently as a Senior Software Engineer.
Shine is definitely a great place to grow and develop both professionally and personally.”
“Working at Shine has been great for me. It’s challenging, yet rewarding.
The Shine team are professional, highly skilled, and great fun to be around.
Shine has a respectful inclusive culture and focuses not only on skill growth but also personal wellbeing.
The thing I value the most is the trust that Shine puts in me to do the job the way I think it should be done.”
“The Shine team has taken my upskilling seriously, which I am greatly thankful for, and now I am helping others upskill.”
“I’ve been with Shine almost 15-years, and it’s the leadership that makes Shine a great place to work.
The founders of Shine are…wait for it…’real people’!
I have always felt that they are genuinely caring of their staff – approachable, honest, open.
They definitely want to see their staff be the best they can be and provide the support and guidance needed to do just that.
I love working here.”