Posted on

Free Google and Bing Maps? Not For Long

Money Map Banner

Store Locator Plus is helping 45,000+ WordPress sites present interactive store locator and directory maps to their customers.   Along the way I have gained the loyalty and trust of thousands of web consulting agencies, design agencies, and website owners from mom-and-pop shops to multinational corporate enterprises.    Part of keeping that loyalty and trust is keeping up with changes in technology and in business.

Over the past month I have been in conversations with both Google and Microsoft regarding their map services.   It is no surprise to anyone that has been paying attention that maps are THE Go To Service for both these companies.     The proliferation of mobile devices and the partnership it brings between  “show me what I want” and “for where I am standing right now” has catapulted mapping services from a “yeah, we have that too” service to a must-have component.

Monetizing The Maps

Based on my recent conversations with both companies it is clear.   Google and Microsoft are the top players in mapping technology and they are going to monetize that technology every way they can.    They are NOT going to leave that money sitting on the table.   If you are a business and are using maps to enhanced your customer experience, the writing is on the wall:

YOUR BUSINESS WILL BE PAYING FOR MAPS.
Period. End of story.

Money Map

Google and Microsoft have all been putting a LOT of work into their map products.  They are both offering paid services for business maps.    They are also putting a lot of pressure on third party service providers, like Charleston Software Associates, to start paying for access to those maps.

It is no longer an option to provide premium map services to your customer base and avoid paying a license fee if there is a map solution involved at any step of the process.   If you do charge for ANYTHING even remotely related to showing a map on a website you need to purchase a map license.   Have a freemium model, like Store Locator Plus, where “all the map goodness” is baked in to the free offering but the “CSS and HTML special sauce” exists in paid add-on packs?  Doesn’t matter, it is tangential to the maps and thus a “premium maps offering”.   If you earn ANY money in ANY way related to a map API you must purchase a license.

How much are those licenses?   Tens-of-thousands of dollars depending on who you talk to.      Have 100,000 visitors looking at your map page in a year?   Try something north of 6-figures.

No wonder Apple decided to contract their own mapping services. Makes complete sense why they stuck with it after the first roll out that was less-than-perfect and current iterations are “not quite right”.   If a small business is paying tens-of-thousands and a big business is paying hundreds-of-thousands, imagine what sort of licensing fees Apple had to be paying.

What This Means For SLP

I have been working the business plan for Charleston Software Associates and trying to justify the nearly $20,000 license fee that Google is charging for an OEM license starting next month.    It is an annual fee that may (and likely will) increase in coming years.   Thankfully I have just enough people buying premium add-on packs to justify the expense.

How does this affect Store Locator Plus?  I plan on providing the same plugins I have provided for the past 2 years.    I hope to continue providing a free base product in the WordPress directory, though that may change.  It is possible that I will need to keep a Google OEM license “locked up” on my servers and make a call-back to my cloud presence before locations can be geocoded.  I am still working out the legal and technical details on that aspect with Google.   Hopefully things can remain as they are with only improvements and “no additional middle-men” in the process between your website and the Google servers.

 

Store Locator Plus Home Page

For the foreseeable future everything will remain as it is.  This puts a significant amount of added pressure on Store Locator Plus to generate revenue.   Based on the current install base that should not be a problem. Sadly less than 10% of the 45,000 installed sites purchase ANYTHING from Charleston Software Associates.   More than 41,000 sites use the free product with zero contribution toward its development and support.

One thing is certain, starting in July I am locked into the Google Maps program for at least a year.   That means SLP and the add-on packs will be around until at least August 2015.      The best way to ensure SLP is around much longer than that is for users to support the endeavor by purchasing a Premier Subscription.  The recurring annual or monthly revenue helps offset the costs of the Google OEM license.

DIY Maps?  Not So Fast

In case you are thinking “no big deal if SLP were to go away, we will just put Google or Bing Maps into our site directly”, not so quick.    If your business is getting more than a few-thousand visits to your map you are going to get a call.  It is only a matter of time.  When you do the conversation goes something like this “Are you running a business that benefits in any way from having the map on your site?  Yes?   Here is your $20,000 bill.” .  The only way out of it will be having a registered OEM licensed product such as Store Locator Plus.

“If SLP goes away there are other WordPress locator plugins on the market.” True.  For today.   They are all “getting the call” over the next few months.    By this time next year there will be only TWO types of WordPress map plugins on the market.  Premium with support and free but in constant danger of becoming outdated, unsupported, and abandoned.

Getting A Deal On Map Licenses

How can you get the best deal for your Google Maps license?  Buy a Premier Subscription.  It is FAR cheaper than getting a license directly.    CSA is taking the “up front hit” on the license fee which is then distributed among all users.    When Google starts fine-tuning the Geocoding and map presentation service to more closely monitor per-site user stats, Premier Subscribers will be the first to have unrestricted access and higher data caps.

Paying For Good Things

I can’t say I blame Google of Microsoft.   They have a great product that they have been letting businesses use at no charge for a very long time.  They have poured millions of dollars into the acquisition of intellectual property and millions more into the research and development of the products.

I have no issue with paying for the services that enable my customers to provide a better experience for their users.

For Store Locator Plus, I have elected to continue to support Google.  I’ve been a long-time fan of Google. I am an investor in Google stocks since the early days and have been a paid Google Business services user for nearly as long.   I like the company, the culture, and their positive impact on the technology landscape.  Plus they just seemed more interested in my business and helping me out.    I also think it is the best option for my users that have been “with Google” through Store Locator Plus for that past few years.

Improved Offerings

One of the immediate benefits is that  I will have access to the Google Enterprise development team, apparently including someone into extreme skiing.  More important, however, they can help advise on how to better implement the technology.

Google Enterprise
Google Enterprise staff will be available to CSA for advice.

In addition the new license allows for much higher data caps and throughput than the base product.  I am planning several new service options to increase map throughput.     One of the top items on that list is a paid bulk upload service that will allow larger sites to geocode up to 100,000 locations daily.

I have a lot of locator coding in front of me over the next few months and will be bringing some new coders up-to-speed to help get it done.  In the meantime I ask for your patience and support as I navigate the changing landscape of mapping solutions.  I hope that I can remain a loyal and trustworthy guide for my customers.

Thank you for your continue support of Store Locator Plus!

Posted on

How To Be Unproductive Doing 8 Hours of Coding

Today was just one of those days.   You know, THAT day.   When you wake up early, get online and think “this is going to be a good, productive day”.   Then all hell breaks loose.   8 hours later you’ve found yourself coding and doing system work all day long and have NOTHING to show for it.   That was my kind of day today.   What broke & what I learned so you may possibly avoid the same issues or at least spend less time fixing them.

Woocommerce 2.0

Ouch.  The new UI is nice.  They fixed some bugs.  They patched some security holes.   They didn’t document a DAMN THING when it comes to all the modifications in the core engine.  You know, little stuff like how their hooks and filters were changed.  The stuff that many third party Woocommerce add-on packs, their own add-on packs, and my custom PayPal tracking and licensing system utilize.    That made for another long day after spending 4 hours reading their code to learn what they changed and patching those items yesterday.   I don’t know how many other Woocommerce items broke yesterday, but I’m guessing it was more than just mine.

Today the PayPal IPN listener was not working.   Turns out they completely removed the original AJAX listener that was, and still is, documented on their site as “how to get your custom PayPal buttons to record transactions in Woocommerce”.   Thus, anyone that purchased the Pro Pack from within the plugin would not get recorded.  No sale.  No license.  No fun.

Some of the hooks and filters that impacted me were the way the WC_Order methods are written, how to fetch an order from a PayPal transaction, and other niceties.   If you have a custom processor for WooCommerce and PayPal and have issues, contact me at this site and I can share some of my hacks.

After HOURS of digging I finally discovered that I had to change my PayPal IPN settings for the new Woocommerce “feature”.   Thanks Woo team for letting all of us IPN users know.   Making the change was easy enough after reading code for 3 hours to learn what the heck they broke in Woocommerce, but…

PayPal IPN

PayPal, in typical fashion, has done half-a-job in making things work.  Once I discovered what I needed to change to get the IPN working with Woocommerce I went and updated my IPN address in PayPal.   Well, in a wonderfully useful moment of forward-thinking by the PayPal dev team, I learned that if you change the IPN service address TODAY then any transactions posted before TODAY will not use the new address.

OK, I guess I get that, but here is the fun part.   I have several transactions from this morning that were sent to the wrong location.   So I just change the setting to the new location, find the transaction, and click the “resend IPN transaction to your server” button.  That should do it, right?  WRONG.   They never read the updated URL.   Thus there is NO WAY to get those few wrong transactions to be put through to my server and “do the magic”.    What a PITA.     Because of this one simple issue I then spent another hour hacking Woocommerce so I could fake an IPN transaction without leaving a huge gaping security hole in my site.

Thanks PayPal.

Oh… and for the record, your PayPal IPN needs to be like this:

http://<your site>/?wc-api=WC_Gateway_Paypal

NOT the old-school /?paypalListener=paypal_standard_IPN setting.

However, not to be outdone, Microsoft decided to get in on the act.

Azure Code-word For…

I finally figured out why Microsoft named their new cloud service Azure.    At first I thought it was some clever reference to the sky… you know, clouds are in the sky, the sky is blue, but Amex kinda took that word and marketed the crap out of it… so clever Microsoft came up with Azure.  How cute.   But then I figured out what it really means…

Servers are shutdown out of the clear azure… I mean blue…

Yup, that’s right.    Here I was logged in to the middle of a log tracking session as a priv’ed user and suddenly out of nowhere I get a “Server being shut down for POWER OFF. Now.”.   WTF?!?!?    Yeah, that’s right.   Microsoft decided to just shut down my server.     I can’t get any answers from them as to what might have happened, how to look for potential issues, NOTHING.  Not a word.

Thinking “there must be a plausible explanation for this” I spent another few hours scanning my server logs.    Security breach?  Nope.  At least none that are recorded in ANY of the log files.      Rogue shutdown command?  Nope.   Hardware fault on the virtualized “metal”?  Nope.     After looking at Unix & Linux system log files over the past 25 years it sure as hell looks like someone just plain hit the reset or power-off button on the hardware.  For a virtual machine that simply means some dill-hole at Microsoft clicked the “power off” button on the wrong server in the host manager interface.   No warning.  No “let me check and make sure this is the right server”.  Nothing.

Maybe Microsoft can prove me wrong and show me a memory fault, security breach, or some other internal-based explanation of how my server just shut down but I’ll be damned if I can find it.

I’m going to hold my breath until Microsoft responds.

Now that I think of it, maybe that is where they came up with the name Azure…. I’m already starting to feel a bit dizzy… think I’m turning Azure….

Quality of Service

I didn’t even touch on the complete suckitude of a system that Microsoft-owned Expedia produced that I got to deal with in between.  When I get the occasional email from a Store Locator Plus customer saying things like “I can’t believe you can’t do X” or “how could you release a product with Y not working?” I always think of the “awesome quality” that everyone else can produce but I cannot.  Yeah, I’m being sarcastic here.    Today I got to deal with anything-but-perfect services that multi-million dollar corporations with big dev teams, QA teams, and a plethora of available beta testing users available and still have problems.

I guess for a solo act I’m not doing so badly.

At least today was not COMPLETELY wasted.   I did happen to stumble across a few-dozen douchebag hackers from India, China, and Russia that have been trying to brute force my server.  None got in, but it did remind me I need to get better security on my new server.    That is content for another article.    Maybe after I get some actual code written for Tagalong.  At this rate I’ll be lucky to get that done before WordCamp Atlanta next week.

 

###

 Alexa Traffic Rank: 260,950 United States Flag Traffic Rank in US: 87,219

link-icon Sites Linking In: 640

 

 

Authority icon

Technorati Authority: 106
Rank: 23373
Posted on

Word 2007 Blank Pages Between Chapters

While working on a documentation project for a client we ran into a unique problem.  According to good technical writing practices, you always want chapters to start on an odd page.  This puts new chapters on the right-hand page of a bound book.  You also want to ensure that any preceding blank page is not 100% blank, most standards dictate at least a footer with a page number and possibly a header with the title of the prior chapter (old school methods were to put a “This page intentionally left blank.” message on the preceding blank page, which is one of my favorite all time ironies).  After digging around for hours (OK, maybe 10 minutes) I found the solution to this blank page problem.

It turns out that when you are forcing pages to start on an odd page # for things like a chapter to always appear on the right side of a bound book, you end up with blank pages preceding some of those pages.  That is just how Word works.  If your previous chapter ends on an odd page, it automatically inserts the blank so that the new chapter starts on the odd page as well.   However, it is clearly documented that Word does not put ANYTHING on that page, not even headers or footers.  There is not setting that says “carry headers/footers over to blank pages”.

The official Microsoft solution… use the hard page break, CTRL-ENTER just before the odd-page-break whenever you want to force Word to insert the header/footer on the blank page.

http://support.microsoft.com/kb/264905

The problem with that solution?  If your document changes the CTRL-ENTER will force a new page ALWAYS.  If your existing work is updated and the prior chapter now pushes up from ending on an odd page to ending on an even page, guess what?   You get TWO BLANK PAGES… one with a footer (the forced blank page) that is now an odd page # with a footer, and an even page with NOTHING… the exact problem you were trying to solve the first go-around.

Bottom line, to get technical documentation standard page footers AND chapters starting on the right-hand page, you will constantly need to scan & manually revise the page breaks in the document every time you update the content, especially if you lengthen any chapter.

Wonderful.  Thanks Microsoft, thank you very much.  Why even provide “odd page break”?  Might as well keep things simple and force 100% manual management of pages with CTRL-ENTER throughout.   Grrrrr… sometimes working with these high tech tools can be so aggravating.     20+ years of MS-Word development and they still don’t have an elegant solution for this common problem.  It was even documented as far back as 2000 and Microsoft had enough inquiries to have written TWO knowledgebase articles about it back then.

Posted on

Versioning Word Documents In Git

We need your help!


Cyber Sprocket is looking to qualify for a small business grant so we can continue our development efforts. We are working on a custom application builder platform so you can build custom mobile apps for your business. If we reach our 250-person goal have a better chance of being selected.

It is free and takes less than 2 minutes!

Go to www.missionsmallbusiness.com.
Click on the “Login and Vote” button.
Put “Cyber Sprocket” in the search box and click search.
When our name comes up click on the vote button.

 

And now on to our article…

 

At first I didn’t know if I should write this email. I really, really, really do not like dealing with Word documents. It has nothing to do with Word specifically as a product; I hate documents in that kind of format in general, including the stuff OpenOffice.org produces. I don’t like working with WYSIWYG documents, at all. One argument I can make against using Word files on projects is that you can’t meaningfully put them in a repository.

Well—this isn’t true. You can do it, and actually do things like diff Word documents. So ultimately I decided it is more helpful to share this information than to secretly hide it in an attempt to keep people from using that God awful format. Of course, I’m going to regret it as soon as there’s some Word document in one of the repositories…

A rarely used feature of Git (in my experience) is its ability to assign ‘attributes’ to files. You do this by making a .gitattributes file in the repository. It is a text file that maps file names or globs to attributes. A simple example would be

*.fl[av] binary

This tells Git that all ‘flv’ and ‘fla’ files are binary, and therefore Git should never try to diff them or perform any CRLF conversions, regardless of any other settings.

Something else we can do with attributes is control how diffs are generated for files. For our specific task here, we want to tell Git to use our customized ‘diff driver’ for Word documents. We can start out by putting this in our attributes file:

*.doc diff=word

Now whenever Git diffs ‘doc’ files it will invoke the ‘word’ driver. Which means now we have to define that driver. We can do this in one of three places.

    1. Our personal, global .gitconfig file.
    2. A .gitconfig file in the repository that can be shared by developers.
    3. The .git/config file in the repository, which is not shared.

Adding support for diffing certain files is something we typically want to share with everyone on a project, so the second choice makes the most sense here. But the way we define the driver is the same regardless of where we actually do it. First I will show you what we have to put in the file to define the driver, then discuss it.

    textconv = strings

The first line should look familiar if you have messed around with your .gitconfig file before; it is your typical INI file section header. When we assigned the attribute ‘diff=word’ that means Git will look for the section ‘’ for the definition. The second line sets the ‘textconv’ property of the driver; this property names a program or command that is capable of translating the file into a text format which Git can then diff like normal. The ‘strings’ program is part of the GNU binutils package, which you can get on all platforms. It rips out all of the printable strings from a binary file.

With that said, it should be clear now how this helps us diff Word documents. Our driver passes in the ‘doc’ file to a program that can take out all of the printable strings. Even though Word is a binary format, it stores the text of the document as text strings that we can pull out. Once we have done that, Git is capable of diffing the file like normal, and we can meaningfully use tools like ‘git log -p’ to get an idea of the changes that some commit made to a Word document.

This techinque can be used with any file format for which you can generate meaningful text output. For example, if you use a tool to take the metadata out of image files then you can make a driver for that and get useful diff info. This never affects the way Git stores these files; they will still be handled just like any other binary file. The benefits are only cosmetic, allowing us to use Git’s diffing tools to get a better idea of what changes have been applied to those binary files. But nonetheless, that information can be very useful when working with such files.

Posted on

Microsoft .Net Framework

Cyber Sprocket and the .Net Framework

Many of the Cyber Sprocket desktop applications require the Microsoft .Net Framework.

Older windows computers do NOT have the .Net Framework installed. All new windows programs that access the Internet will require the .Net Framework, and thus it is a component of newer Windows operating systems. If you are running an older PC and have Windows updates enabled you most likely have the .Net Framework. New XP, Vista and Windows 7 computers come with the .Net Framework by default.

If you are not sure if you have the .Net Framework installed you can skip this step and just begin the program installation, it will tell you if you need to install the .Net Framework during the setup process.

The .Net Framework has several versions, the minimum version required for most Cyber Sprocket applications is version 1.1. We recommend installing version 2.0.

What Is The .Net Framework?

The Microsoft .NET Framework is a software component included with the Microsoft Windows operating system. It provides a large body of pre-coded solutions to common software development requirements, and manages the execution of programs written specifically for the framework. The .NET Framework is intended to be used by most new applications created for the Windows platform.

The pre-coded solutions that form the framework’s Base Class Library cover a large range of programming needs in areas including: user interface, data access, database connectivity, cryptography, web application development, numeric algorithms, and network communications. The class library is used by programmers who combine it with their own code to produce applications.

Programs written for the .NET Framework execute in a software environment that manages the program’s runtime requirements. This runtime environment, which is also a part of the .NET Framework, is known as the Common Language Runtime (CLR). The CLR provides the appearance of an application virtual machine, so that programmers need not consider the capabilities of the specific CPU that will execute the program. The CLR also provides other important services such as security mechanisms, memory management, and exception handling. The class library and the CLR together compose the .NET Framework.

The .NET Framework is included with Windows Server 2003, Windows Server 2008 and Windows Vista, and can be installed on most older versions of Windows.

.Net v1.1

If you do not have the .Net Framework already installed on your PC you can obtain the program in one of two ways:

  1. Download the dotnetfx.exe file from Cyber Sprocket, then double click the dotnetfx.exe that has been downloaded.
  2. Visit the Microsoft Download Center to download the latest version.

.Net v2.0

If you do not have the .Net Framework already installed on your PC you can obtain the program in one of two ways:

  1. Download the dotnetfx.exe file from Cyber Sprocket, then double click the dotnetfx.exe that has been downloaded.
  2. Visit the Microsoft Download Center to download the latest version.

Issues With Microsoft .Net Framework

Repair May Be Needed

The .Net Framework Indicates Repair May Be Needed
The following is documentation from the Microsoft .Net Framework:

Installation Repair

You may need to repair your installation of the .NET Framework after upgrading your operating system or if the system becomes corrupted.

To repair the .NET Framework

  1. Obtain the original installation source. For example, if you installed the .NET Framework from CD or DVD, insert the disk. Or, if you downloaded the .NET Framework, download again and choose to save to disk. If you installed from a network share, reconnect.
  2. On the Start menu, choose Run.
  3. For Windows 98 and Windows Me type:
    command

    For Windows NT, Windows 2000, Windows XP or later, type:

    cmd
  4. In the command window, type the following:
    n:<Installation Source>dotnetfx.exe /t:%temp% /c:"msiexec.exe /fvecms %temp%netfx.msi"

    For example:

    d:dotNetFrameworkdotnetfx.exe /t:%temp% /c:"msiexec.exe /fvecms %temp%netfx.msi"

To repair a .NET Framework Language Pack

  1. Obtain the original installation source. For example, if you installed the .NET Framework from CD or DVD, insert the disk. Or, if you downloaded the .NET Framework, download again and choose to save to disk. If you installed from a network share, reconnect.
  2. On the Start menu, choose Run.
  3. For Windows 98 and Windows Me type:
    command

    For Windows NT, Windows 2000, Windows XP or later, type:

    cmd
  4. In the command window, type the following:
    n:<Installation Source>langpack.exe /t:%temp% /c:"msiexec.exe /fvecms %temp%langpack.msi"

    For example:

    d:dotNetFrameworklangpack.exe /t:%temp% /c:"msiexec.exe /fvecms %temp%langpack.msi"

Determining Your .Net Framework Version & Service Pack Level

The following is from the http://support.microsoft.com/ .Net Framework knowledgebase:

Microsoft Support Article 318785

SUMMARY

This article describes how to determine whether service packs are installed for your Microsoft .NET Framework installation. For additional information about .NET Framework service packs, click the following article number to view the article in the Microsoft Knowledge Base: 318836 How to obtain the latest .NET Framework service pack

MORE INFORMATION

Use MMC 1.2 to determine the version of the .NET Framework that is installed

The .NET Framework Configuration tool, a Microsoft Management Console (MMC) snap-in, exposes the full version number, including service packs of the existing installation of the .NET Framework. This tool is only available on operating systems that have MMC 1.2 and later versions.

If your operating system is Microsoft Windows 98, Microsoft Windows Millennium Edition (Windows Me), or Microsoft Windows NT 4.0, you can download MMC 1.2 from the Microsoft Download Center.

The following file is available for download from the Microsoft Download Center:

Download the Immc.exe package now.

For additional information about how to download Microsoft Support files, click the following article number to view the article in the Microsoft Knowledge Base:

119591 How to obtain Microsoft support files from online services

Microsoft scanned this file for viruses. Microsoft used the most current virus-detection software that was available on the date that the file was posted. The file is stored on security-enhanced servers that help to prevent any unauthorized changes to the file.

If MMC 1.2 or a later version is not installed, you can locate the version number of the .NET Framework by viewing the file versions. For more information, see the “Determine the version of the .NET Framework without MMC 1.2” section.

Determine the version of the .NET Framework on a computer that is running Microsoft Windows XP
  1. Click Start, and then click Control Panel.
  2. In Classic view, double-click Administrative Tools.
  3. Double-click either Microsoft .NET Framework Configuration or Microsoft .NET Framework 1.1 Configuration.
  4. In the .NET Framework Configuration window, click About .NET Framework Configuration on the Help menu.

The .NET Framework version number appears in the About .NET Framework Configuration dialog box. If the version number is 1.0.3705.0, you have version 1.0 without any service packs installed.

Note A bug exists in the installation process of the .NET Framework 1.1 SP1. The information in the detail pane and in About .NET Framework Configuration on the Help menu is not updated. It appears as if SP1 was not installed. To verify the installation of SP1, follow the steps in the “Determine the version of the .NET Framework without MMC 1.2” section.

Determine the version of the .NET Framework on a computer that is running Microsoft Windows 2000
  1. Click Start, and then click Run.
  2. In the Open box, type mmc.exe, and then press ENTER.
  3. In the Console1 window, click Console, and then click Add/Remove Snap-in.
  4. In the Add/Remove Snap-in dialog box, click Add.
  5. In the list of available snap-ins, select .NET Framework Configuration or .NET Framework 1.1 Configuration.
  6. Click Add, and then click Close.
  7. In the Add/Remove Snap-in dialog box, select .NET Configuration in the list of added snap-ins. The About button becomes available.
  8. Click About.

The .NET Framework version number appears in the About .NET Framework Configuration dialog box. If the version number is 1.0.3705.0, you have version 1.0 without any service packs installed.

Note A bug exists in the installation process of the .NET Framework 1.1 SP1. The information in the detail pane and in About .NET Framework Configuration on the Help menu is not updated. It appears as if SP1 was not installed. To verify the installation of SP1, follow the steps in the “Determine the version of the .NET Framework without MMC 1.2” section.

Determine the version of the .NET Framework without MMC 1.2

If your operating system does not have MMC 1.2 installed, follow these steps to verify the version of the .NET Framework that is installed. To check the service pack level of the MSI version of the .NET Framework 1.0, start Registry Editor, and then locate the following registry key:

Key Name: HKEY_LOCAL_MACHINESoftwareMicrosoftActive SetupInstalled Components{78705f0d-e8db-4b2d-8193-982bdda15ecd}
Value: Version
Data type: REG_SZ
The OCM version of the .NET Framework is included with Microsoft Tablet PC, Microsoft Media Center, and Microsoft Windows XP Embedded only. For the OCM version of the .NET Framework 1.0, start Registry Editor, and then locate the following registry key:

Key Name: HKEY_LOCAL_MACHINESoftwareMicrosoftActive SetupInstalled Components{FDC11A6F-17D1-48f9-9EA3-9051954BAA24}
Value: Version
Data type: REG_SZ
For both these registry values, the data is in the following format:

1,0,3705,x
The x in this data represents the service pack level.

The .NET Framework version 1.1

With the .NET Framework 1.1, a new registry hive has been created specifically to make it easier to find the service pack level. Start Registry Editor, and then locate the following registry key:

Key Name: HKEY_LOCAL_MACHINESoftwareMicrosoftNET Framework SetupNDPv1.1.4322
Value: SP
Data type: REG_DWORD
The data in the SP value tells you which service pack is installed for the .NET Framework 1.1. For example, if the value of SP is 0, no service pack is installed for the .NET Framework 1.1. If the value is 1, Service Pack 1 for the .NET Framework 1.1 is installed.

Note that this method cannot be used to detect if any hotfixes are installed for the .NET Framework 1.1.