Tuesday, January 29, 2008

How to speed up your website.

Reduce the number of colors in your graphics

Reduce the number of colors in your graphics in order to lower the size of your graphics.

Avoid using flash as much as possible

Avoid using flash as much as possible because, usually, flash loads harder due to their sizes.

Remove the HTML comments from your pages

Yes, comments can slow your website down. Big or small, comments have something to say when it comes to page size.

Use caching

Set the browser?s cache expiration. This can be easily done using PHP in order to send some headers. For example, let's take a js file called scripts.js. In order to use caching we will create a new file called scripts.js.php and add the following code at the very beginning of it which will set the cache to expire in 3 days:




By using this method you will not speed the first (initial) download but it will have some impact on the overall experience when you're browsing multiple pages or for returning visitors since the content will be already cached.

Combine multiple files into one

Your browser has a limited number of open connections with a certain website. You can use a script to combine multiple .js or .css files into one and reduce the HTTP requests.

Read this article if you want to go deeper into this technique and do some advanced stuff:
Web page optimizer

Choosing the Right DOCTYPE

A page that was built using the Strict doctype will load faster than one that was built using the Traditional doctype or much faster than one that was built with no doctype at all. Of course, it's not a good idea to go ahead and change your doctype without knowing some facts.

Do not use images to display text

Why should you use images to display text? Think of all those HTTP requests again. We talked about the limited number of open requests a browser can have with a certain website. A very good solution is to use stylesheets instead of images. Having all your stylesheets into one file solves many many problems. You result with one request for a lot of needs. Here's an example that creates a mouseover effect on a button using nothing more than css:

a:link
{
color: #ffffff;
background: #ff9900;
text-decoration: none;
padding: 0.2em;
border: 4px solid;
border-color: #99f #008 #008 #99f
}

a:hover
{
color: #ffffff;
background: #ffaa11;
text-decoration: none;
padding: 0.2em;
border: 4px solid;
border-color: #008 #99f #99f #008
}



Use CSS to call images used for decoration

Browsers usually download the background images after everything else. By loading your background files using css you have a huge advantage because the text content will be displayed first and, in most cases, this is the content that your visitor is interested in. They will start reading your text much faster and, in the meantime, your page will download the rest of the content. Here's an example of a css based background:





And this CSS:

.background-image
{
background: url(filename.gif);
width: 200px;
height: 100px
}



You may want to enjoy the alt attribute and here's a way to do it:

description



where something.gif can be a 1px x 1px transparent image.

Use contextual selectors

This is inefficient:

This is a sentence


This is another sentence


This is yet another sentence


This is one more sentence





.text
{
color: #03c;
font-size: 2em
}



Instead of assigning a value to each individual paragraph, we can nest them within a
tag and assign a value to this tag:


This is a sentence


This is another sentence


This is yet another sentence


This is one more sentence






.text p
{
color: #03c;
font-size:2em
}



This second CSS example basically says that every paragraph within class="text" should be assigned a colour value of #03c and a font size of 2em. At first glance this doesn't look too important, but if you can apply this properly throughout your document you can easily knock off 20% of the file size. You may have noticed the color values are shorter than normal. #03c is a shortened version of #0033cc - you can assign this abbreviated value to any colour value like this.

Use shorthand CSS properties

You can use the following shorthand properties for the margin CSS command.

Use:

margin: 2px 1px 3px 4px (top, right, bottom, left)



...instead of

margin-top: 2px;
margin-right: 1px;
margin-bottom: 3px;
margin-left: 4px



Use relative url's

An absolute url like is much bigger than and this will have a huge effect on the file size again.

Remove unnecessary META content

Most META tags have no importance at all. For SEO purposes we can talk about the keywords and description tags but, due to abuse, I don't believe they're so important any more. Anyways, if you're gonna use it, my advice is to keep it under 200 characters to reduce the overall size and also keep some sort of balanced keyword density.

Use a trailing slash at the end of directory links

By placing a simple trailing slash at the end of your link you can tell the server that you're pointing to a directory and not a file. Your server will have more time to take care of other important aspects. Here's an example:
Instead of this:

Do this:

Try to have less HTTP Requests

I think this is the most important step of all. The most time consuming task a browser has to do is to satisfy all the HTTP requests in order to display the full page by downloading all the images, stylesheets, javascript files, flash etc. Reducing this requests will have a massive effect when it comes to user experience. You don't have to cut the whole page and leave out important stylesheets or javascript files. Read this whole article and you will learn how to combine multiple files (css, js), use css to display images and lots of other tricks to keep your page as simple as possible, fast and functional.

Use image maps to combine multiple images into a single image

Image maps combine multiple images into a single image. The overall size is about the same, but reducing the number of HTTP requests speeds up the page. Image maps only work if the images are contiguous in the page, such as a navigation bar. Defining the coordinates of image maps can be tedious and error prone.

CSS Sprites are the preferred method for reducing the number of image requests. Combine all the images in your page into a single image and use the CSS background-image and background-position properties to display the desired image segment.

Inline images use the data: URL scheme to embed the image data in the actual page. This can increase the size of your HTML document. Combining inline images into your (cached) stylesheets is a way to reduce HTTP requests and avoid increasing the size of your pages.

Turn on Http Keepalives

If Http Keepalives are not turned on, you can get 30% to 50% improvements just by turning this on. Keepalives allow multiple HTTP requests to go over the same TCP/IP connection. Since there is a performance penalty for setting up new TCP/IP connections, using Keepalives will help most websites.

Use CSS to keep the important stuff at beginning of your source

Even if this technique won't have so much of an effect on your website's speed it will play a huge role in the user experience. You need to find a way to display the text content (or whatever your visitor is there for) at first and let the browser work in the background in order to finish downloading the rest of the content. Let's take for example a simple page with menu at top, categories on the left and text content on the right. We're interested in the text content but we have to wait for the browser to download and display the top navigation and the left categories until it reaches what we're there for. Well...not necessarily. We can float the categories at the left and the text content at the right and in the source, we can place the text content before the left categories as it will have the same result when it comes to source code but, you achieve something very important: the text will show up first.

Use a Content Delivery Network

This might not be a good solution for small websites since it's not so cheap to use a content delivery network (CDN). Not everyone can own a CDN or pay a provider such as Akamai or Limelight in order to deliver the content from the server with the smallest response BUT, if you think it will worth the investment, this is a big step in optimizing your website for speed and we're talking about 10% - 15%.

Add an Expires Header

"The Expires HTTP header is an instruction to the client about the document's validity and persistence. If cached, the document may be fetched from the cache rather than from the source until this time has passed. After that, the cache copy is considered "expired" and invalid, and a new copy must be obtained from the source."

The expires HTTP header tells all browsers how long an object is active (fresh) for and after that amount of time caches should check back with the server for changes, if any. The expires HTTP header are very good for caching static images like the ones used for navigation or buttons where can be set a big amount of time as expiry in order to make the website much more responsive to it's visitors.

This trick is very important for your returning visitors and for those that browse multiple pages of your site because setting an expires header somewhere in the future will tell the browser to cache the content (scripts, css, images) for that amount of time as it won't change during this period. This way, you avoid sending informations to the browser by a http request and increase the number of cached components. Let's take for example firefox which has, by default, a storage quota of 50Mb for cached content. That's a lot of space which can hold a lot of content which, otherwise, needs to be downloaded.

When you're setting an expires header far in the future and decide to make changes to the cached files you might wanna change the name of the file as well. For example a file that is named myfile.js and is cached via expires header for a long period should be renamed somewhat when we change the content in order to tell the browser that we updated it. A good idea would be to keep versions (myfile1.js, myfile2.js) or timestamps (myfile_11352617289.js) in it's name.

Gzip Components

Gzip is a very popular compression utility that is used on most websites, designed as a replacement for compress and adopted by the GNU project. Gzip is very very handy if you ask me since it manages to reduce the size of the response by nearly 60% - 70%, accelerates the browsing experience and also can cut down the bandwith used with more than a half.

Servers choose what to gzip based on file type, but are typically too limited in what they decide to compress. Most web sites gzip their HTML documents. It's also worthwhile to gzip your scripts and stylesheets, but many web sites miss this opportunity. In fact, it's worthwhile to compress any text response including XML and JSON. Image and PDF files should not be gzipped because they are already compressed. Trying to gzip them not only wastes CPU but can potentially increase file sizes.

It's not such a good idea to gzip files that are smaller than 1k since you might end up with the same result or worse. Anything that is bigger than 1k should be faster than not gzipping it at all. Also try to remember that the result might be a faster web page but a bigger load on the server. The balance is in your hands.

Try to remember that Apache 1.3 uses mod_gzip while Apache 2.x uses mod_deflate so you also depend on versions to benefit from this compression method. You can get the same benefits by adding some very simple PHP code to your web pages.





Gzip can be the real deal when you have your page mostly on text/html, it won't have such a big effect on image-based websites and it might fail on some plugins and PDF files since they're already compressed.

Ayways, you can define in apache what files should and shouldn't be compressed.

Multiple Servers:

As we've seen already, most browsers support a limited number of open connections (http requests) with a server and everything that passes this limit should wait for them to finish a certain task. Let's take for example a browser that has a limit of open connections of 4 and a webpage that is composed of 16 images. 16 / 4 equals 4 so we end up with 4 downloads. What if....we put 4 images on server1, another 4 on server2, another 4 on server3 and the rest on server4? We might notice a huge speed improvement by almost 4 times since the browser will open 4 connections at a time with each server in part since they're different.

You might notice that some websites use different servers for storing images and static content. Of course this limit can be changed by tweaking the browser's settings but you can't ask your visitors to do that for a "better browsing experience" on your website.

AJAX:

Ajax won't necessarily speed your website but has a huge effect when it comes to responsiveness and user experience. Keeping the visitor on the same page and displaying content only on demand/on action makes the page load faster and more interactive. A lot of Java and Flash based websites have switched to Ajax for the same result but in less bytes.

Put CSS at the Top

When a new visitor reaches our website is very important to show him that we have a progressive website that loads fast. Putting CSS at the top helpes the browser to render the page in a progressive way and not wait for the whole page to load in order to figure out how the display should be. This is a huge advantage when we use external stylesheets, tableless layouts, stylesheet based backgrounds etc. Since the css is placed in the header of the pages and, along with it, the structure of the page, the browser knows from the very beginning how the page should look and where should be what. It also increases the browsing experience by showing the visitor the progress of the page (think at a file transfer....if the computer fails to show you the load bar you might think that the transfer failed even if it's not because you see no true progress...think of an ajax indicator - load bar - that tells you to wait until it finishes).

Move Scripts to the Bottom

If moving the stylesheet file in the document head will help the browser show a progressive rendering, it's the other way around with the scripts. When the browser reaches scripts it will stop the progressive rendering of the page until that script is loaded. This method might not work in all cases since there are situations over situations where a script could and should be used but there are workarounds. It's a very good idea to try this small trick when you have a lot of javascript for transitions and various effects etc.

Avoid CSS Expressions


CSS expressions allows you to set the properties in a dynamic way and can be used in a big number of situations. For example a background color that changes every hour by using a Javascript expression:

background-color: expression( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );



This way of setting the properties is problematic because it evaluated by the browser at very simple events such as scrolling, resizing or even when we move the mouse over the content.

One way to reduce the number of times your CSS expression is evaluated is to use one-time expressions, where the first time the expression is evaluated it sets the style property to an explicit value, which replaces the CSS expression. If the style property must be set dynamically throughout the life of the page, using event handlers instead of CSS expressions is an alternative approach. If you must use CSS expressions, remember that they may be evaluated thousands of times and could affect the performance of your page.

Make JavaScript and CSS External

At a simple evaluation, the advantage is huge since an external css file or javascript file can be cached by the browser avoiding the precious http requests on the future. When using inline styles and declarations, we force the browser to download and evaluate them on each request. The result is obvious...

Reduce DNS Lookups


Each time you type in your addressbar a website, the browser contacts the DNS resolver which is supposed to respond with the server's IP address. Nothing takes place until this task is over which, usually, takes between 20 and 120 milliseconds. This operation is called a DNS lookup. The good news is that it can be cached by the operating system's DNS cache and sometimes by the browser.

Going back to the part when we talked about the advantage of using multiple servers you might say that these 2 methods are not so "brother and sister" since it's an advantage in using more servers to allow more http requests but a disadvantage since it creates more DNS Lookups. You should always have a balance in mind when using them. I won't recommend using more than 3 - 4 servers.

Don't use regular expressions where you don't have to

"In computing, a regular expression is a string that is used to describe or match a set of strings, according to certain syntax rules."
Regular expressions are almost a whole language. Very complex and doing real wonders where anything else would fail but they come with a big price: time. Yes they need time to perform the complex operations. There are many situations where you could replace preg_replace and eregi_replace which perform operations based on regular expressions with str_replace which "Replace all occurrences of the search string with the replacement string". My advice is to use them with care and only if you have to.

Minify JavaScript

A good idea would be to remove the comments from your js files, the unnecessary characters from code, white space etc. in order to reduce the size of the files and the time needed to download them. This process is called minification and is an alternative (or vice versa) to obfuscation which also removes comments and whitespace from files but also obfuscates (makes it difficult to be reversed) it. While minification can be a safe process, obfuscating your files can damage them irreversibly. You should always keep backup files before obfuscating.

Avoid Redirects

There are many ways of doing redirects (meta refresh, php's header location, javascript etc.) but all of them take time to be processed since the file needs to be read by the browser in order to understand your message. The best way of redirecting the user to another page is to use the traditional 301 or 302 status codes in a .htaccess file like in the following example:

HTTP/1.1 301 Moved Permanently
Location: http://someurladdress.com/newpage
Content-Type: text/html



or:

Redirect permanent /forum/discussion/17/ http://www.someuri.com/17.html



Another advantage in using this method is that the content won't be cached unless instructed so and we still have a functional back command in the browser that will take us to the previous page.

Remove Duplicate Scripts

This usually happens when a certain website is developed in a team and there's some lack of communication between individuals or when the webmaster/developer is not paying attention to this fact that forces the browser to execute the same piece of code twice or more no matter if it's cached or not and some times even worse when it also needs a new HTTP request to execute it.

Configure ETags

An Etag is a small string that represents the HTTP response header returned by an HTTP/1.1 compliant web server used to uniquely identify the version of a page component (image, stylesheet, script etc.) when compared with what's already cached in the browser. Among other informations the Etag will return the "Last-modified" time and content length of the specific component.

HTTP/1.1 200 OK
Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
ETag: "10c24bc-4ab-457e1c1f"
Content-Length: 12195



The problem with ETags is that they typically are constructed using attributes that make them unique to a specific server hosting a site. ETags won't match when a browser gets the original component from one server and later tries to validate that component on a different server, a situation that is all too common on Web sites that use a cluster of servers to handle requests. By default, both Apache and IIS embed data in the ETag that dramatically reduces the odds of the validity test succeeding on web sites with multiple servers.

If you're not taking advantage of the flexible validation model that ETags provide, it's better to just remove the ETag altogether. The Last-Modified header validates based on the component's timestamp. And removing the ETag reduces the size of the HTTP headers in both the response and subsequent requests. This Microsoft Support article describes how to remove ETags. In Apache, this is done by simply adding the following line to your Apache configuration file:

FileETag none

Use CSS For Faster Pages

I sense a huge struggle in today's design to avoid using tables which can be a mistake. It's ok to use them for rendering tubular data and it's not ok to use them for design purposes but making a tableless website just because everyone seems to claim that you're not a real designer unless you cut down all the tables might give you headaches due to the bad results.

It's again about the cached content in an external css file placed in the header of your page which is supposed to hold the structure of your page and all it's properties. This is the real advantage because, using tables for design purposes, you force the browser to parse the whole table until it knows how should the page look. Using nested tables is much worse but that's another chapter.

Use External Scripts

Supposing that you have a script to animate your menu that is present on every page. It's very small. You might think that it won't be such a good idea to create a whole new file to make it execute from that file. That's a bad idea. If you have no external javascript file to add it too you still have an advantage: the file will be cached on the next visit or page, and, if you already have js files, you can add it at the end of one but make sure you won't generate conflicts and the code will remain functional.

In the worst case, this method will create a new http request but will save you tons in size and speed since it will be cached and reused directly from the browser.

Remove Anything You Don't Really Need

Yes...I know...it's obvious. So obvious that everyone is leaving behind. A good website is not one that is full of cool javascript effects, shining colors, sliding divs and whatever fancy idea you might have. In my opinion, you should keep only what's functional and needed to enhance the browsing experience. While making a website some while ago for someone, I was asked to put a certain song on the homepage to make it cool. The result was a loaded page, hated by many since the song was always starting unless otherwise instructed by the visitor (another wish of my client) and imagine yourself at night with 5-6 websites in your tabs and one of them starting to sing....auuughh!! Do you really need such things?! Keep it simple and functional....in balance with a nice design if you can and not loaded with all your dreams, full of your talent and creation.

Avoid Nested Tables

Content and presentation should be separate. As said above, tables are good to render tubular data but a bad idea when it comes to building a layout based on them since the browser can't show any progress (like we've talked on the CSS part) until it finishes to read that table...what happens when that table has another table inside which has another...? I'm sure you guessed: NOTHING...until everything is read!

Avoid Full Page Tables for Faster Rendering

If you use tables, try avoiding the whole page being one big table. The browser won't show anything until it's read the whole thing that way. For a faster loading webpage, either try multiple tables (not nested) or having stuff above the main table to make your content in the first table show up faster. That way your visitors will have something to read while the rest of your page loads. It may not really make you page faster, but it will feel like it to your visitors.

Split Up Long Pages

This method will make the content show up faster and won't scare readers away with a huge scroll bar on the right. Use pagination or something to split your pages in readeble lengths. Don't make every article like this one :)

Remove Excess "Whitespace"

Yes white space is still space and needs space. Space means time, time means angry visitors and that's the chain as I see it. You can remove white spaces, tabs, line returns and tabs.

It may not be such a good looking code but this is not our goal. We don't build pages to have nice code. We need good code. By removing line returns you will end up with 9% - 11% reduction in your file size and that's a lot. The browser does not care how good looking is your code as long as it can read it correctly. Here's an example:










something
here
for demo




will become:

something
here
for demo




The disadvantage is human. The code becomes harder to edit and follow.

Keep Your Code Clean

Many wysiwyg editors add useless code to your pages like empty tags ( ) and other elements. Remove those for a faster page that also validates cleaner.

Don't Go Overboard On Images

CSS can do many effects that could easily replace many images used on websites. Don't use so many images unless you have to and, again, don't use images where you could use text to obtain the same result.

Height And Width Tags

If you have the height and width tags already defined, at the time of loading, the browser will know the sizes already and will know where everything will be, how much space to allow, how to render the page etc. It's the same rule for tables as well. Try to specify a width and height tag...it will help.

Faster Images? Reduce Their File Size

There are many tools out there that will optimize your images and make them smaller and web ready, they will also keep the transparency and animations in gif's. You will notice an increase in speed. Look at the bottom of this articles for more resources.

Properly Save Your Images

Photoshop and fireworks have a nice feature that says: "save for web". Why do you think it's there? Use this feature when you save a picture for use in your documents. As above, don't use a rich color palette as it will increase the size of your picture. Experiment the websnap feature that will try to cut down similar colors from the palette.

Compression

To decrease the size of your files you could try compressing them. There are many solutions on the net that will compress javascript, css or php eliminating comments, white space, tabs and breaks...anything that is not needed usually. Try to keep in mind that you might end up with non functional results, the result will most likely be very hard to read and follow and that you should in all cases keep the original documents as backup.

Global Loadbalancing:

If you have already invested in some kind of simple loadbalancing technology and are still having performance problems, start investigating in global loadbalancing which allows you to deploy multiple servers around the world and use intelligent loadbalancing devices to route client traffic to closest web server. If your organization can?t afford to setup multiple websites around the world, investigate global caching services like Akamai

Webserver Log Analysis:

The logs that your webserver keep are an open book to teach where and when errors occur. I think the most important part in the logs are the 404 and 500 errors that represent a missing page. It means that a visitor or a web crawler requested that page and it's missing. This again does not have so much of an effect when it comes to speed but it's a good idea to try and repair the bottlenecks at least for the sake of user experience. Almost any web hosting provider offer a log analizer such as awstats.

GIF vs JPG vs PNG


GIF's usually load quicker while JPG's tend to be better for photos and PNG's (optimized) have lossless compression but be aware of the PNG transparency that is not supported in IE6 and below.

Saturday, December 29, 2007

Oracle income jumps on software sales

Oracle fared far better than analysts anticipated in its fiscal second quarter, easing worries that the sagging U.S. economy will curtail corporate spending on technology and drag down the business software maker.

Relieved investors drove up Oracle's (ORCL, Fortune 500) stock price by more than 6 percent late Wednesday after the results were released.

The Redwood Shores-based company it earned $1.3 billion, or 25 cents per share, for the three months ended Nov. 30, a 35 percent increase from net income of $967 million, or 18 cents per share, at the same time last year.

If not for stock option expenses and the costs incurred in recent acquisitions, Oracle said it would have earned 31 cents per share - four cents per share above the average estimate among analysts surveyed by Thomson Financial.

Revenue totaled $5.31 billion, a 28 percent improvement from $4.16 billion last year. Analysts, on average, had projected revenue of $5.04 billion.

Even more important to Wall Street, Oracle's sales of software licenses climbed by 38 percent to $1.67 billion. Analysts had predicted gains in the 20 percent range.

Software sales are closely watched because new licenses establish a pipeline for future revenue from product upgrades and maintenance.

"The strength of the quarter comes down to the fact that we are selling more products to more customers in more industries," Safra Catz, Oracle's chief financial officer, said during a conference call with analysts.

Signaling that its recent momentum will carry into 2008, Oracle forecast software sales will rise 15 percent to 25 percent in the current quarter, which ends in February. Oracle made the same projection for the second quarter and then soared well beyond it.

Excluding stock option expenses, Oracle expects to earn 29 cents or 30 cents per share in the fiscal third quarter. The average analyst estimate for the quarter was 29 cents per share.

Oracle shares fell 49 cents to finish Wednesday's regular trading at $20.76, then rebounded by $1.37, or 6.6 percent in extended trading after its quarterly results were released.

"It was a very strong quarter, based on just about every metric you can think of," said Global Equities Research analyst Trip Chowdhry.


Larry Ellison on Bill Gates, potential purchases, and the good old days


Oracle has been on a roll through most of the past two years, reaping the benefits of a shopping spree that has turned it into a one-stop shop for database software and applications that automate a wide variety of business operations.

By spending more than $25 billion snapping up its smaller rivals since 2004, Oracle has created the software industry's equivalent of a Costco warehouse, said Cowen and Company analyst Peter Goldmacher.

"Oracle looks to be better positioned than just about all its competitors," Goldmacher said. That list of rivals includes other technology heavyweights like IBM Corp., SAP AG and Microsoft Corp.

Larry Ellison, Oracle's hard-charging chief executive officer, remains on the prowl for other takeovers. In October, he offered $6.7 billion for another Silicon Valley software maker, BEA Systems (BEAS), only to be rebuffed. Echoing recent public comments, Oracle reiterated it's unlikely to buy BEA unless there's a change in the makeup of the San Jose-based company's board of directors.

Oracle's second-quarter showing and upbeat outlook may revive hopes that the technology sector will be able to overcome the threat of a looming recession and grow solidly next year.

With informal surveys indicating that a substantial number of companies plan to spend less on technology next year, some analysts are bracing for a downturn and their only question is the depth of the drop.

But there's a theory that Oracle and a few other industry leaders won't be hurt if the economic uncertainty causes businesses to concentrate their tech spending on products made by well-established vendors.

"Customers are going with proven technologies with proven value," Chowdhry said. "That bodes well for Oracle and Microsoft. It doesn't necessarily bode well for the rest of the software industry." To top of page

Opera complains to EU about Microsoft

Web browser developer Opera Software ASA said Thursday it had complained to the European Commission about Microsoft Corp., calling on regulators to make the company give users a choice of Internet software with its Windows operating system.

The small Norwegian company also alleged that Microsoft was holding developers back from making programs that work with each other "by not following accepted Web standards."

Microsoft (Charts, Fortune 500) said its Internet Explorer browser had been a part of Windows for over a decade and supported a wide range of Web standards.

"We will of course cooperate with any inquiries into these issues, but we believe the inclusion of the browser into the operating system benefits consumers, and that consumers and PC manufacturers already are free to choose any browsers they wish," Microsoft said.

A complaint can - but does not always - trigger an antitrust investigation by EU regulators.

Some of the claims echo complaints from years ago, when Microsoft was accused of using its monopoly position to wipe out Netscape by bundling its free Explorer browser with Windows.

Google to press feds on public records


Opera said it was asking EU regulators to apply the principles of their landmark antitrust ruling against Microsoft - upheld by an EU court in September - to Internet software.

That ruling required Microsoft to market a version of Windows without its media player program, even though there were few takers when it went on sale a year after the antitrust order.

EU antitrust chief Neelie Kroes had warned Microsoft that the order set a precedent for its future behavior in other areas - such as its Office software and its new Vista operating system.

"Microsoft should bear this in mind," Kroes said. "The shop is still open, I can assure you ... there are a couple of other cases still on our desk."

EU officials last year cited possible problems with Vista's integrated security software, Internet search, and digital rights management tools used to protect copyrights and software that would create fixed-document formats comparable to Adobe Systems Inc.'s Portable Document Format, or PDF.


YouTube opens ad program to amateurs

Opera is claiming that Microsoft abused its monopoly power as the supplier of software to most of the world's personal computers by giving away its Internet Explorer with Windows and not offering alternative programs.

It "requests the Commission to obligate Microsoft to unbundle Internet Explorer from Windows and/or carry alternative browsers preinstalled on the desktop," it said in a statement.

Opera also said it was asking Microsoft to adhere to its own public pronouncements to support open Web standards. It said the European Commission should require Microsoft to follow "fundamental and open Web standards accepted by the Web-authoring communities."

"Microsoft's unilateral control over standards in some markets creates a de facto standard that is more costly to support, harder to maintain, technologically inferior and that can even expose users to security risks," Opera said.

This touches on an earlier complaint filed by a group of Microsoft rivals, the European Committee for Interoperable Systems, that alleges that Microsoft's XAML markup language - which it said was positioned to replace the current Web page language HTML - was designed "from the ground up to be dependent on Windows."

Opera CEO Jon von Tetzchner said the company was championing open Web standards and "cannot rest until we've brought fair and equitable options to consumers worldwide."

The company now focuses on making browsers for mobile devices, an area where Microsoft is not a major player.

ECIS endorsed the complaint. "Browsers are the gateway to the Internet. Microsoft seeks to control this gateway," said its legal counsel Thomas Vinje.

The group has made complaints of its own against Microsoft, alleging that the new Vista operating system is the company's attempt to extend its monopoly to the Internet and the company uses Windows to extend its market dominance into other areas, including Web-based computing.

Tech Predictions for 2008

Every year at this time I venture forth with my predictions for the New Year. Early in my career, I would foolishly try and predict as much as ten years out, but in a world where technology changes so fast, ten-year predictions are almost worthless these days.

I have become more pragmatic in my old age, and now I try to focus on what I think will be the key industry issues or trends for the next year or two. How accurate am I? Check out my predictions from last year or the previous year or for 2005.

If you read any of my previous predictions, you will notice that they are relatively accurate. This is not to brag, but to point out that the technologies I research typically have their biggest impact 12 to 18 months out.

With that in mind, here are my predictions for 2008:

1. Smartphones Get Smarter and Gain Market Share.
This is not a new prediction, as I have mentioned it in one form or another for the last two years. However, there are two key changes in 2008's prediction. First, we now believe smartphones will get even smarter, thanks to increased processing power, mobile operating systems that gain more functionality (including full Web browsers), and connections to faster wireless networks. Apple has already shown us that you can put the Internet in your pocket via something as small as a smartphone, and the competition is going to school on Apple—big time. In fact, when we look back at 2008, I believe one of the major industry themes will be how the creation of mobile devices that deliver the Internet in your pocket caused a paradigm shift in mobility and drove major changes in the way even mainstream consumers view personal mobility.

The second key change is that even mainstream cell phones will gain more intelligence and help expand the market share of smartphones. Thanks to Google's Android platform, as well as vendors like Palm, RIM, Motorola, and others making their mainstream cell phones more intelligent, we believe that by the end of 2008 smartphones will represent as much as 15 percent of the overall 1.2 billion cell phones sold worldwide in the course of the year, up from a market penetration of around 8 percent today. And by the end of 2009, we now believe smartphones will make up as much as 25 percent of all cell phones sold.

2. Flash-Based Laptops Arrive.
There are a lot of rumors swirling about Apple introducing a flash-based laptop at MacWorld in January. While I have no clue if that is actually going to happen, I do believe that we will see at least one flash-based laptop of some type come from each of the major PC vendors. More important, these new clamshell laptops will introduce a new concept in ultraportables. Although flash memory is coming down in price, I believe most of these new flash-based ultraportables will have only 16GB, 32GB, or, at best, 64GB hard drives on them to keep prices down. This means that people will have to use them differently, and we could see a new class of laptop computers emerge that I call mobile companions. Hard drives in most of today's laptops start at 80GB, although many now sport 120GB and even 180GB.

Given the capacities of these new flash-based clamshell laptops, it's unlikely that they will provide access to full applications or provide rich Web browsing—they'll have limitations much like those of today's BlackBerrys or smartphones. They will require some type of UI that lets you tell your main PC what files you want to take with you, and then enables syncing each time your laptop and your main PC are reconnected. To make this work, you will also need a built-in GoToMyPC-like Internet connection to your PC back home in case you need something while on the road. Look for at least five new flash-based mobile companions to be on the market by the end of 2008, and expect them to be one of the industry's hot topics in the coming year.

3. The Introduction of the "Basic PC."
Next year we will see a real push to create "basic PCs," bare-bones computers priced around $275 to $350 and targeted at emerging markets. We've already seen similar products, such as the XO-1 laptop by the One Laptop per Child (OLPC) initiative and the ASUS Eee PC 4G, but they represent the tip of the iceberg in this category. And don't be surprised if this type of PC gets serious attention as a second, third, or even fourth PC for consumer homes.

4. Social Networks Are Targeted by Botnets.
As social networks gain in popularity, I expect them to become the next major target for security threats. Botnets will find their way into these networks and inflict all kinds of new security problems, including identity theft. McAfee, Symantec, Microsoft, and even Apple are aware of these threats and are working hard to prevent them, but social networks will suffer invasion.

5. Smartphones Become Targets for Viruses and Identity Theft.
As smartphones gain market share, become more popular and powerful, and deliver greater Web access, they will attract the criminal element. I believe that in 2008 they will also become major targets for botnets, viruses, and identity theft. This will be a big problem, as there aren't a lot of great security tools for these smart mobile platforms. All of the security software vendors see this coming, but right now they're creating their tools only for use within the Windows, Linux, Unix, and Mac environments. Soon they will have to deal with at least five major smartphone OS platforms as well.

Computer Tricks

Hide File In Image

1. Gather the file you wish to bind, and the image file, and place them in a folder. I will be using C:\New Folder
-The image will hereby be referred to in all examples as fluffy.jpg
-The file will hereby be referred to in all examples as New Text Document.txt

2. Add the file/files you will be injecting into the image into a WinRar .rar or .zip. From here on this will be referred to as (secret.rar)

3. Open command prompt by going to Start > Run > cmd

4. In Command Prompt, navigate to the folder where your two files are by typing
cd location [ex: cd C:\New Folder]

5. Type [copy /b fluffy.jpg + secret.rar fluffy.jpg] (remove the brackets)

Congrats, as far as anyone viewing is concerned, this file looks like a JPEG, acts like a JPEG, and is a JPEG, yet it now contains your file.

In order to view/extract your file, there are two options that you can take

a) Change the file extension from fluffy.jpg to fluffy.rar, then open and your file is there
b) Leave the file extension as is, right click, open with WinRar and your file is there



Speed Up Ur PC

Cleaning Ur RAM
U may recognize that ur system gets slower and slower when playing and working a lot with ur pc. That's cause ur RAM is full of remaining progress pieces u do not need any more.

So create a new text file on ur desktop and call it .. uhm.. "RAMcleaner" or something...

Type

FreeMem=Space(64000000)
in this file and save it as RAMcleaner.vbs [ You may choose the "All Files" option when u save it ]

Run the file and ur RAM may be cleaned :>
Of course u can edit the code in the file for a greater "cleaning-progress".


FreeMem=Space(128000000)

just try it out.. it worked for me



Block websites without any software

Steps

1] Browse C:\WINDOWS\system32\drivers\etc

2] Find the file named "HOSTS"

3] Open it in notepad

4] Under "127.0.0.1 localhost" Add 127.0.0.2 www.orkut.com , and that site will no longer be accessable.

5] Done!


example :

127.0.0.1 localhost

127.0.0.2 www.yahoo.com-


www.orkut.com is now unaccessable


For every site after that you want to add, just add "1" to the last number in the internal ip (127.0.0.2) and then the addy like before.


ie:

127.0.0.3 www.yahoo.com

127.0.0.4 www.msn.com

127.0.0.5 www.google.com


This also works with banner sites, just find the host name of the server with the banners and do the same thing with that addy.

Hope this small tutorial could keep you going in simple way of blocking websites..



Start a movie in paint!

Start movie in Paint!
* First start a movie in any player.

* Then open Paint.

* Now, in the player when the movie is being played, press "Print screen" button on your key board.

* Now, Press ctrl+v in Paint

* Leave the movie player open and don't minimize it.

* Open Paint now and see the movie in the Paint!




Hacking Rapidshare:

Tired of waiting for another few minutes after downloads try dis
It works


While waiting for download, type javascript:c(countdown = 0); in the browser addressbar to eliminate the rapidshare countdown (waiting) feature. If this trick doesn't work, try the alternative below:

javascript:var%20counta=0;var%20countb=0

;var%20countc=0;var%20countd=0;var%20countd=0

(Just copy and paste this code in your address bar)

another method(Works only if u hv dynamic Ip)

Then, follow the steps below to get a new IP:

1. Go to Start->Run and type in "cmd" without quotes to bring up the command prompt. Hit Enter.

2. Type in "ipconfig /flushdns" without quotes and hit Enter.

3. Type in "ipconfig /release" without quotes and hit Enter.

4. Type in "ipconfig /renew" without quotes and hit Enter. You should now have a new IP address. Check your IP address at IP Chicken again and compare it to the one you got earlier.

5. Now, erase your browser's cache and cookies.

6. Try downloading the Rapidshare


Now enjoy unlimited download from rapidShare..





Yahoo with multiple login IDs

Multiple Login in Yahoo! by regedit

Follow these steps : ->

* Go to Start ==> Run ==>> Type regedit,hit enter

* Go to HKEY_CURRENT_USER -> Software -> Yahoo -> pager -> Test

* On the right pane ==>> right-click and choose new Dword value .

* Rename it as Plural.

* Double click and assign a decimal value of 1.

* Now close registry and restart yahoo messenger.

* For signing in with new id open another messenger .





See who is invisible in Yahoo:

See who is invisible in yahoo messenger.


download this[100% working]

http://
rapidshare.com/files/61785563/BuddySpySetup.exe

If you r scanning for a person be sure that he/she is in your friends list
If he/she is not in your friends list then you may not get right result

enjoy




Lock Computer

we'll make a "Lock Computer" Shortcut on your Desktop so you can lock your computer by simply double-clicking on an icon.
On an empty space on your desktop, right click and select "New" then "Shortcut".
You'll see this shortcut wizard Server.
Paste the following line into the "Type the location of this item" box. Click "Next".

%windir%\System32\rundll32.exe user32.dll,LockWorkStation
This next dialog box will ask for a name for this shortcut. Type in "Lock Computer" or something that makes sense to you. Click "Finish".
Now you'll have an icon on your desktop that allows you to quickly lock your computer without having to go through the process of "control-alt-delete" -> "Lock Computer".




Useful Shortcut:
Start + M: Minimizes all open windows
Start + Shift + M: Maximizes All Windows
Start + E: Runs Windows Explorer
Start + R: Open the RUN Dialog Box
Start + F: Open the Search Results Dialog box
Start + CTRL + F: Opens the Search Results-Computer dialog Box (if the computer is connected to a network)
Start + Pause (Break): Opens the System Properties Dialog Box


Windows System Key Combinations:

F1: Help
CTRL + ESC: Open Start menu
ALT + TAB: Switch between open programs
ALT + F4: Quit program
SHIFT + DELETE: Delete item permanently

Sunday, December 16, 2007

Email Templates

If you have creating email templates use this.


function Merge_template($message,$temparray) // merging function.
{
$melen=strlen($message);
$k=0;
for($j=0;$j<$melen;)
{
if($message[$j]=='#' && $message[$j+1]=='#')
{
$j=$j+2;
while($message[$j] != '#')
{
$test=$test.$message[$j];
$j++;
}
$pattern[$k]=$test;
$test='';
$k++;
}
$j++;
}
$length=count($temparray);
$i=0;
$outputtem=$message;
while($i<$length)
{
$pattern[$i];
$replacement=$temparray[$pattern[$i]];
$test= '/##'.$pattern[$i].'#/';
$outputtem=preg_replace($test,$replacement,$outputtem);
$i++;
}
return $outputtem;
}




$message = "The following account status changed by ##staffname#. Please take necessary action.
##description#
Reference No: ##ref_no#
Customer Name: ##customer_name#
Date : ##date#";


$date=date("d-m-Y");
$staffname="Thomas";
$description = " Test Description";
$ref_no = "238764";
$customer_name="Arnold";

$temparray=array("date"=>$date,"staffname"=>$staffname,
"description"=>$description,"ref_no"=>$ref_no,"customer_name"=>$customer_name);


$mail_body= Merge_template($message,$temparray);

?>

Output

The following account status changed by Thomas. Please take necessary action.
Test Description
Reference No: 238764
Customer Name: Arnold
Date : 17-12-2007

Thursday, November 8, 2007

Simple image resize code using PHP

if($_POST['submit'])
{
// This is the temporary file created by PHP
$uploadedfile = $_FILES['uploadfile']['tmp_name'];

// Create an Image from it so we can do the resize
$src = imagecreatefromjpeg($uploadedfile);

// Capture the original size of the uploaded image
list($width,$height)=getimagesize($uploadedfile);

// For our purposes, I have resized the image to be
// 600 pixels wide, and maintain the original aspect
// ratio. This prevents the image from being "stretched"
// or "squashed". If you prefer some max width other than
// 600, simply change the $newwidth variable
$newwidth=100;
$newheight=($height/$width)*100;
$tmp=imagecreatetruecolor($newwidth,$newheight);

// this line actually does the image resizing, copying from the original
// image into the $tmp image
imagecopyresampled($tmp,$src,0,0,0,0,$newwidth,$newheight,$width,$height);

// now write the resized image to disk. I have assumed that you want the
// resized, uploaded image file to reside in the ./images subdirectory.
$filename = "images/". $_FILES['uploadfile']['name'];
imagejpeg($tmp,$filename,100);

imagedestroy($src);
imagedestroy($tmp); // NOTE: PHP will clean up the temp file it created when the request
// has completed.
}
?>


add html code here

form
input type=file name=uploadfile
input type=submit name=submit
form close

Sunday, October 21, 2007

How to insert data using AJAX , Both GET and POST method (PHP)

Ajax - Browser Specific Code, just copy and paste below code. This code is for browser specific.

var request = false;
var xmlString;
var microsoft = true;
var updatePage;

function initAjax()
{
try
{
request = new XMLHttpRequest(); // Ajax Class for Mozilla based browsers
microsoft = false;
}
catch (trymicrosoft)
{
try
{
request = new ActiveXObject("Msxml2.XMLHTTP"); // Ajax Class for IE
}
catch (othermicrosoft)
{
try
{
request = new ActiveXObject("Microsoft.XMLHTTP"); // Ajax Class for Mozilla based browsers
}
catch (failed)
{
request = false;
}
}
}


This code is must for all AJAX based coding.



Ajax - onreadystatechange Property


Before we even think about sending data to the server, we must first write a function that will be able to receive information. This function will be used to catch the data that is returned by the server.

The XMLHttpRequest object has a special property called onreadystatechange. onreadystatechange stores the function that will process the response from the server. The following code defines an empty function and sets the onreadystatechange property at the same time!

We will be filling this function in throughout the lesson, as you learn more about the XMLHttpRequest object.


I am writing this as a function.

function updatePage()
{
if (request.readyState== 4 || request.readyState=="complete")
{
if(request.status == 200)
{
var obj = document.getElementById('success');
xmlString = request.responseText;
obj.innerHTML=xmlString;
}
else
{
alert("Error :" + request.status );
}
}
}

For GET Method

function addStaff()
{

initAjax();
var obj = document.getElementById('success');
obj.innerHTML="";
var url = "add_data.php";


var name = document.getElementById("name").value;
var password = document.getElementById("password").value;


request.open("GET", url+"?bustcache="+new Date().getTime()+"&name="+name+"&password="+password,true);



request.onreadystatechange = updatePage1;
request.send(null);

}




For POST Method



function submitForm()
{

initAjax();

var name = document.getElementById("name").value;
var password= document.getElementById("password").value;
var obj = document.getElementById('success1');
obj.innerHTML="";

var url = "ajax_output.php";
var passData = '&name='+name+'&password='+password;

request.open("POST", url, true);
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.onreadystatechange = updatePage;
request.send(passData);



}

Friday, August 17, 2007

Php installation in windows/Linux etc...

These are some method to install apahe/php/mysql/phpMyadmin into your system

This is a built in web server that is automatically configured when you install it.

Go through below links

For windows

http://www.wampserver.com/en/index.php

and

http://www.apachefriends.org/en/xampp-windows.html

XAMPP for linux also

http://www.apachefriends.org/en/xampp-linux.html

and for other OS

http://www.apachefriends.org/en/xampp.html

Thursday, August 16, 2007

Some Nice Site for PHP,MySql,Ajax etc for Beginners

Php,MySql, Ajax,XML,JavaScript, etc

http://www.w3schools.com/

http://www.tizag.com/

For PHP


http://php.net/

For pear

http://pear.php.net/


For Smarty

http://smarty.php.net/

Image to Flash convert code using PHP

convery.php

require("class.imageconverter.php");

$img = new ImageConverter("image.jpg","swf");

?>

class.imageconverter.php


class ImageConverter {

var $imtype;
var $im;
var $imname;
var $imconvertedtype;
var $output;

function imageConverter() {

/* parse arguments */
$numargs = func_num_args();
$imagefile = func_get_arg(0);
$convertedtype = func_get_arg(1);
$output = 0;
if($numargs > 2) $this->output = func_get_arg(2);

/* ask the type of original file */
$fileinfo = pathinfo($imagefile);
$imtype = $fileinfo["extension"];
$this->imname = basename($fileinfo["basename"],".".$imtype);
$this->imtype = $imtype;

/* create the image variable of original file */
switch ($imtype) {
case "gif":
$this->im = imageCreateFromGIF($imagefile);
break;
case "jpg":
$this->im = imageCreateFromJPEG($imagefile);
break;
case "png":
$this->im = imageCreateFromPNG($imagefile);
break;
case "wbmp":
$this->im = imageCreateFromWBMP($imagefile);
break;
/*
mail me if you have/find this functionality bellow */
/*
case "swf":
$this->im = $this->imageCreateFromSWF($imagefile);
break;
*/
}

/* convert to intended type */
$this->convertImage($convertedtype);
}

function convertImage($type) {

/* check the converted image type availability,
if it is not available, it will be casted to jpeg :) */
$validtype = $this->validateType($type);


if($this->output) {

/* show the image */
switch($validtype){
case 'jpeg' :
case 'jpg' :
header("Content-type: image/jpeg");
if($this->imtype == 'gif' or $this->imtype == 'png') {
$image = $this->replaceTransparentWhite($this->im);
imageJPEG($image);
} else
imageJPEG($this->im);
break;
case 'gif' :
header("Content-type: image/gif");
imageGIF($this->im);
break;
case 'png' :
header("Content-type: image/png");
imagePNG($this->im);
break;
case 'wbmp' :
header("Content-type: image/vnd.wap.wbmp");
imageWBMP($this->im);
break;
case 'swf' :
header("Content-type: application/x-shockwave-flash");
$this->imageSWF($this->im);
break;
}

} else {
/* save the image */
switch($validtype){
case 'jpeg' :
case 'jpg' :
if($this->imtype == 'gif' or $this->imtype == 'png') {
/* replace transparent with white */
$image = $this->replaceTransparentWhite($this->im);
imageJPEG($image,$this->imname.".jpg");
} else
imageJPEG($this->im,$this->imname.".jpg");
break;
case 'gif' :
imageGIF($this->im,$this->imname.".gif");
break;
case 'png' :
imagePNG($this->im,$this->imname.".png");
break;
case 'wbmp' :
imageWBMP($this->im,$this->imname.".wbmp");
break;
case 'swf' :
$this->imageSWF($this->im,$this->imname.".swf");
break;

}

}
}

/* convert image to SWF */
function imageSWF() {

/* parse arguments */
$numargs = func_num_args();
$image = func_get_arg(0);
$swfname = "";
if($numargs > 1) $swfname = func_get_arg(1);

/* image must be in jpeg and
convert jpeg to SWFBitmap
can be done by buffering it */
ob_start();
imagejpeg($image);
$buffimg = ob_get_contents();
ob_end_clean();

$img = new SWFBitmap($buffimg);

$w = $img->getWidth();
$h = $img->getHeight();

$movie = new SWFMovie();
$movie->setDimension($w, $h);
$movie->add($img);

if($swfname)
$movie->save($swfname);
else
$movie->output;

}


/* convert SWF to image */
function imageCreateFromSWF($swffile) {

die("No SWF converter in this library");

}

function validateType($type) {
/* check image type availability*/
$is_available = FALSE;

switch($type){
case 'jpeg' :
case 'jpg' :
if(function_exists("imagejpeg"))
$is_available = TRUE;
break;
case 'gif' :
if(function_exists("imagegif"))
$is_available = TRUE;
break;
case 'png' :
if(function_exists("imagepng"))
$is_available = TRUE;
break;
case 'wbmp' :
if(function_exists("imagewbmp"))
$is_available = TRUE;
break;
case 'swf' :
if(class_exists("swfmovie"))
$is_available = TRUE;
break;
}
if(!$is_available && function_exists("imagejpeg")){
/* if not available, cast image type to jpeg*/
return "jpeg";
}
else if(!$is_available && !function_exists("imagejpeg")){
die("No image support in this PHP server");
}
else
return $type;
}

function replaceTransparentWhite($im){
$src_w = ImageSX($im);
$src_h = ImageSY($im);
$backgroundimage = imagecreatetruecolor($src_w, $src_h);
$white = ImageColorAllocate ($backgroundimage, 255, 255, 255);
ImageFill($backgroundimage,0,0,$white);
ImageAlphaBlending($backgroundimage, TRUE);
imagecopy($backgroundimage, $im, 0,0,0,0, $src_w, $src_h);
return $backgroundimage;
}
}
?>

Currency Converter Using PHP

below function used to convert one currency to another

function get_conversion($cur_from,$cur_to){
if(strlen($cur_from)==0){
$cur_from = "USD";
}
if(strlen($cur_to)==0){
$cur_from = "PHP";
}
$host="finance.yahoo.com";
$fp = @fsockopen($host, 80, $errno, $errstr, 30);
if (!$fp)
{
$errorstr="$errstr ($errno)
\n";
return false;
}
else
{
$file="/d/quotes.csv";
$str = "?s=".$cur_from.$cur_to."=X&f=sl1d1t1ba&e=.csv";
$out = "GET ".$file.$str." HTTP/1.0\r\n";
$out .= "Host: www.yahoo.com\r\n";
$out .= "Connection: Close\r\n\r\n";
@fputs($fp, $out);
while (!@feof($fp))
{
$data .= @fgets($fp, 128);
}
@fclose($fp);
@preg_match("/^(.*?)\r?\n\r?\n(.*)/s", $data, $match);
$data =$match[2];
$search = array ("']*?>.*?'si","'<[\/\!]*?[^<>]*?>'si","'([\r\n])[\s]+'","'&(quot|#34);'i","'&(amp|#38);'i","'&(lt|#60);'i","'&(gt|#62);'i","'&(nbsp|#160);'i","'&(iexcl|#161);'i","'&(cent|#162);'i","'&(pound|#163);'i","'&(copy|#169);'i","'&#(\d+);'e");
$replace = array ("","","\\1","\"","&","<",">"," ",chr(161),chr(162),chr(163),chr(169),"chr(\\1)");
$data = @preg_replace($search, $replace, $data);
$result = split(",",$data);
return $result[1];
}//else
}//end get_conversion

$value =2;
$x = get_conversion('USD','EUR');
$x = $x * $value;


echo "Conversion Result : ".$x."";
?>

$value means 1,2 etc that means 1 USD = -- EUR
etc

below are the currency names

Installing Apache PHP and MySQL

PHP and MySQL are usually associated with LAMP (Linux, Apache, MySQL, PHP). However, most PHP developer ( including me ) are actually using Windows when developing the PHP application. So this page will only cover the WAMP ( Windows, Apache, MySQL, PHP ). You will learn how to install Apache, PHP, and MySQL under Windows platform.

The first step is to download the packages :

You should get the latest version of each packages. As for the example in this tutorial i'm using Apache 2.0.50 ( apache_2.0.50-win32-x86-no_ssl.msi ), PHP 4.3.10 ( php-4.3.10-Win32.zip ) and MySQL 4.0.18 ( mysql-4.0.18-win.zip ).

Now let's start the installation process one by one.

Go through below links for more details : -

http://www.php-mysql-tutorial.com/install-apache-php-mysql.php