CSI Media
 
CSI Media Website Design Company Blog

CSI Blog

05 December 2011 Posted in General Blog

The Grand Shaving


So, we grew our mos for the whole month, and now the most spectacular of the lot has graciously allowed us to photograph him shaving it off. After a little bit of over-exposure, he looks an awful lot like Keith Lemon...

  •  FordiLemon

  • Pretty impressive mo, even if the picture is a little '40s… flying jacket, anyone? 

  • And, now, on with the shaving!
  • shaving

  • All done... we could easily do the whole ten years younger thing, just shave off your moustache.
  • allsmiles
    If you fancy donating to this majestic mo, just head here:
    http://mobro.co/thetashingmrford

Read more...

22 November 2011 Posted in General Blog

Raising money for men's cancers by growing a Mo!

Well, as some of you may be aware it's MOvember and a few of us in the office have been joining in. From the spring lambs with barely a hair to show, to the Elders of Code with full-on face furniture.

We've not shaved them since November the first, and they won't be leaving til December the first! Come the first of December, we'll shave off these majestic mos and we'll post pictures of the grand de-tashing here to show you all our efforts.

Movember is all about raising money for men's cancers, and raising awareness. Sad to say it, but us blokes don't go to the doctors as often as we should, nor do we discuss our family history like supposed to either. The idea of having something in-your-face like a  moustache is to prompt questions and a discussion about what Movember is, and thus raising awareness.

Taken from http://uk.movember.com/about/ - Mo Bros effectively become walking, talking billboards for the 30 days of November and through their actions and words raise awareness by prompting private and public conversation around the often ignored issue of men’s health. 

The funds raised in the UK support the number one and two male specific cancers - prostate and testicular cancer. The funds raised are directed to programmes run directly by Movember and our men’s health partners, The Prostate Cancer Charity and the Institute of Cancer Research. Together, these channels work together to ensure that Movember funds are supporting a broad range of innovative, world-class programmes in line with our strategic goals in the areas of awareness and education, survivorship and research.

Please donate to Movember: https://www.movember.com/uk/donate/your-details/type/donate-to-cause/member_id/96/

Read more...

26 October 2011 Posted in General Blog

A quick sorry for being so quiet of late.

As some of you may have noticed we have been a lot quieter than usual and are not attending many of the exhibitions we normally participate in.

Why?

To put it simply we have been sooooo busy!! We have quietly launched 7 web systems and sites over the last 2 months with 6 more due over the next couple of weeks.

We have also won 12 new contracts within all sectors, a lot of which are still in travel, but 3 of which are mobile applications. How exciting.

Here are some of the fantastic successes we have enjoyed recently:

1) We launched a travel website a few weeks ago that took over one million pounds in its first 5 days! WOW, but guess what we can't tell you a single thing about it :-(  - Actually we had our best day on the Travelberry platform 7 days ago, taking a whopping £800,000 + in one day!

2) We launched our new ecommerce platform that has already increased sales for two clients by over 300%. Look for these on our portfolio soon.

3) We have sold 6 new tour operator solutions, two of which will add over £250,000's worth of new development and features over the next 6 months.

4) We have now increased our team by 6 in the last 3 months. The good news is they all make a great brew.

We are incredibly proud of our achievements of the last few months and are very sorry that we might not be able to see you at the WTM or Travel Technology Europe show early next year. Our existing clients must come first and by hopefully working together with them, you will be able to follow their successes as well as ours.

Don't forget if you have any exciting projects for next year or you want a chat you are more than welcome to pop up and have a cuppa with us northern folks.

Toodle pip for now.

 

 

 

Read more...

19 September 2011 Posted in General Blog

How do you improve your online experience?

Let’s face it, anybody who has run an online business for a while has their own opinions on what they should and shouldn't be doing to achieve the best results from their website.

The truth is that in a lot of cases being different and having your own opinions is fine, but only if you make sure that you have covered some of the basic principles of ecommerce and web build.

Here are 5 things we feel you should always consider when you are looking to build a transactional or information based website:

Website consideration number 1:

Make sure the website clearly shows what you provide and always has a strong call to action!

A website should always convey your brand and visually impress consumers from the very first few seconds they reach the site, but not at the expense of clearly displaying your products and services.  

The call to action should always be strong on any website irrelevant of what you sell or provide.  If a website does not guide the consumer to an area of call to action the site is not serving its purpose.

Web design consideration number 2:

Don’t rush a site live!

We all have commercial deadlines to hit, but if you don’t feel your website is ready for the consumers, don’t send it live.

Your website is your online shop window and if it has gone live with bugs, the site will make the wrong first impression. Web Designers will always fix bugs before you go live and sign off, so make sure you give yourself the right amount of time to test and smooth out any issues before you go live.  

Web consideration number 3:

If your website is going to take online payments it is imperative to remember to keep the purchasing and payment process streamlined.

Pricing and what is included must be crystal clear.

You must look to generate consumer confidence and trust by clearly displaying concise policies, security badges, trust certificates and contact information. Consumers can be very cautious when asked for personal information, with news of hacked websites being increasingly reported. The biggest and best online companies in the world recognise the importance of consumer confidence and by using these techniques it is one way to help alleviate any fears they may have.

Website design consideration number 4:

Website usability is massively important. If you find your website hard to use during the build process, how will your consumers get on?

You should always make sure your consumers can quickly find and discover products / services by offering clear navigation / calls to action.

Don’t forget the consumers will not always start on the home page so you should have strong product / service landing pages for them to arrive at, with clear call to action. It must also be easy for them to navigate to other product and service areas within your website. 

Website design and marketing consideration number 5:

Once your website is ready to go live and you are happy with everything, the marketing of the site needs the same level of consideration. The days of just throwing some PPC at it are long gone.

Make sure the marketing is always relevant and that you understand the ROI on every penny you spend!

Don’t forget it’s not always just about traffic levels. A site is better having 100 visitors to your website a day with 10 people looking for the product and service you offer, than 20,000 hits a day with only 1 visitor being a potential customer.

SEO and Social Media should form part of your overall plan, but don’t be under any illusion. They take time and effort to implement and come with all the associated costs. Time is money!

Every marketing avenue you look at should be considered and understood. Eventually you will find the marketing streams that will work for your business, which will create the foundation for you to build on.

We hope you have found this useful!

Read more...

15 July 2011 Posted in Development

Yet another cool feature of LINQ

For my current project I am implementing a dynamic rule system. In the admin area users will be able to setup a rule by specifying one or more conditions. A condition is setup by selecting a field (such as first name, country, DOB etc), an operator (equals, less than, greater than etc) and providing a value to compare against ("Andy", "UK", "1985-09-03" etc).

The aim is that users can specify any criteria they want for a rule, e.g. "match all people from the UK where their DOB is before 1985" or "match all people who's name begins with 'Andy' and are male".

On the front end when a user performs a search it should be able to load that rule from the database and run it against the current request. So if you image the request as an object with a child object of "Customer", and that customer object has the properties "FirstName", "Country", "Gender" and "DOB", then the rule system should be able to interparate the criteria and check them against the current instance.

So how in the world do you do that? In a previous project I made a similiar rule system, but all the fields were hard coded as enum values. The rule logic had a massive switch statement that for each entry would get the applicable value from the passed in object. E.g.

switch (ruleCondition.Field)
{
case Fields.FirstName:
return search.CustomerInfo.FirstName;
case Fields.DOB:
return search.CustomerInfo.DOB;
}


The problem with the above approach is that if a new field needs adding in the future then you need to add an enum value, update the rule logic to use the new enum value, ensure the admin area supports it etc.

My approach for the current project is to use LINQ expression builder. A while ago there was a guy who worked with me who was a guru at everything .NET. He taught me LINQ and Entity Framework. He also introduced Microsoft WorkFlow. Basically that is like using Eval() in JavaScript or classic ASP. You can pass a .NET statement as a string into work flow and it will compile it in runtime to a usable function. I don't know the ins and outs of WorkFlow, but judging by it being available for .NET 2 I doubt it uses LINQ expression builder (LINQ was introduced in .NET 3.5), it is more likely using reflection, e.g. you provide "CustomerInfo.FirstName", it is using reflection to find the property "CustomerInfo" against the current search object, and then using reflection to find the property "FirstName" against the CustomerInfo object.

Don't get me wrong, WorkFlow is brilliant, but in my opinion LINQ expression building superseeds it. So what is LINQ expression builder? If you don't know LINQ, then the rest of this blog is unlikely to make sense. Take the following statement:

List foundPeople = people.Where(x=>x.FirstName == "Andy").ToList();


Looking at the LINQ part, we have:

people.Where(x=>x.FirstName == "Andy")


Lets break that down. We have a collection of "Person". We are selecting all from that collection where the "Where" condition matches. I.e. it loops through each item in the collection and adds each item that matches the criteria to a new collection that is returned. The condition in this example is FirstName == "Andy". Using a traditional foreach approach that might be:

List foundPeople = new List();
foreach (Person x in people)
{
if (x.FirstName == "Andy")
{
foundPeople.Add(x);
}
}


All those above lines reduced to a single line in LINQ, got to love it :D Anyway, we are looping through each "Person" item in the collection and for each item, inspecting the FirstName property and checking if it equals Andy.

So breaking it down, we have:
Input param: Person
Left value: "FirstName" property
Operator: Equals
Right value: "Andy" constant

The way I just broke it down above is how LINQ expression builder works. You:
1) specify the input param(s)
2) Specify the field(s) to lookup
3) Specify the criteria
4) Join it all up

So lets take it step by step. First step, specify input param:

ParameterExpression inputPerson = Expression.Parameter(typeof(Person), "x");


The above statement is creating an input parameter. We accept an instance of type "Person" and will call that parameter "x". You can call the parameter whatever you want.

Next we do:

Expression firstNameField = Expression.PropertyOrField(inputPerson, "FirstName");

The above statement is creating an expression for getting the value from the "Person" instance via the property or field "FirstName". PropertyOrField means it will look for either a public field called "FirstName" or a get property called "FirstName". We are passing in the "inputPerson" parameter, which is our "Person" instance, so effectively we are writing "x.FirstName"

ConstantExpression nameValue = Expression.Constant("Andy", typeof(string));


The above statement is creating a constant of type string with the value "Andy". Remember in our LINQ we wrote 'x.FirstName == "Andy"', well there is the "Andy" segment. Why do we have to go through the hassle of specifying typeof? Because you can provide any value, it could be an integer, an enum, a boolean etc. The typeof allows LINQ to assert that when you specify a condition the left and right side are of the same type. E.g. you are not allowed to expictly match a string to an integer (take that, VB users!)

BinaryExpression equalsCondition = Expression.Equal(firstNameField, nameValue);


The above statement is glueing the two sides of our condition together. On our left side we have x.FirstName, on our right side we have "Andy". We are specifying the join as "equal" which equates to 'x.FirstName == "Andy"'. We are nearly there!

Expression<Func> expr = Expression.Lambda<Func>(equalsCondition, new ParameterExpression[] { inputPerson });


The above statement finally puts the rule together. We specify that the rule accepts a Person and returns a bool (Func), we build the rule using the equalsCondition and then specify all the parameters that are expected (person in this case).

That results in an expression tree of our rule, but how do we use it? We compile it!

Func compiledRule = expr.Compile();


We can then use it like any other function:

List people = this.GetAllPeople();
List matched = people.Where(x=>compiledRule(x));


The compiled rule performs the logic that we built up. Obiviously it seems a lot of work to simply check if the person's name equals "Andy", but the point is that it was built dynamically.

We could had got the name from the database and fed the constant with:

String name = this.GetName();
ConstantExpression nameValue = Expression.Constant(name, name.GetType());


We could have got the operator from the database:

OperatorKey key = this.GetOperator();
BinaryExpression condition = null;

switch (key)
{
case OperatorKey.Equals:
condition = Expression.Equal(firstNameField, nameValue);
break;
case OperatorKey.NotEquals:
condition = Expression.NotEqual(firstNameField, nameValue);
break;
case OperatorKey.LessThan:
condition = Expression.LessThan(dobField, dobValue);
break;
}


Noticed in the LessThan example I used dob, you could populate that as:

DateTime dob = this.GetDOB();
ConstantExpression dobValue = Expression.Constant(dob, dob.GetType());


We could even get the field to lookup from the database!

string lookupField = this.GetLookupField();
Expression field= Expression.PropertyOrField(inputPerson, lookupField);


Icing on the cake, you can string multiple conditions together, e.g.

BinaryExpression dobCondition = Expression.Equal(dobField, dobValue);
BinaryExpression nameCondition = Expression.NotEqual(nameField, nameValue);
BinaryExpression completeCondition = Expression.AndAlso(dobCondition, nameCondition);


In the above, we are combining the dob and name conditions together using an && statement. That might look like:
x=>x.DOB == dob && x.FirstName == name

In the future if you added an extra property to the Person class, e.g. "LastName", then you could add to the database a new record to represent the "LastName" field. No code changes required (assuming the Person class is defined in a separate dll)!

That is what I am hoping to achieve with my current project. I will have a database table filled with all the available fields. In the future I can add new fields to the table and they will appear in the admin area and will function correctly in the search logic.

Read more...

10 April 2011 Posted in General Blog

Team Of Web Designers from CSI Media climb snowdon for make a wish foundation

A team of us climbed Snowdon at the weekend to raise money for the charity Make-A-Wish Foundation! 14 members of the CSI Media team (and Sally the dog) got their walking gear on and tackled what was probably one of the most difficult physical challenges any of us have ever done before (with the exception of Nick who is a pro at this kind of thing).

It was a scortching hot day and many of us soon realised that we were in for a hard day of walking (much of it actually climbing up some pretty big boulders), but we couldn’t give up after raising just over £900 so far for such an important children’s charity.

We managed to complete the climb in less than 6 hours, 3 hours up and 2 hours 45 minutes down. Not bad considering the sign at the Visitor Centre states that our chosen trail up is ‘Very Challenging’! It was very relieving to see the top of the peak within a few strides, the only disappointment for many of us was that the bar at the summit was closed.

Anyway, we are all recovering quite well with a few stiff legs and blisters but nothing too severe, and some people have actually been talking about possibly climbing Scafell Pike next year for charity.

Enjoy the photos and feel free to donate to Make-A-Wish Foundation, it’s not too late and will make some very poorly children’s dreams come true :)

 

Web Designers Beat Snowdon

Web Designers Beat Snowdon

Web Designers Beat Snowdon

Web Designers Beat Snowdon

Read more...