Monday, July 9, 2007

Bounce Rate: Sexiest Web Metric Ever?

Hi , i got his article from MarketingProfs have a look at this to clear your doubts for bounce rates ...


It is quite likely that the biggest challenge for you is that you are spending tons of time, energy, and budget on web marketing efforts yet conversion rates (or ROI) are stuck in the 2 to 4 percent range, or perhaps a bit higher for your direct marketing efforts.

You are trying really hard to figure out how to improve the performance but you are stymied by the fact that there is ton of data and you have no idea where to start. Ms. Bounce Rate to the rescue.

Bounce rate is a beautiful way to measure the quality of traffic coming to your website. It is almost instantly accessible in any web analytics tool. It is easy to understand, hard to mis-understand and can be applied to any of your efforts.

So what is this mysterious metric?

In a nutshell bounce rate measures the percentage of people who come to your website and leave "instantly".

Thought about from a customer perspective rather than I came, I saw, I conquered, the action is I came, I saw, Yuck, I am out of here.

Bounce rate measure quality of traffic you are acquiring, and if it is the right traffic then it helps you hone in on where/how your website is failing your website visitors.

It is usually measured in two ways:

  • The percentage of website visitors who see just one page on your site.
  • The percentage of website visitors who stay on the site for a small amount of time (usually five seconds or less).

Either definition is fine, each has its own nuance. Please check what your tool's definition is.

So how can you use it?

Start by measuring the bounce rate for your entire website. Any decent web analytics tool will give you this as soon as you log into it. You'll understand better why your conversion rate is so low, if you have made changes over the last x amount of time then watching a trend of bounce rate is a sure way to know if the changes you are making are for the better.

Now you are ready to dive deeper.

#1: Measure the bounce rate for your traffic sources.

Your goal is to figure out if some sources of traffic are sending you particularly terrible traffic compared to others. In your web analytics tool simply go to the Referring URL's / Sites report and look at this number.

google analytics referring sites bounce rate

For this site both and is not sending great traffic, while their direct marketing campaigns (#2 and #3 above) seem to be doing much better.

Action: Do you need to revisit relationships with sites that are not sending you high quality traffic? What is the call to action that is causing people to come to your site and bounce? Are your email, affiliate, other marketing campaigns yielding low bounce rates? You get the idea.

#2: Measure bounce rate of your AdWords, AdCenter, YSM (PPC) campaigns.

In my humble experience this is one piece of analysis most agencies and companies overlook. Sure we measure conversion and roi and revenue, but are you measuring bounce rate for your PPC campaigns? Remember you can only convert if people are staying for more than five seconds on your website!

google analytics adwords bounce rate

This screenshot shows the bounce rate of traffic on each keyword compared to site average, very cool view. Sadly most traffic for this time period is performing worse than site average (so literally you could be sending money down the, well you know what).

Action: First, stop bidding on those keywords, then do a deeper analysis of how good your landing pages are, and your other campaign attributes (maybe your campaign for refrigerators is being targeted to people only in the great state of Alaska!).

#3: Measure bounce rate of your top trafficked pages.

Now it is entire possible that your efforts are stellar (as they usually are) but it is your website that is letting you down. There is what to do to make your case.....

google analytics content bounce rate

What pages are bouncing traffic like a perfectly formed elastic material and which are great at welcoming traffic with open arms into your website? Pull up the above report in your web analytics tool and find out.

Action: Check to see if the right calls to action are on the page? Is the content optimally organized? If the above pages are your campaign (direct marketing or paid search campaigns) landing pages then are they delivering on the promise of the email piece you had sent out or the search keyword? Answer these questions and consider multivariate testing to improve page performance .

Would you agree this is a awesome metric? It won't have all the answers for you, but it will help you focus very quickly on what's important, show where you are wasting money and what content on your site needs revisiting.

As a benchmark from my own personal experience over the years it is hard to get a bounce rate under 20%. Anything over 35% is a cause for concern and anything above 50% is worrying.

so isn't that really helpful .. Let me know if u have any suggestions about this article ...

Building the Perfect Page - The Basics - Part I

Building the Perfect Page is a series of topics discussing the basics of web page development. Here are the primary areas that will be discussed...

Title Element | META Description Tag | META Keywords Tag | Heading Tags
Alt Attribute | Hyperlinks | Visible Copy | File Names | Directory Names

<!-- Begin Building the Perfect Page - The Basics - Part I -->

Title Element

The page title element (some refer to it as the title tag which is incorrect) is one of the most important factors for ranking highly in the search engines.

Page title elements are normally 3-9 words (60-80 characters) maximum in length, no fluff, straight and to the point. This is what shows up in most search engine results as a link back to your page.

Make sure your Page Title Element (title tag) is relevant to the content on the page.


META Description Tag (Metadata)

The META description tag usually consists of 25 to 30 words or less using no more than 160 to 180 characters total (including spaces). The META description also shows up in many search engine results as a summary of your site.

Directories like Yahoo! and the ODP (Open Directory Project - show the page title and description that you entered (and the editors modified) on their manual submission form.

Make sure your META Description Tag is relevant to the content on the page.


META Keywords Tag (Metadata)

For those search engines that are META enabled, the META keywords tag used to be one of the most important areas after the page title and page description. It has been abused by both marketers and consumers alike that there is very little weight given to the META keywords tag.

Don't fret over your META keywords tag. Utilize keywords and keyword phrases from your title element, META description tag, heading tag and first one or two paragraphs of visible content. Try to limit it to 15 to 20 words if possible.

Make sure your META Keywords Tag is relevant to the content on your page.


Heading Tags

At least one heading tag <h1> should appear at the top of your page and be well written using prime keywords and keyword phrases.

You can use CSS to control the appearance of the heading tags. I prefer using external style sheets (file.css).

Make sure your Heading Tags are relevant to the content on the page.


Alt Attribute

Alt text is the line of text you see pop up (in Internet Explorer, see note below) when you place your cursor over an image. It also displays a text representation of the image when the user has images turned off in their browser (this is the intended behavior). It is highly recommended that you utilize this area as it is required under accessibility laws and, is indexed by the search engines.

Note: Internet Explorer (IE) will display alt text when you hover your cursor over an element that utilizes the alt attribute. This is incorrect behavior as the alt text is designed to be displayed when the user has their images turned off while browsing. Other browsers such as Opera and Mozilla will not display the alt text on hover.

The alt attribute should not to be stuffed with keywords or phrases. The alt text should mirror the content of the image. If it is a graphic header, then your alt attribute should mirror the text in the graphic header.

Alternative text values should not exceed 80 characters in length. If more than 70-80 characters are required one should use the longdesc attribute as an alternative to alt text.

Make sure your Alt Attribute is relevant to the content for that image.


Hyperlinked Text

This area is overlooked by many when promoting a web site to the search engines. Many web sites utilize graphic representations of links. These are visually appealing, but the text in the image cannot be indexed by the spiders.

I always recommend an additional text navigation bar (SSI - Server Side Includes or Front Page Includes) somewhere on the page, usually at the top, right, bottom or left hand side. Link text should be concise, use keywords and phrases, and follow the same structure as the graphic navigation.


Visible Copy - Content is King

Content (visible copy) weighs heavily and is considered one of the primary areas of search engine optimization and marketing, hence the expression, Content is King.

Your content should be written in a way that grabs the users attention, while utilizing your targeted keywords and keyword phrases. There is a method to placement of the keywords and keyword phrases that will help your web site gain better placement in the search engines. Balance is essential and creating that balance takes knowledge and experience.

You should make it your goal to add at least one new page of content daily if possible. If not, then once a week is acceptable. You want to keep your website content fresh and give your visitors something to come back for on their next visit. Stale website content may not perform as well as fresh website content.

I strongly suggest that you utilize last modified dates on your pages so that visitors to your site know when the page was last modified and how fresh the content is.

Last modified: 2007-06-09T07:42:48-0700

Note: We utilize the ISO International Date Format. FrontPage users are welcome to use the following customized webbot to display the International Date Format.

Last modified: <!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%Y-%m-%dT%H:%M:%S%Z" -->

File Naming

I've seen many of the search engines indexing file names and have found that using relative keywords in this area will play a role in your overall search engine marketing strategy.

Instead of naming your file pagename.asp, you would name it keyword-phrase.asp or page-name.asp. Always use hyphens (-) to separate the words in your file names, use all lower case for file naming, this includes images too.

Visitors to your site will appreciate the clean URI paths which are easy to remember and bookmark. Always try to provide the visitor with the shortest URI path.

This is not an area to stuff keywords. Files should be named appropriately as part of the overall theme and should be relevant to the on page content.

Directory Naming

I've seen many of the search engines indexing directory names and have found that using relative keywords in this area will play a role in your overall search engine marketing strategy.

Be descriptive with naming directories. Don't get carried away, but make sure at least one keyword or keyword phrase appears in the directory name. Don't forget to use hyphens (-) to separate the words.

This is not an area to stuff keywords. Directories should be named appropriately as part of the overall theme and should be relevant to the directory content.

<!-- End Building the Perfect Page - The Basics - Part I -->

There is much more to it than that! The above are just the basics and something that all newcomers may want to study carefully. There should be an understanding of page layout, positioning of elements and balancing the use of html markup

Genrating/Creating META Keywords Tags

META Keywords Tag - Metadata Elements

From the W3C - Notes on Helping Search Engines Index Your Website

The W3C does not define a set of legal metadata properties (META Tags). The meaning of a property and the set of legal values for that property are defined in a reference lexicon called a profile. For example, a profile designed to help search engines index documents might define properties such as "author", "copyright", "keywords", etc.

The META Keywords Tag is where you list keywords and keyword phrases that you've targeted for that specific page. There have been numerous discussions at various search engine marketing forums surrounding the use of the keywords tag and its effectiveness. The overall consensus is that the tag has little to no relevance with the major search engines today, but...

Yahoo! Search Recommends the use of the META Keywords Tag

Yahoo! > Search Help > Search Basics > Ranking

How do I improve the ranking of my web site in the search results?

"Use a "keyword" meta-tag to list key words for the document. Use a distinct list of keywords that relate to the specific page on your site instead of using one broad set of keywords for every page."

Relevance of the META Keywords Tag is minimal. The keywords tag may be considered in the overall equation of page quality depending on the search resource.

If the keywords or keyword phrases do not appear on the page visibly, then they should not appear in the keywords tag. We recommend that they come from your title element, meta description, heading and first paragraph of content, in that order.

Historical Note: For those search engines that are META enabled, the META Keywords Tag used to be one of the most important areas after the title element and page description. This tag has been abused over the years by marketers and consumers alike, that the search engines have decreased the relevance of the keywords tag. In some instances, the keywords tag has been deemed irrelevant.

Horizontal and Vertical CSS Menu Tutorial

Vertical Pop Out Menu

#menu {
width: 12em; /* set width of menu */
background: #eee;

#menu ul { /* remove bullets and list indents */
list-style: none;
margin: 0;
padding: 0;

/* style, color and size links and headings to suit */
#menu a, #menu h2 {
font: bold 11px/16px arial, helvetica, sans-serif;
display: block;
border-width: 1px;
border-style: solid;
border-color: #ccc #888 #555 #bbb;
margin: 0;
padding: 2px 3px;

#menu h2 {
color: #fff;
background: #000;
text-transform: uppercase;

#menu a {
color: #000;
background: #efefef;
text-decoration: none;

#menu a:hover {
color: #a00;
background: #fff;

The CSS above removes the padding/margin and bullets from all the lists, sets the width of the the entire menu and styles the links and heading to suit.

View the results so far, if you like, remembering to view with a non-IE browser please. Use your back button to come back here.

Positioning the Pop Outs

#menu li {
/* make the list elements a containing block for the nested lists */
position: relative;

#menu ul ul ul {
position: absolute;
top: 0;
left: 100%; /* to position them to the right of their containing block */
width: 100%; /* width is based on the containing block */

The position: relative; applied to the #menu li makes the <li> elements into containing blocks for the nested <ul> elements.

We only want to apply positioning to tird level nested lists and deeper so the #menu ul ul ul targets that and the popout is positioned over to the right edge of their containing block (parent <li> element)

This now shows all the popouts in their correct position, remember to view with a non-IE browser.

Hiding and Revealing using :hover

div#menu ul ul ul,
div#menu ul ul li:hover ul ul
{display: none;}

div#menu ul ul li:hover ul,
div#menu ul ul ul li:hover ul
{display: block;}

This bit could be simplified with the use of child selectors, unfortunately we have to use more specific descendant selectors in order for IE to understand.

This now achieves what we want, in a non-IE browser.

Fixing it for IE!

<!--[if IE]>
<style type="text/css" media="screen">
body {
behavior: url(; /* call hover behaviour file */
font-size: 100%; /* enable IE to resize em fonts */
#menu ul li {
float: left; /* cure IE5.x "whitespace in lists" problem */
width: 100%;
#menu ul li a {
height: 1%; /* make links honour display: block; properly */

#menu a, #menu h2 {
font: bold 0.7em/1.4em arial, helvetica, sans-serif;
/* if required use em's for IE as it won't resize pixels */

The above is the entire conditional CSS which we use to target IE/Windows only. It enables us to call the hover behaviour file and also to input some other IE "workaround" CSS without affecting other browsers.

Providing the file has been saved to the same directory as the file you're working on you should see that the popouts are now appearing on hover as expected.

The complete code now looks like this, you can now view and admire your work.

Horizontal CSS Dropdown and Popout Menu

#menu {
width: 100%;
background: #eee;
float: left;
#menu ul {
list-style: none;
margin: 0;
padding: 0;
width: 12em;
float: left;

The above sets the width onto the individual lists, <ul>'s, this time as the need to float side by side to make them fit into whatever horizontal space is available to them. This horizontal width is determined by setting the width of the #menu div itself. The #menu div is also floated in order to "contain" it's floated descendants.

Then we apply the required formatting to the <h2> headings and the <a> anchors, again I'm using the same formatting as the vertical menu

#menu a, #menu h2 {
font: bold 11px/16px arial, helvetica, sans-serif;
display: block;
border-width: 1px;
border-style: solid;
border-color: #ccc #888 #555 #bbb;
margin: 0;
padding: 2px 3px;

#menu h2 {
color: #fff;
background: #000;
text-transform: uppercase;

#menu a {
color: #000;
background: #efefef;
text-decoration: none;

#menu a:hover {
color: #a00;
background: #fff;

Color to taste.

Positioning the Popout Menus and Dropdown Menus

#menu li {position: relative;}

#menu ul ul {
position: absolute;
z-index: 500;

#menu ul ul ul {
top: 0;
left: 100%;

The position: relative; on the <li> elements establish containing blocks for the descendant <ul> elements.

All secondary levels and deeper are given position: absolute; and a high z-index in order to make them appear, drop down above following content. the third level and deeper lists are the ones we want to move so "offset" positioning co-ordinates only required to be input onto them.

Hiding and Revealing using :hover

This time we actually do want to hide the second level menu (top choice) as we only want the <h2> heading, inside the top level <ul> to remain visible.

div#menu ul ul,
div#menu ul li:hover ul ul,
div#menu ul ul li:hover ul ul
{display: none;}

div#menu ul li:hover ul,
div#menu ul ul li:hover ul,
div#menu ul ul ul li:hover ul
{display: block;}

The display: block; rules show the three levels being activated with the display: none; rules being entered afterwards to more specifically hide the unwanted (deeper nested) lists (counteract them).

View the results so far.

Fix it for IE!

The complete conditional CSS is the same as the vertical menu's code and looks like this:

<!--[if IE]>
<style type="text/css" media="screen">
body {
behavior: url(;
font-size: 100%;

#menu ul li {float: left; width: 100%;}
#menu ul li a {height: 1%;}

#menu a, #menu h2 {
font: bold 0.7em/1.4em arial, helvetica, sans-serif;

[PV] Garbage - I'm only happy when it rains


[PV] Infernal - Self Control

[PV] Pitbull - Bojangles

[PV] Serebro - Song #1

[PV] Michael Gray - Borderline

Avril Lavigne - Girlfriend

PV] Goldfrapp - Ooh La La

Vivah (Marriage)

A nice song from movie Vivah (Marriage) ..

Lasgo - Something

This is a really great song. Very strong melody and vocals, with a rougher synth background. Cool dichotomy...

Persistent Radio Buttons

ASP pages are often used to both display a form, and carry out the action once the form is submitted. One of the most annoying tasks of HTML/ASP forms programing is keeping a user's chosen radio buttons selected when redrawing the form after it has been submitted. The following code is one way to create a one ASP page form that has persistent radio buttons:

HEAD><TITLE>Pick a color</TITLE></HEAD>
BODY BgColor=<%= Request.Form("Color")%>>
RedChecked = ""
BlueChecked = ""
YellowChecked = ""
SELECT CASE Request.Form("Color")
CASE "Red"
RedChecked = "CHECKED"
CASE "Blue"
BlueChecked = "CHECKED"
CASE "Yellow"
YellowChecked = "CHECKED"
Pick a color:<BR>
FORM Method=Post>
Red: <INPUT Type=Radio Name=Color Value=Red <%= RedChecked%>>
Blue: <INPUT Type=Radio Name=Color Value=Blue <%= BlueChecked%>>
Yellow: <INPUT Type=Radio Name=Color Value=Yellow <%= YellowChecked%>>
INPUT Type=Submit>

Multifaceted image maps

While you may think of server-side image maps as being limited in flexibility, you can actually identify complex shapes as image hot spots. Take a look at the following map file definitions, creating a rectangle, circle, polygon, and even an individual point.

#50x50 pixel rectangle starting at 0,0
rect /page.htm 0,0 50,50

#circle with 40 pixel radius starting at 50,50
circle /page.htm 50,50 40

#polygon with 3 vertices
poly /page.htm 15,15 15,75 50,45

#individual point-great for "easter egg"
point /page.htm 100,100

Manage sessions individually in IIS4

If you're an experienced developer, you're probably using Session object to store information that you need for a particular user-session. As you know, variables that are stored in the Session object are not discarded when the user jumps between pages in the application; instead, these variables persist for the entire user-session. The Web server automatically creates a Session object when a user (who does not already have a session) requests a Web page from the application. The server destroys the Session object when the session expires or is abandoned.
To avoid this, you can turn off the Session feature; however, you can't turn off the Session feature on a per application basis in IIS 3.0. Turning it off for the entire server is faster but drops a lot of functionality. Instead, be very careful to use the Session object only when you really need to. If you use the Session object at all in your application, be sure to use it as soon as possible, so you can avoid the Session object from being reset. The best solution is to use IIS 4.0, since you can enable the session state on a per-application basis and it can be disabled for specified .asp files.

Improve efficiency with server-side includes

Many web sites consist of repetitive information, such as headers, or content that rotates on a regular basis, such as a Tip of the Week. By using server-side includes, you can reduce the repetitiveness and some of the hassle that comes with rotating content, and your code will look much leaner as a result. A server-side include works in much the same way as the C/C++ #include directive, telling ASP to insert the contents of the specified file in place of the include. Your include file can contain HTML, server-side script, client-side script, or anything else you'd normally find in an Active Server page. The syntax looks like this:

<!--#include virtual="header.asp"-->

There are two flavors of includes--file and virtual. When using the file include, you must specify the file's path in relation to the including file. With the virtual include, however, you must specify the file's path in relation to the virtual root. Therefore, if the folder myweb is in your virtual root, and your file structure looks like this: myweb\pages\default.asp myweb\includes\header.asp you'd use the following statements for file and virtual includes, respectively.

 <!-- #INCLUDE FILE="../includes/header.asp" --> <!-- #INCLUDE VIRTUAL="/myweb/includes/header.asp" -->

Image maps 101

To create precise link areas within a graphic on a web page, many web developers use image maps. If it's important to make your image maps compatible with a wide range of browsers, you should probably use server-side image maps, which require you to use both the ISMAP attribute of the IMG tag on the client side and to create a MAP file on the server side. For example, to supply a map file named MAPFILE.MAP for an image named IMAGE.GIF, you'd use the following HTML description


The map file itself is simply a text file that provides the attributes of the image map in question. For example, the map file definition

rect /OTHERPAGE.HTM 0,0 45,45

creates a rectangular hot spot on the image, starting in the upper-left corner and terminating at pixel location 45,45.

IIS and complex polygons

You'll probably never encounter this problem, but it's one you should know about. If you create server-side area maps for IIS, there's an upper limit on the number of vertices you can specify. Early versions of IIS respond with an access violation if you supply more than 100 points; the current version will break at 160. So, if you're planning to map out all the surface characteristics of a particularly complex shape, count your points carefully.

Hiding and restoring Visual InterDev's Workspace pane

When working in Visual InterDev, you can hide the Workspace pane anytime you don't need it by clicking its close button (represented by an X). Then, to restore the Workspace pane when you need it again, simply right-click a blank spot on a toolbar and select Workspace from the context menu.

Fix for IIS security bug

There is a security hole in all versions of the Microsoft Internet Information Server. It allows a web browser to view the source code of your cgi and asp scripts. This can be very dangerous, because passwords and other sensitive data are often stored inside of these scripts, where browsers are not supposed to be able to go. You can fix the problem by making sure that all of your script files do not allow "read" access. For most scripts, simply enabling "execute" permissions will work. There is also a hot-fix available for IIS 3.0 and 4.0. You can find the hot-fix and other information about this serious security issue   here.

Dragging and dropping a Data Command DTC

You can add a Data Command design-time control (DTC) by using a simple drag and drop technique. To do so, first, click the Data View tab so you can see the database. Next, open the page to which you want to add the Data Command control. Then, drag the table you wish to add onto the page and drop it into the correct location within the page. This will load the object tag for the Data Command control. Now, to modify the settings, you can right-click the object tag for the control and select Edit Design-time Control from the context menu.

Don't touch that mouse!

If you're fond of keyboard shortcuts, you're certainly familiar with using the Alt-Tab shortcut to cycle through the open applications in Windows. For those of you who cringe at the thought of moving your hands from the keyboard to accomplish such a simple task as switching documents, Visual InterDev offers a similar shortcut. By pressing Ctrl+Tab, you can cycle through the open Visual InterDev windows, as well as any other Developer Studio application windows you have open.

Controlling How a Page is Cached

A proxy server is used to reduce the amount of time spent retrieving documents over the Internet. It does this by caching, or storing, the document in memory and then serving it from memory the next time a client tries to retrieve the page. This can cause problems with Active Server Pages because of their dynamic nature.
By default, IIS sends web pages with headers that tell proxy servers not to cache their documents. If you need to change this, you can by placing the following line of code at the top of your ASP page:
<% Response.CacheControl="Public" %> This will allow all proxy servers that retrieve the page to save it in their local memory and improve the speed at which it can be retrieved.

Changing the default scripting language at the server level

The default scripting language for ASP is VBScript. However, you can change the scripting language at three levels: the server level, the page level, and the function level. Changing the default at the server level affects all applications that run on the server and requires a trip to Windows NT's registry.
To change the default to JScript, use Windows NT's registry editor to open the following key:



Then, change the DefaultScriptLanguage entry from VBScript to the new default, JScript. Finally, you must stop and restart IIS for the changes to take effect. When you're finished, all scripts on the server will be processed by the JScript engine unless otherwise specified at the page or function level.

Batch your code to save processing time

If you use the <%=...%> syntax to write in multiple places in your code, consider "batching" those writes by replacing multiple, interspersed <%=...%> writes with one Response.Write statement. While you are making that change, take a look at how you have your HTML code with regard to your script.
Try not to intersperse HTML and script too much; instead, try to have blocks of script and blocks of HTML. Arranging your HTML and Script code will save you valuable server process time.

Avoid unnecessary window switching


If you installed Books Online with Visual InterDev, you know that they're a valuable resource. However, if you reference the information while working on a project, you may get tired of switching back and forth between documentation and your code. If you'd like to be able to see the documentation and your code at the same time, just follow these few simple steps. Pull down the tools and select the Options... menu item. Next, select the Workspace tab from the Options dialog. Under Docking views, select the InfoViewer Topic option, then click OK. The next time you select an InfoViewer Topic, the results will be displayed in their own window. You can either dock the window as part of your workspace or just let it float. When you're not using the InfoViewer window, just click the close button to get rid of it. The next time you choose an InfoViewer topic, the window will reappear right where you left it.

Authenticating Anonymous requests

By default, when a browser requests a Web page, IIS will first try to fill the request without authenticating the user. In order to do this, IIS impersonates a special Windows NT account, named IUSR_machinename (where machinename is the name of the IIS host computer). When you install IIS, the installation program creates this account automatically. If, by impersonating the IUSR_machinename account, IIS can access the requested resource, then it serves the page to the anonymous user; otherwise, the user gets a 401 error.
A common problem with anonymous access occurs when the password for the IUSR_machinename account and the password entered in the Internet Service Manager get out of sync. When IIS tries to impersonate the IUSR_machinename account, it submits the password that was entered in the anonymous logon field to a Windows NT server. If that password is incorrect, IIS is prevented from using the IUSR_machinename account. Once anonymous access fails, IIS will attempt to authenticate everyone. Because authentication can happen silently, the site can fail, but the reason for failure isn't always apparent. The type of authentication you're using makes a huge difference if your pages are accessing other resources, such as databases or server-side components (DLLs).

(vs. Server.CreateObject())

When creating a server object using a server component, you have a choice between two methods. The most common method is to use the CreateObject() method of the Server object, as shown in the following code: SET NextLink = Server.CreateObject("MSWC.NextLink"). While this method works fine, there is another way to create an object that is just a bit more resource friendly.

When you create an object using the Server.CreateObject() method, the object is created as soon as the method is called. Any threads, memory, or other resources are allocated at the point of instantiation, or creation. The syntax for creating an object using the <OBJECT> tag is shown in the following statement:

<OBJECT Runat="Server" ID="NextLink" ProgID="MSWC.NextLink"></OBJECT>

By using the HTML <OBJECT> tag with the Runat=Server attribute, you can create the object in a way that it is not actually created until the first method or property of the new object is referenced. While this may not seem like a lot of savings, when you are trying to design a system that can withstand 1,000,000 hits per day, every little bit helps.

ASP Code-Based Security

Using ASP code, you can implement more specialized security for your site. For example, say some annoying users plague your site. Because their IP addresses can be pulled from the server activity logs, you could use the following code to deny access:

<%If request.servervariables("REMOTE_ADDR") = "" then
Response.Buffer = TRUE
Response.Status = ("401 Unauthorized")
End If%>

There are many variables available within an Active Server Page that supply information about the browser making the request, as well as the information about IIS itself. The LOGON_USER command, for example, will return the Domain\Username of authenticated users, and a blank for anonymous users. You could then use server-side code to check for specific individuals, and redirect them to other pages.

ASP and Personal Web Server

If you develop on the run and don't always have access to an NT box running IIS, Windows 95's Personal Web Server (PWS) may be an excellent alternative development environment for ASP. In fact, with PWS, you can maintain a functional development environment even on a laptop. To set up a system to run Visual InterDev and ASP with PWS, simply install the following components:
Personal Web Server
Active Server Pages server extensions
FrontPage server extensions
Visual InterDev Client
Note: The same configuration also works with Peer Web Services for Windows NT Workstation.

Basic authentication vs. NT Challenge and Response

When you password protect a web page using Internet Service Manager, you have the option of choosing either Basic authentication or NT Challenge and Response (aka: Integrated Windows authentication). The difference in the two methods is in the way the username and passwords are transmitted over the Internet. NT Challenge and Response encrypts the password so malicious snoopers can not intercept and use the information. Basic authentication sends the password as plain text. While it would be great to use NT Challenge and Response for all secured web pages, the only web browsers that currently support this protocol are Internet Explorer 3 and higher. If you might have users with other web browsers, your only choice is Basic authentication.

If you would like to have a secure website take advantage of using encrypted usernames and passwords but still want to be compatible with Netscape browsers, you can use Basic authentication over SSL. Using Secure Sockets will encrypt the user name and password but at the same time will still let Netscape browsers use your site, the best of both worlds.

Thanks to Eric Rosenblum for reminding us about Basic authentication over SSL.

ASP Tips - 301 Moved Permanently - Redirecting URLs with ASP

If you are utilizing .asp (Windows Active Server Pages) as the underlying technology of your Windows IIS hosted websites, there is a simple 301 permanent redirect method that you can utilize without involving a server administrator. This 301 method allows you to quickly implement a 301 Moved Permanently status from the old-page.asp to the new-page.asp. Here is how it works...


Take the old-page.asp that is being renamed or moved and remove all of the code. Place the below code in place of the old HTML/XHMTL.

<%@ Language=VBScript %>
Response.Status="301 Moved Permanently"
Response.AddHeader "Location", ""

In the above 301 redirect example, you need to change the Location to the URI of your new-page.asp. Include the full URI path unless you are redirecting to a root level page (index.asp, default.asp, etc.). If you are setting up a 301 redirect for a root level page, keep the URI short and without the index.asp file name. For example...

"Location", ""

Once you've included the above code at the top of your old-page.asp, verify that it is returning the proper server header response using our Check Server Headers tool. You should see a recursive response (2 server responses) returned from the server header that look similar to this...

#1 Server Response:
HTTP Status Code: HTTP/1.1 301 Moved Permanently
Server: Microsoft-IIS/5.0
Date: Fri, 04 Jun 2004 03:11:15 GMT
Connection: Keep-Alive
Content-Length: 0
Content-Type: text/html
Cache-control: private

Redirect Target:

#2 Server Response:
HTTP Status Code: HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Fri, 04 Jun 2004 03:11:15 GMT
Connection: Keep-Alive
Content-Length: 14268
Content-Type: text/html
Cache-control: private

The first server response above is telling you that the referenced URI (old-page.asp) has been Moved Permanently. This is evident due to the HTTP Status Code of 301. The Moved Permanently is referred to as a Reason Phrase. The Reason Phrase can be any value although the official term for Status Code 301 is Moved Permanently. Other unofficial 301 Reason Phrases may be; Error or Permanently Moved.

The second server response is telling you that the Redirect Target (Location) is OK. This is how it should be when permanently redirecting an old-page.asp to a new-page.asp. The OK is the official Reason Phrase for Status Code 200.

In reference to spidering entities (crawlers, robots, spiders), the ASP code above and the ASP.NET code below will send a server header response of 301 Moved Permanently and, is instructing the spiders to update their index and replace the old URI (old-page.asp) with the new URI (new-page.asp). This could take several months before results are final.

ASP.NET Version

<script runat="server">
private void Page_Load(object sender, System.EventArgs e)
Response.Status = "301 Moved Permanently";

Note: If your 301 is set up properly, you should not be able to browse to the old-page.asp (unless you have auto redirects turned off in your browser). The browser will automatically redirect you to the new-page.asp. This is of course the intended behavior.

To be on the safe side, you could always leave your old-page.asp in place and include something like this to alert visitors (who have auto redirects turned off) that the page has been moved and to update their link references...

The resource you've requested has been moved to a new location as of 2004-12-01. Please update your bookmarks and/or links to reflect the new location of this resource.

New URI Reference:

This old page will be removed on 2005-02-01 at which time we will assume our visitors have updated their links and the spidering entities have updated their indexes. At that time, this old page will return a 404 Not Found status. Thank you in advance for your understanding and continued support.

Edward Lewis, System Admin

Remember to insert your 301 Moved Permanently code above all other code on the page. For those who have auto redirects turned off, they will see your message above along with the new URI reference. Everyone else will be automatically redirected to the new URI reference.

Operating Systems Listing

This article sort of sums up all the reviews of OSes that I have written till date. My intention is (if possible) to review all known Linux distributions and many non-Linux ones as well. But considering the sheer number of Linux distributions around, I guess it is going to take some time. So starting with Linux distributions and then non-Linux distributions, here is the list of reviews you will find on this blog. The operating systems are listed in alphabetical order. This post will be updated as and when I review new OSes...

Linux Distribution reviews
Debian Etch
Debian Etch
Damn Small Linux (DSL)
Ver 2.0 RC2
Engarde Secure Linux
Ver 3.0.14
Gentoo Linux
Gentoo review
Ver 4.0
Kubuntu Ver 6.06 LTS
Open SuSE
Ver 10.2
Ver 0.92
Slackware 11
Slackware Ver 11.0
Ubuntu Dapper Drake
Ubuntu Dapper Drake
Vector Linux
Vector Linux
Non-Linux operating system reviews
Belenix review
FreeBSD 6.0
FreeDOS ver 1.0
Ver 1.1, Ver 1.3.4
Sun Solaris 10
Solaris 10

Kubuntu 6.06 LTS - An excellent Linux distribution based on KDE

At the time of the official release of Ubuntu Dapper Drake, I happened to visit the site of Kubuntu - the alter identity of Ubuntu. And on an impulse, I ordered a CD of the latest Kubuntu 6.06 LTS which was also released more or less at the same time as Ubuntu Dapper Drake but with a lot less fan fare. I forgot all about it till a couple of days back, when I received the single CD I ordered enclosed in a beautifully designed blue CD case.

This is one aspect of Ubuntu/Kubuntu I really like. They send you the CDs free of cost and they ship it to any place in the world and I believe this has helped in a large way in catapulting Ubuntu as the most popular Linux distribution.

Fig: Kubuntu desktop featuring KDE 3.5.2

By the time I received the Kubuntu CD, I was very excited and raring to check out what Kubuntu had in store for the Linux users. I found that there is a great level of overlap between Kubuntu and Ubuntu in that the way it boots up is the same for both the distributions. And Kubuntu also uses the same installer bundled with the Ubuntu live CD which makes it possible to install Kubuntu in a mere six steps. More over, all the Kubuntu specific packages are in the same archives as that of Ubuntu.

The end result is that an Ubuntu user can install all the Kubuntu specific packages by running the following command:

$ sudo apt-get install kubuntu-desktop
... and vice versa.

Kubuntu 6.06 has KDE 3.5.2 which is the latest version of KDE and so comes with its own set of improvements. One of the most noteworthy is the system settings dialog. In the earlier versions of KDE, the system settings which includes configuring hardware, desktop and any other thing related to KDE had their own separate dialog which made it rather confusing to navigate. In the KDE that is bundled with Kubuntu, all the configuration settings can be accessed from a single location which is the system settings dialog - Windows users will find it similar to the Control Panel but much more intuitive.

Fig: System settings dialog is much more intutive

Another thing which I found exciting was the inclusion of search as you type feature in each of the windows - be it the file manager or the system settings. And one has to just type the query string and the files matching the query will be selected in real time.

And to install additional programs, Kubuntu comes bundled with Adept - the installation manager similar to Synaptic found in Ubuntu. Here too, there is a search box and one has to just start typing and the results will be filtered as you type. I found this software to contain additional features such as tree view and advanced search with more options which made it a better option than synaptic.

Fig: Adept package manager in Kubuntu

KIO Slaves

Of course, the one feature I really like in KDE and which is a prominent reason to use Kubuntu is the KIO slaves. What this translates for the end user is ease of use and lesser dependence on the shell. KIO slaves (KDE Input/Output Slaves) are programs that provide support for individual protocols. For example, I can view a man page, locate files on the system, ftp to a remote location, browse through any windows shares on my network, ssh to a remote machine and much more from within the file manager konquorer which by the way also acts as a web browser. Some of the useful KIO slaves which I found interesting are as follows:

  • man:/command - This will show the man page of the command in Konquorer in a nicely formatted manner.
  • locate:/query - Locate files which match the query and show it in Konquorer. Under the hood, the protocol uses the locate command.
  • - Will ftp to the remote machine and display the files in the location. If the username and password are required, it will ask for it.
  • fonts:/system - See all the system fonts. But the users can also view the per user fonts by navigating to fonts:/user
  • settings:/ - This will show all the system configuration links such as hardware configuration, display settings, desktop settings and so on.
  • fish:/ - allows one to access another computer's files using the SEcure Shell protocol. The remote computer needs to be running SSH daemon.
    Eg: fish://username@hostname[:portnumber]

Fig: A subset of KIO Slaves put to use in Kubuntu

All the commands are to be entered in the address bar of Konquorer. But I found that some of them also work in file open dialogs or the run command box and so on in KDE. The above list is only a small subset of the entire KIO slaves supported in KDE. The last time I looked, KDE supports nearly 50 different KIO slaves which includes one for tar, gzip and bzip2 archives.

Kubuntu is no doubt a very polished distribution bundled with the latest version of KDE. Unfortunately, it has till now been overshadowed by its big brother Ubuntu to a large extent. But when KDE releases version 4.0 some time next year, I am sure it will gain more popularity than it now has and hence claim its rightful share in the lime light.

Enabling Tracing and adding own trace message ...

Save this file as default.aspx 
<%@ Page Trace="true" %>
script runat="server">
Sub page_load
dim strTraceMessage as string

Trace.Warn("Page _Load event executing")
strTraceMessage="Welcome To S3 Tech Blog !"
Trace.Write("The Value of strTraceMessage is " & strTraceMessage)
End Sub

head runat="server">
<title>S3 Tech Blog| Trace Example</title>

<h2>Testing Page Trace ..</h2>
<h3>Here u can see 2 types of trace colors in Red and Black </h3>
<li>The trace message in red comes comes due to Trace.warn Whereas Black highlights due to Trace.Write</li>
<h3>The warn and write both are same are same the only diference is the color .. So don't get confused in this .</h3>

<%Trace.Warn("Rendering Page content....") %>

The Result is here ... 

Standard Asp.Net Namespaces

using System;
using System.Collections;
using System.Collections.Specialized;
using System.Configuration;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Caching;
using System.Web.Security;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

Why doesn’t C# have a synchronized keyword?

In Java you can mark a class method as a critical section, i.e. it will only be executed by one thread at a time, by using the synchronized keyword:

synchronized void myMethod()

In C# you have to type in this ghastly (and rather obscure) mouthful:

using System.Runtime.CompilerServices;

void MyMethod()

.NET by day, Rails by night

Here are a couple of interesting blogs for anyone who falls into the “.NET by day, Rails by night” category. Softies on Rails is a blog about Rails especially geared towards Microsoft coders by a couple of developers in Chicago, and A Fresh Cup is Mike Gunderloy’s new blog chronicling his reinvention of his career. (Gunderloy, for those of my readers who don’t keep up with who’s who in the world of software development, is a fairly well known author in the Microsoft world.) Back at the start of the year, he announced that he had had it with the Borg and was jumping ship. It looks like Rails is his framework of choice in Life After Microsoft.

Personally I’m not a great one for language wars. I tend to adopt a fairly pragmatic approach to the whole issue, which is why I do both .NET and PHP, as well as anything else that I am required to get my teeth into. Most of my development experience over the past six years has been in .NET, and I don’t see that changing too drastically in my day job, but I do think it’s a good idea to have some experience of other languages and platforms as well. A lot of developers only learn the bare minimum needed to do their jobs, and the result is often

Rails is a particularly good platform to learn as it teaches you all the latest best practices in web development: Model-View-Controllers, O/R mapping and the like, and important concepts such as “Once and only once” are drummed into you right from the word go. The Ruby language also contains a lot of advanced features such as closures and other functional paradigms, which can make for some pretty nice looking code. Plus, of course, there’s all the Ajax whizziness that can help you write really cool apps very easily.

Case sensitivity

The issue of case sensitivity in programming languages is one of those religious wars that we developers get into every now and then. Some people—the kind who were brought up on Unix, C, and all that, swear by it. Others think it is the worst travesty to befall computing since software patents. It is especially prevalent in the .NET world, where you have two main languages: C#, which is case sensitive, and VB.NET, which isn’t.

I am not particularly keen on case sensitivity myself, though most of my work is done in case sensitive languages. It could be argued that it is an advantage that it trains the mind to pay close attention to small details, but there are already so many small details to take careful note of in code that programming does that anyway, and it just adds to the burden. It doesn’t necessarily make your code look any tidier either. In fact, it can actually cause more problems than it solves. In fact, will someone please enlighten me as to exactly what problems case sensitivity is supposed to solve in the first place?

Take for instance this C# code snippet:

class Foo {
private int bar = 0;

public int Bar {
get { return bar; }

Now this is all well and good — a private field encapsulated as a read only property. This is the kind of thing that you encounter daily when you are working with C# code. When I was more inexperienced I used to use this convention all the time: camelCase for the fields and PascalCase for the properties. However, one simple typo can spell disaster:

class Foo {
private int bar = 0;

public int Bar {
get { return Bar; }

Spot the difference? The getter for Bar, rather than returning the contents of the field, will now call itself, giving unwanted recursion and a stack overflow. And do you think IntelliSense makes it any better? In your dreams. I had this problem bite me several times simply because IntelliSense sneakily changed the case of bar to Bar and I didn’t notice, before I wised up and started prepending the private fields with an underscore:

class Foo { private int _bar = 0; public int Bar { get { return _bar; } } }

Now this is a simple example, but there are other more complex ones that I could give. And because most people don’t tend to notice the exact case of identifiers, it is all too easy to end up getting the wrong one — or even, particularly if you are maintaining someone else’s code, to fail to notice that there is a wrong one to get in the first place.

Naming conventions can help with this. Both .NET and Java have specific standards, but even then there is still scope for ambiguity. You are supposed to write identifiers in PascalCase or camelCase depending on its visibility and purpose, with the first letter of each word in the identifier capitalised. However, in some cases it isn’t that clear whether you should consider some identifiers as one word or two. Do you write Filename or FileName, for instance?

It would be easy if all languages were case insensitive, like VB, Delphi or Fortran. Unfortunately, even these languages often have to communicate with other languages and platforms. In .NET in particular, you may have to slap a [CLSCompliant] attribute on your assembly one day so that it can interoperate with someone else’s code in a language on the other side of the Great Divide. When that happens, it you have a namespace called ee.cummings in one place and EE.Cummings in another, both VB.NET and C# will choke on it. Alternatively, you may need to port your code from a language that is case insensitive to one that is case sensitive, or vice versa.

The problem with case sensitivity is that it is so pervasive. All the C-like languages are case sensitive, at least in part1, as are Python and Ruby. That means nine of the current top ten programming languages. Some important cross-language protocols such as XML and SOAP are case sensitive. If you expose some methods as a web service, they are case sensitive. Some bits of URLs may or may not be case sensitive depending on the underlying operating system and the web programmer’s predilections. And then there are those times when you can’t quite remember off the top of your head.

To avoid problems, I operate with two basic guidelines, regardless of what language or platform I am using.

1. When choosing new identifier names, assume that the language is case insensitive. Don’t choose names for your identifiers that vary by case alone. This means that if the language is case insensitive, or your code has to interface with or be ported to such a language, you will avoid name collisions.

2. When using existing identifiers, assume that the language is case sensitive. Be consistent in the case you use when referencing identifiers. This means that if the language turns out to be case sensitive after all, your variables will be found correctly. IntelliSense and other similar technologies can help here, provided you have stuck to (1).

Love it or loathe it, case sensitivity is here to stay. We still have to live with it, so we might as well just get used to it. Still, it would be more bearable if programming languages and operating systems enforced both these rules, rather than just one or the other. This happens in the .NET framework when you mark your assembly with the [CLSCompliant] attribute, but this only extends to publicly visible members, so you still have scope for the problem outlined in the examples above. Even better would be for you to be able to choose for yourself which case sensitivity rules you wanted to use as a compiler or interpreter option.

1 PHP variables are case sensitive; functions and constants are case insensitive. Some implementations of JavaScript are stricter about case sensitivity than others.

#827 - Lian Li PC-A12 Case Video Review

Master Chief is an Alcoholic

Asahi Robocco: Beer-pouring robot

iPhone: 4 Days Early - Part 1 of 3

Driving car

Driving Car in google's Map .
Funny !