Wednesday, July 07, 2010
Marketing Manager – Online
Equator is Scotland’s largest full service digital agency. Established in 1999, Equator has grown to be a team of over 60 talented online enthusiasts, positioning us as a top 20 UK design & build agency. Equator’s marketing team currently delivers successful SEO, PPC, affiliate, media and social media campaigns for big names including AllSaints, RSPCA, SSE and AXA. Within Marketing we are recruiting a Marketing Manager to support the Marketing Director and manage operations within the department.
Marketing Manager - The Overview:
- Location - Glasgow (G3 8EX) with occasional travel
- Career development within the dynamic online marketing sector
- Platform to deliver in a growing marketing team.
- Competitive salary dependent on experience and skills
Marketing Manager - The Vacancy:
Marketing is one of the business units at the heart of what Equator does with responsibilities for developing, launching and managing paid search, natural search optimisation, affiliate marketing, media and social media campaigns. As a Marketing Manager, your focus will be to support the Marketing Director in developing and delivering campaigns for our 20+ marketing clients.
- Help deliver strategic planning for all current clients
- Support Marketing Director in development and expansion of function
- Support and manage functional team managers within department
- Maintain and develop client job management
- Coordinating the delivery of new propositions and assist in identifying and developing new business streams
- Identify, monitor and manager key business measures within the function to validate success of departmental works
Marketing Manager - The Person:
To operate successfully in this marketing role, you will need to demonstrate the following experience and have these points clearly presented in your CV.
- Experience within an online marketing environment, with experience of managing a small team
- Sound commercial experience (marketing) supporting delivery of ‘bottom line’ profit performance within a business.
- Experience of driving and implementing business change
- Evidence of both strategic and short-term planning experience
- Ability to work as part of a team, and within a matrix organisation
- Communicate effectively and influence at all levels in the business
- Confidence, presence and determination to succeed in a dynamic and demanding business environment with a passion for producing results that have an impact.
Please apply online to martin.jordan@eqtr.com. Please send your letter and CV as one document. This role will be shortlisted in mid-late July.
Tuesday, July 06, 2010
Recently we all moved to Windows 7 (64bit) on our development machines. With that, we moved also to IIS7.
So that meant that development copies of websites that we are working on have to
be moved to IIS7. This should be simple. Right?
When I attempted to get the first site up and running I got hit by the error "Could not load file or assembly 'System.Web' or one of its dependencies. An attempt was made to load a program with an incorrect format.".
(The full error message is below.)
After searching around I eventually managed to piece together that the reason
was that IIS was trying to run in 64 bit mode and this application was compiled
as a 32 bit application. Okay.... So how do you fix this?
It turns out the fix is rather easy. In the IIS Manager, open up the list of
Application Pools and select the pool for your application. Right-click and
select "Advanced Settings". From that point you get this dialog:

Just set "Enable 32-bit applications" to "True", then Okay the dialog. You then
have to recycle the Application Pool for the change to take effect.
Server Error in '/' Application.
Could not load file or assembly 'System.Web' or one of its dependencies. An attempt was made to load a program with an incorrect format.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.BadImageFormatException: Could not load file or assembly 'System.Web' or one of its dependencies. An attempt was made to load a program with an incorrect format.
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
|
Assembly Load Trace: The following information can be helpful to determine why the assembly 'System.Web' could not be loaded.
WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].
|
Stack Trace:
[BadImageFormatException: Could not load file or assembly 'System.Web' or one of its dependencies. An attempt was made to load a program with an incorrect format.]
System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) +0
System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +416
System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +166
System.Reflection.Assembly.Load(String assemblyString) +35
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +190
[ConfigurationErrorsException: Could not load file or assembly 'System.Web' or one of its dependencies. An attempt was made to load a program with an incorrect format.]
System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +11207304
System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +388
System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +232
System.Web.Configuration.AssemblyInfo.get_AssemblyInternal() +48
System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +210
System.Web.Compilation.BuildProvidersCompiler..ctor(VirtualPath configPath, Boolean supportLocalization, String outputAssemblyName) +76
System.Web.Compilation.CodeDirectoryCompiler.GetCodeDirectoryAssembly(VirtualPath virtualDir, CodeDirectoryType dirType, String assemblyName, StringSet excludedSubdirectories, Boolean isDirectoryAllowed) +11196482
System.Web.Compilation.BuildManager.CompileCodeDirectory(VirtualPath virtualDir, CodeDirectoryType dirType, String assemblyName, StringSet excludedSubdirectories) +185
System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() +551
[HttpException (0x80004005): Could not load file or assembly 'System.Web' or one of its dependencies. An attempt was made to load a program with an incorrect format.]
System.Web.Compilation.BuildManager.ReportTopLevelCompilationException() +76
System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() +1012
System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters) +1025
[HttpException (0x80004005): Could not load file or assembly 'System.Web' or one of its dependencies. An attempt was made to load a program with an incorrect format.]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +11301302
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +88
System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +11174792
|
Version Information: Microsoft .NET Framework Version:2.0.50727.4927; ASP.NET Version:2.0.50727.4927
Thursday, June 24, 2010
If you are going to dump user generate input into XML please remember to escape appropriately. For example, the ampersand symbol has special meaning in XML and you must escape it. e.g. & becomes &
Monday, June 14, 2010
I’ve noticed that when ever I have to get in touch with customer services for after sales advice then I get a really bad service. I tend to get stock answers that suggest the person who responded didn’t really read my inquiry. Often they will tell me how important I am, but that really is not the impression I get. I don’t want stock answers. I don’t want to be told how important I am when it is so obvious that it really isn’t true.
However, sometime I see examples that really make me think: Didn’t someone in management at least care enough to stop stuff like this happening.
The example I’m talking about is from Halfords. I was looking for a download of the instructions for my bike rack as I’d lost them a while ago. When I searched for them I found a forum on Halfords website attached to the product that where someone had asked that very question: “Would be it possible for you to send me a complete set of instructions for this bike rack. I have lost mine.”. Now rather than actually answer the question Halfords responded with “The Halfords Bike / Cycle carrier range are designed to be universal. The range of products will fit most cars (This carrier is not recommended for cars with spoilers) The Halfords Rear Mount 3 Cycle Carrier should fit your model of car. Halfords colleagues in any one of our stores will be able to assist you in selecting the best bike carrier for your needs and provide fitting if required”

Ummm… okay. That’s just paraphrasing the product description already.
Luckily, someone, another customer I presume, was at least more helpful and showed how to find the instructions on the website. More helpfully, they also included a direct link to the instructions to make it easy.
Why couldn’t Halfords have done this? Why did they think they could get away with fobbing off the customer with stock drivel?
Thursday, May 20, 2010
I’ll be standing down as chairman of Scottish Developers shortly. I’m not leaving, I’m just looking for a different role within the user group. But as I’m hanging up that particular hat I felt I would add my own personal feedback to the feedback we have received over the last three DDD Scotland events.
On the whole the DDD events in Scotland have been exceptionally well received, especially considering the amount of polish in the main DDD events that happen in Microsoft’s UK HQ in Reading. I suppose from my perspective, sitting on the inside, seeing exactly how it is hanging together I’m always amazed that the feedback is so positive. It is a testament to all the other organisers, speakers and helpers on the day that help keep the event running smoothly.
That said, I feel there are some people that are not fully aware of what goes into organising this event, and on what kind of a budget that we manage it. The speakers are not paid, they volunteer their time, travel, and accommodation expenses.
What makes a DDD event?
The goals for DDD events, as a whole are:
- The event is free to delegates
- There are no marketing talks.
- No speakers from Microsoft.
- The sessions are voted on to the agenda prior to the event.
You don’t have to aim for everything on this list, and at DDD Scotland we didn’t for various reasons.
We do our best to ensure that it is free to delegates. And we’ve managed that three years running and we will continue to do that for as long as we can.
What follows is some information about how we run the events based on the feedback we have received. I hope this gives you a little insight in to the event. We have received other feedback too that we will be acting upon to improve the event, and if possible we will act on the feedback below to improve things too. I just really wanted to get over the constraints we were running under so you didn’t think that after three years we weren’t listening. We do value all feedback.
The event is “not very well advertised”
We have no advertising budget so we use social media such as blogs, twitter and the like to get the word out. However, even with no advertising we were still oversubscribed. The event “sold out” in 15 days, 3 hours and 35 minutes. After that it went to a waiting list. At its peak there were 88 people on the waiting list.
“Tons of people who signed up didn't come, maybe the people on the waiting list should the get the spaces of the people who didn't turn up.”
We do our best on this count. If people realise they cannot come they can unregister which means the website will invite someone on the waiting list along. However, if someone doesn’t want to go and they also don’t unregister then there is little we can do about it.
Over the three years we have run the event we have had a 30%-33% drop out rate and we take that into account when allowing people to sign up. For example, this year we allowed 280 people to sign up before the waiting list was activated, in the end we had 188 delegates turn up on the day. We were aiming for 200 delegates, the same as last year. Last year we had 176 turn up.
In the 24 hours prior to the event the waiting list dropped by 60% allowing nearly 50 people that otherwise would not have had the opportunity to go a chance to get to the event.
“As you go feedback [is] better than a few days later”
This is interesting. There is a debate between some of the various DDD organisers as to which is better: online feedback after the event or paper based during the event.
I can’t say which provides better quality feedback. However, my particular take is that I want to get feedback to the speakers as quickly as possible. The sooner a speaker gets feedback the quicker they can see issues they may have and resolve them, or the quicker they can see what is working or what people appreciate about their presentation.
I also feel that when I get asked for feedback immediately I have a better recollection of what I’m feeding back on. If I wait a couple of days the memories are fading and I won’t recall something that would have helped the speaker improve.
We did a little experiment, with one of the speaker’s permission. He happened to run the same session at DDD8 in Reading as well as at DDD Scotland this year. We compared the feedback he got on line for DDD8 versus the paper feedback he got from DDD Scotland. Roughly the same percentage of the audience filled in feedback, of those that did, roughly the same percentage filled out comments (which is more valuable to the speaker than the raw ratings do). However, where there was a significant difference was that the amount that was written in the freeform feedback was greater online… Perhaps, as developers, we are so used to typing that we can’t write so much these days. But then, was all that extra written material an increase in quality as well as quantity?
I guess the debate will continue on that front.
“Make it a 2 day event, do it twice a year (or more)”
I’d love to do that. It is just very hard work for doing it once a year. But the two day idea is certainly something I’d entertain.
Scottish Developers have noticed that if we run day events during the week we do get a slightly different audience so perhaps it would be an excellent way of reaching out to those that can’t make a Saturday.
Incidentally, the Saturday concept was so that the event didn’t impact on the working week so that contractors didn’t lose a days pay and so that the genuinely enthusiastic could continue geeking out at the weekend.
“The lunch break was too short”
The lunch break was 90 minutes. However, we do have activities on during the lunch break to keep people interested. Unlike previous years, this year we only had grok talks – these are short 10 minute talks that represent topics that would not suit a full presentation or a taster for a full length session.
“more in depth” - “not for beginners”
One of the key aspects of DDD events are their democratic nature. Some people may want more elementary sessions while others may prefer more in-depth sessions. But on the day, what is on the schedule was put there by votes. Every single session was voted in. Back up sessions are chosen by votes too. No session appears without having been voted in.
However, that said, when the ash cloud threatened to disrupt the travel plans of most of our speakers we would have been prepared to bend the rules on that one slightly just to be able to put on an event.
“put feedback forms in goodie bag”
Interestingly we did that last year and we didn’t get that many of them back. People either just didn’t realise they were there or forgot about them. Either way, it meant that the feedback was not as comprehensive as we’d have liked.
Putting the feedback forms on the seats works better for us we’ve found.
“The food was a bit disappointing” - “More coffee in breaks” - “Why not run a café?”
Yes, we know. Unfortunately our budget didn’t allow us to stretch any further than we did. The catering bill was by far the largest expense. Since GCU kindly donated the venue to us for the day the catering budget accounted for about 90% of the running costs.
The first year we ran we got feedback decrying the fact that we didn’t put on breakfast. Possibly this was due to some people who were used to the DDD events in Reading which have the backing of a big corporation that can afford, to us, such luxuries.
There is a café on the ground floor at the venue, however it is closed on a Saturday. We did, the first year, look in to opening it up but were told that was not possible.
Ultimately, what we can afford depends on how much sponsorship we can pull in. This year was particularly disappointing. We were lucky in that we still had a sizeable chunk of money left over from last year which, in fact paid for most of the conference this year. Next year we will be starting from a relatively clean slate financially. Simply put, the cupboard is bare.
“Too much Microsoft oriented presentations”
The conference is run as democratically as we can. If you want to see more non-Microsoft oriented technologies then we need more submissions from people offering non-Microsoft oriented sessions and then we need enough people to vote on them.
We also had people asking for more consistent tracks and we do our best to work in a route through the agenda so that a person who has a high level interest in a particular area, say web technologies, has a route from start to end. But ultimately we can only work with what we have, and what we have are sessions that were submitted and a set of votes telling us what people want to see.
For the future
There are a number of points above that we will try to fix, just as soon as we can. For example, we’d love to keep you all properly fed and watered during the day. We’d love to do this more often, have an event every 6 months or a two day event. We’d love to vary the city.
For these things we need more sponsorship. Not just the variety where a vendor gives us free licenses. I’m not saying we don’t want that. We love to get items from sponsors to use as prizes or swag, it keeps things interesting during the day, but ultimately we need things we can use and the bottom line is mostly money.
If you have any ideas that will help up put on a better event, especially if it helps us solve the issues we currently have then please get in touch at support@scottishdevelopers.com
Friday, March 19, 2010
Type Inference is a neat feature where the C# compiler can work out itself what type a reference to an object is. While this can be used for the developer to be lazy it is most useful when you are dealing with the exceptionally long type names that LINQ expressions can generate. It is also a requirement when dealing with anonymous types, because there simply is no type name that you can use.
For example:
var aString = “ABC”;
Type st = aString.GetType(); // System.String;
var aNumber = 123.45M;
Type nt = aNumber.GetType(); // System.Decimal
var aDate = DateTime.Now;
Type dt = aDate.GetType(); // System.DateTime
In each of the above examples the compiler works out from what is on the right side of the equals sign the type of the reference (or value) on the left hand side.
What is important is that the compiler has something it can work with. In other words, you must assign something.
var aString; // Illegal – Can’t infer type
// Computer says "no":
// Implicitly-typed local variables must be initialized
Also, because the variable is strongly typed from the get-go each time you assign something to it, it must be of the same type.
var aDate = DateTime.Now;
aDate = 123; // Illegal – Can’t change type
// Computer says "no":
// Cannot implicitly convert type 'int' to 'System.DateTime'
Wednesday, March 17, 2010
A while ago I wrote about all the new language features of C# 3.0 and it occurred to me that I'd left out a chunk about Lambdas. With LINQ being such an important part of C#3.0 that seems like a terrible omission, so I'm going to make up for it now.
The easiest way to think about a lambda is that it is a short form of anonymous methods that were introduced in C#2. However, you can also use lambdas to create expression trees (I'll come to those in more detail in another post, for the moment, I'll be concentrate on using lambdas for creating anonymous methods).
Basic Structure
A lambda that looks like this
(i) => 123 + i
^^^ ^^ ^^^^^^^
(1) (2) (3)
is compiled to an anonymous method
delegate (int i) { return 123+i; }
^^^^^^^ ^^^^^^^^^^^^^
(1) (3)
The first part of the lambda (1), in the brackets, declares the parameters. The brackets are, incidentally, optional if there is only one parameter. The type is inferred so you don't have to explicitly declare it as you would have to do with an anonymous method. However, if the compiler cannot infer the parameter type then you will have to declare it explicitly:
(int i) => 123 + i
The second part (2) is pronounced "goes to" and does not really have an equivalent with an anonymous method, although you could argue that it is the equivalent of the delegate keyword.
The third part (3) is the expression or statement. In a lambda expression the return is implicit so it does not need to be declared. It can also contain a number of statements enclosed in separated by semi-colon, but in that case it cannot be used to create expression trees and you must explicitly have a return statement if there is something being returned.
delegate void DisplayAdditionDelegate(int i, int j);
DisplayAdditionDelegate add = (i, j) => { Console.WriteLine("{0} + {1} = {2}", i, j, i+j); };
add(2, 5);
// Output is: 2 + 5 = 7
Framework assistance
The .NET Framework provides a number of predefined generic delegate types that can be used with lambdas in order that is is easy to refer to them and pass them around.
Each of these contains a generic list of parameter types and finally the return type, or if there are no parameters just the return type.
The delegates with a return type are defined as:
public delegate TResult Func<TResult>()
public delegate TResult Func<T, TResult>(T arg)
public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2)
public delegate TResult Func<T1, T2, T3, TResult>(T1 arg1, T2 arg2, T3 arg3)
public delegate TResult Func<T1, T2, T3, T4, TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4)
The delegates without a return type are defined as:
public delegate void Action<T>(T obj)
public delegate void Action<T1, T2>(T arg1, T2 arg2)
public delegate void Action<T1, T2, T3>(T arg1, T2 arg2, T3 arg3)
public delegate void Action<T1, T2, T3, T4>(T arg1, T2 arg2, T3 arg3, T4 arg4)
You can then uses these delegates to represent an appropriate method without having to create a custom delegate type - for most purposes they are quite sufficient.
Outer variables
Outer variables are variables that the lambda can use that are defined in the method that defines the lambda.
int j = 25;
Func<int, int> function = i => 100 + i + j;
j = 75;
int result = function(50);
// result == 225
As you can see in the above example the value of j is not evaluated at the point the lambda is declared, but at the point it is invoked. The lambda is able to keep a reference to j even although it was declared in a different scope. The same is true if the lambda is eventually invoked from a different scope block altogether. For example, if it has been passed out of the method in which it is declared.
The lambda can also change the value of the outer variable. For example:
int j = 6;
Func<int, int> function = i => { j = j * j; return 100 + i + j; };
int result = function(50);
// result == 186
// j == 36