Saturday, March 21, 2009

Buying PC parts

Situation.

I now need new parts. I have a fairly decent PC mini tower from Euro PC where they sell reduced price DELL machines. Got a very good deal a year or so ago and it's treating me well. It has 3GB of RAM so I thought I'd put a bit more juice in as Crucial is offering 2x1GB sticks of compatible memory for only £22 all in. Good deal, I thought, so I got 'em.

Also, the monitor (as with the other monitor - I have two) is a fairly old CRT by MicroScan. It (they) was (were) the daddy(s) in it's (their) day (awesome image quality and a built in mic), but one has now pretty much shutdown (goes horribly blurry after a minute of use) and the second seems on the way out. The behaviour to note here is the occasional twitch of the screen, as if there is a power surge, causing irregular distortions on the screen, making it look like a mobile phone nearby is receiving a txt message, when there isn't.

So, having ordered the RAM (at silly-o-clock this morning) thought I'd do some proper research into monitors (and can have it verified later by my brother, who is up on his monitor KB, by virtue of his profession) and post some links here for buying and, more importantly, decoding the jargon around the tech specs.

I'm going for a big monitor because I think one large one is better for viewing quality than two smaller one's. This is born out by the fact that the seperation between the two monitors makes split screen movie watching cruddy, to say the least. I'm not going for a projector, because this is a PC I develop code on and I'm not mental.

Some useful links:
Places to buy:
Notes.

It's worth knowing that a high contrast ratio is good and a low one, obviously, is bad. This is because (if you look up the word contrast) the contrast ratio in monitors is the difference between the opposite ends of the colour spectrum. Meaning that if black is 1 and white is 20,000 then you have a contrast ratio of 20000:1 and it is better than 8000:1.

This only differs when you have a monitor with a dynamic range, usually printed as 8000:1 (dynamic). This simply means that the power output, and thus the brightness, of the pixels can be lowered, and thus dimmed, to give the impression of a darker colour. This makes sense because no lightbulb in existence can actually output "black". (American's are wrong when they refer to ultra-violet as "black light" - it's not black!) This can be a problem when a bright colour is near a dynamically dimmed colour, because the light edges will bleed into the darker areas.

It's also worth knowing that DSUB is the type of connector that monitors use, though this is not accounting for the number of pins. Therefore, if a monitor has a DSUB connector you can assume it is a standard VGA monitor connector.

Just for reference, here's what I decided to buy this morning...

Memory:

Obviously, this is not what everyone will need, as everyone's system is different, but I plumbed for 2 x CT763270 1GB, 240-pin DIMM Upgrade for a Dell Vostro 400 Mini Tower System from Crucial's UK branch.

Monitor:

I finally (verrrrry long decision process) settled on the Samsung SM-2433BW Cream 24" Widescreen LCD Monitor - Glossy Black by Novatech. Decent size, decent inputs and decent quality. Any less money and it would have started to be a bad monitor with a limited life. I believe the sweet spot for monitors of this size is £250+, though I think £500 is way too much, unless you're a graphics person (I ain't!)

Thursday, March 19, 2009

Getting the correct month, no matter the country

Recently I posted about localisation and today need to have a page work out a given month's index value (ie: 1-12) from a string. Because I'm developing the code in the UK and hosting it in the US, the localisation was mucking about with the handling of the DateTime.Parse() interpretation of the date string. I needed the code to handle the parsing as if it was in the UK, no matter where it's hosted.

In short, the answer is from a MSDN article: http://msdn.microsoft.com/en-us/library/bz9tc508.aspx

There are two methods, both easy, to use. The first is in the page's page tag (at the top), where the 'GB' forces things like datetime to use Great Britain formatting:

<%@ Page ... Culture="en-GB" ... %>

The second is in the web.config, again it's the GB:

<system.web>
<globalization uiCulture="en" culture="en-GB" />
...
</system.web>

Now, my code will render properly:

DateTime.Parse("01/" + Int32.Parse(month) + "/2009").ToString("MMMM")

Don't ask why I'm doing that, it's just necessary, is all.

I'm preferring the web.config approach, but it's perfectly valid for the page - just be sure to remember which pages use the setting. Obviously, this can all be set dynamically, but you'll have to read the MSDN pages for how to do that - this is just a reminder for myself and anyone who might run across my pages.

How to be productive...

A good question with some nice, simple, straightforward answers, which don't just apply to developers: http://stackoverflow.com/questions/645237/as-a-programmer-what-single-discovery-has-given-you-the-greatest-boost-in-product

I have lived this.

Wednesday, March 18, 2009

Totally Awesome - Real Digital Paper!

http://i.gizmodo.com/5173069/super-thin-flexible-oled-lights-to-be-available-in-2011

Looks like it's finally here! Digital Paper, or OLED sheets capable of displaying images like any monitor, but any a few millimetres thick.

Sunday, March 15, 2009

Microsoft links I have yet to read, but really should...

How Do I: Create a Breakpoint
Using Conditions?

How Do I: Create a Breakpoint Using Hit Count?

How Do I; Learn Tips and Tricks for Debugging in Visual Studio?

Office Development with Visual Studio Developer
Center Just Launched!

Microsoft Cloud Computing Tools

How Do I: Add Tool Windows to the Visual Studio IDE?

How Do I: Add a New Tool Window to Visual Studio?

How Do I: Integrate With the Error List?

How Do I: Create a Basic Language Service Using the Managed Babel System?

How Do I: Create Custom
Project Templates Using Visual Studio 2008?

How Do I: Create an Item Template Using Visual Studio 2008?

How Do I: Write to the Output Window?

Explore the New Features of Visual Studio 2008

How Do I: Create a Debugger Visualizer?

How Do I: Place My Commands Into Different Kinds of Visual Studio Menus?

How Do I: Add Commands
and Controls Into the Visual Studio IDE?

How Do I: Get Started with the VisualStudio Domain Specific Languages?

Heroes Happen Here
DotNetNuke® and Visual Studio 2008

Visual Studio Tip of the Day

How Do I: Add AJAX Functionality to an Existing ASP.NET Page?

How Do I: Debug a Windows Presentation Foundation Application in Visual Studio 2008?

How Do I: Use the LINQ-Enabled
XML API in Visual Studio 2008?

Some bluetooth resources. Rage.

Just some links to various useful sites for bluetooth...


There does seem to be a lot of niche interest in bluetooth, but MicroSoft are letting developers down by not providing a bluetooth API for Windows and Windows Mobile.  How beautiful it would be to create a solution with a couple of Win Forms and Mobile Forms app projects and use the same API in both to communicate over bluetooth, serial even IR.  But no.  There are even videos available on Channel9 where MS devs talk about the amazing work they've done using the MicroSoft C# bluetooth API but simply don't make any of the useful information available.  What's going on MS?  Is it because you know BT is destined for the bin?  And no, I don't consider the above link to Channel9 a productive one.  Is that really the best MS can for us?  Anil Dhawan's link is broken!

Gizmodo, gadgets and fun in the news...

Just browsing about today, I thought I'd post this as it's a bit of a laugh...


Photo info for creating high dynamic range images...


Mars!

Friday, March 13, 2009

Tips 'n' Tricks - Null Coalescing Operator

We all like the null coalescing operator (http://msdn.microsoft.com/en-us/library/ms173224.aspx), but it’s frustrating when we need to set the variable we’re returning rather than just returning it.

Really we just want to do this:

public class Something
{
private string falafel;

public string GetInfo()
{
return falafel ?? "tabbouleh";
}
}

But then falafel doesn’t get set.

This feels inelegant:

if (falafel == null)
falafel = "tabbouleh";
return falafel;

Luckily, there’s a solution:

return falafel ?? (falafel = "tabbouleh");

This first sets the value of falafel and then returns it.

Wednesday, March 11, 2009

Fun With GridView...

[EDIT: This is being posted now, but was started back in 2006, so might be a little out of date. My aim is to have no draft posts and this was too useful to delete.]

So I've been playing with databinding controls etc and trying to do things the easy way, I've discovered CodeSmith: http://www.codesmithtools.com/. Used in conjunction with NetTiers2: http://www.nettiers.com/ is a very powerful data access layer code generator.

Anwyay, todays subject, minor though it is, is GridView commands...
...I wanted to have a grid with a couple of buttons: Up and Down, as link buttons, to re-order my content without an edit button.

The solution is simple enough:
  1. Add a Button column to your GridView
  2. Set it's 'button type' to Link (this is optional really)
  3. In the GridView's events panel, double-click RowCommand
  4. In the generated event handler you can place:
    switch (e.CommandName) { .... }

Simple really.

Lastly, here's some resources I've been looking at recently:

  1. http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowcommand.aspx
  2. http://weblogs.asp.net/scottgu/archive/2005/10/18/427754.aspx
  3. http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/ASPNETProvMod_Prt5.asp
  4. http://www.ondotnet.com/pub/a/dotnet/2005/01/10/liberty.html
  5. http://www.odetocode.com/Articles/440.aspx
  6. http://www.asp.net/QuickStart/aspnet/doc/profile/default.aspx
  7. http://www.theserverside.net/tt/articles/showarticle.tss?id=CreatingProfileProvider
  8. http://flimflan.com/blog/ProfileView.aspx
  9. http://weblogs.asp.net/scottgu/archive/2006/01/10/435038.aspx
  10. http://www.asp.net/sandbox/samp_profiles.aspx?tabindex=0&tabid=1
  11. http://msdn2.microsoft.com/en-us/library/83y98ckk.aspx
  12. http://www.google.com/search?hl=en&lr=&q=aspnet_regsql+command-line+utility+&btnG=Search
  13. http://www.learnvisualstudio.net/
  14. http://www.asp.net/learn/absolute/default.aspx?tabid=63
  15. http://www.microsoft.com/uk/msdn/security/link_library.mspx
  16. http://weblogs.asp.net/scottgu/archive/2006/04/13/Source-Code-for-the-Built_2D00_in-ASP.NET-2.0-Providers-Now-Available-for-Download.aspx
  17. http://weblogs.asp.net/scottgu/archive/2006/02/24/438953.aspx

Caching and Url Mapping

Caching.

If you look at the line <%@ OutputCache... in the .aspx files you will see that it is configured to cache the output of that whole page for the value in the Duration attribute. The VaryByParam value indicates that any url parameter will cause the page to be re-generated and cached. Replace the "*" with "none" and the caching will ignore the url params and that page will be cached once for the duration.
The OutputCache can be used in individual user controls as well, however, if the page has a duration of 20 and the control within it has a duration of 10 both will be cached for 20. Reverse those numbers and the page will be cached for 10 but the control will be cached for 20.

Be careful that you don't try to reference in your code a control which may have been cached, as it will come back with a null reference, possibly causing an exception!
One other method of caching is substitution mapping, the drawback being that you can only point this at .net controls, not user controls.

Url Mapping.

Now, go to IIS, create a virtual directory under Default Web Site, point it at the Test solution's directory. Open the Properties panel for the virtual dir. Do the following:
Disable directory browsing.
Under Documents, enable default document and have only 1 default document called default.aspx.
Go back to Virtual Directory, click Configuration, click Add and enter:
1. Executable: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll
2. Extension: .*
3. All Verbs
4. Script Engine ticked
5. Check that file exists NOT ticked
6. Click Ok, Click Ok.
Go to ASP.NET tab and ensure the ASP.NET version is 2.0.50727
Click Ok.
Now, when you browse to http://localhost/test/lose/ or http://localhost/test/win/ you should see the page come up which is actually /test/win.aspx or /test/lose.aspx. Hit refresh and you will see the time has not changed, because the page has been cached. The page appears, even though you have entered a directory name, because IIS is automatically adding default.aspx to any requested directory listing and redirecting all file requests to the .net framework. The .net framework is redirecting from ~/win/ or ~/lose/ to ~/win.aspx or ~/lose.aspx because in the web.config you have a UrlMapping block! Easy.

The only problem with this is that you can't use regular expressions to have, for example, ~/search/ipod/ re-mapped to ~/search.aspx?query=ipod which is annoying, but only because the next server version from microsoft will have a fully operational url mapper and they didn't have time to put it into the current release.

Links:

Caching: http://msdn2.microsoft.com/en-us/library/xsbfdd8c.aspx
Substitution mapping: http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.substitution(VS.80).aspx
Url Mapping: http://www.developer.com/net/asp/article.php/3581326
MS Blog: http://weblogs.asp.net/scottgu/archive/2005/11/14/430493.aspx

Tuesday, March 10, 2009

Tools List

Here's a list of tools which I use on a regular basis and would be a fixture of a Windows image, if I ever create one...
I had a slightly different list previously: http://springboardpillow.blogspot.com/2009/03/tools-list.html

Rubberduck Debugging

Got this from our work email, if you like "intra-mail"...

We called it the Rubber Duck method of debugging.  It goes like this:
1) Beg, borrow, steal, buy, fabricate or otherwise obtain a rubber duck    (bathtub variety)
2) Place rubber duck on desk and inform it you are just going to go over    some code with it, if that's all right.
3) Explain to the duck what you code is supposed to do, and then go into    detail and explain things line by line
4) At some point you will tell the duck what you are doing next and then    realise that that is not in fact what you are actually doing.
The duck    will sit there serenely, happy in the knowledge that it has helped you    on your way.  Works every time.  Actually, if you don't have a rubber duck you could at a pinch ask a fellow programmer or engineer to sit in.

A university in Canada I was told about many moons ago actually had a teddy bear sitting in the student admin's office. When a student wished to book in with a lecturer to discuss a problem they were asked if they'd explained their problem to the teddy bear. If they hadn't, they were told to do that first. This cut something like 80% of lecturer meeting requests from students.

Monday, March 09, 2009

ASP.NET Life Cycle Diagram

Just a quicky...  It's often nice to know what the steps are in the ASP.NET life cycle, as we all forget this (probably) easily and often, especially if we stop using it for a while...

So here is a link providing some good life cycle diagrams:

My favourites:

And one general use link:

He he he!

Creating a certificate in IIS

This is an easy one and really specific to developers who need to do this and only this, but essentially I found the answers by googling "SelfSSL" and "IIS certificate"...
You will need to do this if you want a website hosted in your local IIS which uses HTTPS.

[EDIT: 21/04/2009] If you need a network certificate from an online (or your company's domain) authority, you should Request a Certificate. Microsoft provide fairly easy instructions for this here: http://support.microsoft.com/kb/228821

If you can't locate SelfSSL.exe on your own machine, I've a compressed version you can download here: http://home.freeuk.com/eudoxus/selfssl.rar

[EDIT:01/04/2009] I've just located the download page for this, along with some helpful articles:
For a site I setup recently, I used the following line:
selfssl.exe /N:CN=mytestsite /K:1024 /V:1000 /S:30412573 /P:443 /T

Broken down thus:
selfssl.exe
/N:CN=(sitename - doesn't have to match anything)
/K:(certificate size in bytes)
/V:(expiration period in days)
/S:(site id, found by selecting 'Web Sites' in IIS and checking the 'Identifier' field on the right)
/P:(https port number, leave it at 443)
/T (adds the certificate to the trusted sites list)

Once this is finished, open the Properties panel for the website you've just added a certificate to and go to: Web Site -> Advanced -> Multiple SSL identities for this Web site

In this area you should see that the IP address is 'Default' and the SSL port is '443'. Double click this row (or select and click Edit) and replace the 'Default' IP address entry with the IP address of the web site you created.

This last piece means that when the browser goes to the site looking for a secure page IIS will direct it towards the same site, ie the same IP address, rather than the default (the machine address.) You could create two sites, under different IP's, one secure and one not, but that will make your site building harder as you'll have to cater for this in various ways (that I won't go into.)

Have fun.

[EDIT:18/03/2009] It is my experience (Windows 2003 Server R2, IIS 5.2) that occasionally IIS will need the certificate recreating. I don't know why, but I'll try to document it here if I find out.

[EDIT:01/04/2009] Just been sent this: http://support.microsoft.com/kb/260096
The issue being wrestled with here is that (since version 5.0) when IIS starts up it begins listening for all sites on ports 80 and 443 (standard web and SSL) for incoming connections. This is known as socket pooling. This means that only the first site with SSL (ie: the last site to have a certificate registered) will receive requests on HTTPS. This can be turned off by following the link in the second section (of the above page), which you can also find here: http://support.microsoft.com/kb/259349/EN-US/ Please read both these pages to be fully informed, but for brevity, here are the steps to disable socket pooling:
  • At a command prompt, switch to the "C:\InetPub\AdminScripts" folder.
  • Type the following command:
    CSCRIPT ADSUTIL.VBS SET W3SVC/DisableSocketPooling TRUE
You can also read more about this at: http://support.microsoft.com/kb/238131/EN-US/

Just for reference, I've switched off socket pooling on my machine using the article above and it looked something like this:
C:\>cd Inetpub

C:\Inetpub>cd AdminScripts

C:\Inetpub\AdminScripts>CSCRIPT ADSUTIL.VBS SET W3SVC/DisableSocketPooling TRUE
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

DisableSocketPooling : (BOOLEAN) True

C:\Inetpub\AdminScripts>

Augmented Reality in CSharp

My mind was completely blown away last night when I discovered a blog post by a guy called Casey providing wrapped C++ code for a simple augmented reality project in C#:
http://www.mperfect.net/wpfAugReal/

This is a first step, but it provides a source code solution in .NET to render 3D objects over a live webcam video feed.

To get it running just make sure you have a webcam with a clean image, .NET 2.0 and Visual Studio, the WPF (Windows Presentation Foundation) installed, and DirectShowLib. These are all linked from the above link.

I really hope this can be expanded on and that Casey does not mind me referencing his code because the more interest there is in this, the faster/more practical it will grow and become. We don't see really exciting creations like this in everyday life very often, but hopefully this will establish itself.

Btw, one I've not checked out properly: http://sites.google.com/site/augmentedrealitytestingsite/

Resources:

Thursday, March 05, 2009

ASP.NET Globalization, Culture, Localization and the Resource tag

So here's a couple of useful links that involve setting the appropriate properties of websites in ASP.NET that every .NET coder should be aware of.  Also, something I only recently discovered proper is the tag.  Looks like I've some reading to do, may well expand this entry another time...

ASP.NET Globalization and Localization:

Basic Instincts-Resources and Localization in ASP.NET 2.0: http://msdn.microsoft.com/en-us/magazine/cc163566.aspx


Extract:

In addition to programmatic access, ASP.NET 2.0 also introduces declarative syntax you can use to bind a named string to a property of a page or control. The syntax involves using the dollar sign ($) followed by the Resources namespace, the name of the resource file and the name of the string:

Wednesday, March 04, 2009

Tweet tweet tweet...

Yes, I now twitter...

:)

Commerce Server, Afraid to ask?

Finally getting into Microsoft Commerce Server for work and have been looking around for useful articles to break me in gently.  Some good posts from Max Akbar right here:

http://blogs.msdn.com/maxakbar/search.aspx?q=pipeline+afraid&p=1

The initial thrust of my exploration is Pipelines, hence the first 4 articles in the above search, but the rest is good reading.

gacutil exited with error 9009

Ok, this isn't one for me, right now, but I noticed this occuring in some code I'm working on. Now, I don't mess about with the gac (global assembly cache) in .NET - I'm a straight shooter - but I also like to note down issues with resolutions that might crop up later.

Henceforth, here is a blog post with a useful link:

And the article with the solution (original link):

Essentially, it's useful to be aware that VS does not take into account environment variables when compiling code unless executed with the right options, so best to use the full pathname of assemblies.

Tuesday, March 03, 2009

Quake? Online? In a browser window? Nice(?)

Ok, so I just noticed this little beauty on my Google homepage:
http://www.hanselman.com/blog/QuakeLiveReviewAndRantWhyIsThisInteresting.aspx

However, hmm, looks like it'll be a disappointment.  Better stick with Unreal 3 ;)

Thursday, February 19, 2009

Convert byte[] to String

I was going to make one big entry containing lots of little bits of code, then realised I only had one to put in, because I keep forgetting it...

Converting a byte[] (array) into a String:

string outStr = System.Text.Encoding.UTF8.GetString(inByteArr);

Thursday, February 12, 2009

More useful links...

I have posted many links on this blog, for many reasons. I'll now be posting even more. These are useful .NET coding resources which I simply don't want to forget.

TRULY UNDERSTANDING VIEWSTATE:
http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx
TRULY UNDERSTANDING DYNAMIC CONTROLS (PART 1):
http://weblogs.asp.net/infinitiesloop/archive/2006/08/25/TRULY-Understanding-Dynamic-Controls-_2800_Part-1_2900_.aspx
Building Templated Custom ASP.NET Server Controls:
http://msdn.microsoft.com/en-us/library/aa478964.aspx
Developing Custom ASP.NET Server Controls:
http://msdn.microsoft.com/en-us/library/zt27tfhy.aspx
Introducing Commerce Server 2007:
http://www.microsoft.com/commerceserver/default.mspx
Max akbar - For the hardcore Commerce Server Developer... and demystify the product:
http://blogs.msdn.com/maxakbar/
Getting Started with Windows Communication Foundation (WCF):
http://msdn.microsoft.com/en-us/netframework/aa663324.aspx
Windows Presentation Foundation:
http://en.wikipedia.org/wiki/Windows_Presentation_Foundation
Using Bluetooth in .NET:
http://dotnet.org.za/rudi/archive/2007/09/28/using-bluetooth-in-net.aspx
Search JQuery from inside Spotlight:
http://www.appelsiini.net/2009/2/search-jquery-api-docs-from-spotlight
Mozilla's new cloud-based HTML editor:
http://www.readwriteweb.com/archives/bespin_html_editor_cloud.php
Simon Edwards' blog:
http://www.transceiver.co.uk/
Adobe Photoshop Express:
https://www.photoshop.com/express/landing.html
CoolIris media viewer (see top of page):
http://www.cooliris.com/
What annoys you about Windows?:
http://www.annoyances.org/
YouTube tools:
http://www.quickonlinetips.com/archives/2006/10/the-amazing-youtube-tools-collection/

Friday, January 23, 2009

More Embedded Resource fun

If you're new to embedded resources please read this entry first: http://springboardpillow.blogspot.com/2009/01/embedded-resources-and-having-fun-with.html

Now we'll use the same image, from my previous blog entry, from within the project we created earlier. For this we will need a...

Custom Web Control

To make this, either use the default ServerControl1.cs, or right click the control project and select: Add -> New Item -> Web -> ASP.NET Server Control. By default this should give us:

WebCustomControl1.cs

To get in the habit, first...

Compile the Control Project

Select: Build -> Rebuild [project name]

This will recompile the custom web control project, including the new (empty) control and place it's DLL into the web project. This is because we previously referenced the control project from the web project. Now, we are going to...

Add a reference to the Embedded Resource to the Custom Control

In the new custom control, find the RenderContents(...) method and replace it's content with:

output.Write(
"<img src='"+
Page.ClientScript.GetWebResourceUrl(typeof(EmbeddedCtrls.ServerControl1),"EmbeddedCtrls.cartman.jpg")+
"' />"
);

You should be able to see that this is essentially just manually writing out the same code as was in the previous web page, however this time we are inside the custom control and so the reference to it can essentially be 'this.GetType()'.

Now, rebuild the custom control project as before (Build -> Rebuild [project name]) and the updated DLL will be copied to the web project. All we need to do is...

Drop the Custom Control onto a Web Page

So, create a new ASPX in the web project and open it's design view. If the custom web control project compiled correctly, you should have a new toolbox group called '[project name] Components'.

Grab the custom control from within the toolbox group and drop it onto the designer. Save everything and run the page.

You should now have the same output as in the previous blog entry!

Easy, eh?

Two things to Note are...

That dropping the custom control on your web page add a Register directive to the top (just as any ASP.NET toolbox control does)

And that you will have a <span> tag surrounding your <img> tag. To remove this, simply override RenderBeginTag and RenderEndTag, like so:

public override void RenderBeginTag(HtmlTextWriter writer)
{
// removed one line of default code!
}
public override void RenderEndTag(HtmlTextWriter writer)
{
// removed one line of default code!
}

Listing the Known Embedded Resource

If you want to place a stop point in your code and list the embedded resource files that are available to you, paste the following line just before your stop point:

object a = GetType().Assembly.GetManifestResourceNames();

Upon stopping here, the 'a' object will be a list of embedded resources.

As Before...

The entire demo solution can be found here.

Resources:

http://support.microsoft.com/kb/910442
http://www.codeproject.com/KB/aspnet/MyWebResourceProj.aspx
http://aspnet.4guysfromrolla.com/articles/080906-1.aspx
http://aspalliance.com/726
http://msdn.microsoft.com/en-us/library/yhzc935f.aspx

Embedded Resources and having fun with them

Ok, so, having gotten back from 2 months round the world and almost 3 months not coding at all, I'm feeling rusty. Opening Visual Studio came as quite a shock, simply because "All Those Buttons Can't Possibly Do What I Remember!!!"

Anyway, back in the saddle (I hope) and getting some new code under my belt: This time in the form of...

Embedded Resources

What are those? Well, when you drop, say, a GridView control or something, anything from the toolbox onto your page and it already has, lets say, stylesheets, images, javascript etc, that you think would be better provided as separate files... they probably are. How? Well, when building the code as separate files the non-C# files are placed into an...

ASP.NET Server Control project

This project then needs to be referenced by the web project, so that it's DLL is placed in the website's \bin directory, thus placing any (correctly compiling) custom web controls [because that's what this project type is for] into the toolbox (when ASPX/ASCX 's are in design mode.)

So, lets...

Create a Custom Web Control with images and stylesheets in a DLL

So, open Visual Studio and create a new solution (File -> New -> Project -> Visual C#|Basic -> ASP.NET Web Application) This will give us a website as well.

Now, to this solution, add an ASP.NET Server Control project (File -> Add -> New Project -> Visual C#|Basic -> Web -> ASP.NET Server Control) This gives us a project we can create custom web controls in. This is also the project where the embedded files will be placed.

Ok, so the quickstart to adding and using an embedded resource is...

Add an Embedded Resource and call GetWebResourceUrl

First we need something to use. So lets add an image to the control project - not the web project!

In order to make the image embedded select it in the solution explorer and in the properties panel change it's Build Action to Embedded Resource.

Now make the image usable by expanding the control project's Properties item (in the solution explorer) and edit the AssemblyInfo.cs. Add the following lines to the using declarations at the top:

using System.Web.UI;

And the following to them bottom:

[assembly: WebResource("EmbeddedCtrls.cartman.jpg","image/jpg")]

Where the format is:

[assembly: WebResource("[assembly name].[directory names].[filename]","[filetype]")]

For an image called "cartman.jpg" stored in the root directory of the control project.

Bear in mind that the first part is the assembly name (select the project in solution explorer and click properties) and not the namespace. Also, that rather than being a typical absolute path, the path separators are '.' and not '/'.

We now have a project with an image which can be referenced as an embedded resource, both by code within the control project and any project which references it's DLL's, eg: the web project we created at the start.

Important: One major stumbling block I found was that if the above line of code, in the AssemblyInfo.cs, does not get recognised by Visual Studio, it means something has gone when creating the project. Just delete it and create a new "ASP.NET Control Project". It should appear as so:

[assembly: WebResource("EmbeddedCtrls.cartman.jpg","image/gif")]

Or something close to that, assuming you haven't adjusted your editor styling.

Now, to actually use this image somewhere, we need to...

Add a reference to the Control Project and Compile It.

So, in the web project, right click the References and add the control project as a reference. Then, select the control project in the solution explorer and click Build -> Build [project name]

This will compile the control project and copy it's DLL into the web project's \bin directory. Nearly there. Finally, we need to use it by...

Adding a reference in a web page

Either add an ASPX or open the default one. Paste the following line into the <div></div> statement in the HTML of the page:

<img src='<%= Page.ClientScript.GetWebResourceUrl(typeof(EmbeddedCtrls.ServerControl1),"EmbeddedCtrls.cartman.jpg") %>' />

And run the web page. If everything goes to plan, you should have a page with a single img tag which displays your embedded image.

If WebResource.axd is not found, check the highlighting of the assembly: webresource statement as described above. Also, check that the image file Build Action is set to Embedded Resource, in the properties panel. If the image simply fails to appear, just go through and check that you are providing the correct file name, assembly name, etc.

If you get a web resource exception, it's because you are not registering the embedded resources correctly. If you get a webresource.axd?d=... URL but it shows nothing, it's because the image file is not being referenced in your code properly. The GetWebResourceUrl call and the AssemblyInfo.cs entries must match.

Failing the above, ensure that each time you change the contents of the control project that you rebuild the project and refresh the web page. Simply recompiling the web project will not do it (unless you've configured your solution especially - this is not the default in VS.)

Wasn't that fun? You can download the complete solution here. That is also the same download for the next blog entry, where I will deal with referencing the image from within the control project.

Resources:

http://support.microsoft.com/kb/910442
http://www.codeproject.com/KB/aspnet/MyWebResourceProj.aspx
http://aspnet.4guysfromrolla.com/articles/080906-1.aspx
http://aspalliance.com/726
http://msdn.microsoft.com/en-us/library/yhzc935f.aspx

Saturday, October 04, 2008

Getting MVC setup

This is all about getting MVC Preview 5 running: http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16775

ASP.NET Project page: http://www.asp.net/mvc/

Had a bit of trouble getting MVC setup. A nasty little bugger going by the name of "Cannot load assembly ..." etc. You know the score.

One post on forums.asp.net sorted it all out:

http://forums.asp.net/p/1314519/2596828.aspx

I short, do the following:

Go to: C:\Documents and Settings\All Users\Start Menu\Programs\Microsoft\Microsoft Visual Studio 2008\Visual Studio Tools

Run: Visual Studio 2008 Command Prompt

Go to: C:\Program Files\Microsoft ASP.NET\ASP.NET MVC CodePlex Preview 5\Assemblies

Type:
C:\Program Files\Microsoft ASP.NET\ASP.NET MVC CodePlex Preview 5\Assemblies>gacutil -if System.Web.Routing.dll

And:
C:\Program Files\Microsoft ASP.NET\ASP.NET MVC CodePlex Preview 5\Assemblies>gacutil -if System.Web.Abstractions.dll

That should install the DLL's into the GAC (Global Assembly Cache) and cause .NET 3.5 to find them suitably.

Thursday, August 28, 2008

Release Mode missing

I recently realised, after a long time of not caring, that there are two ways to create a web project, with only one allowing Release Mode compilation.

Release Mode allowed: File -> New -> Project -> Visual C# -> Web -> ASP.NET Web Application

Only Debug Mode allowed: File -> New -> Website

Of course, from the command line, both of these options are available, as the options taken when creating any project are simply preset instructions for the compiler switches.

However, I feel it's important to note that only in Release Mode can the source of the website be compiled into a single DLL.

Reference: http://forums.asp.net/p/1053679/1532732.aspx#1532732

Friday, June 20, 2008

Getting ASP.NET Authentication in SQL Working

Firstly, you could go here, which helped me: http://weblogs.asp.net/scottgu/archive/2005/08/25/423703.aspx

Otherwise, just go to: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

Run the aspnet_regsql.exe and following through the Next button.

If you want to setup a connection to your local machine running sql express, be sure to enter <machinename>\<sqlserver> for example: MATTSMACHINE\SQLEXPRESS

Everything should now be setup.

The next bit is optional, but I like to go to: http://msdn.microsoft.com/en-us/library/cc467894.aspx

Get the latest build of the Microsoft Enterprise Library. The setup is fairly simple, just install and follow the instructions for setting up the web.config and connection strings for allowing the data access layer. This will provide easy to use connection pooling and everything you need for single command SQL execution on your db.

The important entries in your web.config file should be:

<configSections>
<section name="dataConfiguration"...
...
</configSections>
<connectionStrings>
<add name="chopDatabaseConnection" providerName="System.Data.SqlClient"...
...
<dataConfiguration defaultDatabase="chopDatabaseConnection"/>

And you're away!

You might also want to read this:

Friday, May 23, 2008

Slapdash - Putting feeds on your page the easy way

I wanted to read RSS into a DataSet but found that when loading the XML from, for example, a community server feed I would often get a 'column already exists'. This was because the feed used namespaces which causes elements to be declared like this: <slash:comment>

There are two solutions to this. First, write an XSLT to parse out the stuff I don't want. Second, run over the raw XML myself and filter it. I wanted to go with the second, because writing XSLT for every customised RSS, ATOM, etc feed that my front end developers might want to use didn't appeal - I just wanted to be able to load the RSS into a DataSet. However, then I found some code which seemed to work: http://www.aspcode.net/Updated-RSS-reader-class-dealing-with-already-belongs-error.aspx

The one problem I had was that the code did not seem to know when an element like <enclosure/> did not have a closing tag following it. I have fixed this code and present it below. I have used it to load the header information and each item entry in the RSS feed into a couple of repeaters, for quick databinding, so that I can provide a simple data layout for my front end designer to work with. He can then style this anyway he likes and I can even wrap the items table in a DataView to sort and filter it by any combination of fields in the feed. Of course, because this uses a DataSet, I could even merge other feeds into it.

Many thanks to, er, admin(?), for writing the original - you really have helped me a lot!...

    protected void Page_Load(object sender, EventArgs e)
{
DataSet set = new DataSet();
XmlTextReader xmlRdr = new XmlTextReader("http://stuff.tv/blogs/cool/rss.aspx");
XmlDocument doc = new XmlDocument();
doc.Load(xmlRdr);

set = GetRSSDataSet("http://stuff.tv/blogs/cool/rss.aspx");

headerRepeater.DataSource = set.Tables[1];
itemsRepeater.DataSource = set.Tables[2];

DataBind();
}

public DataSet GetRSSDataSet(string m_strAdress)
{
DataSet m_ds = new DataSet();

System.Xml.XmlTextReader oXml = new System.Xml.XmlTextReader(m_strAdress);
oXml.WhitespaceHandling = System.Xml.WhitespaceHandling.None;
System.Text.StringBuilder oBuilder = new StringBuilder();

bool fContinue = oXml.Read();
while (fContinue)
{
string sName = oXml.Name.Replace(":", "_");
bool isClosed = oXml.IsEmptyElement;
if (oXml.NodeType == System.Xml.XmlNodeType.Element)
{
//Add the element...
oBuilder.Append("&lt;" + sName);
if (oXml.HasAttributes)
{
while (oXml.MoveToNextAttribute())
{
sName = oXml.Name.Replace(":", "_");
oBuilder.AppendFormat(" " + sName + "=\"" + oXml.Value + "\"");
}
}
if (isClosed)
oBuilder.Append("/");
oBuilder.Append("&gt;");
}
else if (oXml.NodeType == System.Xml.XmlNodeType.Text)
{
oBuilder.Append(System.Web.HttpUtility.HtmlEncode(oXml.Value));
}
else if (oXml.NodeType == System.Xml.XmlNodeType.EndElement)
{
oBuilder.Append("&lt;/" + sName + "&gt;");
}

fContinue = oXml.Read();
}
oXml.Close();

string sXmlResult = oBuilder.ToString();


m_ds = new DataSet();
System.IO.StringReader oStringReader = new System.IO.StringReader(sXmlResult);
try
{
m_ds.ReadXml(oStringReader, System.Data.XmlReadMode.Auto);
}
catch (Exception ex)
{
m_ds = null;
}
if (oStringReader != null)
oStringReader.Close();
if (oXml != null)
oXml.Close();
return m_ds.Tables.Count == 0 ? null : m_ds;
}
 [EDIT: 2008-06-20] I have a .NET3.5 new and improved version of this, which allows multiple feeds and optional sorting - I'll post this later.
[EDIT: 2009-02-19] Sorry for not having posted the replacement of this code.  I will, when I find it.  A lot has happened since the original posting.  

Tuesday, April 01, 2008

How to Auto-Create Stored Procedures

Use this script. I make no guarantees on it's solidity, but it has been useful. It will try to execute the CREATE PROCEDURE commands it executes, so comment those out if you want to run them manually.

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- Author: Matthew Webster
-- Create date: 2007-03-20
-- Description: Automatically creates stored procedures for insert, update and delete functions
ALTER PROCEDURE [dbo].[Cms_CreateAuto_Procs]
@author nvarchar(250),
@tableName varchar(8000)
AS
BEGIN
SET NOCOUNT ON;

--declare @tableName nvarchar(50)
--set @tableName = 'editorialtypegroup'
--declare @author nvarchar(50)
--set @author = 'Matthew Webster'

declare @insert varchar(8000)
declare @update varchar(8000)
declare @delete varchar(8000)

declare @key varchar(8000)
declare @fields varchar(8000)
declare @arguments varchar(8000)
declare @variables varchar(8000)
declare @assignments varchar(8000)

set @key=''
set @fields=''
set @arguments=''
set @variables=''
set @assignments=''

select @key=@key+ ', '+column_name
from information_schema.columns
where table_name=@tableName and (COLUMNPROPERTY(OBJECT_ID(@tableName), column_name, 'isidentity') = 1) AND (column_default IS NULL)

select @fields=@fields+ ', '+column_name
from information_schema.columns
where table_name=@tableName and (COLUMNPROPERTY(OBJECT_ID(@tableName), column_name, 'isidentity') = 0) --AND (column_default IS NULL)

select @arguments=@arguments+ ', @'+column_name+' '+data_type+'(' + cast(character_maximum_length as varchar(10)) +')' + case is_nullable when 'no' then ' ' when 'yes' then '=null' end
from information_schema.columns
where table_name=@tableName and (COLUMNPROPERTY(OBJECT_ID(@tableName), column_name, 'isidentity') = 0) and character_maximum_length<>null AND (column_default IS NULL)and data_type<>'text'

select @arguments=@arguments+ ', @'+column_name+' '+data_type
from information_schema.columns
where table_name=@tableName and (COLUMNPROPERTY(OBJECT_ID(@tableName), column_name, 'isidentity') = 0) -- and (character_maximum_length=null or data_type='text' ) AND (column_default IS NULL)

select @variables=@variables+ ', @'+column_name
from information_schema.columns
where table_name=@tableName and (COLUMNPROPERTY(OBJECT_ID(@tableName), column_name, 'isidentity') = 0) --AND (column_default IS NULL)

select @assignments=@assignments+ ', '+column_name+' = @'+column_name
from information_schema.columns
where table_name=@tableName and (COLUMNPROPERTY(OBJECT_ID(@tableName), column_name, 'isidentity') = 0) --AND (column_default IS NULL)

set @key=SUBSTRING(@key,3,len(@key))
set @fields=SUBSTRING(@fields,3,len(@fields))
set @arguments=SUBSTRING(@arguments,3,len(@arguments))
set @variables=SUBSTRING(@variables,3,len(@variables))
set @assignments=SUBSTRING(@assignments,3,len(@assignments))

/*--
select @tableName
select @key
select @fields
select @arguments
select @variables
select @assignments
*/
declare @insertProc varchar(8000)
set @insertProc = '
CREATE PROCEDURE Cms_Auto_Insert'+@tableName+'
'+@arguments+'
AS
BEGIN
SET NOCOUNT ON;
insert into '+@tableName+' ('+@fields+') values ('+@variables+')
END
;
'

declare @updateProc varchar(8000)
set @updateProc = '
CREATE PROCEDURE Cms_Auto_Update'+@tableName+'
@'+@key+' int, '+@arguments+'
AS
BEGIN
SET NOCOUNT ON;
update '+@tableName+'
set '+@assignments+'
where '+@key+' = @'+@key+'
END
;
'

declare @deleteProc varchar(8000)
set @deleteProc = '
CREATE PROCEDURE Cms_Auto_Delete'+@tableName+'
@'+@key+' int
AS
BEGIN
SET NOCOUNT ON;
delete from '+@tableName+' where '+@key+' = @'+@key+'
END
;
'

exec (@insertProc)
exec (@updateProc)
exec (@deleteProc)

END

How to Stack Trace SQL

Just use SQL Profiler - if it's installed! Open the profiler, connect to a database, File->New. Remember to check the boxes for text query and hit run. Let your code do it's bit, then hit stop. But be quick about it, because there's probably a lot of other stuff going on and (like C# debugging) this could all come jumping out you in a very short space of time.....

Friday, January 11, 2008

Useful MSDN Blog Links and Immutable Classes

The standard feed provided in the Visual Studio 2005 Start Page provides some very useful links. One of them is this:

http://blogs.msdn.com/lucabol/archive/2007/12/28/creating-an-immutable-value-object-in-c-part-iv-a-class-with-a-special-value.aspx

a blog tutorial on creating immutable classes and the clever things to do with them.

I'm hoping to build a large list of really useful links featured on that feed, here.

Yes, yet another list.

MicroSoft Visual Source Safe

This is just a little post to lament the problems provide (as features) by VSS.  Fortunately, this guy has posted them already: http://www.highprogrammer.com/alan/windev/sourcesafe.html

Happy coding...

Thursday, January 10, 2008

SubSonic and some DAL stuff

So I've been using CodeSmith with NetTiers for over a year now and loving almost every minute. However, there is now a very large problem which seems to have settled in and won't go away, like an elephant in the corner at a party. Except that everyone is talking about how to get rid of it, but no-one's managing to shift the thing. This problem is that Deep-Loading and Deep-Saving cannot be guaranteed in any version. (My personal issue with this is that if a nightly release does appear with a fix, any number of other critical bugs arise to replace it.) So, what we have is a DAL (Data Access Layer) generator which used to be wonderful and cuddly, but is now more of a problem than the number it solves.

So, what am I doing about it? Helping to solve the code issues? Submitting a new series of DAL templates using a radical and effective new code schema? Or ignoring the problem entirely?

That's right, I'm leaving my rather large application using the last, most reasonable generated DAL layer as it is, until I find another DAL generator I can use. Obviously, this is because there's a lot of people with much more experience solving their own code bugs without me trying to hack their templates apart. While I feel a little guilty about jumping ship, I will quite happily throw my support behind them if this quite annoying bug gets solved - something which used to be a huge selling point, IMHO.

Anyhow, this situation has opened a number of avenues. Among them is a little thing called SubSonic, with the catchy slogan "All Your Database Are Belong To Us!" Nice.

I'm only just starting with this one, so I've no useful (or other) information to pass on, so I'll start with some links and hopefully, soon, there'll be plenty of musing from my addled brain...

http://geekswithblogs.net/dlussier/archive/2007/12/30/118069.aspx
http://geekswithblogs.net/scottkuhl/archive/2006/11/17/97470.aspx
http://subsonicproject.com/view/for-web-sites---using-the-buildprovider.aspx
http://www.codeplex.com/subsonictools
http://blog.benhall.me.uk/2007/10/setting-up-subsonic.html
http://www.scribd.com/doc/94319/SubSonic?query2=%27SubSonic.Generated.+does+not+contain+a+definition+for

Saturday, November 03, 2007

ReOrderList replacement and other AJAX.NET Fun

Having gotten fairly annoyed with the flaky-ness of the AJAX.NET ReOrderList control (among others) I've decided to take a look at building my own. Having had a look at a really great tutorial on javascript drag and drop code:
http://www.webreference.com/programming/javascript/mk/column2/
I've built a couple of custom controls; DragItem and DragContainer. These are part of an in-dev solution I'm building to provide myself (and anyone bothered enough to read on) with lightweight AJAX controls. Mostly because I want to understand the intricacies of this black magic, but partly because I believe the javascript libraries provided by the AJAX Toolkit to be too heavy for inidividual control use.

To justify myself here: I love the Ajax Control Toolkit and think MS are doing a brilliant job, especially when there are kits like:
http://www.telerik.com/
out there. But, and this is big, the dynamically provided javascript libraries which the API requires each browser page to download (assuming the ScriptManager control is placed) are too big. I want a small piece of script, perhaps placed within the page, rather than a seperate file, to perform efficient, fast actions, not replace most of the js API in the browser and watch/handle a million things I'm probably not even aware are going on. Not that I mind those features being there when they're needed!

Anyway, here's a list which might be useful to some:
http://ajaxpatterns.org/DotNet_Ajax_Frameworks

And here's the solution download for my own .NET AJAX controls:
http://home.freeuk.com/eudoxus/JsWebSite.rar

Saturday, October 06, 2007

UnbindablePanel

To download the example solution click here: http://home.freeuk.com/eudoxus/JsWebSite.rar

[EDIT 03/11/2007] This link has been changed to include the code provided in my most recent Ajax-oriented post: ReOrderList replacement and other AJAX.NET Fun

I've been trying to get a Repeater to bind it's DataSource to contained controls for differing content. What I mean, there, is that if the DataSource has objects of different type I want to render a different data binding within the ItemTemplate depending on the type of data in the current DataItem. [Skip the next two paragraphs to get to the interesting bit.]

Having failed to try this by forcing Panel, PlaceHolder, MultiView/View and Wizard/StepTemplate from binding in anything other than a straightforward way (I hate it when future me can't follow younger me code!) I decided to try my latest trick...

Ok, I can't believe I didn't realise this before (or perhaps a more obvious solution - which, no, I still haven't discovered), but inheritting Panel and adding or overriding to get the functionality you want is just about the best way to make accessible, functional custom controls! They have data containers, can be bound, are supported by VS GUI and everyone understands them.

So, the situation is thus; I have bound a Repeater to a DataSource which provides an enumeration of objects which have different properties. This could be a random collection of DateTime, String and DataRow objects, or anything. Don't ask why, I just want to do it.

My solution is, essentially, to make a Panel which will not bind it's child controls if told not to. To decide whether it should or not, we simply check the class type, an identity or type field, property or namespace, etc.

So, first we inherit the Panel control:

public class UnbindablePanel : Panel

Then we have to provide a property which will determine whether or not the child controls found within the Panel will be databound:

private bool _allowChildBinding = true;
public virtual bool AllowChildBinding
{
get
{
return _allowChildBinding;
}
set
{
_allowChildBinding = value;
}
}

And finally, override the DataBindChildren() method to avoid the databinding if needed:

protected override void DataBindChildren()
{
if (AllowChildBinding)
{
base.DataBindChildren();
}
}

There is a little extra; in order to ensure the Panel is not visible at all, you might want to include a property/method combo to ensure the visibility matches the databound true/false value. This would stop any non-databound controls from being seen, but as such, is not absolutely necessary and is not the driving force behind this class.

To download the example solution click here: http://home.freeuk.com/eudoxus/JsWebSite1.rar

Thursday, July 12, 2007

Finally got Microsoft Bluetooth Generic and ActiveSync working again!

My story so far to repairing bluetooth and activesync when they absolutely refuse to play ball...

Prologue:
(1) Disabled Microsoft ActiveSync to stop my mobile synchronising every time I wanted to charge it.
(2) Updated all software via Windows Update, including Bluetooth drivers.

Synopsis:
(1) ActiveSync refused to work again, even with repeated un-installs and re-installs.
(2) My ePox BT-DG03 Bluetooth USB Dongle stopped working because the latest Microsoft Bluetooth drivers are now called ABE Bluetooth Controller and don't work with it (these replaced the previous Windows XP SP2 bluetooth drivers "Generic Bluetooth Radio" and "Microsoft Bluetooth Enumerator".)

Today:
(1) Took a complete, clean copy of my C:\Windows\Inf, C:\Windows\System32 and all sub-folders onto my iPod and brought them in.
(2) Uninstalled ActiveSync and all associated Bluetooth drivers (Add/Remove Programs and Device Manager.)
(3) Connected Device via USB cable; Machine should recognise Generic RNDIS device and ask for drivers, etc.
(4) PLugged-in bluetooth dongle; Machine should again recognise bluetooth device and ask for drivers, etc.

The Secret:
When drivers are asked for;
(1) Un-install all the existing device drivers to avoid conflicts.
(2) From device manager, perform Update Drivers.
(3) Select "Install from a list or specific location (Advanced)."
(4) Select "Don't search. I will choose the driver to install."
(5) Click "Have disc".
(6) Browse to your backed-up copy of C:\Windows\Inf and select the file "drvindex.inf".
(7) From then on it should find the correct devices and all you have to do is show it where to find the right files.

I had to do this 2 or 3 times before the driver installs stuck, but now it's fairly happy and I can just plug the dongle and mobile phone in and no more reinstalls need to take place.

The key files I found are:
Bluetooth Device;
(1) rfcomm.sys (system32\drivers)
(2) wshBth.dll (system32)
(3) irftp.exe (system32)
(4) irmon.dll (system32)
Standard Modem over Bluetooth link;
(1) bthmodem.sys (system32\drivers)

Be warned, there are more files the auto-installer will ask for, but if/when I need to do this again, I'll try and note them all down.

Epilogue:
(1) I've had one instance where the bluetooth dongle needed to be reinstalled, but with care and forethought, the right drivers can be picked - this is down to selecting Show All Devices (when the option is presented) and always selecting \Inf\drvindex.inf, to give the auto-install the best chance of finding the right driver.

Saturday, July 07, 2007

iTunes Remote Control

Well, after a lot of help from the http://www.32feet.net/ forums, not forgetting Mr. Peter Foot himself, and late night messing, I've finally got a working version of my iTunes remote control (kinda) finished.
Ok, for those interested enough, there's a log window, which shouldn't dump out too much; volume controls work, but there's a bug in that once a volume or position value gets changed, messages start getting thrown back and forth- Once I've re-worked the request and response formats I'll be fixing the synchronisation issues. The format issue will also allow the playlist window to function by feeding from partial list messages.
There is also an iPod look-a-like dialog, which will in time provide full control. This will be waiting until after the other functions/bugs have been sorted out.
You can download the current version here: http://home.freeuk.com/eudoxus/BtChat.2007-07-07.001.rar
Again, thanks to everyone on the 32feet.net forums who helped!
Matt.

Thursday, July 05, 2007

Bluetooth iTunes Remote for Windows Mobile 5.0

Yep, I've been developing (and having problems with) a .NET/C# iTunes remote control for Windows Mobile 5.0. For my own reference, here's the download: http://home.freeuk.com/eudoxus/BtChat.iTunesRemote.2007-07-05.001.rar

[EDIT] This has no changed to: http://home.freeuk.com/eudoxus/BtChat.2007-07-07.001.rar
Please see post for update: http://springboardpillow.blogspot.com/2007/07/itunes-remote-control.html

In theory, I've got the whole thing working:

Queued message sending (from the client) to avoid blocking the BT device
Threaded timer updates of the display
Error log dialog
Back/Next/Play/Pause/Volume/Time controls
Track/Artist/Album display

The problem I'm facing right now is that bluetooth has completely failed on my work machine and I'm finding that the only drivers which work are the Generic Bluetooth Radio and Microsoft Bluetooth Enumerator - which should be one driver and are ONLY available via Windows Update - and of course have now been replaced by a broken driver called ABE.

To add to the fun threading seems to lock up when I kick off my own thread on the device side of the application, as if the two threads used for monitoring in-coming messages are the only threads I'm allowed to run. I'm not sure, but I think it might be the BtListener thread which is causing problems, however the forums say otherwise.

Wednesday, June 20, 2007

Infinities Loop Auto Complete Extender

I've been reading with interest, for a while now, that http://weblogs.asp.net/infinitiesloop/ has a rather nice textbox auto-complete extender. Lots of people have had lots to say on the matter, so I'll be short: I've had trouble getting the code provided to build and run, even with the assistance of the links provided on the blog entries.

The most useful entries (to date) appear to be:

http://weblogs.asp.net/infinitiesloop/archive/2006/11/15/ASP.NET-Ajax-Beta_3A00_-AutoCompleteBehavior-without-a-Web-Service.aspx
http://lvildosola.blogspot.com/2007/01/how-to-get-smartautocompleteextender.html

Having downloaded the files I played around and got it all nicely working. I really have to hand it to I.L. because having state information available where the http://ajax.asp.net/ajaxtoolkit/ forces you to use a webservice (and thus lose all context of the user's session, etc) if invaluable.

My personal use for the context is to specify a locale for the searching of brands where users in different locales would get different results. I think the most obvious would be the searching of a user's personal history of textual terms.

Anyway, I've got the solution and all the .dll files required, in a .rar here:
http://home.freeuk.com/eudoxus/MattsSmartAutoCompleteRTM.rar

Thursday, May 24, 2007

Loader Lock exception in windows applications

Blatantly ripped from: http://www.thezbuffer.com/articles/304.aspx


Error Message:

LoaderLock was detected
Message: DLL '.......\Microsoft.DirectX.Direct3D.dll' is attempting
managed execution inside OS Loader lock. Do not attempt to run
managed code inside a DllMain or image initialization function since
doing so can cause the application to hang.A Loader lock is one of the Managed Debugging Assistants (MDAs) that were added to VS2005 to help find hard to debug runtime issues. There is code in all Managed DirectX 1.1 assemblies that causes this MDA to fire. Microsoft have confirmed they are aware of the problem. However I do not expect to see a fix for MDX 1.1 since current efforts are focused on MDX2.0/XNA Framework, it ONLY affects code run under the debugger (i.e. it won't happen when users run your EXE) and there is a trivial workaround. I'm not sure of exact reproduction steps - it appears to fire on some projects and not on others.

To work around the problem you have several choices:

Go back to using VS2003 and .Net 1.1
Use MDX 2.0. Note that MDX 2.0 will never actually ship as it is being transformed into the XNA framework.
Disable the loader lock MDA. Debug/Exceptions (ctrl-D, E), Open the Managed Debugging Assistants tree node and uncheck Loader Lock. This setting is per solution so it will only affect this solution.
Versions affected:All .Net 1.1 Managed DirectX assemblies when used with Visual Studio 2005 and .Net 2.0.


My apologies, but I will get around to writing my own piece on this particular exception and it's foibles myself when I've got time!

Monday, January 29, 2007

Top 10 Worst Album Covers Of All Time

Yeah, I know, it's a complete waste of an entry, I just wanted to try out the new blogger engine and thangs, y'all know.

Check out http://salamitsunami.com/archives/91 for some laughs, old though I know it is. Maybe I can generate some hits, but then again, people might start reading this drivel.

Onk.

Sunday, October 29, 2006

The Bluetooth Saviour

I discovered a very useful little help page somewhere long ago, then lost it again. It was to do with installing WIDCOMM drivers for the USB BT dongle (mine's an ePox dongle.) Anyway, I found essentially the same document written by someone over at:

http://www.geekzone.co.nz/forums.asp?ForumId=8&TopicId=2200

I thought I would repost it here, as long as they don't mind, and hopefully it will stay available for all perpetuity...


This is a small guide for those who installed the Service Pack 2 for Windows XP and are experiencing problems with the WIDCOMM Bluetooth software..If you install the WIDCOMM BTW 1.4.2.10 Bluetooth software on Windows XP SP2, you will get the following error as soon as you double click on the blue-red system tray icon:"Your Bluetooth Software license does not include use with this Bluetooth Device"After that you will be asked to point to a valid license.dat file. However if you select the license.dat that came with your manufacturer's driver (be it on CD-ROM or downloaded from the manufacturer's website) it still won't work.The reason for this problem:In the Service Pack 2, Microsoft included a generic Bluetooth driver, naturally being WHQL-certified -- it's directly from Microsoft. The WIDCOMM Bluetooth driver however is not WHQL-certified, so Windows XP continues using the generic driver. This interferes with the WIDCOMM Bluetooth software resulting in the above error.To force Windows XP to use the WIDCOMM driver, perform the following steps:Don't plug in the Bluetooth device yet.If you have any Bluetooth software apart from the included Windows drivers installed, deinstall them and reboot. I am not sure if this is necessary, but just in case.Install the WIDCOMM BTW 1.4.2.10 Bluetooth software. When it asks you to plug in the Bluetooth device and click OK, don't, and click cancel instead.When the WIDCOMM setup has finished, plug in your Bluetooth device and let Windows install the driver. (There should be two Bluetooth icons in the system tray; one blue-white: this is the Windows driver - and one blue-red: this is the WIDCOMM driver which is deactivated.)Now go to the Device Manager, right click on the "Generic Bluetooth Radio" and select "updatedriver". Don't let Windows XP connect to the internet, then select "Choose software from a list or specified location". In the next window, select "Don't search, but select the driver to install".In the next window, activate "Show compatible hardware" (if it isn't activated already) and select your manufacturer's driver instead of the "Generic Bluetooth Radio" driver.Click next until the new driver is installed. Now the WIDCOMM system tray icon should be blue-white as well, activated and ready to use.If you now double click on "My Bluetooth Places" (e.g. on the desktop), the WIDCOMM software installation will be continued and finished.This should solve any compatibility issues with the WIDCOMM BTW 1.4.2.10 Bluetooth software and Microsoft Windows XP SP2.If you still experience problems, please reply to this thread. If necessary, I will update this HowTo accordingly.

Thursday, October 19, 2006

Net Tears and Code, Sniff

Ok, so I've been right gettin inta CodeSmith and NetTiers this past few months and it's all wicked.

Seriously useful shit.

I'll post back here more when I can figure out exactly how to post code without having to trick the parser in the blogger.