The more work I do around WPF "smart" clients the less I believe they are the future. Maybe it's because I'm working on an application that I truly believe is using the wrong technologies and should be an asp.net application but I miss the freedom I felt writing web apps.
I know there are a bunch of reasons for writing smart-client - offline, being one of them, but I think that reason is starting to look a little shaky given Google Gears... Now if Silverlight lets you run Sql CE (or equivalent) on the client I see that as one more reason not to write chunky fat clients.
Sunday, March 02, 2008
Using Uri's in CAB
Recently I was thinking about a neat addition to CAB that would allow a user to use a Url to "deep-link" into a CAB application (CAB as that's the technology I use at work).
The way I see it working would be:
Use a pluggable protocol to register my application with explorer.
Create a common url syntax to link a Uri to a Cab event
When the application starts follow one of two paths:
1. If not already running then start up and pass the Url to the Url launcher service.
2. If not already running then open an ipc channel listening locally on port whatever
3. If already running then connect to the ipc channel and supply the url.
Originally I thought that you could use the uri to directly create a CAB work-item. This is impossible to do right though. You don't know where the work-item should live in the hierarchy, if it is single instancing or multiple, or any number of contextual issues. Using a Cab event is bullet-proof though. Raise it globally and the subscriber can choose exactly what they want to do with it.
Nice.
The way I see it working would be:
Use a pluggable protocol to register my application with explorer.
Create a common url syntax to link a Uri to a Cab event
When the application starts follow one of two paths:
1. If not already running then start up and pass the Url to the Url launcher service.
2. If not already running then open an ipc channel listening locally on port whatever
3. If already running then connect to the ipc channel and supply the url.
Originally I thought that you could use the uri to directly create a CAB work-item. This is impossible to do right though. You don't know where the work-item should live in the hierarchy, if it is single instancing or multiple, or any number of contextual issues. Using a Cab event is bullet-proof though. Raise it globally and the subscriber can choose exactly what they want to do with it.
Nice.
Monday, February 25, 2008
Blog reactivated
Wahay,
For some reason my blog was deactivated when I checked it last week. Seems like Google have re-activated it!
For some reason my blog was deactivated when I checked it last week. Seems like Google have re-activated it!
Sunday, May 27, 2007
CAB, SCSF Testability
I came across a class the other week called TestableRootWorkItem. I was put onto it from a post I made on the Smart Client forum, and it can be found in the Appraisal Work Bench test module.
Basically it's a WorkItem which is initialised with a core set of services (of your choosing) and can then be used to test your own CAB code.
Example time - imagine you've a presenter / view combo called ShowCustomersPresenter.
The view implements an interface called IShowCustomersView.
In your test fixture you can use the TestableRootWorkItem a little bit like this:
public void MyTestOfWhatever()
{
TestableRootWorkItem rootItem = new TestableRootWorkItem();
rootItem.Services.AddNew<ICustomerService, MockCustomerService>();
ShowCustomersPresenter presenter = rootItem.Items.AddNew<ShowCustomersPresenter>();
IShowCustomerView mockView = new MockView();
presenter.View = mockView;
presenter.FindCustomers();
Assert.AreEqual(3, mockView.CustomerCount);
}
so, what's going on here then?
Well, we start with adding a mock customer service to the work item.
Next we add an instance of the Presenter we want to test. ObjectBuilder will spot a [ServiceDependency] attribute looking for a service of type ICustomerService and will add my MockCustomerService which has been registered.
The presenter's view is an IShowCustomerView. I don't want to test the real one so have added a MockView class which implements the interface. I have total control over this, but most importantly it's not a UI component.
here is my implementation of these 2 classes:
public class MockCustomerService: ICustomerService
{
public IList<CustomerSearchResult> FindCustomers(string customerName)
{
return new List<CustomerSearchResult>(new CustomerSearchResult[] { ... });
}
}
public class MockView: IShowCustomerView
{
public int CustomerCount = 0;
public ShowCustomers(IList<CustomerSearchResult> results)
{
CustomerCount = results.Count;
}
}
it's pretty plain sailing from here.
I simulate someone clicking the Find button by calling presenter.FindCustomers() directly.
My implementation of the Presenter under the hood calls the ICustomerService service to get the customers, and then calls View.ShowCustomers(results).
Using a well known service, and a mock view I can prove in the test that indeed this is what is happening.
To make it more interesting it's pretty straight forward to test Presenters raising or subscribing to events. You can create a MockEventSubscriber class which uses a CAB [EventSubscription(....)] to check for the raising of an event. The test method just has to add this class directly to the WorkItem (WorkItem.Items.AddNew<MockEventSubscriber>()) and you're there!
CABs loose coupling event plumbing makes it perfect for writing classes that can be tested in isolation. In-fact, I think that if you're not testing CAB code in this way that you're really missing a trick! I'm about to start on the next phase of a CAB project and hope to report back on how it all goes!
That's all for now :o)
Basically it's a WorkItem which is initialised with a core set of services (of your choosing) and can then be used to test your own CAB code.
Example time - imagine you've a presenter / view combo called ShowCustomersPresenter.
The view implements an interface called IShowCustomersView.
In your test fixture you can use the TestableRootWorkItem a little bit like this:
public void MyTestOfWhatever()
{
TestableRootWorkItem rootItem = new TestableRootWorkItem();
rootItem.Services.AddNew<ICustomerService, MockCustomerService>();
ShowCustomersPresenter presenter = rootItem.Items.AddNew<ShowCustomersPresenter>();
IShowCustomerView mockView = new MockView();
presenter.View = mockView;
presenter.FindCustomers();
Assert.AreEqual(3, mockView.CustomerCount);
}
so, what's going on here then?
Well, we start with adding a mock customer service to the work item.
Next we add an instance of the Presenter we want to test. ObjectBuilder will spot a [ServiceDependency] attribute looking for a service of type ICustomerService and will add my MockCustomerService which has been registered.
The presenter's view is an IShowCustomerView. I don't want to test the real one so have added a MockView class which implements the interface. I have total control over this, but most importantly it's not a UI component.
here is my implementation of these 2 classes:
public class MockCustomerService: ICustomerService
{
public IList<CustomerSearchResult> FindCustomers(string customerName)
{
return new List<CustomerSearchResult>(new CustomerSearchResult[] { ... });
}
}
public class MockView: IShowCustomerView
{
public int CustomerCount = 0;
public ShowCustomers(IList<CustomerSearchResult> results)
{
CustomerCount = results.Count;
}
}
it's pretty plain sailing from here.
I simulate someone clicking the Find button by calling presenter.FindCustomers() directly.
My implementation of the Presenter under the hood calls the ICustomerService service to get the customers, and then calls View.ShowCustomers(results).
Using a well known service, and a mock view I can prove in the test that indeed this is what is happening.
To make it more interesting it's pretty straight forward to test Presenters raising or subscribing to events. You can create a MockEventSubscriber class which uses a CAB [EventSubscription(....)] to check for the raising of an event. The test method just has to add this class directly to the WorkItem (WorkItem.Items.AddNew<MockEventSubscriber>()) and you're there!
CABs loose coupling event plumbing makes it perfect for writing classes that can be tested in isolation. In-fact, I think that if you're not testing CAB code in this way that you're really missing a trick! I'm about to start on the next phase of a CAB project and hope to report back on how it all goes!
That's all for now :o)
Sunday, May 06, 2007
CAB / Smart Client Software Factory pointers
I've been involved in a project which is using Microsofts Component Application Block for a few months now and thought I'd drop an entry on CAB 101 - do's and donots!
CAB is heavily based around MVP and the idea of splitting use-cases into a WorkItem. Sounds complicated? Don't let it. A WorkItem is nothing more than a container of things which are required to get the job of a use-case done.
So, a workitem may contain some views, some services, and some logic for co-ordinating them together. Simple huh?
Lets look at a use case of searching for customers.
What views are involved in this? For this example lets say we have a view to enter search text, and a view to show a list of customers.
Get your GUI guys to knock up these 2 views. Make them look blinding! Just hold off on the actual guts of what is going on as it's not their job!
GUI guys working on the views? Great. Let's begin the meaty stuff.
Lets create a class that will hold all of the parts involved in the use-case together. This is will be subclass of WorkItemController.
Override the Run() method on this type. Lets have it create a Search Criteria view and add it as SmartParts to the WorkItem's SmartPart collection.
SearchCriteriaView view = WorkItem.SmartParts.AddNew();
Let's also show this view in the main workspace.
WorkItem.Workspaces[MainWorkspace].Show(view);
Assume that the view has some fields for entering search criteria, and a Search button. When the user clicks on the Search button we'll delegate to our SearchCriteriaViewPresenter class (remember MVP)...
The Presenter for the Search Criteria screen is the thing that will go and find the results. But how does it do this?
This is where we use another piece of CAB goodness - its DependencyInjection framework. CAB will wire up objects we want, setting properties on them by magic. Did I mention that we have already asked CAB to register a CustomerSearch service on our behalf? Nope? Well we did!
In the Search Criteria presenter we'll have some lines that look like this...
[ServiceDependency]
public ICustomerSearch
{
set { _customerSearch = value; }
}
public void Search(....)
{
IList<SearchViewCustomer> customers = _customerSearch.Search(....)
}
But how do we get these results to the results view? This is where CAB's idea of loose coupling comes into play. What we'll do is add the results into the WorkItem's Items Collection and then raise an event to say we've found some search results. The Search method becomes more like this.
[EventPublication("ResultsReturned", PublicationScope.WorkItem)]
public event EventHandler<EventArgs> ResultsReturned;
public void Search(....)
{
IList<SearchViewCustomer> customers = _customerSearch.Search(....)
WorkItem.Items.Add(customers, "CustomerList");
ResultsReturned(this, EventArgs.Empty);
}
Woah! What's going on there. Well the EventPublication line instructs CAB that this class can raise a CAB event. CAB events offer more flexibility over .net events. We can change the scope of who they are raised to. In our case we're going to tell the WorkItem that we've found some results.
Go back to the WorkItemController from earlier and add the following method.
[EventSubscription("ResultsReturned")]
public void OnResultsReturned(object sender, EventArgs e)
{
ResultsView view = WorkItem.SmartParts.AddNew();
WorkItem.Workspaces["MainWindow"].Show(view);
}
Remember that other gui screen that was being prepared? Get into the Presenter and add a constructor.
[InjectionConstructor]
public ResultsViewPresenter(
[ComponentDependency("CustomerList") IList<Customer> customers] )
{
View.Customers = customers;
}
The InjectionConstructor attribute is a Object Builder attribute that will let us easily inject data into the new Presenter. In this case we are telling builder that the constructor is dependent on an item called CustomerList. It will look for this item in the Items collection and pass it to the constructor for us.
All we have to do is bind the customers list to the view.
Recap! What have we achieved?
We've created 2 smart parts which act together to perform the use case of finding customers.
W've created a WorkItemController which will hold these 2 views giving us a context for working with just the 2 views loosely without them knowing about each other.
We've used a CAB Event to tell anyone interested that we found some customers.
We used CAB's Items collection to share the customers between 2 views without either of them being aware of each other.
And we used the dependency injection system to obtain a reference to a service, and to wire up a Presenter.
Not bad for 10 minutes work!
CAB is heavily based around MVP and the idea of splitting use-cases into a WorkItem. Sounds complicated? Don't let it. A WorkItem is nothing more than a container of things which are required to get the job of a use-case done.
So, a workitem may contain some views, some services, and some logic for co-ordinating them together. Simple huh?
Lets look at a use case of searching for customers.
What views are involved in this? For this example lets say we have a view to enter search text, and a view to show a list of customers.
Get your GUI guys to knock up these 2 views. Make them look blinding! Just hold off on the actual guts of what is going on as it's not their job!
GUI guys working on the views? Great. Let's begin the meaty stuff.
Lets create a class that will hold all of the parts involved in the use-case together. This is will be subclass of WorkItemController.
Override the Run() method on this type. Lets have it create a Search Criteria view and add it as SmartParts to the WorkItem's SmartPart collection.
SearchCriteriaView view = WorkItem.SmartParts.AddNew
Let's also show this view in the main workspace.
WorkItem.Workspaces[MainWorkspace].Show(view);
Assume that the view has some fields for entering search criteria, and a Search button. When the user clicks on the Search button we'll delegate to our SearchCriteriaViewPresenter class (remember MVP)...
The Presenter for the Search Criteria screen is the thing that will go and find the results. But how does it do this?
This is where we use another piece of CAB goodness - its DependencyInjection framework. CAB will wire up objects we want, setting properties on them by magic. Did I mention that we have already asked CAB to register a CustomerSearch service on our behalf? Nope? Well we did!
In the Search Criteria presenter we'll have some lines that look like this...
[ServiceDependency]
public ICustomerSearch
{
set { _customerSearch = value; }
}
public void Search(....)
{
IList<SearchViewCustomer> customers = _customerSearch.Search(....)
}
But how do we get these results to the results view? This is where CAB's idea of loose coupling comes into play. What we'll do is add the results into the WorkItem's Items Collection and then raise an event to say we've found some search results. The Search method becomes more like this.
[EventPublication("ResultsReturned", PublicationScope.WorkItem)]
public event EventHandler<EventArgs> ResultsReturned;
public void Search(....)
{
IList<SearchViewCustomer> customers = _customerSearch.Search(....)
WorkItem.Items.Add(customers, "CustomerList");
ResultsReturned(this, EventArgs.Empty);
}
Woah! What's going on there. Well the EventPublication line instructs CAB that this class can raise a CAB event. CAB events offer more flexibility over .net events. We can change the scope of who they are raised to. In our case we're going to tell the WorkItem that we've found some results.
Go back to the WorkItemController from earlier and add the following method.
[EventSubscription("ResultsReturned")]
public void OnResultsReturned(object sender, EventArgs e)
{
ResultsView view = WorkItem.SmartParts.AddNew
WorkItem.Workspaces["MainWindow"].Show(view);
}
Remember that other gui screen that was being prepared? Get into the Presenter and add a constructor.
[InjectionConstructor]
public ResultsViewPresenter(
[ComponentDependency("CustomerList") IList<Customer> customers] )
{
View.Customers = customers;
}
The InjectionConstructor attribute is a Object Builder attribute that will let us easily inject data into the new Presenter. In this case we are telling builder that the constructor is dependent on an item called CustomerList. It will look for this item in the Items collection and pass it to the constructor for us.
All we have to do is bind the customers list to the view.
Recap! What have we achieved?
We've created 2 smart parts which act together to perform the use case of finding customers.
W've created a WorkItemController which will hold these 2 views giving us a context for working with just the 2 views loosely without them knowing about each other.
We've used a CAB Event to tell anyone interested that we found some customers.
We used CAB's Items collection to share the customers between 2 views without either of them being aware of each other.
And we used the dependency injection system to obtain a reference to a service, and to wire up a Presenter.
Not bad for 10 minutes work!
So long England, hello Australia!
Well it's been a while since I last wrote a blog entry but I have decided to start up again for no particular reason!
I'll probably keep it quite techie this time though. I'm currently working on a WPF / CAB project so I might drop some entries from time to time about these technologies.
I'll probably keep it quite techie this time though. I'm currently working on a WPF / CAB project so I might drop some entries from time to time about these technologies.
Friday, August 26, 2005
What part of cancelled don't you understand
Just over two weeks ago my wife had the misfortune of having her wallet stolen which contained a bit of cash and a debit card.
It wasn't long before she noticed and I called the bank for her to cancel the debit card. I walked through the transactions which had occurred that day, all which were bona-fide attributed to her, and the card was duly cancelled.
It was a bit disturbing to find last night £1300 of transactions, dated a week later, for train tickets (GNER, Virgin) from Euston station each for £280 - £350 (now that's a HELL of a lot of money for one train ticket but 1st class can be that expensive in the UK).
So being very, very alarmed my wife phoned up the bank (a big global world bank who shall rename nameless) and was routed to the call centre in some other country in the world. She was told that the transactions had occurred the night the card was stolen, and most likely in the window between it being stolen and being cancelled. Alarm bells started ringing - am I protected, will I be re-imbursed for what is a months salary, etc, but she were told nothing could be done that night and se'd have to call customer service the next morning.
So, 8am and the call to customer service. Again, nothing could be done but the transactions had been authorised on the Friday night when the card was stolen. She was bounced to the fraud department. Here's where things started getting ridiculous:
Aside from that, here is the bit I love most of all -
The transactions that occurred on the Friday night occurred at 9:30pm. But how can that be? The card was registered stolen at 8:30pm. Well here is the icing on the cake.
Am I surprised credit / debit card fraud is massively increaing???? Not on your life. If registering a card as stolen doesn't actually stop it being used then what chance is there of this sort of fraud being stopped?
It wasn't long before she noticed and I called the bank for her to cancel the debit card. I walked through the transactions which had occurred that day, all which were bona-fide attributed to her, and the card was duly cancelled.
It was a bit disturbing to find last night £1300 of transactions, dated a week later, for train tickets (GNER, Virgin) from Euston station each for £280 - £350 (now that's a HELL of a lot of money for one train ticket but 1st class can be that expensive in the UK).
- Interestin point 1 - the account was close to zero when the card was stolen and had a £500 overdraft. How come £1300 of transactions was
- allowed
- didn't register as a strange spending pattern even though said bank claims to have state of the art transaction pattern monitoring systems.
So being very, very alarmed my wife phoned up the bank (a big global world bank who shall rename nameless) and was routed to the call centre in some other country in the world. She was told that the transactions had occurred the night the card was stolen, and most likely in the window between it being stolen and being cancelled. Alarm bells started ringing - am I protected, will I be re-imbursed for what is a months salary, etc, but she were told nothing could be done that night and se'd have to call customer service the next morning.
So, 8am and the call to customer service. Again, nothing could be done but the transactions had been authorised on the Friday night when the card was stolen. She was bounced to the fraud department. Here's where things started getting ridiculous:
- The fraud department couldn't help and suggested she went into a branch. Now call me stupid but isn't a fraud department supposed to deal with fraud.
- Ridiculous suggestion 1: Said bank offered to increase her overdraft to help her get through the month. Great idea - not content with letting someone spend £1300 from an account with a £500 overdraft they now want to push the limit up so she can bring her account even more into the red.
Aside from that, here is the bit I love most of all -
The transactions that occurred on the Friday night occurred at 9:30pm. But how can that be? The card was registered stolen at 8:30pm. Well here is the icing on the cake.
- EACH TRANSACTION WAS MARKED WITH "INCORRECT ISSUE NUMBER ON CARD"
- A card is stolen, registered as stolen, but then £1300 of transactions are allowed even though the system at some point knows that this card is not supposed to be used.
Am I surprised credit / debit card fraud is massively increaing???? Not on your life. If registering a card as stolen doesn't actually stop it being used then what chance is there of this sort of fraud being stopped?
Tuesday, June 14, 2005
Live 8 & Ebay
Hmm, did nobody envisage this happening?
I've been speculating since the tkx were announced that there would be a flood of people trying to sell their tickets on eBay as soon as they got them!
That's just the state of the world we live in today. Too many people who want to make a quick buck for doing nothing at-all.
Sorry Bob, cry all you like but maybe you should have learned the Glastonbury lesson which is to print security into the tickets and make sure whoevers name is on, is at the gate.
(For the record I think it's a terrible situation that people are doing this, and if I had a pair I wouldn't think of it. It's my 30th birthday tho' so I'm having a party instead!!)
I've been speculating since the tkx were announced that there would be a flood of people trying to sell their tickets on eBay as soon as they got them!
That's just the state of the world we live in today. Too many people who want to make a quick buck for doing nothing at-all.
Sorry Bob, cry all you like but maybe you should have learned the Glastonbury lesson which is to print security into the tickets and make sure whoevers name is on, is at the gate.
(For the record I think it's a terrible situation that people are doing this, and if I had a pair I wouldn't think of it. It's my 30th birthday tho' so I'm having a party instead!!)
Friday, May 20, 2005
Grease Monkey
This is a neat add-in for google maps. Install grease monkey into firefox, and then this little add-in to make your mouse wheel control the zoom slide bar.
For real power addicts download Nasa's World Wind. Very, very cool! Even my wife agreed and she is not a techy fan!
For real power addicts download Nasa's World Wind. Very, very cool! Even my wife agreed and she is not a techy fan!
Smoking - the solution
How socially unacceptable is this habit. Last night at the Moby gig (Brixton Academy) I got sick to death of people blowing smoke in my face.
I propose a compulsory attachment to cigarettes which forces all smoke back into the lungs of the smoker. Lets see how many people carry on with that.
Also non-smoking areas in restaurants. What's the point. You're still only 5 metres from smokers.
And, even worse - the smokers who won't smoke when they are eating, but light up as soon as they've finished even though I, the non smoker, am sat on the next table - and then are really annoyed when you point this out to them and ask them to put it out. What a selfish race of people they are.
If you want to smoke then by all means do - just don't expect me to breathe your smoke in. You choose to smoke it, so you should have it all, to yourself... My gift to you. I'm kind like that.
I propose a compulsory attachment to cigarettes which forces all smoke back into the lungs of the smoker. Lets see how many people carry on with that.
Also non-smoking areas in restaurants. What's the point. You're still only 5 metres from smokers.
And, even worse - the smokers who won't smoke when they are eating, but light up as soon as they've finished even though I, the non smoker, am sat on the next table - and then are really annoyed when you point this out to them and ask them to put it out. What a selfish race of people they are.
If you want to smoke then by all means do - just don't expect me to breathe your smoke in. You choose to smoke it, so you should have it all, to yourself... My gift to you. I'm kind like that.
Twisting tale
So things have moved on a little bit.
- The "spec-changing" job is now dead and buried and good riddance to it.
- The 3 interviews job are now aware that I've turned down previous job and am not pushing for an answer any more (this is a very good move as I don't want to hurry them).
- A 3rd job has surfaced, this time down in Docklands. I should have an interview on Monday with them.
Unbelievable
I feel like I've been kicked in the guts. I got offered one of the jobs that I interviewed for on Wednesday.
The spec was for a c# / asp.net developer, the interview was as-well. The offer was for the very same job... Until today that is when the manager decided to alter the job to a VB6 COM role. Is that legal? It shouldn't be! I'm still a bit shocked for the audacity of someone to do such a thing.
Needless to say the job has been immediately turned down so I'm pinning my (diminishing) hopes on the other job that I've had 3 interviews for.
Looks like Sicily could be spent in and out of internet cafes applying for jobs. Wonderful.
The spec was for a c# / asp.net developer, the interview was as-well. The offer was for the very same job... Until today that is when the manager decided to alter the job to a VB6 COM role. Is that legal? It shouldn't be! I'm still a bit shocked for the audacity of someone to do such a thing.
Needless to say the job has been immediately turned down so I'm pinning my (diminishing) hopes on the other job that I've had 3 interviews for.
Looks like Sicily could be spent in and out of internet cafes applying for jobs. Wonderful.
Tuesday, May 17, 2005
The Glazer effect
OK,
What is going on here. Now I'm not a Manchester United fan, but I can't help feel worried for the club given that Malcom Glazer has managed to borrow millions of pounds, and we're talking over 500 million, from various banks to buy 75% of the shares. That's instantly made one of the most profitable soccer clubs in the country (probably world) one of the biggest debters.
I know Manchester United are listed on the Stock Exchange which makes them perfectly reasonable targets for such actions, but this guy must have the most amazing business plan to be able to repay not only the interest on the loans, but the loans themselves.
I can understand someone like Roman Abramovich with his billions wanting a toy team - and at least he does show up on Saturday afternoons to cheer Chelski on, but Glazer's intentions trouble me. All I've read so far points to him as someone who will squeeze every penny however he can be it increasing ticket prices, pulling out of the collective TV rights deal, or trying to push United as a global brand. 5 years ago bus shelters in Kuala Lumpar were emblazoned with United's logo and they are already massive across Asia. The rest of the world (not including USA) are already fanatical about footy but have their own teams. And I can't see him pushing them in the US as they already have their own "world" sports.
Not a good week for UK football. Congratulations to the Baggies on staying up. The other 3, we'll see you at Turf Moor next year!!
What is going on here. Now I'm not a Manchester United fan, but I can't help feel worried for the club given that Malcom Glazer has managed to borrow millions of pounds, and we're talking over 500 million, from various banks to buy 75% of the shares. That's instantly made one of the most profitable soccer clubs in the country (probably world) one of the biggest debters.
I know Manchester United are listed on the Stock Exchange which makes them perfectly reasonable targets for such actions, but this guy must have the most amazing business plan to be able to repay not only the interest on the loans, but the loans themselves.
I can understand someone like Roman Abramovich with his billions wanting a toy team - and at least he does show up on Saturday afternoons to cheer Chelski on, but Glazer's intentions trouble me. All I've read so far points to him as someone who will squeeze every penny however he can be it increasing ticket prices, pulling out of the collective TV rights deal, or trying to push United as a global brand. 5 years ago bus shelters in Kuala Lumpar were emblazoned with United's logo and they are already massive across Asia. The rest of the world (not including USA) are already fanatical about footy but have their own teams. And I can't see him pushing them in the US as they already have their own "world" sports.
Not a good week for UK football. Congratulations to the Baggies on staying up. The other 3, we'll see you at Turf Moor next year!!
30th birthday
Mine is fast approaching now (2nd July) and people are starting to ask me about what I'd like for it.
I always find it tricky to think up what I'd like. A few months ago I was after a Mac Mini but I've gone off that idea. I've read quite a few articles talking about the $$$ you need to bring them upto a 1/2 decent spec.
My wife put a great idea in my head the other week though - a Gibson Les Paul Standard edition. They aren't too expensive, they look beautiful and they sound very, very deep and mellow. I've got a big Fender Studio Pro 40 amp that I could chop in as-well to help finance it (I know it's my birthday but I'm not into mass expenditure!) My current electric guitar is a very old Fender Squire Strat copy. I bought it with my 1st student loan back in 1993 and it's showing every bit of that age (not in a way that good guitars age though).
BTW - colour would be either Gecko or Root Beer. I think.
Hmm, very very tempting!
I always find it tricky to think up what I'd like. A few months ago I was after a Mac Mini but I've gone off that idea. I've read quite a few articles talking about the $$$ you need to bring them upto a 1/2 decent spec.
My wife put a great idea in my head the other week though - a Gibson Les Paul Standard edition. They aren't too expensive, they look beautiful and they sound very, very deep and mellow. I've got a big Fender Studio Pro 40 amp that I could chop in as-well to help finance it (I know it's my birthday but I'm not into mass expenditure!) My current electric guitar is a very old Fender Squire Strat copy. I bought it with my 1st student loan back in 1993 and it's showing every bit of that age (not in a way that good guitars age though).
BTW - colour would be either Gecko or Root Beer. I think.
Hmm, very very tempting!
Asp.Net Development Helper
This looks neat - my friend Richard Birkby has put together a Firefox version.
This morning I'd thought I'd try and help out by building the viewstate parser for Firefox. He beat me to it though. However it only works for Asp.Net 2.0.
My parser is a bit brute force compared to Rich's, but it might be useful for .Net 1.1 users to have a firefox sidebar showing the ViewState breakdown. Plus it'll be a nice introduction to writing XUL widgits.
This morning I'd thought I'd try and help out by building the viewstate parser for Firefox. He beat me to it though. However it only works for Asp.Net 2.0.
My parser is a bit brute force compared to Rich's, but it might be useful for .Net 1.1 users to have a firefox sidebar showing the ViewState breakdown. Plus it'll be a nice introduction to writing XUL widgits.
Interviews, interviews everywhere
Could be a good week -
I've got two interviews lined up for Wednesday. One, and this takes some believing, is the one where I was rejected last week (the agent relayed that I might be bored at the job). Anyway, as I said before I've really liked who I've spoken to there so far.
And I've also one lined up just after that in the city again. This one is an interview directly with the manager and team lead - no techy screening interview here.
So maybe I'll be able to come back from Sicily straight into a job... And how is the weather currently looking in Sicily? Well better than here! Palermo is hovering around the mid to high 20's. That'll do nicely!
I've got two interviews lined up for Wednesday. One, and this takes some believing, is the one where I was rejected last week (the agent relayed that I might be bored at the job). Anyway, as I said before I've really liked who I've spoken to there so far.
And I've also one lined up just after that in the city again. This one is an interview directly with the manager and team lead - no techy screening interview here.
So maybe I'll be able to come back from Sicily straight into a job... And how is the weather currently looking in Sicily? Well better than here! Palermo is hovering around the mid to high 20's. That'll do nicely!
A bit of Bowie
I used to know a guy at college who was a mad David Bowie fan. He used to think he was gay when he was a kid because he liked Bowie so much!
I don't know much Bowie but Hunky Dory is permanently on my car radio. So I expanded my collection at Fopp Records on Shaftesbury Avenue last week with Ziggy Stardust. Five quid - what a bargain!
Also I was amazed to see pretty much all New Orders back catalogue for a fiver each. That is seriously dangerous for after beer shopping!
I don't know much Bowie but Hunky Dory is permanently on my car radio. So I expanded my collection at Fopp Records on Shaftesbury Avenue last week with Ziggy Stardust. Five quid - what a bargain!
Also I was amazed to see pretty much all New Orders back catalogue for a fiver each. That is seriously dangerous for after beer shopping!
The Flaming Lips
I borrowed this from my brother last week - it's superb.
Favourite tracks:
Fight Test
Yoshimi Battles The Pink Robots pt.1
(what a great name for a track!)
Also borrowed the new Doves album. Again seriously worth listening to.
Favourite tracks:
Fight Test
Yoshimi Battles The Pink Robots pt.1
(what a great name for a track!)
Also borrowed the new Doves album. Again seriously worth listening to.
Monday, May 16, 2005
Still between jobs
So, another week goes by and I'm still looking for a job.
I got pretty close on Wednesday! At my 2nd interview I passed the techie test with flying colours, thought I got on with the 2 guys really well. Unfortunately they decided not to invite me back for the 3rd. But they recommended I go for a more senior position instead.
So I went for the other job interview on Friday but didn't feel a connection with the guy who interviewed me, as-well as messing up a couple of questions.
Just as the weekend looked to be going down I found out about another job interview I'll have next week agt another bank! So fingers crossed for that one.
I got pretty close on Wednesday! At my 2nd interview I passed the techie test with flying colours, thought I got on with the 2 guys really well. Unfortunately they decided not to invite me back for the 3rd. But they recommended I go for a more senior position instead.
So I went for the other job interview on Friday but didn't feel a connection with the guy who interviewed me, as-well as messing up a couple of questions.
Just as the weekend looked to be going down I found out about another job interview I'll have next week agt another bank! So fingers crossed for that one.
Thursday, May 05, 2005
Windows Server 2003
I've just installed this. I've no experience of using this and was intrigued by IIS6.
I like the idea of things like Process Recycling. Something amuses me about the thought of an application which eats up memory. The conversation in the team goes like:
PM: So, we're chewing up 100Mb of memory every 5 minutes. Seems like we've got problems with our app. Any suggestions?
Dev 1: Yeah - let's get deep down into the app and look for memory leaks.
Dev 2: Yeah - give us a few weeks and we can work out why it's not working.
PM: No - let's use process recycling. Every 5 minutes we can tear down the application and let it restart. That'll give us all the memory we've eaten back.
Heh heh! I like it!
I like the idea of things like Process Recycling. Something amuses me about the thought of an application which eats up memory. The conversation in the team goes like:
PM: So, we're chewing up 100Mb of memory every 5 minutes. Seems like we've got problems with our app. Any suggestions?
Dev 1: Yeah - let's get deep down into the app and look for memory leaks.
Dev 2: Yeah - give us a few weeks and we can work out why it's not working.
PM: No - let's use process recycling. Every 5 minutes we can tear down the application and let it restart. That'll give us all the memory we've eaten back.
Heh heh! I like it!
Subscribe to:
Posts (Atom)