4 weeks of Forge, Hammer and Anvil

It's been 4 weeks since I officially took over Hammer, Forge and Anvil, so I thought I'd write up some notes on the experience, things I've learned and encountered along the way.

The beauty of this acquisition was that there were already a fairly healthy bunch of users already using the platform, and some of them were also paying for the service. Before I set about writing a single line of code, I wanted to learn as much as possible as I could about how people were using the products, so I did a few things:

Communicating With Customers

By setting up Hootsuite to manage the Social Accounts

Each of the products has its own twitter account - @getforge @hammerformac @anvilformac. Along with my own personal twitter account and the new Twitter account I created for Beach (since Beach replaced my old service company Double Digital), this is setting up to be a Social Media Management pain in butt.

We don't employ anyone to manage our own social media full time, so it means we typically do our own social media pretty poorly. With Forge, there's a number of ways to communicate with our customers, but with Hammer and Anvil, it's much more difficult as we don't know who they are.

So, Twitter is a very important channel, until I can establish Forge as the main platform for all of our customers to use with whichever Beach product they are using.

Using Hootsuite at least gives me a fighting chance to keep on top of @replies and mentions, support requests and product feedback.

It was particularly useful when Forge went down a few times, to relay important platform status information and therefore limit the customer support requests that would inevitably come in.

 

Getting to Know Our Customers

By installing Intercom into Forge

One of my favourite products, one I've used on all of my products since way back in 2012, is Intercom. The first thing I did on Forge was install it and start talking to customers directly. I made sure I was on hand to respond quickly and thoroughly to all users of the service, to really understand what they thought of Forge and what their concerns were. 

 

The main support requests I received related to Deployments getting stuck. Sometimes this happens and users would just see the endless spinner syndrome - not a great experience. Most of the time, it's due to something fairly innocuous in the uploaded archive, but also the deployment just fails sometimes and can easily be fixed with an intervention on the technical support side.

Forge is actually doing quite a bit of work behind the scenes whilst the site is deploying, and it's great that this is invisible to users most of the time, but when things do go wrong, it's also really important to provide enough information to be useful in understanding what's gone wrong and how it can be fixed. Watch out for some improvements coming in that area soon, including some slightly more elegant logging and console tools.

 

 

Understanding Our Value

By creating a survey on Typeform

I issued a very simple customer survey via one of my favourite products of the moment, Typeform. This gave me a very impactful way to understand the challenge ahead of me. I wasn't really sure how existing customers felt about our products right now and I felt I needed some insight to better approach the future.

The feedback from customers was very consistent. There was a genuine love of the products, the design and simplicity of how the products went about their business. It's shown me just how important it will be to keep this guiding principal as I start to evolve the products.

There was, understandably, an overall tone of frustration. People were on the cusp of giving up all hope that these products would still be alive in the days or weeks to come. So, I was met with some scepticism, but genuine optimism at someone new stepping up and taking these products over. People really loved Hammer, and I think, would really like to love it again. 

 

Championing Our Customers

By creating a customer showcase

There are some super smart, incredibly creative people people using our products to do amazing things and that makes me so proud. I'm a big fan of championing customers, making them the stars of the show.

My first step was to reach out to those I'd identified and invite those who felt they related to the idea, to showcase their profiles on the Forge website. It was fascinating to understand how they use and love our products in their daily workflow, some relying on all three - Hammer, Forge and Anvil, whereas others really only relying on just one product. That's fine, but it's crucial in my eyes that everyone is celebrated for the great work they do and to inspire others.

The first 4 went up last week and I'm build out applications from many more customers, all of whom I'm incredibly envious of their talents.

I'll be publishing more in depth interviews and profiles on each of them very soon on the Forge blog, which will be the main resource for updates and news about each of our products.

 

Working on the Roadmaps

By creating public roadmaps on Trello

I've always been a fan of bringing ideas out into the open and sharing in how those ideas evolve and get implemented into products. So, it was a no-brainer for me to firstly establish the principal of public roadmaps for these products. Trello is my go to choice, since I already use it daily for managing internal product development tasks.

The feedback I received from the Customer Survey and from directly talking to people through Intercom, all goes into these boards, starting with the one for Forge.

 

Users and Customers are free to add ideas, comment and vote on others which helps me to understand demand and prioritise our workflow. It always takes a bit of time for people to get into the habit of contributing directly here, but is an area I really hope will build out organically as we gather momentum.

In August I'll be releasing the Hammer roadmap for people to contribute and stay informed on the progress.

 

Learning About Our Business

 Using Stripe, Chart Mogul and App Figures

We use Stripe for processing payments on Forge. For Hammer, we rely on the Mac App Store.

Both of these services are very well served by some supporting services that provide a way of looking at the data to get a better understanding of the nature of your business, instead of purely looking at timeline transactional data, but looking in terms of your key metrics.

Until I figure out what our "2000 Users" killer metric is, I'm really interested in understanding how new customers find our products (funnel), which product they choose to buy (pricing model) and how long they stay for (churn).

Screen Shot 2015-07-20 at 13.24.16.png

 

I found that Chart Mogul is a great service for making the most of Stripe data, though I also quite like the native Stripe apps. Chart Mogul provides information in relation to churn rates, and when I get deeper into this, I'm sure will provide much more value still.

The App Store data via iTunes Connect is typically crappy, so I'm using AppFigures for tracking the performance of Hammer. Despite the obvious frustration since stagnating the development, people are still downloading the tool and still love it. So, I'm really hopeful that when I get into the next version development, we can re-establish the trust and passion for Hammer that it once showed such promise for.

Through this initial research, I made some quick decisions on evolving our pricing model. I felt that the free version was too generous and creating too much of a comfortable zone for new users to exist in. Instead of the 5GB limit, I reduced it to 1GB. 

The $10 plan, I felt was also not driving enough value to prompt people to take that big step of putting their hands in their pockets to pay for the service, so I doubled the number of sites that can be created from 5 to 10.

I didn't think there was then enough of a significant difference in value from the basic plan to the paid plan, so I took a big step to remove the limit on sites entirely - you can create unlimited sites with custom domain for $50 per month.

A big feature of each of the paid plans is the Customer Support. It was never something that was really part of the feature set, but hopefully I've made a successful attempt to establish my intention to ensure that we really focus on supporting our customers, through all of the tools that we have available.

 

Tackling the Crooks

Using Intercom and Rack::Attack to block the crims.

All of a sudden, Forge went down. Panic. Was it something I did? I'm still figuring my around the stack, did I botch up the CDN settings? Did I knock out an EC2 instance? Arrghhh.

Turns out, no.

As I was getting to learn about the Forge user base, I discovered that there were around 100 accounts registered on the platform with Nigerian locales. On deeper inspection, it turns out that many of these accounts were using Forge to create suspected phishing sites and Amazon weren't thrilled about it.

Once I figured this out, I went through and removed offending accounts, sites and established some rules for new user signups to prevent this type of thing happening again. 

One way is simply to monitor the new account registration activity, this is time consuming, but a very important exercise to understand how people are using Forge. Intercom is a great tool for this, particularly when I have it setup to fire notifications into a dedicated Slack channel.

The other way is to maintain an active blacklist of IP addresses, using Rack::Attack.

I have a feeling this wont be the last we see of this issue, the virtues of a free account service, but we will monitor and do our best to prevent breaches of our terms of service.

 


So, that's an overview of some the main aspects of what we've been working on the past few weeks - I wont bore you with the drudgery of actually managing a transition of tech from one party to another.

I'm very excited that we're now starting to pick up the challenges of some of the Forge roadmap, from stabilising and updating the underlying technology, improving performance of existing critical features and starting some new shiny things too.




Why Forge, Hammer and Anvil?

Today is a great day and I am very happy.

I quietly announced that my company, Beach.io, has acquired three small products: Hammer for Mac, Forge and Anvil, from the guys at Riot.

A few thoughts on Hammer

Back in 2012, Hammer was born with a flurry of excitement. Back from the initial commit by Elliott to the Hammer server-side repo on June 10 2012, up to the announcement pretty much bang on 6 months later that the app was flying

People loved Hammer. It was a breath of fresh air for Mac-touting front end dev's everywhere.

I know this sentiment very well. I wasn't the first user of Hammer - in fact after signing up for the initial BETA, I didn't quite understand what it was for until I really got stuck into the first release.

It was a REVELATION to me

I wrote this guide to Hammer back in September 2013.

Since then, I haven't done anything static that didn't involve Hammer.

  • I prototyped new UI concepts for Currys / PC World
  • I used it to build Brand Swatches and Style Guides for Breast Cancer Campaign
  • I prototyped early static screens and clickable prototypes for Nourish Care
  • I built and ran value proposition experiments and lead generation for Ferticentro
  • I built product websites for Nuwe, HealthHackers, Nutribu, Beach, Double Digital
  • I used it during Hackathons
  • I converted many themeforest themes into Hammer templates just so I could use them without drowning in long HTML files...
  • I converted the Startup Framework into Hammer templates

2 years after Hammer's first release, I'm still an active customer and user of the product. But the world of Developer Tools moves so fast. We've seen the rise of javascript libraries and frameworks, from Backbone to Ember to Angular to React and Mithril. We've all been struggling to keep up, to place our bets on what will stick and what will fall by the wayside. 

In this time, we've seen other tools with similar promise to Hammer rise in popularity as the products have continued to adapt as the development technologies we use have evolved. Codekit, LiveReload, PreProc, CactusCrunch and Koala to name a few. [Editor: See additional notes at the bottom of the article]

I've tried them all in this time, but there's something about Hammer that keeps me coming back.

But, it seemed something was not right with Hammer, the updates stopped coming. New releases were not made. All was quiet. Meanwhile...

A few thoughts on Forge

Having been a Hammer user since early 2013, when I found out about the new service from Riot, called Forge, I was keen to dive in. In October 2013, when Forge opened its doors, I was right there to give it a try.

I had been having a torrid time with basic hosting, using Fasthosts VPS. It had caused me no end of bother, considering I didn't really want to be doing hosting in the first place, but when you're running client projects, it's something you end up just doing to avoid the inevitable hand holding of a client-managed hosting setup.

So, as soon as Forge came out, I moved a number of my simpler static sites straight over. That wasn't before I'd also wrestled with Amazon S3 for static site hosting, and found updating S3 buckets, configuring permissions and Route53 settings to be a pig of a job for something that should be so straightforward.

That's exactly what Forge was. Dead, dead simple. Drag, drop and forget.

I remember getting so pee'd off with the whole thing, I even ran a couple of demo sites straight out of a public Dropbox folder, I mean, jeez - so when Forge released Dropbox (and Github) integration, I was like "...are these guys reading my freakin' mind?"

Forge is like a bit of a secret weapon for me. In a way, I never really wanted to tell people about it, like they would discover my kryptonite or something. I've hosted everything from coming soon pages, to single page web sites all the way up to a rather nice React app with Parse.com integration on Forge. It's not as "static" as you might think.

I always thought to myself, I'd love to have some products like these, Forge and Hammer are just awesome - amazingly well executed, beautifully designed, simple propositions which really do have an impact on the way developers work.

Since Forge was released, we've seen a number of other static site hosting services, none more significant than Github's own pages service. Then there's Divshot, BitBalloon, Roots, Netlify, Site44, Paperplane and Brace (acquired by Squarespace)

Once again, as I could tell that Forge was not progressing at the velocity that I had hoped, I tried all of these services, but somehow, kept finding my way back to Forge.

A few thoughts on Nuwe and Me

I am CTO and co-founder of a startup, named Nuwe, which we founded in 2014. I have a small tech company, a bit like Riot, called Beach and we specialise in web and mobile app development, mainly focussed on products.

At Nuwe, we are building a developer platform which provides a Platform as a Service for people making new mHealth apps and services. I love ideas with real Social Capital.

We were recently accelerated by Startup Bootcamp, as part of the Barcelona IoT and Data Cohort of 2015.

I come from a rich background of experience in running large and small projects, from PHP-based web apps, e-commerce and CMS builds to more recently, the last few years focussing mainly on Ruby (rails), Node.js and native iOS projects. I'm a developer, product manager, team leader, entrepreneur.

I have 2 small boys, 2 basset hounds and a very understanding wife.

With Nuwe, we've been helping 20 or so companies to build their mHealth apps with significant cost and time savings, during our closed BETA phase. What I've seen in this process up close, is that although the technologies we use to build products vary massively (a huge challenge for us being truly platform agnostic), that the real problem and barrier to growth comes with the understanding and application of the skills required to build and iterate on new ideas from the ground up. Those aren't technical challenges. They are a mindset barrier.

I've seen, first hand, the tendency to assume too much, to believe our own instincts and write feature requirement after feature requirement - often forgetting the real people who you want to buy the product and drowning behind the desk in the belief that what we're building is the right thing, the thing that people want. I've seen it with startups, indie developers and with large multinational corporates.

A big challenge for the creators of new Health services, apps and services in general for that matter, is in obtaining and practising better product development processes and that starts even before we even lay down one line of code on our product.

One of the best parts of the accelerator process for us, was to disconnect from the need to build software and reconnect with our audience. We designed, tested and iterated our value proposition over and again until we found something that resonated - in language, tone, style and structure. 

Doing that somehow free'd us to build later, faster and in a more targeted way. All we needed was a website, a view of the problem and way to communicate the solutions we had in mind.

Through all this, I knew we needed to help educate our customers to maximise the use of our platform and that we'd need to invest in the content and the tools to provide this.

The Convergence of Pathways

It was a chance conversation between myself and Elliott over twitter, since I knew of his move a while back to Dropbox, to ask him what his plans were for Forge, in particular, when we started talking about the future of these products.

Within a few hours we were talking about a deal that would see me take over the on going management of Forge.

And within a couple of weeks, we'd struck a deal for me to take over the ownership of Forge, Hammer and Anvil.

You see, Elliott and I have similar visions for the products they originally created. Elliott still has unfinished business for sure and so I was delighted when both he and Hector agreed to stay close to the products as key advisors and to share in any future success as the original creators.

There's a number of things that need to be addressed quickly, in my mind as a customer of the products and I'm sure you'll agree with those.

There's many routes that these products could take, and I'm sure we'll become more divided on those ideas as we progress, since the landscape is evolving all the time.

One things is for certain, these products don't deserve to end up on the crap pile. They're too damn good, too damn valuable and have too much bloody potential as yet unfulfilled.

My Simple Manifesto

I think that it would be rather premature to tell you what I plan to do, so it might make more sense to outline what I believe in.

Customer Service is Top Priority
One of the things I want Forge to be known for is Amazing Customer Service. It's going to be hard, we're a very small team to start with, but I see the potential for this product and I will do everything I can to make sure the service you receive kicks the cr*p out of the larger, less personal and more sales-driven companies. The service will be personal and the best way to reach us is via the new Intercom tool in your Forge admin area. Look out for this...
 

forge-intercom

Openness, Transparency and Collaboration
I'm going to bring openness and transparency to the roadmap, I want all of our Customers to have a say in the way that Forge takes shape.

Build and Enable Great Products
I believe in Products. And whilst Forge itself is a product, the customers using Forge are also building and promoting their own products. So I think Forge is a tool for creating better products and better businesses and this will guide what we do with Forge.

Simplicity Is Beautiful
I love simplicity. And that's why I love Forge and Hammer, it really was the easiest way to host and build my websites. Even so, some things are still not as simple as they could be and there's lots of things I'd like to add. Remembering this value will be crucial.

Social Capital is Really Important
I like working on things that provide an amount of Social Capital. If you're in Education or you're building products for Health, then I'd especially love to hear from you to see how we can help you further.


I'd love to hear your thoughts on any of the products, ideas you've been mulling over and waiting for over the past couple of years and your own visions of the future.

Follow Forge on Twitter

Follow Hammer on Twitter

Follow Anvil on Twitter

 

 


Edit: Thanks to @TheLoneCuber and Bryan Jones (@bdkjones) from Codekit for pointing out the potential for interpreting the article in a way that I hadn't intended.

It seems it could have been read that I was suggesting Hammer was the first tool of its kind in the market - that wasn't the intention. I was merely trying to make the point that since Hammer was released, other apps have continued to evolve and establish a place in the market and Hammer has not evolved at the same pace over recent months.

To clarify, and as both had pointed out, Codekit (thanks to Bryan's exhaustive and often entertaining public release notes) actually went live into Public Beta in November 2011 and according to the project's repo, Hammer's first commit wasn't until summer 2012.

 

 

 

What is Prototyping?

What is Prototyping?

Prototype is a term which gets thrown around a lot, often in the context of many different situations and reasons. Because of this, there might actually be a bit of confusion about what exactly a prototype is. In the means of the digital world, I will define what a prototype is. Firstly, I’m going to explain what a prototype isn’t.

Throughout my years of graphic lessons through School, the prototype was used a lot in conjunction with sketching and mock ups. These design are elements, and while important to the whole process, are not prototypes. Each one is an essential part and what we class as static and represents part of the state of the proposed design. 

Sketches help you explore and discover your ideas quickly and help you experiment and refine designs. Wire framing is more of a map of the project, a sort of visual guide to its internal structure. Mock ups are usually more refined representations of the finished visual design. Missing from each of these is the ability to show how the application actually works, what it does, or how one is supposed to interact with it.

This is where prototypes come in. Prototypes are simulations, models, if you will, of how the the finished product will work. They let you experience how the applications flow, how the interactions work, and let you test the usability and feasibility of your designs. Because people tend to think of simulations as almost finished products, there is tendency to expect prototypes to have a certain degree of fidelity with the finished design. In reality, prototypes can have any type of fidelity you need, from high to low, from paper sketches to fully realized designs.

Depending upon what you need them to do, they can can simulate an entire application or a single use interaction. All that is needed for something to be a prototype is that it simulates some aspect of how the application is intended to work.


Hackbmth10 - A VERY HACKBMTH CHRISTMAS

Hackbmth10 - A VERY HACKBMTH CHRISTMAS

Today's christmas festivities were celebrated in the form of a bit of hacktastic skullduggery, in the form of an overdue get together of Bournemouth's finest coders, hosted by our friends at RedWeb.

I decided, given the festive season, to take some time to get acquainted with SpriteKit and build out the game idea that I had been conceptualising with my little 3 year old son Rudi.

The game, a Disney Cars inspired shoot em up, where Rudi, the games main protagonist, gets to fire his warchest of cars toys at the oncoming Tyger (Rudi's one year old brother). The premise of the game, to provide a virtualised outlet for Rudi to satisfy his insatiable urge to throw things, whilst teaching him the appropriateness of his actions in real world and virtual settings.

I set the game scene up quickly, based on a fairly generic xcode SpriteKit game template and the very entry level tutorial from Ray Wenderlich.

The main customisations I made, aside from the graphical components, were features driven by requests from my son.

1. "Daddy, can I throw different Cars?" 

The initial game setup just had a single projectile type, the obvious Lightning McQueen. So one of the first orders of business, was to create a full armoury of projectiles, of our favourite Cars characters.  First request was for Professor Z, and not content for long, I added 9 different options. 

I setup a UIVIew container, and placed the UIButton outlets inside it. I created a UIButton *menuButton which would have a background image that reflected the currently selected image. When the menuButton is pressed the weapon drawer will toggle open and closed.

2. Unlocking Weapons

It would be all too boring to just put all the projectile types in the tray from the start. Instead, I setup a simple game mechanic that involved unlocking the projectile types when a certain number of hits had been achieved. Whenever 

projectile:(SKSpriteNode *)projectile didCollideWithMonster:(SKSpriteNode *)monster

is called, the int pointsCounter is incremented and the score label text updated. We also save the score to the NSUserDefaults.

- (void)projectile:(SKSpriteNode *)projectile didCollideWithMonster:(SKSpriteNode *)monster {

NSLog(@"Hit");
[projectile removeFromParent];
[monster removeFromParent];
counter++;
if (updateLabel == NO) {
updateLabel = YES;
}
[self updateUserDefaults];
[self loadProjectiles];
}

3. "Daddy, can I move myself?"

I enabled Core Motion, to access the accelerometer to enable using the tilt of the device to move the Rudi character up and down, whilst firing at the on coming baddies.

I found this tutorial to be quite helpful here:

What next?

There's still much to do before the game will be accepted by its harshest critic. Some of the next things will be:

  • Fix some bugs with current physicsBody affecting the Player node.
  • Use SKParticleEmitter to create collision explosions, projectile trails, and smoke.
  • Create levels
  • Give projectiles different properties and behaviours.
  • Parallax for background scene to provide some depth

Thanks to the internet for providing the images and other such assets.

Why Do We Need Apple?

Why Do We Need Apple?


Why we need Apple?

It’s no secret that I’m an avid Apple fan and user-  Apple Ipad, Apple Ipod, Macbook Air and Iphone. I have never been a fan of any other system such as Android, Windows etc, I find them too cluttery and a bit all over the place. My first smartphone was a Samsung Omnia and it was awful. The windows system, then, was in no way as good as the simple Ios from Apples 3G model. So I can safely say I couldn't be happier about Apple’s latest announcements. Why? Because what Apple does affects us all.

There’s a tendency in the tech world- and especially as it relates to mobile OS-es to believe that the tech giants operate independently from each other. Apple makes its products, Google makes its operating system and any overlap is copying at best, and theft at worst. This view fails to take into account a lot of the complexities of how tech operates.


Apple Has the Scale to Reach Millions of Users

Perhaps, the biggest reason that Apple matters is it's distribution scale. Apple isn't the only one who puts good ideas into their products. But making a good phone doesn't matter much if you can’t put it into the hands of the people who want it. Some features (like NFC payments) only really catch on if a lot of people are using them. Apple is one of the few who can put phones into millions of hands.

When Apple launched the Iphone 5s last year, it initially launched in 11 countries, reaching a total of 50 countries by November 1st. This is possible due to the massive infrastructure that Apple has devoted to its one product line.  According to reports, Foxconn- one of Apple’s biggest suppliers- is able to crank out 500k Iphone's per day. Thats a 24-hour work cycle (bogged down with human rights violation problems. Not that this is unique to Foxconn or Apple), but for context, at that capacity, Apple could make 45 million Iphone's in 90 days. One quarter.

Compare this to a recent up and comer: Motorola. After Google purchased Motorola, it made a huge sweeping overhaul to its management team and cranked out a product that, while not impressing spec geeks, was still more than good enough for most people. Allegedly, it sold 500,000 in 90-days. Even if those sales numbers are inaccurate, though, Motorola itself claimed it's Texas facility-home of the customised Moto maker handsets- could only make 100,000 handsets per week. For context, for a 90-day period that would be roughly 1.28 million units. Thats still about 43.72 million units behind Apple. Motorola pioneered customisable hardware which could have shaken up the mobile industry, but because it couldn’t  deliver that to more than one country at launch, almost no one noticed.

Samsung is the closest non-Apple products to have the same scale. In Q2 2013, Samsung pushed 71 million smartphones, compared to Apple’s 31.2 million over the same time frame. Not all of those are flagships but the fact remains that Samsung is the only Android manufacturer that can compete in this arena.

To push a new type of consumer tech, you need consumers to actually use it. Unlike fan favourites such as HTC or Motorola, if Apple wants to make a device popular, it has the means to do so. Retailers need a reason to upgrade their systems to support NFC payments. Apple can give them 45 million new reasons every quarter. No matter how much their fans like them, HTC and Motorola can’t do that.

Apple Has the Cool Factor to Gain Mindshare

Whether you call it high quality hardware or reality distortion field, the fact is that Apple makes products that millions of people really love. Not everyone, but enough. Enough people, at the very least, to nudge consumer mindshare into a direction Apple chooses. Like wearing a computer on your wrist.

We saw this happen to a certain extent with voice commands. Despite Google now being just as good as (and sometimes better) Siri, the latter is the one that became a brand unto itself. Voice command jokes maybe useless, but they give, what is otherwise just a smartphone feature, personality. Simply put, no one’s asking whether or not some day we will have meaningful relationships with Google.

Does this mean Apple is the only one making cool features? Definitely not. But fashion matters in tech. Arguably, Google Glass’s biggest failure from what I have seen personally and read isn’t the tech, or its practicality, or even its oddly invasive camera. It’s that Glass simply just looks silly. Maybe it shouldn't be. People wear glasses in their every day to day life. But when you attach a bright orange camera to someone's eyeball, it puts people off. Coolness matters and, for the time being, Apple is still pretty damn cool.

Wearables is another big area where coolness is going to matter. Smart watches have been around since before the pebble, but they still have the perception of being very silly. There are no guarantees in tech, but Apple may just be able to make the smart watch cool. The category certainly needs the push, and after the announcement of the Apple watch, they might have gotten it. Not only will it become more socially acceptable to wear them, but Android users will probably have more (good) models to choose from if it catches on.

Apple’s monopoly on cool isn't totally absolute, of course. Google’s software design has arguably become much, much cooler in recent years. Bigger phones have become cool enough for Apple to follow suit. But Apple does still have a lot of cool collateral in its coffers. More importantly, as stated before, it has the manufacturing capacity to back it up. Quite frankly, despite pushing the same number of units, Samsung doesn’t have the same fashionable factor. This puts Apple in  a unique position, particularly in terms of appealing to a key, influential demographic.

Gold Iphone 6

Apple Has a Wealthier Target Demographic.

Apple products aren’t necessarily overpriced. They’re just expensive. The same goes for the price of a good quality laptop from a different manufacturer.

The difference with Apple is that “expensive” is the only price point they reach. There’s no budget iPad for £200. The cheapest Mac you can get is £899. The lowest price for a laptop is £749. The new Apple Watch will cost around £250 for the smaller screen watch, which is nearly twice the cost of the early Android wear devices. For any other company, this would be suicide. In fact, for Samsung's smart watch, it sort of was.

There’s nothing inherently wrong with this approach, but it means that Apple necessarily excludes poorer demographics (and countries). The Moto G is sold in foreign markets where a £600 phone is prohibitively expensive. In fact, arguably, Android was only able to get to where it is today because it’s able to cater to more than one price point or type of market.

“Android is popular because it is cheap, not because it is good.”

With exclusionary prices, though, comes status symbols. And status symbols, by their nature, are more often owned by the wealthy. Money shouldn’t necessarily buy influence, but it often does. Businesses with cash to spend will invest in technology they think is worthwhile.

Countries with more money will determine what devices will become more popular. That is why the US and China are important first launch markets, while Haiti doesn't come up too often in conversations about mass market appeal. It’s callous, it’s insensitive, it marginalises some groups, and it’s true. People who sell things need to find people with money to buy things in order to survive. And Apple, by its very nature, appeals to people and businesses with more money.


COMPETION-1.jpg

Competition Matters, and Apple Is the Biggest we Have

None of these factors are exclusive to Apple. However, the just-right combination is pretty rare. This means  that, even if you don’t use a single Apple product, the company probably has some influence over the technology that you use. Android wear, as an example, might be an excellent product. But without a company like Apple to make wearables fashionable, it’s not entirely certain if they would catch on. They’ve certainly struggled so far.

Not to mention, there’s other little competition. Without Apple, the entire Android world might get over run by Samsung (arguably already has). Without Apple, there’s almost nothing competing with Windows. Without Apple, the “who’s better than who” discussion will die out almost entirely. Even if you hate Apple, that rivalry drives us to do more.

That type of competition will always drive companies to out-do and borrow from one another. It’s possible that Android wouldn’t have worked on Project Better if not for Apples smoothness, in the same way that Apple might not have made its own notification shade following Androids lead. One lends itself to the other. It’s the circle of competition, and we’ll all benefit from it.

Of course, no one’s saying Apple’s the only one that drives competition or the only one who comes up with the ideas. But it does popularise many of them. No one is giving credit solely to Apple for inventing all technology. Just because Apple prefers a walled-garden approach to tech, though, doesn’t mean it actually lives in one. 

 

 

 

Links to Resources 

http://appleinsider.com/articles/13/11/11/apple-store-sales-fall-3-as-iphone-ipad-distribution-network-grows

http://www.apple.com/pr/library/2013/09/23First-Weekend-iPhone-Sales-Top-Nine-Million-Sets-New-Record.html

http://appleinsider.com/articles/13/11/27/foxconn-building-500k-iphone-5s-units-for-apple-per-day-with-nonstop-production-lines

http://www.cnet.com/uk/news/motorola-to-shutter-texas-factory-building-moto-x/

http://www.dailytech.com/Motorolas+Moto+X+Assembly+Plant+in+Texas+to+Close+by+the+End+of+2014/article34986.htm

http://www.theinquirer.net/inquirer/news/2352262/samsung-warns-of-poor-q2-due-to-slowing-galaxy-s5-sales

http://bgr.com/2013/07/23/samsung-smartphone-sales-q2-2013-iphone/

http://www.theguardian.com/technology/2014/oct/02/apple-watch-smartwatches-and-the-wearables-fashion-gap

http://www.style.com/trends/fashion/2014/fashion-tech-problem-silicon-valley

https://www.apple.com/uk/

http://www.pcpro.co.uk/features/389782/apple-ios-vs-android-vs-windows-8-whats-the-best-compact-tablet-os

http://uk.pcmag.com/tablets/3869/feature/how-to-choose-the-right-tablet

http://www.knowyourmobile.com/mobile-phones/apple-ios-8/22240/ios-8-vs-windows-phone-81-best-bits-both-examined

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

How to format ISO 8601 Date Format in iOS

So, it turns out NSDateFormatter, a formidable class for converting and manipulating date formats in iOS development, met its match with the ISO8601 date format that I was getting from a rails based API. Or at least, that's what I found. So here's how I coped with it:

The json:

"start_date": " "2014-10-26T21:00:00.000+00:00"

Turns out, NSDateFormatter can't parse this.

I did quite a bit of digging around and in the end, my friend and mentor @HunterBridges pointed me in the direction of this nifty little library on GitHub

https://github.com/boredzo/iso-8601-date-formatter

It even has a nice little xkcd comic in the README, so definitely work checking out, just for that.

I downloaded and extracted just the header and implementation files "ISO8601DateFormatter" and included them in my model class. 

#import "ISO8601DateFormatter.h"

Then, in the implementation where I was initialising my model instance from the API response dictionary:

 

NSString *datestr = [result objectForKeyNotNull:@"start_at"];
NSLog(@"Date String: %@", datestr);
ISO8601DateFormatter *dateFormat = [[ISO8601DateFormatter alloc] init];
NSDate *date = [dateFormat dateFromString:datestr];
NSLog(@"Formatted Date String: %@", [dateFormat stringFromDate:date]);

 

Note "objectForKeyNotNull:" method is a convenience method for making sure the result doesn't contain a null value.

So, I grab the original date format from the web service response and save it as an NSString.

I then alloc and init the new ISO8601 class as dateFormat variable. Then I create a new NSDate object and call dateFromString on my dateFormat variable, passing it the original dateStr variable as a parameter.

And that's it. Later on, I create a normal NSDateFormatter to parse the new date object and get just the time in HH-mm format, which is what I actually wanted for the app feature I was building.

osi

 

 

 

If Snapchat and Tinder weren't evil || Lumpy - iOS App (part 2)

Then they'd probably do something like this....

A while ago, I wrote a post about a particular product hypothesis I had. I won't regurgitate the underlying rationale and background research, but needless to say, I think it's compelling enough. Since that time I've been pretty full-on building my startup Nuwe & consulting at Nourishcare.

But, a couple of incidents recently brought back to my attention this concept and I've decided to flesh it out a bit more. Today peoples, we're fighting cancer. And broken bones. And probably other things, but let's stay humble for the time being.

A few weeks ago, we were on a family holiday to Center Parcs. Near the end of the holiday, my 3 year old son, Rudi, fell off a coffee table and hurt his arm. It was clearly painful, and despite continuing to cycle and swim, he was also clearly carrying his arm in a way as to relieve the pain. When we got home, we took him to the doctor, who assessed and prodded and poked and, reticent to x-ray a 3 year old, advised us to monitor the situation. My wife and I asked each other 10's of times, whether we should take him for an x-ray, it clearly wasn't right. We asked each other, we asked other members of the family. We asked and asked and asked.

A few days later, we decided to take Rudi to A&E, and it turned out, he had a broken collar bone!

A week later, my wife went on a spa day with her girlfirends. Much to my amusement, she came hobbling home, having slipped getting into the jacuzzi and couldn't walk. A few days later and her ankle was purple. Again, the questions started - should I get it checked out? is it broken? 

How often must this happen? How often must this be needed but the person doesn't have anyone to ask? These are questions that tickle my interest.

What have Snapchat & Tinder Got To Do With This?

Does a day go by without seeing some rip-off of a snapchat or tinder type feature, UI approach or app clone? Well, don't expect anything different from me. Let's get all popular culture and ask ourselves "WHAT IF"?

What if, Tinder's amazingly engaging and simple gesture based UI could be put to use for more promising purposes?

What if, Snapchat's ephemeral messaging system that is popularly used for kids sharing naked photos of each other could be used to encourage sharing of sensitive visual information - such as photos of suspect moles, skin blemishes, lumps, bruises, potential broken bones - things we want to share, should share, but can't?

How does it work?

1. User takes a photo of a suspect skin blemish, mole, bruise, lump - something that's concerning them and they just want to invite feedback from family, friends, or the general public.

2. User selects the people they want to receive a very simple binary response - yes/no -which aims to answer the question "should I get it checked out?"

3. The responder receives the message into the person inbox, and is notified via push notification and if not responded after an amount of time, receives an email to their inbox.

4. The responder selects the message, which loads the message details. This contains the image "card" ala Tinder. The message will be visible for 15 seconds, encouraging the recipient to respond with their "gut" reaction and not to dwell / risk dropout and non-response.

5. The message will self-destruct after the timer runs out, and the message will no longer be visible to the recipient. Attempts to take screenshots using the camera will trigger the view to close before screenshot is taken.

6. The user can then embellish their response with additional notes and comments - personal experiences, words of encouragement, advice etc.

7. The user is notified when responses are received, and can view a summary of the responses on the message detail view, helping them to decide what action to take next.

8. Users can configure their settings to ensure their images are also deleted from the server, or retained on the server for their own personal future use and also for the benefits of research and visual recognition and machine learning for predictive diagnosis of skin conditions and injuries.







Take a photo or video

Select the recipients

Recipients received requests to their inbox

Time to Vote - who does it look?

See the results

Next Steps...

Next we have to validate this concept with our target audience, and for that we need to start to hypothesis who that will be, how to reach them, what they might pay (if they will) for the service, how much they'll cost to reach and a billion other questions...

AI Assistance in Popular Culture

AI Assistance in Popular Culture

Since the start of the 21st century, there's no question to mankind making tremendous strides into the field of Robotics. While modern robots can now replicate the movements and actions of humans, the next challenge lies in teaching robots to think for themselves and react to changing conditions and environments. The field of artificial intelligence (AI) promises to give machines the ability to think analytically, using concepts and advances in computer science, robotics and mathematics.

While scientists have yet to realise the full potential of AI, this technology will likely have far- reaching effects on human life in the years to come. Below are a list of ways AI will be able to help or change the way we live in the future:

Tackling Dangerous (or Boring) Tasks

Taming the Weather

Saving the Planet

Driverless Transport

Pushing the Limits of Space Exploration

Protecting Your Finances

Staying Safe

A Little Help Please

Space-Age Medicine

The Robot-Human Species

In the past we have seen early concepts on AI through television, films and media, Here are some examples that have blessed our screens in the past:

Sonny- I-Robot

Brought to artificial life by the brilliant Alan Tudyk, Sonny is the robot at the heart of the Will Smith blockbuster.

Rosey - Jetsons: The Movie

One of the most iconic and recognisable robots for many people, Rosey the Robot was the helpful robotic maid of the Jetson family.

Skynet – The Terminator films

One of my all time favourites, is the all-powerful big bad of the Terminator universe, Skynet is essentially the internet after it turns on us. Which is a scary, scary thought, and which will probaly happen for sure one of these days. Pretty much undefeatable, Skynet always finds a way to exist and just keeps on coming. Skynetisnt featured in the film that much, being far more threatening as a concept than its reality (a big computer). Instead it just keeps on sending Terminators after everyone.

T-800 – The Terminator

In a mighty career spanning five decades, one role is undoubtedly the most iconic of all of Arnold Schwarzenegger’s film work. The Terminator, aka T-800. From the unstoppable killing machine of the original film, to the reborn hero of the sequel, Arnie’s T-800 has always been one of cinema’s greatest characters. He also looked badass underneath, with the endoskeleton being one of my all-time favourite designs in cinema. The metal skull is freakishly chilling, and the red eyes haunting. The perfect embodiment of Skynet, the T-800 was even better as a hero, proving that machines could be our salvation as well as our end.

Kit- Knightrider

KITT is an artificially intelligent electronic computer module in the body of a highly advanced, very mobile, robotic automobile: the original KITT as a 1982 Pontiac Trans Am, and the second KITT as a 2008-2009 Ford Shelby GT500KR.

Optimus Prime- Transformers

If there was a Robot god. He would be it! The most noble of all robots. Leader of the heroic autobots, Prime is the best parts of humanity rolled into one metal form, despite being an alien life form. Constantly sacrificing himself for the sake of others, Prime is one character who’s thankfully been pretty much left untouched in the recent Michael Bay films – he’s pretty recognisable even in his new state. Handy in a fight, and the epitome of moral righteousness, Prime is one of the most enduring fictional good-guys of modern times. He’s the friend you desperately wished you’d had growing up, the mentor who would set you right, and the fighter who would beat up the bullies for you. Optimus Prime you’re my hero.


AI in Mobile Technology

AI is everywhere nowadays from most of our household electronics to our cars and everywhere in between. AI assistance is becoming ever more popular and smarter within our smart phones with the likes of Siri and other similar tools.

The application uses a natural language user interface to answer questions, make recommendations, and perform actions by delegating requests to a set of Web services. Apple claims that the software adapts to the user's individual preferences over time and personalizes results.  The name Siri is Norwegian, meaning "beautiful woman who leads you to victory", and comes from the intended name for the original developer's first child.

When it comes to Siri, we finally have some insight into what makes her work. In this profile of the work involved in making computers speak, it looks how the voice Siri is made.

It’s a fascinating glimpse at just how Siri operates and the technology involved, but the human element is even more amazing. Considering how prevalent Siri has become in our lives, it’s quite an eye opener to see just how many people come together to make it work.

Apple fans have patiently waited for Apple to introduce a Siri API to developers, but ever since the personal assistants arrival in 2011, the technology has largely been restricted. And while Apples feisty helper has improved over the years, Siri stil hasnt quite reached its full potential. However, a new report from The Information claims Siri is getting ready to play nice to third party apps and services, with an eye to make the assistant more intelligent overall. 

Apples plans claim not only will Siri be opened up, (with plenty of restrictions), the technology will also get more predictive smarts. For example, A map application might load up as you get in the car and start driving, or it might put itself on silent when in a meeting. As it stands, Siri more of an add on that you might use once in a while. If given more predictive powers, the technology could evolve into something you come to rely on, and maybe even enjoy using. 

The Future

The future of AI is looking increasingly scarier. In the next 10 years technologies in narrow fields such as speech recognition will continue to improve and will reach human levels. In 10 years, AI will be able to communicate with humans in unstructured English using text or voice, navigate (not perfectly) in an unprepared environment and will have some rudimentary common sense (and domain-specific intelligence).

People will start turning more and more bionic, which means living longer lives. Being able to use AI to help the human body and the planet to live longer and making life more easier for ourselves while robots do all the hard work. 

 









10 Tips for Building Wireframes

10 Tips for Building Wireframes

I have been learning to create low and high fidelity wireframes for both mobile and web devices. There are a variety of different tools you can use to create these wireframes like Illustrator, Photoshop and Sketch ( only available on Mac ). I have been using Sketch 3 to wireframe as its a simple combination of both illustrator and photoshop. 

More and more designers are using vectors for wire framing. The following tips will help you make the most of your wire framing experience. 

Wire framing is about working rapidly and iterating quickly. The aim is not to create attractive interfaces; your number one priority is to design information and experience. 

Below are 10 tips that i believe to be important when designing wire frames. 

1.  Start Sketching

Sketch them first with pencil and paper for a quick sanity check. This should take about 30 seconds and opens up the possibility of getting early feedback. This can save a lot of time and money. The feedback gained through peer review or, best of all, from some early and informal user testing (you may need to spend a little more than 30 seconds on sketches if they're for user tests). 

2. Go Monochrome

Wireframes make clear the hierarchy on a web page; they visually demonstrate the order in which users should process the available information. If you want users to process the headline before hitting the "buy now" button, the headline needs to "trump" the button by demanding more attention.

This visual hierarchy can be defined in a number of ways. We could use size to make the headline more impactful, we could use positioning (by placing it before the button). We could use colour, contrast and a range of other things, but doing so in a wireframe only makes things more confusing.

By removing colour from the equation, the visual relationship defined by position, size and (if you want to go the extra step) contrast, is much cleaner.

We're not building pretty, pixel perfect UI kits here. Stick to a limited range of greys, then use color just for labels and notes. 

3. Don't forget the goals of the page 

Keep the goals of the page in mind when designing a wireframe. Focus on driving action. Organise the information into hierarchy that serves the goal of the page. 

4. Pick Your End Point

Prior to commencement, work out who will be consuming the wireframes, how they'll consume and what what level of fidelity is required. Remember that theres a relationship between the level of fidelity and type of feedback. Will quick paper sketches suffice or will they need to be fully interactive with accurate dimensions? Keep in mind: the less precise the wireframes are, the more liberty and creativity a designer is going to take with them. On the other hand, if you think they look perfect designers may feel inhibited and merely "colour in" the wireframes, preventing the design process from really getting going. 

5. Keep the rest of the team informed

Wire frames are not just for the client. All members of the web team should provide feedback on them, buying into the process at an early stage.

syd-creative-team.jpg

6. Use common elements

When designing a set of pages, use tools that allow you to make multiple changes to all common page elements at once. Moreover, as you're creating the wireframes, look out for design patterns that repeat. Leveraging these is key to gaining efficiency and consistency. 

7. Consider the content

If your wireframe aren't sketches then be realistic about the amount of content that will be added to the page. This holds true also for number (and length) of links and navigation. If practical use accurate sized fonts, images and consider what will happen when more text then ideal is added. Nothing on the web should be etched in stone, so ask if the design will flow as required. 

8. Draw on your experience

You do not need skills in design or development. All anyone needs is experience in using web apps or websites. Of course the more experience the better but you don’t need to understand relational databases to wireframe.

9. Keep it clean

If a particular page requires two text boxes and a button then it should have just that, no more, no less.

10. Get feedback 

I have learnt not to be afraid to test your wireframes with a couple of informal user tests. Grab people from around the office and ask them to find various bits of information or explain what they think the function of the certain elements is. 

 

 

 

 

 

 

 

 

 

 

 

 

 

The use off Animation in IOS 7 Apps

The use off Animation in IOS 7 Apps

I have been using IOS 7, the newest operating system for Iphones and Ipads, since it first became available back in June. Firstly on my 4 now on my ever faster, better, Iphone 5s and Ipad 3 maybe 4.

Nowadays, good design is so much more than how an app looks. It also has to “feel right”. When you look carefully at the animations and transitions in IOS 7, you will notice that the interaction is nearly as important as the whole experience.

When they released IOS 7 it came with some problems for people that suffered from motion sickness. For those with motion sickness, iOS 7 caused problems. The transition of app’s zooming in and out of icons when launching or closing to the home screen, which might look sharp but is not to everyone's liking. After plenty of complaints about people suffering from motion sickness Apple got the message that iOS 7 zooming isn't for everyone. The iOS 7.0.3 update has made it possible to switch off the zoom effect.

10 Best Practice Tips for User Onboarding to a Mobile Application.

10 Best Practice Tips for User Onboarding to a Mobile Application.

1.The Goal.

The main goal is to accommodate your user and to get them using your product, ASAP. It’s highly important to make a fantastic first impression and to then carefully familiarize your users with the product so that they come back.

 

2. Communication is key.

You don’t want to talk their ear off but you want to be as charming as possible. Simply: Tell the user what they need to know. In as few words as possible, make them like you, being as witty or delightful as you can while doing it. It is also important to make sure you type in the correct formality for your members.

 

3. Welcome them properly.

It doesn't feel great spending so much time filling out registration and membership forms to then only walk in through the door with every single staff member acting as if you don’t exist.

 

A major part of the on boarding process is making a new member feel welcome. You want to be able to thank them for taking the time to join your product instead of just sending the invite to the junk box. If you haven’t set up a welcome email, then make one. It doesn't need to be long.

 

4. Making it easy.

This is where you will lose sign ups. Life is complicated enough as it is and if you do not make your sign up simple, you will be losing customers. Take some time to figure out what you actually want to know from your customers- the bare basics.

 

5.  Save them time.

Nobody, including ourselves, like being asked to fill out questionnaires or registration forms by people in the streets. You’re in a rush, you have to go to the doctor with your headphones in.  I’ve used all the excuses in the world not to stop to be asked to fill out a questionnaire. We don’t have a lot of spare time. We value our information and don’t necessarily feel comfortable sharing a lot of information right from the start.

 

pinterest.JPG

Social log-in is a great time saver that is appreciated by a vast majority of consumers. You’re going to have some people who do not want to use this option, but you can offer a different mode for them. Pinterest is a great example of this. They have an option for a social log-in, or you can create a direct account. Do the same thing for your visitors.


The on boarding process should be warm in tone, fun and offer additional guidance if necessary. For example, if you've got a video available on how to make the most of their experience, this information should be included both in the email you send out and in their welcome  page.


6.  Creating a compelling CTA.

No matter what market you’re in, chances are you are facing some stiff competition out there. What can you do to make signing up for your customer a “must”? Take a step back and distil what it is that makes you unique into no more than 2 sentences. Your tagline should be placed in a prominent spot on your landing page.

7. Making Referrals.

2.png

The best way to make an influential person shout about your company? Start including friend referencing on your boarding process.  A fantastic example of this is Facebook. When you sign up and are getting your profile ready, you have the option of inviting friends/existing contacts.

There is nothing more influential than a customer who is totally excited about what you have to offer and wants to be the first person to share it with friends.

The added benefit of a referral goes back to your growth funnel. It takes a lot of people pouring into the funnel to keep it full so why not let your customers help you keep it full.

8. Don’t break the flow.

Designers usually strive to get the users into a state of “flow” in which a person performing an activity is fully immersed in a feeling of focus, full involvement in the process of the activity. There are many tools to help designers make this happen that can also be implemented into the design of your on boarding process.

 

One of the main requirements is to be as unobtrusive as possible. For example, don’t surprise your users with unexpected pop ups and messages. The best way to prepare the user is show them what steps are coming up and what they have left. For a fluid experience, context is important.

 

 

9. On boarding is a relationship and is ongoing.

Relationships are built on trust so don’t mislead your users and make it easy for them to trust you. Your users are new and are figuring out there way around your product. You need to nurture the relationship between yourself and them to keep the relationship going. Engage your users in a natural yet friendly way. You should spend time very early on in the on boarding process getting to know your users and what their needs are. This could be sending me them a personalized note to each individual right after the moment of email verification.10. Ease them in gently. People, including myself hate it when you visit a page or an application where it’s so busy and over complex, it makes me want to stay away. This isn't to say that you should not do something personal and fascinating.  What you don’t want to do is overwhelm the new users on their first visits to your application.There some examples of pages and apps where all the white space is full of content. Colours, images and words. It can all be a bit too much for a new user to handle. With some effort, the experience can be elegant and informative without over stimulating the user. Short tips and pop up notifications are a good way to guide new users through the appropriate steps. Be sure to show them one at a time. Tell them directly what they need to know and when they need to know it. Don’t make them remember too much as they will forget it. Instead, use reminders.Overall, on boarding new users should be a fun and creative experience to help develop your product. There are hundreds of tools out there to help you optimize your product. Experiment with different tools and features to your advantage.

 

 

Sources and Further Reading

http://www.blogtyrant.com/best-about-us-pages/

https://zapier.com/blog/user-onboarding-user-interface-inspiration/

http://www.dtelepathy.com/blog/design/ux-flows-onboarding

http://blog.piethis.com/post/84814920128/improve-onboarding-tips

http://www.hubba.com/improving-new-user-onboarding

http://www.hubba.com/improving-new-user-onboarding

http://growthdevil.com/user-onboarding-techniques-successful-growth-hacking/

 

 

Factual & Rails || Grabbing UPC Product Data

We're heads down creating the next significant iteration of Nutribu, our nutrition tracking app. It's nearly ready, and we're dead excited.

Nutribu is being re-imagined to make tracking what you eat, still a very manual process which is unavoidable despite the numerous tech gimmicks you may have seen to help automate the process. So, we're focussing making it simple, fun and dead easy to find what you're eating and capture it in order that you can track your nutrition against your goals.

One area that users really wanted, and isn't really a new feature as it's often touted as one of the best features of apps like MyFitnessPal, is the ability to scan a UPC product barcode and instantly return the product complete with nutritional information. I can tell you now, the new Nutribu will have that too. Yay!!!

Actually, now I'll show you how to implement such a feature into your own app, starting with the server side component of fetching and storing product information from a service like Factual.

Before you do anything, head over to Factual and grab an API key and secret.

1. There's a Gem for that, of course.

gem 'factual-api'

2. Write tests.

Note: We use VCR to optimise the testing of HTTP interactions.

products_controller_spec.rb
require 'spec_helper'

describe V1::ProductsController do
  
  include_context "signed up user"
  include_context "api token authentication"
  
  describe "show" do
    let(:product) { Product.new(name: "Stone Crop Body Lotion", brand: "Eminence", upc: "608866337447") }
    def get_product
      VCR.use_cassette('factualapi') do
        get "/v1/products/#{product.upc}.json", nil, token_auth
      end
    end
    it "returns status 200" do
      get_product
      expect(response.status).to eq(200)
    end

    it "contains the product info" do
      get_product
      body = JSON.parse(response.body)
      expect(body["name"]).to eq(product.name)
      
    end
    
    context "product does not exists in in-house db" do
      it "create a new product in db" do
        
      end
    end
  end
end

3. Generate Products Model

$rails g model Product name brand weight:integer upc

class CreateProducts < ActiveRecord::Migration
  def change
    create_table :products do |t|
      t.string :name
      t.string :brand
      t.integer :weight
      t.string :upc
      
      t.timestamps
    end
  end
end

4. Generate a Model for Product Image

$rails g model Image image:attachment product:references
class Image < ActiveRecord::Migration
  def change
    create_table :images do |t|
      t.references :product
      t.attachment :image
    end
  end
end

5. Update Routes.rb

...

resources :products

...

6. Product Model and Validations

app/models/product.rb

class Product < ActiveRecord::Base
  validates_presence_of :name
  validates_presence_of :upc
  validates_uniqueness_of :upc
  has_many :images
end

7. Image Model & Validations

This one is somewhat more involved. We use Paperclip

#todo include explanation for this.

app/models/image.rb

class Image < ActiveRecord::Base
  
  has_attached_file :image
  belongs_to :product
  validates_attachment_content_type :image, :content_type => /\Aimage/
  
  def file_from_url(url)
    self.image = download_remote_file(url)
  end
 
  private
  
  def download_remote_file(url)
    # OpenURI extends Kernel.open to handle URLs as files
    io = open(url)
    
    # overrides Paperclip::Upfile#original_filename;
    # we are creating a singleton method on specific object ('io')
    def io.original_filename
      base_uri.path.split('/').last
    end
    
    io.original_filename.blank? ? nil : io
  end
end

8. The Product Controller

# Update an existing user's profile.
# Requires a valid API token.
class V1::ProductsController < V1::BaseController

  before_action :authenticate

  def show
    result = FetchProduct.perform({upc: params[:id]})
    if result.success?
      render json: result.product
    else
      render json: {error: {message: result.message}}, status: result.status
    end
  end

end


9. The FetchProduct Interactor

We use Interactors to add a layer of abstraction between our models and controllers - especially useful when performing complex interactions in a single request.

Basically, how we want this to work, is to initially check our own database to see if the product already exists, if not route the request to Factual to get the data, return and store it in our db, so the next request can just fetch it from our local store.

app / interactors / fetch_product.rb

class FetchProduct
  require 'factual'
  include Interactor
  attr_reader :status
  attr_reader :product
  
  def perform
    product = Product.find_by_upc(context[:upc])
    if product.present?
      @status = :found
      context[:product] = product
    else
      # could not find this product in our db, find it on factual db
      factual = Factual.new(ENV['FACTUAL_KEY'], ENV['FACTUAL_SECRET'])
      raw_data = factual.table("products-cpg").filters("upc" => upc).last
      
      # this should be put in a worker, then what will we return for the first time? not_found?
      if raw_data.present?
        # create product from raw data
        product = Product.create({name: raw_data["product_name"], brand: raw_data["brand"], upc: raw_data["upc"]})
        raw_data["image_urls"].each do |url|
          image = product.images.create()
          image.file_from_url(url)
        end
        @product = product
        @status = :found
      else
        context.fail! message: "could not find product info"
        @status = :not_found
      end
    end
  end
end


Google Web Guidelines Summarised

Webmaster google guidelines. 

Key points of web master guidelines: 

Syndicated content-

Syndicated content is content which is copied from another website, some sites copy content which stays on topic, but they don't add any of there own value. Other sites copy completely random and irrelevant content to increase their search traffic. Scrapped content alone, even high quality content, does not add any more value to your users. 

Affiliate Content-

Similarly, if your site participates in Affiliate programs make sure your site adds value and gives the user a reason to visit your site. An example of a high quality affiliate site would be a bicycle blog with original reviews and commentary. 

An example of a low quality affiliate site would be a bicycle blog that only uses copy product descriptions, accompanied by affiliate notes. 

Doorway Sites-

Doorway sites are created purely to another website and often try to crowd the search results for a particular term or phrase. This provides the user with a poor experience as more than one search will ultimately lead them to same site. 

A violation of the web master guidelines can negatively impact your performance in our search results and in some result can result in removal from our search results. Our primary goal is to serve users with high quality relevant information.

These guidelines are in place to ensure a good user experience so its worth your time to give them a thorough reading. 

Design and Content Guidelines. 

  • Make a site with a clear hierarchy and text links. Every page should be reachable from at least one static text link.

  • Offer a site map to your users with links that point to the important parts of your site. If the site map has an extremely large number of links, you may want to break the site map into multiple pages.

  • Keep the links on a given page to a reasonable number.

  • Create a useful, information-rich site, and write pages that clearly and accurately describe your content.

  • Think about the words users would type to find your pages, and make sure that your site actually includes those words within it.

  • Try to use text instead of images to display important names, content, or links. The Google crawler doesn't recognize text contained in images. If you must use images for textual content, consider using the "ALT" attribute to include a few words of descriptive text.

  • Make sure that your <title> elements and ALT attributes are descriptive and accurate.

  • Check for broken links and correct HTML.

  • If you decide to use dynamic pages (i.e., the URL contains a "?" character), be aware that not every search engine spider crawls dynamic pages as well as static pages. It helps to keep the parameters short and the number of them few.

  • Review our recommended best practices for images, video and rich snippets.

 

 

iOS8 - What's got me excited? Notifications.

Push and local notifications came on leaps and bounds in iOS7, to the extent that they're no longer really annoying* and in fact, have been verging on being quite useful when used intelligently within the overall experience of a mobile app.

Notifications displayed on my lock screen are, by some stretch, the most frequently visible real time notifications that I receive in the course of my day. So, when Apple officially declared iOS8 and it's myriad of updates yesterday, it was the evolution of the notifications, part of the iOS UIKit library, that caught my attention.

At both NuWe and Nourish Care, we've been looking closely at the opportunities for using notifications to improve the overall user experience, simplify the ways that users interact with our apps starting even before they've gone through the rigmarole of actually unlocking the screen, finding the icon, opening the app and logging in before they get to do what it was they wanted to do in the first place.

Some technologies offer considerable promise, such as the iBeacon protocol for adding real world context to user actions.

But notifications were really missing some additional, albeit simple, but important features to make them really useful without the need for things like iBeacon. And yesterday, goddamit, I think they got it.

Apple talked about 2 primary enhancements to provide Interactive Notifications:

  • Inline Comments - for example, responding to a text message inline within the notification.
  • Inline Actions - for example, offering user some inline buttons which, when tapped, will open the app and provide some context with which to customise the experience.

Let's have a look at them a little more closely:

Image from Yahoo Tech

Image from Yahoo Tech

I can't currently see within the apple documentation where this specific type of interaction resides, and if indeed it is available outside of the message app for use with 3rd party apps - I really hope it is. I can think of a number of great use cases for taking the input and parsing the string to create a very streamlined user experience for manual tracking activities. Even better, the option to use the voice control as well.

I presume it must reside somewhere within the UIKit library, if you spot it, let me know :)

 

Image from Techcrunch

Image from Techcrunch

Actionable Notifications, found in the UIUserNotificationAction class reference give us additional options to setup buttons that the user can tap straight from the notification.

We can set an action, optionally require user authentication, and we can use different UI patterns based on whether the action is likely to be destructive (such as deleting some data) as a result of the interaction. The default is non-destructive, set it in the property.

@property(nonatomic, assign, getter=isDestructive) BOOL destructive

You can also configure whether the action will load the app to the foreground, or simply process the action in the background, using these constants:

typedef enum UIUserNotificationActivationMode : NSUInteger {
   UIUserNotificationActivationModeForeground,
   UIUserNotificationActivationModeBackground
} UIUserNotificationActivationMode;

Oh my frickin' God, this is awesome!

*some developers still abuse them and make them annoying, I can think of a few examples...

Lumpy - iOS App Concept (Part 1)

The Background:

My initial, unqualified view was that there is a problem related to people's perception of the risks of some kinds of cancers, in particular skin cancer, from my own anecdotal experience. It didn't take very long to find an article reinforcing this viewpoint.

All cancers can be fatal if not detected or treated properly, but a new poll has revealed that people worry less about skin cancer because they don’t think it’s as bad or as serious.

Some 53% are less concerned about getting skin cancer than other forms of the disease and 18% think it can be easily avoided, the survey of 5,000 people for theBritish Skin Foundation found.

Almost four in 10 (38%) do not realise that skin cancer can lead to death, while 56% do not know that malignant melanoma - the most deadly form of skin cancer - can spread to other parts of the body such as the liver and brain.

Dermatological surgeon Dr Bav Shergill said: “Skin cancer kills seven people in the UK every day and rates of malignant melanoma continue to rise faster than any other type of common cancer.

”In fact, there are more cases of skin cancer diagnosed each year than any other form of cancer in the UK. However, this research shows that people are often underestimating how serious the disease can be and the lasting impact it can leave on lives.”
— http://www.huffingtonpost.co.uk/2014/03/19/people-dont-take-skin-cancer-seriously-_n_4992759.html

My second view was that I suspected that there would be a significant proportion of the population that

a) Didn't check themselves regularly for lumps, check their moles and other less-well-known risk areas for signals of problems.

b) If they did find something not quite right, the chance of them seeking professional medical advice were slim and that the rates for the population would be low.


Only around a third (36%) of people polled admitted checking their skin or moles for changes that can indicate skin cancer, while 35% say they did not know what they were looking for.

Just a quarter (25%) would get a mole checked by their GP straight away if they noticed a change, while 8% would wait for it to get noticeably worse.

More than a third (34%) were unaware that skin cancer can appear on any part of the body - including under nails and the soles of feet - while 18% were unaware that people of all skin types and colours can get skin cancer.
— http://www.huffingtonpost.co.uk/2014/03/19/people-dont-take-skin-cancer-seriously-_n_4992759.html

ASIDE: The research was from the British Skin Foundation and was only published by the HuffPo.

 

Product Hypothesis

My initial thinking was that an app could work to break down some of these barriers in a number of ways.

How would it work?

A user will register in the app and login.

The user will be able to add their friends as contacts from the list of users.

The user can capture a photo or video of the problem area.

The image is stored locally on the users device.

The user can send the image or video to a selection of their friends list as they see fit.

A friend will receive a notification that they have received a message from the user.

The friend will view the message containing a photo or video.

The viewing of the photo/video is time limited.

The friend will be invited to provide a form of simple feedback to the user "Check it" or "Look's Fine" (or something to that extent).

The image or video is removed from the Friend's inbox

If sent to multiple people, after the final friend has viewed the image, the image is destroyed on the server, unless...

The user opts in to a program for Lumpy to keep images and meta information (votes from friends), but remove the relationship between the image and the person, for the purposes of research (another post on that to come..).

How will this help? 

1. As a way to seek external advice about an area of concern, with minimal friction / commitment and maximum privacy protection.

2. Using social / peer pressure for follow up actions.

3. To learn from the images, using machine learning techniques, as a predictor for risk areas from photographic samples.

 

Designing the App

Initially, I'm going to start with primarily standard iOS7 UI components and gradually customise them and add more complex UI functionalities. Here goes....

 

Email 101 || Opens, Clicks and Conversations

Email 101 || Opens, Clicks and Conversations

 

A badly-written email is about as effective as a love letter addressed “To whom it may concern.” Don’t waste your time writing them.

There are some basics to writing emails, some simple rules that you can follow to maximize the chances that your email will be opened, clicked, and ultimately convert.

A good open rate is regarded as anything above 20%, depending on your content. Open rate is a crapshoot at best. It relies on a mail client preloading a single-pixel gif, which varies depending on everything from the mail client, to whether you’re in the address, to the browser that Gmail is loaded in. With most modern email clients giving a generous preview, it often means that an email can be read without being “opened”, regardless of how you even track opens. Like I said, a crapshoot.

 

You can achieve a good open rate at any list size. If anything, the larger your list grows, the more likely it is that people are opening, unless you’re scamming people into subscribing. So, in this regard, if your open rate takes a nosedive it should be cause for concern, and not simply something that happens as you expand.

Readers slip away over time

However, reader fatigue, like activity churn, is a reality of growing a list of subscribers. Someone who hung on your every word 6 months ago might feel, 24 mails later, that you’re repetitive, or losing touch. The email marketer’s equivalent of the sophomore slump. There is no easy way to combat this, the tactic is “Stay Relevant”, but there’s no quick hack for that, no matter how often people try.

Some tactics will improve your open rate. Subject line and from field are your best weapons here. Barack Obama’s campaign team achieved some stunning results with subject lines such as “Today’s decision”, “I wanted you to be the first to know”, and perhaps his best, a simple personal “Hey”. Other quick hacks include things like interesting characters in the subject line, changing sender for emails to break from monotony, or tweaking time of sending. But remember, over time all marketing strategies result in shitty click-through rates, at first they work, then they don’t.

Intercom.io


Your direct line to every user for product feedback, onboarding, and communications.

Get live insight into who is using your product, and how, and send targeted, personalized messages that drive conversion.

 

I't has now been put upon me to dive into the world Intercom by @R3trosteve. His words precisely. 

"your destiny for the foreseeable, will be to become the master of Intercom.io". 

Using Intercom should stretch my abilities in design, communication, user engagement, marketing and analytic's. 

Before I I have been able to sign up or log in, I have been reading thorugh their blog posts at docs.intercom.io and insideintercom.io

                               docs.intercom.io

Docs.intercom.io is used as a guide and a place that you can visit for tips and guidance on using the tool to the best of its capabillities. 

                                        inside.intercom.io

Whereas, inside.intercom.io is all about blog posts, and introducing new employees, new features and other various topics that go on within Intercom.

 

 

Over the next week or so I will be diving deep into this program learning about it more and being able to discover what it's all about. 

06/05/2014

So today I signed up to Intercom to discover what it does and have been going through the tour which is set up on the site to help you understand a little bit more about various features. 

This image shows the start of the product tour which takes you through various factors and features of Intercom. 

Each box just describes what the feature does and then follows with an example to show you what they mean. 

 

 

 

This is the most basic way of coaching someone through something new and something that I have delivered myself many of times.

There are several feature's which it take you through describing each part and again giving an example to help you learn it better. Any time you feel that you might need some help you can always go back to the tour by clicking the "docs button" in the top right hand corner and then pressing "take the product tour". 


Filtering users to identify groups of a certain interest 

This is the overall look of the page, this lists all of your users. It is simple, clean and easy to navigate around. It's not very useful to stare at a list of 5000+ users. You can't draw any meaningful conclusions from doing that. So what Intercom lets you do is drill down into subsets of your users to answer specific questions. You do this by using Intercom's filters. The filters are available on the sidebar on the left hand side of your user list. 

How do they work? 

Filters are contextual, so for each one you’ll see a different set of options on which to filter. For example, if you are filtering using the 'Signed Up' filter, the options are things like 'Signed up more than 10 days ago', 'Signed up less than 10 days ago', and so on. Whereas if you're filtering by something like 'Sessions', the options are things like, 'Sessions is greater than 5', 'Sessions is less than 5', etc. 

One of the most powerful features of Intercom is the ability to create Auto Messages based on your filters. These can easily be combinations of complex filters. For example, if you wanted to send a message to all of your users that signed up more than 7 days ago, but have logged in more than 10 times and have less than 10 projects, your filters would look like the ones in the image above.

The idea of using intercom is having a simple way to connect and communicate with your users, being able to see who is using the product and being able to build and send targeted, personalized messages that drive conversation, It helps you to understand how your product is being used. Reach out to the right users for feedback. 

Intercom makes it easy to identify certain segments of users like "active, but with no team mates." and talk to talk to them understand why they do what they do. 

How Intercom can Help:

Understand how your product is being used. Reach out to the right users for feedback.

Intercom makes it easy to identify certain segments of users, like “active but with no team mates”, and to talk to them to understand why they do what they do.

Increase conversions by automatically reaching out to users after they sign up

The first few days after a user signs up are make or break. Intercom lets you create a simple communication schedule to ensure that every new sign-up gets individual attention.

Treat customers like humans. Reach out and offer help, let them contact you easily.

No more robotic auto responders or ticket numbers. Intercom makes it easy for customers to reach a real person, and for you to personally respond quickly.

Contact all your customers, or just a segment, with ease.

Nobody sets out to spam their users. But email marketing tools don’t give you much of an option. Intercom makes it easy to segment users, send them personal, relevant messages, and encourage them to reply.

I have only been scraping the surface of what Intercom can really do and look forward to diving deep and becoming the master of the program to help us with future and present projects within customer feedback and execution. 

Users and Customers 

See who your users are and what they do in your project. 

Imagine having a live database of your users that’s lightning fast, easy-to-use, and always up-to-date. That’s Intercom.

Just tell Intercom what you want to know about your users. It will track them in real-time, and automatically segment them.

Send behavior-driven email and in-app messages

With Intercom you know who is using your product and how, so it’s easy to send incredibly contextual messages, to the right users, at the right time.

It’s simple to broadcast a single message or create a feed of triggered messages, freeing-up your developers’ time to work on your product.

Talk like people not Data points 

Intercom connects who your users are, and their activity in your product, to every interaction you have with them.

With the complete picture it’s easy to personalize conversations and ensure every user gets the human touch.


Fuelr || First LIVE Beta Session

Fuelr || First LIVE Beta Session

The goal of a #leanstartup is to move through the build-measure-learn feedback loop as quickly as possible.
— Eric Ries, Lean Startup

And so, with that in mind, I've been pushing to get Fuelr into the hands of real users as quickly as possible.

If you're not familiar with the Fuelr project, you may want to jump back here for an overview.

The Fuelr iOS app, for iPad, although far from production ready, is functional - or so I hoped. Actually, until the live session, I hadn't even seen some of the key features of the group video sessions working in development so I was a bit twitchy.

Goals

The goals for this live trial were:

  1. See if the current prototype was sufficiently functional to deliver a real training session.
  2. Test the product with dubious broadband connectivity
  3. Test an initial content idea for a training session 
  4. Test if the end users actually liked this kind of workout format and delivery
  5. Figure out some guidance / rules for the optimal physical setup for the trainer and the user
  6. Test the fidelity of the video stream
  7. Test the suitability of the audio

The Session

Setup with Testflight

The first issue with any such pre-release test is not so much the app itself, but getting normal people setup with the app, via Testflight, so that they can install and run it. IT always seems to create some confusion, but generally for this test, it was fine. The attendees made light work of the Testflight setup. That is, except one poor tester who suffered at the hands of some hidden iPad preferences, which wouldn't allow Testflight to install. After 15 minutes of debugging by phone, we had to abort and continue with the test session, which was a shame.

For those struggling with this issue, this article provided some tips to resolve, but alas, they didn't work for us.

Physical Setup

I always had in my mind that the physical setup was going to be key for the smooth and seamless delivery of the training, the communication, the relationship between trainer and client. Factors I was considering, included:

  • Relative height of device to the trainer
  • Relative angle of device to the trainer
  • Distance of trainer to the device
  • Effect of above on audio fidelity and the potential need for external microphone
  • Lighting and effect on visual fidelity
  • Optimal contrast between environment background and the trainer/clothing
  • Amount of general space required for trainer to demonstrate exercises effectively

In reality, the iPad is bloody fiddly to position in any way that is not the specific design of whatever general purpose case you are using - there's normally one or two position variants and anything else will just mean that it falls over.

At this point, I'm less concerned with finding the correct case / stand solution, but more concerned with figuring out where the ipad needs to be in relation to the trainer for optimal quality of the session. 

So, with the help of a step ladder, a blanket, some cushions, a magazine and and elastic bungee cord - we had our makeshift way of getting the ipad at the correct height and angle to correctly frame Jo, our trainer, in the video. We could also quickly adjust the angle, great for the shift from standing to floor exercises, by inserting a magazine behind the ipad which was under pressure from the bungee cord and so stayed nicely in place.

We found that it was better to have the device lower down, around 1 - 2ft from the floor, angled up slightly for standing shots. Though, I neglected to measure our final setup, note to self, do that next time.

Needless to say, not a scaleable or practical solution, but very useful for the purposes of determining the guidelines and possibly creating a low cost solution that could be sent to trainers and users to improve the overall experience.


Broadband Connectivity

From the trainer side, we ran the session from a fairly poor 6mbps down / 0.5 mbps up ADSL line. At Jo's end, we had a couple of issues with the video stream freezing, particularly when we had more then one device connected to the session on the same network. When we killed the additional device connections and refreshed the session, we got through the entire 2nd half of the session without issue. 

For the clients on the other side, of whom, I know at least one had a good 60mpbs down / 18mbps up connection, they reported no issues of freezing or lost connection to the video stream. "It's just like Facetime..." said one of the participants, not sure whether that was compliment, at least she didn't say Skype ;)

Content

My challenge to Jo, who is in charge of the operational side of things, was to think about the style and tone of the content. To think about what type of sessions would be compelling, engaging and fun when delivered. Our initial session was a highly targeted, dynamic 30 minute glute workout, shaping those buns for the summer ahead. After a quick warm up, there was a smooth transition into the main workout and then into the cool down. 

The content was good, had zero dependencies in terms of equipment and the guys had a great time during the session.

Social Experience

A really interesting side effect was that, through the Fuelr session, the people training who didn't know each other before hand, really engaged with each other and with the trainer in a way that was unexpected. This was a really positive outcome and one I'm keen to investigate the dynamic of in future sessions.

To Sum Up

Really pleased we simply managed to successfully complete a full session, via a 3-way connected iPad network, with people who didn't know each other - engaging around a common goal - to tighten up their buns!

Can't wait to push this further and see where it leads.



Raspberry Pi || Sending POST requests to a web service with python

Yesterday I spent a few hours getting acquainted with my Raspberry Pi.

The mission, was to simply setup the Pi, create a simple script to write some output, to a text file. Then, to create a cron job to process that script every few minutes. After that, I would get acquainted with Python modules, firstly by getting the current time and outputting that to the log.

Finally, constructing a POST request to a 3rd party web service to send that timestamp to.

What we did:

Using Python version 2.7.3rc2 on a Raspberry Pi, running Raspian distribution of Linux.

We first got a simple python script writing to a text file, getting the current time using the python Time module and appending it to the file contents. 

import time

f = open('/path/to/folder/test/log', 'a')
# current_time = time.asctime( time.localtime(time.time()) )
current_time = time.strftime('%I:%M%p %Z on %b %d, %Y')
f.write(current_time + '\n')

f.close()


Then we created a cron script to run on boot of the Pi and then every 2 minutes, to run the python script. 

$ sudo crontab -e
# m h  dom mon dow   command
*/2 * * * * python /path/to/folder/test/add_note.py
@reboot python /path/to/folder/test/add_note.py

From there, we constructed a POST request to the nourish staging (old) Notes endpoint, firstly via the Python shell (IDLE) which comes with the Raspian distribution of Linux. 


Key here was the use of two further Python modules: urllib and urllib2 


import time
import urllib
import urllib2

url = "http://api.someservice.co.uk/api/v2/notes/?auth_token=XXXXXXXXXXXXX"

current_time = time.strftime('%I:%M%p %Z on %b %d, %Y')
date = current_time
post_data_dictionary = {'log[person_id]':12, 'log[user_id]':67, 'log[text]':current_time}
post_data_encoded = urllib.urlencode(post_data_dictionary)
request_object = urllib2.Request(url, post_data_encoded)
response = urllib2.urlopen(request_object)
html_string = response.read()

f = open('/path/to/file/test/log', 'a')
f.write(html_string + '\n')
f.close()

Note that in Python 3, urllib2 has been merged into urllib, so no need to declare both in that case. 

I then updated the cron to process this file and refactored the script a bit. 

Authentication just passes the auth token as a param, so need to improve there. 

Next step is to get the actual data via an analogue to digital converter, and interface to the Pi, via SPI. We want to end up with a self contained RJ45 which interfaces directly to a pressure sensor for bed or chair interactions. 

We also need to change the location that this data is sent to, either the existing mongodb or some other suitable data storage, which can then be interrogated and queried at will by a caffeine fuelled CEO. 

Team Treehouse

Team Treehouse

A key part of my structured training, has been to learn the fundamentals of web design - encompassing HTML & CSS.  And to learn this, I've been using Treehouse.

Treehouse, a leading online education provider,  seeks to help prospective coders become great coders by providing a rich library of over 600+ videos organised into specific learning tracks, along with interactive quizzes and code challenges. Treehouse provides deep and high quality training in HTML, CSS, Javascript, User Experience, as well as Back-End development in Ruby, PHP, iPhone and Android applications.

I have found it a truly enjoyable experience learning on Treehouse; its simple, effective, and offers so much for the learner to get to grips with. 

Along the journey you get to create projects that help you to understand the process. The first thing I created was a single page website for a bakery company called "Smells like Bakin". It took you through all the coding and then they give you a quiz at the end of each little section to make sure you understand what they've been teaching. Then, after that, there's a code challenge where they ask you to code yourself what they have taught you, via the online code editor, to start creating your web page. 

Screen Shot 2014-02-28 at 13.12.51.png

So this was the first project I built through Treehouse, which covered all the basics in HTML and CSS. 

The next stage works on other basics including tables, charts, links, text, lists, objects and forms, again at the end of each of these you have to take a quiz and a code quiz to show you have grasped the fundamentals, I find it really easy to learn from this and has helped a lot in giving me some foundational knowledge of how websites are made and the challenges we face when designing and building for the web. 

The next module will be learning more advanced HTML and CSS that I will be able to add to the Project to make the website more dynamic and engaging.