XAMPP / WAMP problem with port 80

I tried to install XAMPP on a Vista machine but I couln’t get the apache web server running. Port 80 was already used by another process. Since I have not installed the usual suspect Skype, I installed WAMP which comes with a port check tool that gives more detailed information than the one in XAMPP. And it told me the service using port 80 was microsoft-httpapi/2.0. After some googeling I learned that this is the SQL Server Reporting Services service from my SQL Server 2008 installation. To solve the problem do the following:

  • Open the SQL Server Configuration Manager
  • Double-click on SQL Server Reporting Services
  • Stop the service
  • On Tab Service changed the start mode to manual

Then port 80 is not used anymore and XAMPP and WAMP can be used without problems.

XAMPP slow on Vista

Just installed XAMPP lite on my Vista machine. The installation went smooth but the web server feels somehow slow. There is often a delay of about 1-2 seconds without any CPU load when I open a web page. I encountered this problem before on other Vista machines but never found a solution for it. Now I found a solution:

  • Open notepad.exe as administrator (right-click Notepad icon -> run as administrator)
  • Click on File -> Open
  • Change the selection Text files (*.txt) to All files (*.*)
  • Open the file C:WindowsSystem32driversetchosts
  • Change the line
    ::1             localhost

    to

    #::1             localhost
  • Save and close notepad

That’s it.

GROUP BY understanding problem

I am going to take the Microsoft MCTS Exam 70-433 – SQL Server 2008 Database Development. So I bought the corresponding book from Microsoft Press for this very exam:

ISBN-13: 978-0735626393
ISBN-13: 978-0735626393

Altough I have a lot of experience with SQL in general and the SQL Server in particular I decided to read Chapter 1 where they explain the SQL basics, to be sure to get it all. When I came to the part where they explained  the GROUP BY clause, I stumbled across the following simple SQL statement (page 20):

SELECT Production.Product.ProductSubcategoryID
     , AVG(ListPrice) AS 'Average'
     , MIN(ListPrice) AS 'Minimum'
     , MAX(ListPrice) AS 'Maximum'
FROM Production.Product
WHERE ListPrice <> 0
GROUP BY Product.ProductSubcategoryID;

The result set:

ProductSubcategoryID | Average  | Minimum | Maximum
NULL                   159.1333   133.34    196.92
1                      1683.365   539.99    3399.99
2                      1597.54    539.99    3578.27
...

What follows is this explanation of the result set:

The top row, where the ProductSubcategoryID is listed as NULL, is the summary row that provides the average, minimum and maxiumum list prices of products across all subcategories.

Aggregate functions with a simple GROUP BY do return a summary row? Could it be that I missed that all the years? Obviously the first row is simple the group of rows with ProductSubcategoryID of NULL and not a summary row. Or do I miss something here?

I know there is a WITH ROLLUP clause which produces summary rows, but this is explained in the next chapter of the book, so I don’t think it a simple typo.

Btw, this example uses the AdventureWorks2008 example database from Microsoft.

Hints for web-developers

This is a brief list of things I picked up while listening to the Stackoverflow Postcat #38:

1. Create a subdomain for serving images. Reason: A web browser usually only makes a  maximum of two simultanious connections to a single domain. So if you move your images to a different domain, e.g. images.yourdomain.com, the browser makes more than two connections and downloads your site faster. As you see a subdomain is enough to do the trick.

2. Since web browser do very aggresiv caching of css files it happens that a web browser doesn’t pick up your updated css file until the user manually forces a refresh. A sulution is to add a version number to the name of your css file, e.g. style.css?3110. You can easily automate this task by using your current subversion revision number. This way you can force your client web browsers to use the latest css file.

3. Add a content-expires header to things like images to stop the web browser making even an request, to check if the ressource has changed. This minimizes the amount of http request needed to open your website.

There is a lot more to say to each of this points I guess, but it should serve as a reminder for me.

Cool video with Jeff Atwood

Just found this video of a presentation with Jeff Atwood and Phil Haack. Phil Haak gives an introduction on ASP.NET MVC and builds a simple Stackoverflow clone. But the real interesting part is when Jeff Atwood enters the stage and talks about Stackoverflow which is built with ASP.NET MVC. He logs in to the live server and shows some real Stackoverflow code. Don’t miss this.

Jeff Atwood presenting Stackoverflow
Jeff Atwood presenting Stackoverflow

How to benchmark queries on Sql Server

Recently I had to optimize some SQL-queries on Sql Server 2005. Therefore I used  Sql Server Management Studio.
I run into the following two problems:

  1. The resolution of the timer is one second. Thats too inaccurate.
  2. The cache in Sql Server optimized subsequent runs of the same query. So i couldn’t tell if I improved the query or made it worse.

If found the following solution for both problems on http://www.sqlnewsgroups.net/group/microsoft.public.sqlserver.server/topic13664.aspx. Just insert the query you want to tune below the comment and you can run your query always under the same preconditions.

CHECKPOINT
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
go
DECLARE @Started datetime, @Ended datetime
SET @Started = CURRENT_TIMESTAMP

— insert query to tune here

SET @Ended = CURRENT_TIMESTAMP
SELECT DATEDIFF(ms, @Started, @Ended)
go

DVD drive not visible in Vista

Recently my DVD drive on my Vista machine was not visible any more. The device-manager told me that the driver could not be loaded. I had no idea what the reason was. However this is the solution I found on the net:

  1. Open regedit
  2. Navigate to HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlClass {4D36E965-E325-11CE-BFC1-08002BE10318}
  3. Delete all keys named “UpperFilters” and “LowerFilters”

Done.

How to http post raw data in php

This example shows how to post raw data over http in php. For exemple if you want to send an XML-document to a web service.

$xmlData = ‘…’;

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, ‘http://example.com/service.php’);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(“Content-Type: application/xml”));
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $xmlData);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec ($curl);
curl_close ($curl);

The variable $response now contains the server response.