# Tuesday, July 04, 2006

I know this is covered all over the web but I'm forever forgetting it so if Outlook has started blocking email attachments i.e. ASP files you can easily adjust this by adding a String Key called "Level1Remove" to the registry, navigate to: Current User --> Software --> Microsoft --> Office (x) --> Outlook --> Security (where (x) is the version of office you are running: 9 = Outlook 2000, 10 = Outlook 2002 11 = Outlook 2003

Then right click and choose "New" and "String Key", then add in a list of the attachments you would like to allow seperated by semi-colons i.e.:
.exe;.mdb;.url;.asp;.aspx;.zip

Tuesday, July 04, 2006 11:46:14 AM (GMT Daylight Time, UTC+01:00)  #    Disclaimer  |  Comments [0]  | 
# Monday, July 03, 2006

There are two questions I get asked a lot by people who are thinking about becoming self-employed and even those already running a business. The first is How do you get the work? –this is something I’ll blog about in more detail later as the second is what I want to talk about today and that’s How much should I charge?

When setting out, this may seem a really difficult question to answer but in actual fact it can easily be calculated out and it’s critical to the success (or failure) of your business. When we first started out, I was plucking figures from thin air, when someone asked my how much a website would cost I decided a figure that I felt would compensate me for the time input. This is not what I would suggest doing!

Now that we are considering outsourcing work with the view to employing some new wonderful people to help out on the creation of our sites I felt it was time to work out a base rate from which we should quote. After some pondering I feel I’ve come up with a solution that can easily be re-used on any business.

Firstly, add up all your expenses (equipment, software, phone, ISP, rent, taxes, etc.) –it’s worth taking some time over this to make sure you include as many expenses as possible. Then add what you would like to get paid (your yearly salary). Finally, because you would like to grow your business add some profit (somewhere between 10% and 15% is about right). The figure you’re left with is the turnover you company is aiming for.

Now you need to work that figure back to an hourly rate. Lets assume you want to allow for 4 weeks holiday -you’ll have a potential of 48 working weeks available to you. Now, assuming you’re going to be a slacker and only work a 40hr week, following on from my previous post of how much time was spent on non-development work, we have to assume that we’ll be spending 16hrs of our 40hr week on non-development (yes we do have to take this into account –you’re still working!!)

This leaves us with 24 billable hours every week, this equates to 1,152 billable hours a year. To calculate your hourly rate, simply divide the required turnover by the billable hours.

Let’s try an example:

Expenses
Server Costs: £100pm = £1,200pa
Rent: £1000pm = £12,000
Phone Bill: £29.99pm = £359.88pa
Electricity: £40pm = £480pa
Total Costs: £14,039.88

Salary: £100,000
Profit: £114,039.88 + 15%
Required Turnover: £131,145.90

[Hourly Rate] = [Required Annual Turnover] / [Available Annual Billable Hours]
£131,145.90 / 1152 = £113.84
So in our example, your hourly rate should be £113.84

Notice in my example I have included the server costs which, in many cases will be covered by clients but what happens if they don’t pay or you don’t fill the space? You’ll have to pay so factor it in and any space you sell will be additional profit which you can choose to pass back to the client or save to reward your staff!

This figure should is a base rate, it is always worth factoring in the client when estimating on the work, for example, if you have a large corporate client, many of them will expect to pay a higher hourly rate and odd as it sounds are concerned when it’s too cheap so offset these clients against the smaller clients. Remember: you can be turned down for being too cheap as well as being too expensive!

To clarify that point a little further: If you have a small client who cannot afford £115ph and a large client who is happy with £175ph development costs, for every hour you work for the large client, you can afford to offer the small client a reduction:
10hours @ £115ph = £1150
5hours @ £175ph + 5hours @ £55ph = £1150

So when estimating work, look at it on a yearly basis –having business is better than no business, just don’t be a busy fool.

As a closing note, I would like to add that if your hourly rate sounds too high for your clients, you have to think about what they’re getting –You! You may be expensive but as long as your work is of a high standard price doesn’t matter. The alternative is to find areas to cut your expenses (or take a salary reduction!) so I know which I'd rather do...

I hope you’re starting out in business and when you do I hope you make it! Good Luck.

Update: I should just add, the figures in the example are not real world (or ours) they're merely for demonstration!

Update 2: I feel I should also point out that although we have a base rate that helps us estimate on work and allow us to quickly determine how profitable the project is, we rarely work on an hourly basis as we prefer to quote on a project basis -something which I'll write about another day.

Monday, July 03, 2006 5:05:22 PM (GMT Daylight Time, UTC+01:00)  #    Disclaimer  |  Comments [3]  | 

Here's some code I regularly find useful when going from a dev server to a production server (or changing the username), I'm sure there's a more automated way but for a quick fix...

DECLARE @username varchar(100)
SET @username = 'xyz'
SELECT
    'GRANT EXECUTE ON ' + name + ' TO ' + @username
FROM
    sysobjects
WHERE
    xtype = 'p'
AND
     LEFT(name, 4) = 'PRE_'

The code is simple, it lists all the stored procedures with a set prefix and generates the T-SQL to grant EXECUTE permissions to a given user.

To use it, set the username, update the last line if you would like to limit it's bounds (we prefix ours for clarity i.e. SProcs with a prefix of CMS_ are used in the Content Management System) and run it, then copy the results and run them in a Query Analyser.

Monday, July 03, 2006 3:42:17 PM (GMT Daylight Time, UTC+01:00)  #    Disclaimer  |  Comments [0]  | 

A while ago the Disability Rights Commission (DRC) in collaboration with BSI released a guide to good practice in commissioning accessible websites called Publicly Available Specification (PAS) 78. The guidelines outline good practice in commissioning websites that are accessible to and usable by disabled people.

Originally it was made available at a charge but the nice people at the Disability Rights Commission have decided to make it publicly available for free! You can download your copy at: http://www.drc-gb.org/library/website_accessibility_guidance/pas_78.aspx

The guide gives recommendations for:

  • The management of the process of, and guidance on, upholding existing W3C guidelines and specifications
  • Involving disabled people in the development process and using the current software-based compliance testing tools that can assist with this.

It is applicable to all public and private organizations that wish to observe good practice under the existing voluntary guidelines and the relevant legislation on this subject and is intended for use by those responsible for commissioning public-facing websites and web-based services.

Monday, July 03, 2006 9:20:18 AM (GMT Daylight Time, UTC+01:00)  #    Disclaimer  |  Comments [0]  | 
# Sunday, July 02, 2006

Having been chatting on the net for a long time, I use internet acronyms in most of my day-day conversations over instant messengers (IMs). When you get used to them they're massive timesavers but before then it must seem like they're leaving out a lot of letters -producing gobbledy goop! Although some acronyms are phonetically based, many are are not and often confusing, so sparked by a number of people new to IMs constantly stopping me and asking what it meant (so not making it a timesaver at all while I either typed it out or found a dictionary of acronyms) I decided I would overview a list of acronyms that I use on a regular occasion as a reference point, I may add more later and I hope its of use to someone else out there (please note some of these are just ones that I've made up/use to aid development talk).

General

gtg
Got To Go
brb
Be Right Back (less than 5mins)
bbiab
Be Back In A Bit (5 - 15mins)
bbiaw
Be Back In A While (15mins +)
b
Back
wb
Welcome Back
ty
Thank You
yw
You're Welcome.
atm
At The Moment
ttyl
Talk To You Later
styl
Speak To You Later
cya
See You
cu
See You
afaik
As Far As I Know
afaiaa
As Far As I Am Aware
afaiac
As Far As I'm Concerned
afaics
As Far As I Can See
afaict
As Far As I Can Tell
b/c
Because
w/
With
w/o
WithOut
g/f
GirlFriend
b/f
BoyFriend
gl
Good Luck
omg
Oh My God
faq
Frequently Asked Question(s)
nm
Never Mind
n1
Nice One
n2s
Needless To Say
nn
Night Night
n00b
A inexperienced and / or ignorant or unskilled person (especially used in computer games)
nmp
Not My Problem
nmj
Not My Job
pwned
Beating / Defeating / Outclassing someone
lol
Laugh(ing) Out Loud
k
Ok
btw
By The Way
lmao
Laugh(ing) My Ass Off
wrt
With Regards To

Ones I don't tend to use but I frequently see

wtf
What The F***
wth
What The Hell
fo
F*** Off
fk
F*** Knows
fa
F*** All
sfa
Sweet F*** All
ffs
For F***'s Sake
po
P*** Off

Technical

w/s
Web Service
se
Search Engine
seo
Search Engine Optimisation

Smileys

:)
Smiley / Happy
:D
Mega Happy
:(
Sad
;)
Winking
:P
Sticking Toungue Out
:o
Surprised
:|
Disappointed
:S
Confused / Worried
:#
Don't Tell Anyone
:'(
Crying
>:(
Annoyed
:@
Angry
|-)
Sleepy / Tired / Yawning

Actions

When a phrase is contained in <> it generally refers to an action the user is doing

<g>
Grin
<bg>
Big Grin
<vbg>
Very Big Grin
<vbeg>
Very Big Evil Grin

When a is contained in >< it means the user is referring to himself
i.e. >Thinks its too late to be writing an article<

It may also be worth checking out: Google as there's many more complete dictionaries out there!

Sunday, July 02, 2006 4:09:08 PM (GMT Daylight Time, UTC+01:00)  #    Disclaimer  |  Comments [0]  | 
# Saturday, July 01, 2006

After a somewhat hectic week on the phone I asked myself “has all this time on the phone been wasted time?” Well, I spent time talking to clients, developers, friends and family and this is important. Although it may cost you a little development time, talk is cheap (that’s what the telecom’s companies want to tell you isn’t it?)

Rather than looking at it negatively I tried to look at it from another point of view, I could have spent the time developing some weird and wonderful new creation for a client however, this phone time was doing something else –it was promoting the business. Admittedly the business couldn’t survive if we all spent all the time with the phone glued to our ear, but once in a while I believe is a good thing.

Why am I looking at it like that? That’s simple, if you make time for your clients, friends and family in any context it shows that you care for them beyond a pay check and at the end of the day, if they need some development they’re more likely to think of you in a good light.

Out of interest I decided to work out how much time I spent on non-development hours and I was somewhat shocked, in the average week I would estimate that at least 2 days is spent on non-development work, that includes phone calls, invoicing, letter writing, emailing etc. It's a staggering ammount but, all part of running a business.

Saturday, July 01, 2006 4:14:26 PM (GMT Daylight Time, UTC+01:00)  #    Disclaimer  |  Comments [0]  | 
# Friday, June 30, 2006

Julian Voelcker raised a question on the MsWebDev mailing list the other day that I've been meaning to investigate for a while as it's something that I have to double check on every time I write a new custom control -the various lifecycles an ASP.Net page.

Many people have blogged about the lifecycle of an ASP.Net Page or Master Page but every time I need to find the complete lifecycle of a control it’s not so easy. Today I wrote a couple of test pages to generate a reference.

The pages are very simple, I just overrode every method I could find and wrote to the trace. For completeness when the method called its base I wrapped it with “Start MethodName” and “End MethodName” (if you look at the trace outputs below you will see why). I did this for the Master Page (.master), Page (.aspx), User Control (.ascx) and Web Control (.cs), the page structre was simple:

  • Master Page
    • Page
      • User Control
      • Web Control

For clarity I’ve split the produced trace into 5 individual reference sections:

ASP.Net 2.0 Master Page Life Cycle

  • Start Construct()
  • End Construct()
  • Start FrameworkInitialize()
  • End FrameworkInitialize()
  • Start AddParsedSubObject(object obj)
    • CreateControlCollection()
    • Start AddedControl(Control control, int index)
    • End AddedControl(Control control, int index)
  • End AddParsedSubObject(object obj)
  • Start AddParsedSubObject(object obj)
    • Start AddedControl(Control control, int index)
    • End AddedControl(Control control, int index)
  • End AddParsedSubObject(object obj)
  • Start AddParsedSubObject(object obj)
    • Start AddedControl(Control control, int index)
    • End AddedControl(Control control, int index)
  • End AddParsedSubObject(object obj)
  • Start AddParsedSubObject(object obj)
    • Start AddedControl(Control control, int index)
    • End AddedControl(Control control, int index)
  • End AddParsedSubObject(object obj)
  • Start AddParsedSubObject(object obj)
    • Start AddedControl(Control control, int index)
    • End AddedControl(Control control, int index)
  • End AddParsedSubObject(object obj)
  • ResolveAdapter()
  • Start OnInit(EventArgs e)
  • End OnInit(EventArgs e)
  • Start TrackViewState()
  • End TrackViewState()
  • Start OnLoad(EventArgs e)
    • Page_Load(object sender, EventArgs e)
  • End OnLoad(EventArgs e)
  • Start EnsureChildControls()
    • ResolveAdapter()
    • Start CreateChildControls()
    • End CreateChildControls()
  • End EnsureChildControls()
  • Start OnPreRender(EventArgs e)
  • End OnPreRender(EventArgs e)
  • SaveViewState()
  • SaveViewState()
  • HasControls()
  • Start RenderControl(HtmlTextWriter writer)
    • Start Render(HtmlTextWriter writer)
      • Start RenderChildren(HtmlTextWriter writer)
      • End RenderChildren(HtmlTextWriter writer)
    • End Render(HtmlTextWriter writer)
  • End RenderControl(HtmlTextWriter writer)

ASP.Net 2.0 Page Life Cycle

  • ResolveAdapter()
  • DeterminePostBackMode()
  • Begin PreInit
    • Start OnPreInit(EventArgs e)
    • End OnPreInit(EventArgs e)
    • HasControls()
    • Start RemovedControl(Control control)
    • End RemovedControl(Control control)
    • ResolveAdapter()
    • Start AddedControl(Control control, int index)
    • End AddedControl(Control control, int index)
  • End PreInit
  • Begin Init
    • ResolveAdapter()
    • Start OnInit(EventArgs e)
    • End OnInit(EventArgs e)
    • Start TrackViewState()
    • End TrackViewState()
  • End Init
  • Begin InitComplete
    • Start OnInitComplete(EventArgs e)
    • End OnInitComplete(EventArgs e)
  • End InitComplete
  • Begin PreLoad
    • Start OnPreLoad(EventArgs e)
    • End OnPreLoad(EventArgs e)
  • End PreLoad
  • Begin Load
    • Start OnLoad(EventArgs e)
      • Page_Load(object sender, EventArgs e)
    • End OnLoad(EventArgs e)
  • End Load
  • Begin LoadComplete
    • Start OnLoadComplete(EventArgs e)
    • End OnLoadComplete(EventArgs e)
  • End LoadComplete
  • Begin PreRender
    • Start EnsureChildControls()
      • ResolveAdapter()
      • Start CreateChildControls()
      • End CreateChildControls()
    • End EnsureChildControls()
    • Start OnPreRender(EventArgs e)
    • End OnPreRender(EventArgs e)
  • End PreRender
  • Begin PreRenderComplete
    • Start OnPreRenderComplete(EventArgs e)
    • End OnPreRenderComplete(EventArgs e)
  • End PreRenderComplete
  • SaveViewState()
  • Begin SaveState
    • SaveViewState()
    • HasControls()
    • Start SavePageStateToPersistenceMedium(object state)
      • ResolveAdapter()
    • End SavePageStateToPersistenceMedium(object state)
  • End SaveState
  • Begin SaveStateComplete
    • Start OnSaveStateComplete(EventArgs e)
    • End OnSaveStateComplete(EventArgs e)
  • End SaveStateComplete
  • Begin Render
    • CreateHtmlTextWriter(System.IO.TextWriter tw)
    • Start RenderControl(HtmlTextWriter writer)
      • Start Render(HtmlTextWriter writer)
        • Start RenderChildren(HtmlTextWriter writer)
        • End RenderChildren(HtmlTextWriter writer)
      • End Render(HtmlTextWriter writer)
    • End RenderControl(HtmlTextWriter writer)
  • End Render
  • CreateHtmlTextWriter(System.IO.TextWriter tw)

ASP.Net 2.0 User Control Life Cycle

  • Start Construct()
  • End Construct()
  • Start FrameworkInitialize()
  • End FrameworkInitialize()
  • ResolveAdapter()
  • Start OnInit(EventArgs e)
  • End OnInit(EventArgs e)
  • Start TrackViewState()
  • End TrackViewState()
  • Start OnLoad(EventArgs e)
    • Page_Load(object sender, EventArgs e)
  • End OnLoad(EventArgs e)
  • Start EnsureChildControls()
    • ResolveAdapter()
    • Start CreateChildControls()
    • End CreateChildControls()
  • End EnsureChildControls()
  • Start OnPreRender(EventArgs e)
  • End OnPreRender(EventArgs e)
  • SaveViewState()
  • SaveViewState()
  • HasControls()
  • Start RenderControl(HtmlTextWriter writer)
    • Start Render(HtmlTextWriter writer)
      • Start RenderChildren(HtmlTextWriter writer)
      • End RenderChildren(HtmlTextWriter writer)
    • End Render(HtmlTextWriter writer)
  • End RenderControl(HtmlTextWriter writer)

ASP.Net 2.0 Web Control Life Cycle

  • Constructor Test()
  • Start ApplyStyleSheetSkin(Page page)
  • End ApplyStyleSheetSkin(Page page)
  • ResolveAdapter()
  • Start OnInit(EventArgs e)
  • End OnInit(EventArgs e)
  • Start TrackViewState()
  • End TrackViewState()
  • Start OnLoad(EventArgs e)
  • End OnLoad(EventArgs e)
  • Start EnsureChildControls()
    • ResolveAdapter()
    • Start CreateChildControls()
    • End CreateChildControls()
  • End EnsureChildControls()
  • Start OnPreRender(EventArgs e)
  • End OnPreRender(EventArgs e)
  • SaveViewState()
  • SaveViewState()
  • HasControls()
  • Start RenderControl(HtmlTextWriter writer)
    • Start Render(HtmlTextWriter writer)
      • Start RenderBeginTag(HtmlTextWriter writer)
        • Start AddAttributesToRender(HtmlTextWriter writer)
        • End AddAttributesToRender(HtmlTextWriter writer)
      • End RenderBeginTag(HtmlTextWriter writer)
    • Start RenderContents(HtmlTextWriter writer)
      • Start RenderChildren(HtmlTextWriter writer)
      • End RenderChildren(HtmlTextWriter writer)
    • End RenderContents(HtmlTextWriter writer)
    • Start RenderEndTag(HtmlTextWriter writer)
    • End RenderEndTag(HtmlTextWriter writer)
    • End Render(HtmlTextWriter writer)
  • End RenderControl(HtmlTextWriter writer)

Complete Trace

Category Message
Page ResolveAdapter()
Page DeterminePostBackMode()
aspx.page Begin PreInit
Page Start OnPreInit(EventArgs e)
Page End OnPreInit(EventArgs e)
MasterPage Start Construct()
MasterPage End Construct()
Page HasControls()
Page Start RemovedControl(Control control)
Page End RemovedControl(Control control)
MasterPage Start FrameworkInitialize()
MasterPage End FrameworkInitialize()
MasterPage Start AddParsedSubObject(object obj)
MasterPage CreateControlCollection()
MasterPage Start AddedControl(Control control, int index)
MasterPage End AddedControl(Control control, int index)
MasterPage End AddParsedSubObject(object obj)
MasterPage Start AddParsedSubObject(object obj)
MasterPage Start AddedControl(Control control, int index)
Page ResolveAdapter()
MasterPage End AddedControl(Control control, int index)
MasterPage End AddParsedSubObject(object obj)
MasterPage Start AddParsedSubObject(object obj)
MasterPage Start AddedControl(Control control, int index)
MasterPage End AddedControl(Control control, int index)
MasterPage End AddParsedSubObject(object obj)
UserControl Start Construct()
UserControl End Construct()
UserControl Start FrameworkInitialize()
UserControl End FrameworkInitialize()
CustomWebControl Constructor Test()
CustomWebControl Start ApplyStyleSheetSkin(Page page)
CustomWebControl End ApplyStyleSheetSkin(Page page)
MasterPage Start AddParsedSubObject(object obj)
MasterPage Start AddedControl(Control control, int index)
MasterPage End AddedControl(Control control, int index)
MasterPage End AddParsedSubObject(object obj)
MasterPage Start AddParsedSubObject(object obj)
MasterPage Start AddedControl(Control control, int index)
MasterPage End AddedControl(Control control, int index)
MasterPage End AddParsedSubObject(object obj)
Page Start AddedControl(Control control, int index)
Page End AddedControl(Control control, int index)
aspx.page End PreInit
aspx.page Begin Init
Page ResolveAdapter()
MasterPage ResolveAdapter()
UserControl ResolveAdapter()
UserControl Start OnInit(EventArgs e)
UserControl End OnInit(EventArgs e)
UserControl Start TrackViewState()
UserControl End TrackViewState()
CustomWebControl ResolveAdapter()
CustomWebControl Start OnInit(EventArgs e)
CustomWebControl End OnInit(EventArgs e)
CustomWebControl Start TrackViewState()
CustomWebControl End TrackViewState()
MasterPage Start OnInit(EventArgs e)
MasterPage End OnInit(EventArgs e)
MasterPage Start TrackViewState()
MasterPage End TrackViewState()
Page Start OnInit(EventArgs e)
Page End OnInit(EventArgs e)
Page Start TrackViewState()
Page End TrackViewState()
aspx.page End Init
aspx.page Begin InitComplete
Page Start OnInitComplete(EventArgs e)
Page End OnInitComplete(EventArgs e)
aspx.page End InitComplete
aspx.page Begin PreLoad
Page Start OnPreLoad(EventArgs e)
Page End OnPreLoad(EventArgs e)
aspx.page End PreLoad
aspx.page Begin Load
Page Start OnLoad(EventArgs e)
Page Page_Load(object sender, EventArgs e)
Page End OnLoad(EventArgs e)
MasterPage Start OnLoad(EventArgs e)
MasterPage Page_Load(object sender, EventArgs e)
MasterPage End OnLoad(EventArgs e)
UserControl Start OnLoad(EventArgs e)
UserControl Page_Load(object sender, EventArgs e)
UserControl End OnLoad(EventArgs e)
CustomWebControl Start OnLoad(EventArgs e)
CustomWebControl End OnLoad(EventArgs e)
aspx.page End Load
aspx.page Begin LoadComplete
Page Start OnLoadComplete(EventArgs e)
Page End OnLoadComplete(EventArgs e)
aspx.page End LoadComplete
aspx.page Begin PreRender
Page Start EnsureChildControls()
Page ResolveAdapter()
Page Start CreateChildControls()
Page End CreateChildControls()
Page End EnsureChildControls()
Page Start OnPreRender(EventArgs e)
Page End OnPreRender(EventArgs e)
MasterPage Start EnsureChildControls()
MasterPage ResolveAdapter()
MasterPage Start CreateChildControls()
MasterPage End CreateChildControls()
MasterPage End EnsureChildControls()
MasterPage Start OnPreRender(EventArgs e)
MasterPage End OnPreRender(EventArgs e)
UserControl Start EnsureChildControls()
UserControl ResolveAdapter()
UserControl Start CreateChildControls()
UserControl End CreateChildControls()
UserControl End EnsureChildControls()
UserControl Start OnPreRender(EventArgs e)
UserControl End OnPreRender(EventArgs e)
CustomWebControl Start EnsureChildControls()
CustomWebControl ResolveAdapter()
CustomWebControl Start CreateChildControls()
CustomWebControl End CreateChildControls()
CustomWebControl End EnsureChildControls()
CustomWebControl Start OnPreRender(EventArgs e)
CustomWebControl End OnPreRender(EventArgs e)
aspx.page End PreRender
aspx.page Begin PreRenderComplete
Page Start OnPreRenderComplete(EventArgs e)
Page End OnPreRenderComplete(EventArgs e)
aspx.page End PreRenderComplete
Page SaveViewState()
MasterPage SaveViewState()
UserControl SaveViewState()
CustomWebControl SaveViewState()
aspx.page Begin SaveState
Page SaveViewState()
Page HasControls()
MasterPage SaveViewState()
MasterPage HasControls()
UserControl SaveViewState()
UserControl HasControls()
CustomWebControl SaveViewState()
CustomWebControl HasControls()
Page Start SavePageStateToPersistenceMedium(object state)
Page ResolveAdapter()
Page End SavePageStateToPersistenceMedium(object state)
aspx.page End SaveState
aspx.page Begin SaveStateComplete
Page Start OnSaveStateComplete(EventArgs e)
Page End OnSaveStateComplete(EventArgs e)
aspx.page End SaveStateComplete
aspx.page Begin Render
Page CreateHtmlTextWriter(System.IO.TextWriter tw)
Page Start RenderControl(HtmlTextWriter writer)
Page Start Render(HtmlTextWriter writer)
Page Start RenderChildren(HtmlTextWriter writer)
MasterPage Start RenderControl(HtmlTextWriter writer)
MasterPage Start Render(HtmlTextWriter writer)
MasterPage Start RenderChildren(HtmlTextWriter writer)
UserControl Start RenderControl(HtmlTextWriter writer)
UserControl Start Render(HtmlTextWriter writer)
UserControl Start RenderChildren(HtmlTextWriter writer)
UserControl End RenderChildren(HtmlTextWriter writer)
UserControl End Render(HtmlTextWriter writer)
UserControl End RenderControl(HtmlTextWriter writer)
CustomWebControl Start RenderControl(HtmlTextWriter writer)
CustomWebControl Start Render(HtmlTextWriter writer)
CustomWebControl Start RenderBeginTag(HtmlTextWriter writer)
CustomWebControl Start AddAttributesToRender(HtmlTextWriter writer)
CustomWebControl End AddAttributesToRender(HtmlTextWriter writer)
CustomWebControl End RenderBeginTag(HtmlTextWriter writer)
CustomWebControl Start RenderContents(HtmlTextWriter writer)
CustomWebControl Start RenderChildren(HtmlTextWriter writer)
CustomWebControl End RenderChildren(HtmlTextWriter writer)
CustomWebControl End RenderContents(HtmlTextWriter writer)
CustomWebControl Start RenderEndTag(HtmlTextWriter writer)
CustomWebControl End RenderEndTag(HtmlTextWriter writer)
CustomWebControl End Render(HtmlTextWriter writer)
CustomWebControl End RenderControl(HtmlTextWriter writer)
MasterPage End RenderChildren(HtmlTextWriter writer)
MasterPage End Render(HtmlTextWriter writer)
MasterPage End RenderControl(HtmlTextWriter writer)
Page End RenderChildren(HtmlTextWriter writer)
Page End Render(HtmlTextWriter writer)
Page End RenderControl(HtmlTextWriter writer)
aspx.page End Render
Page CreateHtmlTextWriter(System.IO.TextWriter tw)
Friday, June 30, 2006 9:01:00 AM (GMT Daylight Time, UTC+01:00)  #    Disclaimer  |  Comments [15]  | 
# Monday, June 26, 2006

It's been brought to my attention that some people out there STILL don't know what the RX-8 looks like so I thought I'd post a little photo of it here for you:


Visit Mazda's RX-8 Showcase Site

I'll try and post a few more later of the interior etc.

Monday, June 26, 2006 9:19:24 AM (GMT Daylight Time, UTC+01:00)  #    Disclaimer  |  Comments [0]  | 
# Sunday, June 25, 2006

This morning we had the TV on while getting ready to go out and a new L'Oreal advert came on. If you haven't seen it, it has features Jane Fonda telling us how the product helps firm the skin etc, that she's 68 and look how great her skin is -the usual junk. Although the advert doesn't actually say the product is why she "looks so good" it leads you to believe that it is (great marketing btw) anyway, where am I going with this (other than stating the obvious)? Well, when the advert finishedI was left thinking "ok, so this cream makes your skin feeling younger" and "L'Oreal is the answer to all your old age prayers" but surely they're contradicting themselves a touch? Firstly they've got this attractive 68year old promoting this product as well as a 20-something saying "Use this and you won't look old when you're older". Well if Jane's 68 and looks like that (yeah yeah with all that plastic surgery etc) then why invest thousands in the anti-aging creams? -You can just use that one when you're 68. Oh and if she's 68 -don't people think "Hang on, she looks good, she's been around well before L'Oreal started pimping these promises so why should I buy it?" -just a thought! As I keep saying to Stacey, it's been long known that it's all in the genes -any guy that wants to know what his lovely lady is going to look like at 40 all he needs to do is look at her mum...

Here's a shot of Jane for those of you who don't know who she is/was (I didn't know it was her until I checked out the L'Oreal site ;-))


L'Oreal Website (For the product of the advert)

On that note, another advert was listing the signs a woman had noted of getting older -a grey/white hair here-or-there, a wrinkle or two and loosing her eyesight/hearing which again got me thinking, I don't think I'll even notice getting old. During the summer my hair goes white in the sun, I can't see, my hearing's not great at the best of times and as Stacey keeps reminding me I've already got wrinkles on my forehead so...

Sunday, June 25, 2006 10:55:39 PM (GMT Daylight Time, UTC+01:00)  #    Disclaimer  |  Comments [0]  | 
# Friday, June 23, 2006

I've just had it pointed out to me (and quite rightly so) by Craig that my code for enabling the trace with Phil Winstanley's WebException was a touch wrong. I was assuming that the user was (correctly imho) running the application with the trace already disabled. However correct that may be, it may not be the case so as pedantic as this is, the code snippet should really be:

TraceContext t = HttpContext.Current.Trace;
bool bCurrentState = t.IsEnabled;
t.IsEnabled = true;
WebException WE = new WebException();
WE.CurrentException = Server.GetLastError();
WE.Handle();
t.IsEnabled = bCurrentState;

Although I've adapted the code to accomodate this, I really wouldn't run production sites with the trace enabled as this is not only a performace hit but quite a security issue!

Friday, June 23, 2006 5:34:31 PM (GMT Daylight Time, UTC+01:00)  #    Disclaimer  |  Comments [0]  |