<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-20572124121972732</id><updated>2012-01-21T02:23:57.751-08:00</updated><category term='linux'/><category term='IPv6'/><category term='Games'/><category term='javascript'/><category term='joins'/><category term='mysql'/><category term='js'/><category term='sql'/><category term='IPv4'/><category term='Ajax'/><category term='Programming'/><category term='database'/><category term='InnoDB'/><title type='text'>Technologies To Learn</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-4566949556934737583</id><published>2012-01-21T02:23:00.001-08:00</published><updated>2012-01-21T02:23:57.759-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='InnoDB'/><title type='text'>InnoDB plugin row format performance</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;InnoDB plugin row format performance&lt;br /&gt;&lt;br /&gt;Here is a quick comparison  of the new InnoDB plugin performance between different compression, row  formats that is introduced recently.&lt;br /&gt;&lt;br /&gt;The table is a pretty simple one:&lt;br /&gt;&lt;br /&gt;CREATE TABLE `sbtest` (&lt;br /&gt;`id` int(10) unsigned NOT NULL,&lt;br /&gt;`k` int(10) unsigned NOT NULL DEFAULT '0',&lt;br /&gt;`c` char(120) NOT NULL DEFAULT '',&lt;br /&gt;`pad` char(60) NOT NULL DEFAULT '',&lt;br /&gt;PRIMARY KEY (`id`),&lt;br /&gt;KEY `k` (`k`)&lt;br /&gt;) ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;&lt;br /&gt;&lt;br /&gt;The  table is populated with 10M rows with average row length being 224  bytes. The tests are performed for Compact, Dynamic and Compressed (8K  and 4K)  row formats using MySQL-5.1.24 with InnoDB plugin-1.0.0-5.1 on  Dell PE2950  1x Xeon quad core with 16G RAM, RAID-10 with RHEL-4 64-bit.&lt;br /&gt;&lt;br /&gt;Here are the four test scenarios:&lt;br /&gt;&lt;br /&gt;1. No compression, ROW_FORMAT=Compact&lt;br /&gt;2. ROW_FORMAT=Compressed with KEY_BLOCK_SIZE=8&lt;br /&gt;3. ROW_FORMAT=Compressed with KEY_BLOCK_SIZE=4&lt;br /&gt;4. ROW_FORMAT=Dynamic&lt;br /&gt;&lt;br /&gt;All  the above tests are repeated with innodb_buffer_pool_size=6G and 512M  to make sure one fits everything in memory and another one overflows.  The rest of the InnoDB settings are all default except that  innodb_thread_concurrency=32.&lt;br /&gt;&lt;br /&gt;Here is the summary of the test results:&lt;br /&gt;&lt;br /&gt;Table Load:&lt;br /&gt;&lt;br /&gt;Load time from a dump of SQL script having 10M rows (not batched)&lt;br /&gt;Compact  Compressed (8K)  Compressed (4K)  Dynamic&lt;br /&gt;28m 18s  29m 46s  36m 43s  27m 55s&lt;br /&gt;&lt;br /&gt;File Sizes:&lt;br /&gt;&lt;br /&gt;Here is the size of the .ibd file after each data load&lt;br /&gt;Compact  Compressed (8K)  Compressed (4K)  Dynamic&lt;br /&gt;2.3G  1.2G  592M  2.3G&lt;br /&gt;&lt;br /&gt;Data and Index Size from Table Status:&lt;br /&gt;&lt;br /&gt;Here  is the Data and Index size in bytes from SHOW TABLE STATUS and you can  see the original data size here rather than the compressed size&lt;br /&gt;Compact  Compressed (8K)  Compressed (4K)  Dynamic&lt;br /&gt;Data  2247098368  2247098368  2249195520  2247098368&lt;br /&gt;Index  137019392  137035776  160301056  137019392&lt;br /&gt;&lt;br /&gt;Compression Stats:&lt;br /&gt;&lt;br /&gt;Here  is the compression stats after the table is populated from  information_schema.InnoDB_cmp; and you notice that 4K takes more  operations and time for both compression and un-compression&lt;br /&gt;Page_size  Compress_ops  Compress_ops_ok  Compress_time  Uncompress_ops  Uncompress_time&lt;br /&gt;8K  8192  446198  445598  73  300  0&lt;br /&gt;4K  4096  1091421  1012917  463  38801  13&lt;br /&gt;&lt;br /&gt;Performance:&lt;br /&gt;&lt;br /&gt;Here  is the performance of various row formats with threads ranging from  1-512 for both 512M and 6G buffer pool size for both concurrent reads  and writes.&lt;br /&gt;&lt;br /&gt;compress512m&lt;br /&gt;&lt;br /&gt;compress6g&lt;br /&gt;&lt;br /&gt;Observations:&lt;br /&gt;&lt;br /&gt;Few  key observations from the performance tests that I performed without  looking to any of the sources, as I could be wrong, someone can correct  me here. Its hard to draw from these input scenarios, but helps to  estimate what is what.&lt;br /&gt;&lt;br /&gt;* The load time is almost same except  that the 4K compression seems to take longer than the rest; and  compression in general is hitting the INSERT/Load performance a little  bit.&lt;br /&gt;* Compact or Dynamic, there is no compression; so the data and index file sizes will be almost same&lt;br /&gt;* The SHOW TABLE STATUS for compressed table will have its original  Data_Length and Index_Length statistics rather than the compressed  statistics (may be a bug or InnoDB needs to extend SHOW TABLE STATUS to  show any compressed sizes or other means, right now only option is to  view your files manually)&lt;br /&gt;* 8K compression reduced the .ibd file  by nearly 50% (1.2G out of 2.3G) and 4K compression reduced the size by  1/4th (592M out of 2.3G); and it could vary based on table types and  data.&lt;br /&gt;* 8K compression takes less ops and time for both compression and de-compression when compared to 4K (obvious)&lt;br /&gt;* When there is enough Innodb buffer pool size to act data in  memory, the compression is a bit overhead, but you will be saving space&lt;br /&gt;* When there is a overflow from buffer pool (IO bound), compression seems to really help&lt;br /&gt;* 4K compression in general seems to be slower when compared with 8K or any other row_format.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-4566949556934737583?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/4566949556934737583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=4566949556934737583' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/4566949556934737583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/4566949556934737583'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2012/01/innodb-plugin-row-format-performance.html' title='InnoDB plugin row format performance'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-916388283006809667</id><published>2012-01-21T01:55:00.000-08:00</published><updated>2012-01-21T01:55:18.113-08:00</updated><title type='text'>How To Obtain hierarchical data / Parent - Child relationship</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Explain How To Obtain hierarchical data / Parent - Child relationship data&lt;br /&gt;&lt;br /&gt;&lt;div class="plainnote"&gt;This is a series of articles on hierarchical queries in &lt;b&gt;MySQL&lt;/b&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/" target="_blank"&gt;&lt;b&gt;Hierarchical queries in MySQL&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://explainextended.com/2009/03/18/hierarchical-queries-in-mysql-adding-level/" target="_blank"&gt;&lt;b&gt;Hierarchical queries in MySQL: adding level&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://explainextended.com/2009/03/19/hierarchical-queries-in-mysql-adding-ancestry-chains/" target="_blank"&gt;&lt;b&gt;Hierarchical queries in MySQL: adding ancestry chains.&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://explainextended.com/2009/03/20/hierarchical-queries-in-mysql-finding-leaves/" target="_blank"&gt;&lt;b&gt;Hierarchical queries in MySQL: finding leaves&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://explainextended.com/2009/03/21/hierarchical-queries-in-mysql-finding-loops/" target="_blank"&gt;&lt;b&gt;Hierarchical queries in MySQL: finding loops&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;See also:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://explainextended.com/2009/07/20/hierarchical-data-in-mysql-parents-and-children-in-one-query/" target="_blank"&gt;&lt;b&gt;Hierarchical data in MySQL: parents and children in one query&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-916388283006809667?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/916388283006809667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=916388283006809667' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/916388283006809667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/916388283006809667'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2012/01/how-to-obtain-hierarchical-data-parent.html' title='How To Obtain hierarchical data / Parent - Child relationship'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-906538821032278726</id><published>2012-01-21T00:53:00.000-08:00</published><updated>2012-01-21T00:53:01.175-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IPv6'/><category scheme='http://www.blogger.com/atom/ns#' term='IPv4'/><title type='text'>IPv4 vs IPv6</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;I had compiled  differences between IPv6 and IPv4 long back.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Hope someone might find  this useful. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;table border="1" cellpadding="2" cellspacing="0" style="width: 391px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="191"&gt;&lt;div align="center"&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;IPv4 &lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;td valign="top" width="198"&gt;&lt;div align="center"&gt;&lt;strong&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;IPv6 &lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="192"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Addresses are 32 bits (4 bytes) in length. &lt;/span&gt;&lt;/td&gt;&lt;td valign="top" width="197"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Addresses are 128 bits (16 bytes) in length &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="192"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Address (A) resource records in DNS to map host names to IPv4 addresses. &lt;/span&gt;&lt;/td&gt;&lt;td valign="top" width="197"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Address (AAAA) resource records in DNS to map host names to IPv6 addresses. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="192"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Pointer (PTR) resource records in the IN-ADDR.ARPA DNS domain to map IPv4 addresses to host names. &lt;/span&gt;&lt;/td&gt;&lt;td valign="top" width="197"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Pointer (PTR) resource records in the IP6.ARPA DNS domain to map IPv6 addresses to host names. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="192"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;IPSec is optional and should be supported externally &lt;/span&gt;&lt;/td&gt;&lt;td valign="top" width="197"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;IPSec support is not optional &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="192"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Header does not identify packet flow for QoS handling by routers &lt;/span&gt;&lt;/td&gt;&lt;td valign="top" width="197"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Header contains Flow Label field, which Identifies packet flow for QoS handling by router. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="192"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Both routers and the sending host fragment packets. &lt;/span&gt;&lt;/td&gt;&lt;td valign="top" width="197"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Routers do not support packet fragmentation. Sending host fragments packets &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="192"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Header includes a checksum. &lt;/span&gt;&lt;/td&gt;&lt;td valign="top" width="197"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Header does not include a checksum. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="192"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Header includes options. &lt;/span&gt;&lt;/td&gt;&lt;td valign="top" width="197"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Optional data is supported as extension headers. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="192"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;ARP uses broadcast ARP request to resolve IP to MAC/Hardware address. &lt;/span&gt;&lt;/td&gt;&lt;td valign="top" width="197"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Multicast Neighbor Solicitation messages resolve IP addresses to MAC addresses. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="192"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Internet Group Management Protocol (IGMP) manages membership in local subnet groups. &lt;/span&gt;&lt;/td&gt;&lt;td valign="top" width="197"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Multicast Listener Discovery (MLD) messages manage membership in local subnet groups. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="192"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Broadcast addresses are used to send traffic to all nodes on a subnet. &lt;/span&gt;&lt;/td&gt;&lt;td valign="top" width="197"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;IPv6 uses a link-local scope all-nodes multicast address. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="192"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Configured either manually or through DHCP. &lt;/span&gt;&lt;/td&gt;&lt;td valign="top" width="197"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Does not require manual configuration or DHCP. &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="192"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Must support a 576-byte packet size (possibly fragmented). &lt;/span&gt;&lt;/td&gt;&lt;td valign="top" width="197"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Must support a 1280-byte packet size (without fragmentation). &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;a href="http://www.networksorcery.com/about.htm"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Network Sorcery &lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;is a great place to find RFC(s).&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Refer to &lt;/span&gt;&lt;a href="http://www.networksorcery.com/enp/protocol/ipv6.htm" title="http://www.networksorcery.com/enp/protocol/ipv6.htm"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;http://www.networksorcery.com/enp/protocol/ipv6.htm &lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;and &lt;/span&gt;&lt;a href="http://www.networksorcery.com/enp/protocol/ip.htm" title="http://www.networksorcery.com/enp/protocol/ip.htm"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;http://www.networksorcery.com/enp/protocol/ip.htm &lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;links for related RFC(s) of IPv6 and IPv4 respectively.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;Also there is good reference for Understanding IPv6 @ &lt;/span&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc786127.aspx"&gt;&lt;span style="font-family: verdana; font-size: 85%;"&gt;http://technet.microsoft.com/en-us/library/cc786127.aspx &lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-906538821032278726?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/906538821032278726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=906538821032278726' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/906538821032278726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/906538821032278726'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2012/01/ipv4-vs-ipv6.html' title='IPv4 vs IPv6'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-8185557758325408778</id><published>2007-10-25T00:39:00.000-07:00</published><updated>2012-01-21T01:14:49.763-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Games'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>ET:QuakeWars - Linux Client is now available</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="content"&gt;&lt;br /&gt;In case you missed the official announcement, &lt;a href="http://community.enemyterritory.com/index.php?q=node/185"&gt;ETQW Linux Client&lt;/a&gt; is now available to download. You do need the full retail DVD to complete the installation though. The client itself is really small at 18MB, so need to work out if they actually preloaded some OS compatilibty stuff on the DVD pre-release.&lt;br /&gt;&lt;br /&gt;Another issue, it only runs in 32bit mode, so if you have a x86_64 install - you will need the compat libs along with their deps. My main gaming machine is i686, but my primary laptop is x86_64 ( the Acer Ferrari 4005 ) and I will at some point install the game there as well. So a list of rpms required on centos-5 to make it work will get posted here soon'ish :)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-8185557758325408778?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/8185557758325408778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=8185557758325408778' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/8185557758325408778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/8185557758325408778'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2007/10/etquakewars-linux-client-is-now.html' title='ET:QuakeWars - Linux Client is now available'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-3603338319935173428</id><published>2007-10-25T00:32:00.000-07:00</published><updated>2007-10-25T00:35:39.339-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>The Oracle Unbreakable Linux incompatibility</title><content type='html'>Submitted by dag&lt;br /&gt;&lt;div class="content"&gt;&lt;br /&gt;   &lt;p&gt;It was exciting when a year ago at LinuxWorld Expo London we heard a rumour that Oracle was going to support Red Hat Enterprise Linux. It was surprising to find out that this rumour was not entirely as well-intended and supportive as it sounded.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Instead of helping the community, Oracle was directly attacking Red Hat with its own product as if it was showing the world that Open Source has no value and that even Oracle could run away with Red Hat's crown jewels and customers. A hostile take-over attempt of Red Hat by Oracle.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;What the world did not understand (and Oracle tried to hide) is that the business value is not in the source-code, but in the development and the community. Red Hat is involved in most of the Open Source projects and in fact is able to support their product &lt;strong&gt;for 7 years&lt;/strong&gt; because they have the experts and the insight of how projects work. Oracle has not.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Another well-hidden fact of Oracle's promotional buzz is that you cannot both be compatible with RHEL, and provide bugfixes and improvements. Either you make changes, or you stay compatible with the original. So whatever Oracle stated was self-contradictory. All the articles at the time failed to mention that, riding on Oracle's wave.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Now that Oracle is porting YaST to Red Hat (who in their right mind would want to have YaST on RHEL is beyond my comprehension) it becomes all that obvious that whatever procedure you have for RHEL or CentOS it will not work with YaST. Once you use YaST, you cannot change (a lot of) configuration files by hand.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I always tell people at tradeshows that &lt;strong&gt;"CentOS is completely compatible with Red Hat Enterprise Linux, including the bugs"&lt;/strong&gt;. And even though that seems a bit harsh, it is &lt;em&gt;very&lt;/em&gt; true and it is exactly what we want to tell people. We cannot replace Red Hat's support because we need to be compatible and therefor rely on Red Hat's support. We cannot fix any bugs ourselves. That means that if you really need support (and you cannot support yourself), you need to get it from Red Hat.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The CentOS users rely on us to provide a compatible product and Oracle is fooling their customers if they tell them otherwise...&lt;/p&gt;&lt;br /&gt;  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-3603338319935173428?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/3603338319935173428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=3603338319935173428' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/3603338319935173428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/3603338319935173428'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2007/10/oracle-unbreakable-linux.html' title='The Oracle Unbreakable Linux incompatibility'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-2323552118269476322</id><published>2007-10-24T03:54:00.001-07:00</published><updated>2012-01-21T01:16:13.805-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='joins'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>A Visual Explanation of SQL Joins</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;I thought Ligaya Turmelle's post on SQL joins was a great primer for novice developers. Since SQL joins &lt;i&gt;appear&lt;/i&gt; to be set-based, the use of &lt;a href="http://en.wikipedia.org/wiki/Venn_diagram"&gt;Venn diagrams&lt;/a&gt; to explain them seems, at first blush, to be a natural fit. However, like the commenters     to her post, I found that the Venn diagrams didn't quite match the &lt;a href="http://en.wikipedia.org/wiki/Join_%28SQL%29"&gt;         SQL join syntax&lt;/a&gt;     reality in my testing.&lt;br /&gt;I love the concept, though, so let's see if we can make it work. Assume we have the following two tables. &lt;b&gt;Table A&lt;/b&gt; is on the left, and      &lt;b&gt;Table B&lt;/b&gt; is on the right. We'll populate them with four records each. &lt;br /&gt;&lt;pre style="border: 2px dotted silver; line-height: 100%; margin: 0px auto; max-height: 450px; overflow: auto; padding: 5px; width: 95%;"&gt;id name       id  name&lt;br /&gt;-- ----       --  ----&lt;br /&gt;1  &lt;span style="color: red;"&gt;Pirate&lt;/span&gt;     1   Rutabaga&lt;br /&gt;2  Monkey     2   &lt;span style="color: red;"&gt;Pirate&lt;/span&gt;&lt;br /&gt;3  &lt;span style="color: red;"&gt;Ninja&lt;/span&gt;      3   Darth Vader&lt;br /&gt;4  Spaghetti  4   &lt;span style="color: red;"&gt;Ninja&lt;/span&gt;&lt;/pre&gt;Let's join these tables by the name field in a few different ways and see if we can get a conceptual match to those nifty Venn diagrams. &lt;br /&gt;&lt;table border="1" cellpadding="6" cellspacing="4" style="border-collapse: collapse; border: 1px solid rgb(204, 204, 204); width: 400px;"&gt;&lt;tbody&gt;&lt;tr&gt; &lt;td&gt;&lt;pre style="border: 2px dotted silver; line-height: 100%; margin: 0px auto; max-height: 450px; overflow: auto; padding: 5px; width: 95%;"&gt;SELECT * FROM TableA&lt;br /&gt;&lt;b&gt;INNER JOIN&lt;/b&gt; TableB&lt;br /&gt;ON TableA.name = TableB.name&lt;br /&gt;&lt;br /&gt;id  name       id   name&lt;br /&gt;--  ----       --   ----&lt;br /&gt;1   Pirate     2    Pirate&lt;br /&gt;3   Ninja      4    Ninja&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Inner join&lt;/b&gt;     produces only the set of records that match in both Table A and Table B.&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img alt="Venn diagram of SQL inner join" border="0" height="250" src="http://farm3.static.flickr.com/2208/1575103971_3d2133737c_m.jpg" width="400" /&gt; &lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;&lt;pre style="border: 2px dotted silver; line-height: 100%; margin: 0px auto; max-height: 450px; overflow: auto; padding: 5px; width: 95%;"&gt;SELECT * FROM TableA&lt;br /&gt;&lt;b&gt;FULL OUTER JOIN&lt;/b&gt; TableB&lt;br /&gt;ON TableA.name = TableB.name&lt;br /&gt;&lt;br /&gt;id    name       id    name&lt;br /&gt;--    ----       --    ----&lt;br /&gt;1     Pirate     2     Pirate&lt;br /&gt;2     Monkey     &lt;span style="color: grey;"&gt;null&lt;/span&gt;  &lt;span style="color: grey;"&gt;null&lt;/span&gt;&lt;br /&gt;3     Ninja      4     Ninja&lt;br /&gt;4     Spaghetti  &lt;span style="color: grey;"&gt;null&lt;/span&gt;  &lt;span style="color: grey;"&gt;null&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey;"&gt;null&lt;/span&gt;  &lt;span style="color: grey;"&gt;null&lt;/span&gt;       1     Rutabaga      &lt;br /&gt;&lt;span style="color: grey;"&gt;null&lt;/span&gt;  &lt;span style="color: grey;"&gt;null&lt;/span&gt;       3     Darth Vader&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;Full outer join&lt;/b&gt; produces the set of all records in Table A and     Table B, with matching records from both sides where available. If there is no match,     the missing side will contain null.&lt;/td&gt;         &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img alt="Venn diagram of SQL cartesian join" border="0" height="250" src="http://farm3.static.flickr.com/2173/1575103951_1370b28531_m.jpg" width="400" /&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;  &lt;td&gt;&lt;pre style="border: 2px dotted silver; line-height: 100%; margin: 0px auto; max-height: 450px; overflow: auto; padding: 5px; width: 95%;"&gt;SELECT * FROM TableA&lt;br /&gt;&lt;b&gt;LEFT OUTER JOIN&lt;/b&gt; TableB&lt;br /&gt;ON TableA.name = TableB.name&lt;br /&gt;&lt;br /&gt;id  name       id    name&lt;br /&gt;--  ----       --    ----&lt;br /&gt;1   Pirate     2     Pirate&lt;br /&gt;2   Monkey     &lt;span style="color: grey;"&gt;null&lt;/span&gt;  &lt;span style="color: grey;"&gt;null&lt;/span&gt;&lt;br /&gt;3   Ninja      4     Ninja&lt;br /&gt;4   Spaghetti  &lt;span style="color: grey;"&gt;null&lt;/span&gt;  &lt;span style="color: grey;"&gt;null&lt;/span&gt; &lt;/pre&gt;&lt;b&gt;Left outer join&lt;/b&gt; produces a complete set of records from Table A, with the matching records     (where available) in Table B. If there is no match, the right side will contain null.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;   &lt;td&gt;&lt;img alt="Venn diagram of SQL left join" border="0" height="250" src="http://farm3.static.flickr.com/2245/1575103977_440cc4ca18_m.jpg" width="400" /&gt; &lt;/td&gt; &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;&lt;pre style="border: 2px dotted silver; line-height: 100%; margin: 0px auto; max-height: 450px; overflow: auto; padding: 5px; width: 95%;"&gt;SELECT * FROM TableA&lt;br /&gt;LEFT OUTER JOIN TableB&lt;br /&gt;ON TableA.name = TableB.name&lt;br /&gt;&lt;b&gt;WHERE TableB.id IS null&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;id  name       id     name&lt;br /&gt;--  ----       --     ----&lt;br /&gt;2   Monkey     &lt;span style="color: grey;"&gt;null&lt;/span&gt;   &lt;span style="color: grey;"&gt;null&lt;/span&gt;&lt;br /&gt;4   Spaghetti  &lt;span style="color: grey;"&gt;null&lt;/span&gt;   &lt;span style="color: grey;"&gt;null&lt;/span&gt; &lt;/pre&gt;To produce the set of records only in Table A, but not in Table B, we perform the same     left outer join, then &lt;b&gt;exclude the records we don't want from the right side via         a where clause&lt;/b&gt;.&lt;/td&gt;         &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img alt="join-left-outer.png" border="0" height="250" src="http://farm3.static.flickr.com/2300/1575103985_0d9cdbc8a3_m.jpg" width="400" /&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;&lt;pre style="border: 2px dotted silver; line-height: 100%; margin: 0px auto; max-height: 450px; overflow: auto; padding: 5px; width: 95%;"&gt;SELECT * FROM TableA&lt;br /&gt;FULL OUTER JOIN TableB&lt;br /&gt;ON TableA.name = TableB.name&lt;br /&gt;&lt;b&gt;WHERE TableA.id IS null&lt;br /&gt;OR TableB.id IS null&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;id    name       id    name&lt;br /&gt;--    ----       --    ----&lt;br /&gt;2     Monkey     &lt;span style="color: grey;"&gt;null&lt;/span&gt;  &lt;span style="color: grey;"&gt;null&lt;/span&gt;&lt;br /&gt;4     Spaghetti  &lt;span style="color: grey;"&gt;null&lt;/span&gt;  &lt;span style="color: grey;"&gt;null&lt;/span&gt;&lt;br /&gt;&lt;span style="color: grey;"&gt;null&lt;/span&gt;  &lt;span style="color: grey;"&gt;null&lt;/span&gt;       1     Rutabaga&lt;br /&gt;&lt;span style="color: grey;"&gt;null&lt;/span&gt;  &lt;span style="color: grey;"&gt;null&lt;/span&gt;       3     Darth Vader&lt;br /&gt;&lt;/pre&gt;To produce the set of records unique to Table A and Table B, we perform the same full outer join,     then &lt;b&gt;exclude the records we don't want from both sides via a where clause&lt;/b&gt;.&lt;/td&gt;         &lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img alt="join-outer.png" border="0" height="250" src="http://farm3.static.flickr.com/2152/1575104001_ed2a2d5e22_m.jpg" width="400" /&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;There's also a cartesian product or &lt;b&gt;cross join&lt;/b&gt;, which as far as         I can tell, can't be expressed as a Venn diagram:&lt;br /&gt;&lt;pre style="border: 2px dotted silver; line-height: 100%; margin: 0px auto; max-height: 450px; overflow: auto; padding: 5px; width: 95%;"&gt;SELECT * FROM TableA&lt;br /&gt;&lt;b&gt;CROSS JOIN&lt;/b&gt; TableB&lt;br /&gt;&lt;/pre&gt;This joins "everything to everything", resulting in 4 x 4 = 16 rows, far more than we         had in the original sets. If you do the math, you can see why this is a &lt;i&gt;very&lt;/i&gt;         dangerous join to run against large tables.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-2323552118269476322?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/2323552118269476322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=2323552118269476322' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/2323552118269476322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/2323552118269476322'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2007/10/visual-explanation-of-sql-joins.html' title='A Visual Explanation of SQL Joins'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2208/1575103971_3d2133737c_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-1382678644603126407</id><published>2007-10-24T03:53:00.001-07:00</published><updated>2012-01-21T01:17:00.502-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='js'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><title type='text'>Best Places To Use Ajax</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;b&gt;Form driven interaction.&lt;/b&gt; &lt;br /&gt;Forms are slow. Very slow. Editing a tag (the old way) on a del.icio.us bookmark? Click on the edit link to load the edit bookmark form page, then edit the field and hit submit to wait for the submission to go through, then return to the previous page and scroll down to find the bookmark to see if the tags look right. Ajax? Click on the edit link to instantly start changing tags, click on the submit button to asynchronously send off changes to the tags and quickly see in place what changed, no reloading the entire page.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Form driven interaction- Subset:Linked Select Menus.&lt;/b&gt; Imagine a T-Shirt with 3 options; Size, Color, and Style. When tracking inventory for your product, you know you have Large, Red, Polo shirts in stock, but you’re out of Small, Blue, T-Shirts… It is frustrating to the user to pick this combination and then receive an error on the checkout page stateing that you are out of stock… and then have to go back to the selection process and reconfigure the item… Using &lt;span class="caps"&gt;AJAX&lt;/span&gt;, you can check the stock of the options &lt;i&gt;as the user picks them&lt;/i&gt; and only return or show the items which are in stock.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Form driven interaction- Subset: Autosave.&lt;/b&gt; Think of someone writing in Word. Which button do they use the most? Save.&lt;br /&gt;With javascript you can do one better. Not only can you have a save &amp;amp; continue that works just like the del.icio.us forms – you can autosave! Remember to tell the user this, as simply knowing this relaxes quite a lot of people. Properly explained count-down clocks are prefered, for obvious reasons. &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Deep hierarchical tree navigation.&lt;/b&gt; First of all, applications with deep hierarchical tree navigation are generally a nightmare. Simple flat topologies and search/tagging works very well in most circumstances. But if an application really calls for it, use Javascript to manage the topology ui, and Ajax to lessen the burden on the server by lazy loading deep hierarchy data. For example: it’s way too time consuming to read discussion threads by clicking through and loading completely new pages to see a one line response.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Rapid user-to-user communication.&lt;/b&gt; In a message posting application that creates immediate discussions between people, what really sucks is forcing the user to refresh the page over and over to see a reply. Replies should be instant, users shouldn’t have to obsessively refresh. Even Gmail, which improves on the old hotmail/yahoo mail ‘refresh inbox, refresh inbox’ symptom, doesn’t really push Ajax far enough yet in terms of notifying new mail instantly.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Voting, Yes/No boxes, Ratings submissions.&lt;/b&gt; It’s really too bad there are no consistent UI cues for Ajax submission, because submitting a vote or a yes/no response is so much less painful when the submission is handled through Ajax. By reducing the time and impact of clicking on things, Ajax applications become a lot more interactive – if it takes a 40 seconds to register a vote, most people would probably pass unless they really care. If it takes 1 second to vote, a much larger percentage of people are likely to vote.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Filtering and involved data manipulation.&lt;/b&gt; Applying a filter, sorting by date, sorting by date and name, toggling on and off filters, etc. Any highly interactive data manipulation should really be done in Javascript instead of through a series of server requests. Finding and manipulating a lot of data is hard enough without waiting 30 seconds between each change in views, Ajax can really speed this up.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Commonly entered text hints/autocompletion.&lt;/b&gt; Entering the same text phrases or predictable text phrases is something software/javascript can be good at helping out with. It’s very useful in del.icio.us and GMail, for quickly adding tags/email addresses.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Interactive Errors&lt;/b&gt; If someone is entering complicated data, it doesn’t make sense to tell them they have failed only after a lengthy submission process. Ajax can speed up this workflow by quickly letting the user know of an error condition before they try to submit. Example: a username chooser, instead of making the user submit the entire form, try a new name and repeat, or keep trying a ‘is this name chosen’ form, the username chooser can simply indicate to the user whether the username is unique or not, while the user is still typing it.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Long Running Queries/Remote Calls&lt;/b&gt; If a query or a call to a remote webservice  is going to take a long time that cannot be avoided, Ajax works well to manage the time a user waits for the call to return. For example, SWiK uses Ajax to fill in results from webservices detailing new projects: a user doesn’t have to wait for Google webservice to return before starting to edit a new project&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Computationally Expensive Operations&lt;/b&gt; Unfortunately, Javascript has a tendency to be quite slow. Complex math or number crunching just isn’t Javascript’s forte. Additionally, heavy Javascript computation can slow the basic user interface to a crawl. An XMLHTTPRequest call can be helpful here, pushing expensive computations to beefier remote servers.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Server Savings&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;Sometimes, a process users do over and over on a site requires only a small amount of new data to be sent over the wire, but loading entire new pages can be a strain on the servers in bandwidth and resources. Ajax can be used to load pages more efficiently, as seen in various tests. Of course the ease of making new or multiple requests from the server using Ajax also means that it’s easy to overtax server resources as well.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Interactive Panning And Moving Over Data&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;Moving and scanning over large data sets makes it impracticable to pre-load all of the data. Loading the data just ahead an just behind the user gives the appearance of the entire data set being accessible, and helps eliminate loading times. A great example of this is Google Maps’ scrolling tiles system that gives the effect of moving over a map by picking up tiles behind and placing them ahead of the user, filling them with new data requested via Ajax.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-1382678644603126407?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/1382678644603126407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=1382678644603126407' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/1382678644603126407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/1382678644603126407'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2007/10/best-places-to-use-ajax.html' title='Best Places To Use Ajax'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-706398658498086644</id><published>2007-10-24T03:52:00.002-07:00</published><updated>2007-10-24T03:53:22.035-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Best Top Ten Open Source,Ajax/DHTML Librearies For Web Developer</title><content type='html'>Hi, Frnds...I made a list of the top 10 libraries that I have come across or that I personally use. Libraries can be best for a web developers friend. They are great resources to learn from and can save hours and hours of time. These libraries include JavaScript, Ajax, Colors, PHP, and CSS. These should be in any web developers bookmarks, so go ahead and look through these libraries and bookmark your favorite ones. The list is in no particular order.&lt;br&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;1) &lt;a href="http://moofx.mad4milk.net/"&gt;Moo.fx&lt;/a&gt;&lt;/strong&gt; - A superlightweight, ultratiny, megasmall javascript effects library, written with &lt;a href="http://prototype.conio.net/"&gt;prototype.js&lt;/a&gt;. It’s easy to use, fast, cross-browser, standards compliant, provides controls to modify Height, Width, and Opacity with builtin checks that won’t let a user break the effect with multiple crazy clicks. It’s also optimized to make you write the lesser code possible.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2) &lt;a href="http://openrico.org/rico/home.page"&gt;Rico&lt;/a&gt;&lt;/strong&gt; - An open source JavaScript library for creating rich internet applications. Provides full Ajax support, drag and drop management, and a cinematic effects library.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3) &lt;a href="http://swat.silverorange.com/Swat"&gt;Swat&lt;/a&gt;&lt;/strong&gt; - Developed by &lt;a href="http://www.silverorange.com/"&gt;silverorange&lt;/a&gt;, Swat is an open source web application toolkit built with PHP.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;4) &lt;a href="http://www.colorcombos.com/combolibrary.html"&gt;ColorCombos&lt;/a&gt;&lt;/strong&gt; - Who would’ve thought a color library would end up mixed in with a bunch of JavaScript and PHP libraries? Well they do have a pretty sweet little color library for finding color combinations, all you do is select the color and they show you some nice combos that work with that color. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;5) &lt;a href="http://script.aculo.us/"&gt;script.aculo.us&lt;/a&gt;&lt;/strong&gt; - Provides you with easy-to-use, compatible and, ultimately, totally cool JavaScript libraries to make your web sites and web applications fly, Web 2.0 style. I’m sure I’m not alone when I say this library is my favorite. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;6) &lt;a href="http://www.mochikit.com/"&gt;Mochikit&lt;/a&gt;&lt;/strong&gt; - A kick-ass lightweight JavaScript library that will help you get shit done fast.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;7) &lt;a href="http://www.dynamicdrive.com/style/"&gt;Dynamic Drive CSS Library&lt;/a&gt;&lt;/strong&gt; - Here you’ll find original, practical CSS codes and examples such as CSS menus to give your site a visual boast.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;8) &lt;a href="http://pear.php.net/"&gt;PEAR&lt;/a&gt;&lt;/strong&gt; - A framework and distribution system for reusable PHP components. PEAR provides the above mentioned PHP components in the form of so called “Packages”.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;9) &lt;a href="http://www.dhtmlgoodies.com/"&gt;DHTML Goodies&lt;/a&gt;&lt;/strong&gt; - A good sized library of DHTML and AJAX scripts.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;10) &lt;a href="http://www.dojotoolkit.org/"&gt;dojo&lt;/a&gt;&lt;/strong&gt; - Open source JavaScript toolkit that makes professional web development better, easier, and faster. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Honorable Mentions&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;11) &lt;a href="http://www.cross-browser.com/toys/"&gt;Cross Browser | Toys&lt;/a&gt;&lt;/strong&gt; - Huge JavaScript library. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;12) &lt;a href="http://developer.yahoo.com/yui/"&gt;Yahoo UI Library&lt;/a&gt;&lt;/strong&gt; - The Yahoo! User Interface (YUI) Library is a set of utilities and controls, written in JavaScript, for building richly interactive web applications using techniques such as DOM scripting, DHTML and AJAX. The YUI Library also includes several core CSS resources.&lt;/p&gt;  &lt;p&gt;Big thanks to all of those who have help in anyway to put one of these libraries together. &lt;/p&gt;  &lt;p&gt;I hope you find this list helpful. Keep in mind there’s hundred of libraries available online,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-706398658498086644?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/706398658498086644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=706398658498086644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/706398658498086644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/706398658498086644'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2007/10/best-top-ten-open-sourceajaxdhtml.html' title='Best Top Ten Open Source,Ajax/DHTML Librearies For Web Developer'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-788055437682672580</id><published>2007-10-24T03:52:00.001-07:00</published><updated>2007-10-24T03:52:38.877-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Income Streams for Bloggers</title><content type='html'>&lt;strong&gt;Advertising&lt;/strong&gt; &lt;strong&gt;Programs&lt;/strong&gt; - Perhaps the most obvious changes in the past few months have been with the addition of a variety of viable advertising options for bloggers. No longer are bloggers only presented with the &lt;a href="http://google.com/adsense/"&gt;Adsense&lt;/a&gt; and/or &lt;a href="http://www.blogads.com/"&gt;BlogAds&lt;/a&gt; choice - instead they now have a massive array to choose from. Getting the most publicity recently have been &lt;a href="http://chitika.com/mm_overview.php?refid=livingroom"&gt;Chitika’s eMiniMalls&lt;/a&gt; of course but there are just so many other options now that also include:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.qumana.com/adgenta_signup.htm"&gt;Adgenta&lt;/a&gt;, &lt;a href="http://www.crispads.com/"&gt;CrispAds&lt;/a&gt;, &lt;a href="http://www.text-link-ads.com/?referrer=10847"&gt;Text Link Ads&lt;/a&gt;, &lt;a href="http://www.vibrantmedia.com/"&gt;Intelli Txt&lt;/a&gt;, &lt;a href="http://www.peakclick.com/"&gt;Peak Click&lt;/a&gt;, &lt;a href="http://www.doubleclick.com/"&gt;DoubleClick&lt;/a&gt;&lt;a href="http://www.tribalfusion.com/"&gt;Tribal Fusion&lt;/a&gt;, &lt;a href="http://www.adbrite.com/mb/?spid=9435&amp;amp;afb=110_32_01"&gt;Adbrite&lt;/a&gt;, &lt;a href="http://clicksor.com/"&gt;Clicksor&lt;/a&gt;, &lt;a href="http://www.industrybrains.com/"&gt;Industry Brains&lt;/a&gt;, &lt;a href="http://www.adhearus.org/"&gt;AdHearUs&lt;/a&gt;, &lt;a href="http://www.kanoodle.com/"&gt;Kanoodle&lt;/a&gt;, &lt;a href="http://www.avnads.com/"&gt;AVN&lt;/a&gt;, &lt;a href="http://www.pheedo.com/"&gt;Pheedo&lt;/a&gt;, &lt;a href="http://adknowledge.com/"&gt;Adknowledge&lt;/a&gt;, &lt;a href="http://www.yesadvertising.com/"&gt;YesAdvertising&lt;/a&gt;, &lt;a href="http://revenuepilot.com/"&gt;RevenuePilot&lt;/a&gt;&lt;a href="http://www.textads.biz/"&gt;TextAds&lt;/a&gt;, &lt;a href="http://searchfeed.com/"&gt;SearchFeed&lt;/a&gt;, &lt;a href="http://publisher.targetpoint.com/"&gt;Target Point&lt;/a&gt;, &lt;a href="http://www.bidvertiser.com/"&gt;Bidvertiser&lt;/a&gt;, &lt;a href="http://www.fastclick.com/re.f?16512"&gt;Fastclick&lt;/a&gt; &lt;a href="http://www.valueclick.com/"&gt;Value Click&lt;/a&gt; and &lt;a href="http://onemonkey.com/"&gt;OneMonkey&lt;/a&gt; (to name just some of the options - I’m sure I’ve forgotten some) and there is a smorgasbord of options. Of course there is more to come with &lt;a href="https://adcenter.msn.com/Default.aspx"&gt;MSN Adcenter&lt;/a&gt; and &lt;a href="http://publisher.yahoo.com/"&gt;YPN&lt;/a&gt; both in beta testing and with a variety of other advertising system currently in development (so I hear). &lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;strong&gt;RSS Advertising&lt;/strong&gt; - The past 12 months have seen some advances in RSS Advertising also. I’m yet to hear of any bloggers making big dollars through it to this point - but as improvements are made to the ad programs exploring this I’m sure we’ll start to see examples of it being profitable. &lt;/p&gt; &lt;p&gt; &lt;strong&gt;Sponsorship&lt;/strong&gt; - In addition to the array of advertising programs that are available to join there is a growing awareness in the business of the value and opportunity that exists for them to advertise directly on blogs. I’m hearing more and more examples of this and have been fortunately to have a couple of ad campaigns of my own in the past month - one with Adobe a couple of weeks ago and another just completed with Ricoh for a new digicam over at my &lt;a href="http://www.livingroom.org.au/photolog"&gt;Digital Camera Blog&lt;/a&gt;. These are not isolated cases - as I say I know of many blogs exploring sponsorship with advertisers at present and suspect we’ll see more of it in the year ahead. Sponsorship is also happening on a post by post basis with some bloggers being paid to write on certain topics by companies - either in one off or a regular fashion. &lt;/p&gt; &lt;p&gt; &lt;strong&gt;Affiliate Programs&lt;/strong&gt; - There are larger affiliate programs like &lt;a href="http://www.amazon.com/gp/browse.html/ref=gw1_mm_2/103-4938891-8839811/?node=3435371"&gt;Amazon&lt;/a&gt;, &lt;a href="http://www.linkshare.com/"&gt;Linkshare&lt;/a&gt;, &lt;a href="http://www.clickbank.com/"&gt;Clickbank&lt;/a&gt; and &lt;a href="http://www.cj.com/"&gt;Commission Junction&lt;/a&gt; but also literally thousands of others from the large to the very small. &lt;/p&gt;  &lt;p&gt; &lt;strong&gt;Blog Network Opportunities&lt;/strong&gt; - with the rise in popularity of Blog Networks - bloggers are also being presented with more places to earn an income from their blogging - by writing for and with others. While it might be difficult to get a writing gig with one of the bigger networks - there are plenty who are always asking for new bloggers to join and who are willing to pay bloggers using a variety of payment models. While there are distinct advantages of blogging for yourself - blogging for an established network who will handle a lot of the set up/promotion/admin/SEO etc has it’s advantages also. More and more bloggers are combining writing for themselves on their own blogs with taking on blog network blogs as additional income streams. &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Business Blog Writing Opportunities&lt;/strong&gt; - as blogging has risen in it’s profile as a medium more and more businesses are starting blogs. Many of these companies have internal staff take on blogging duties - but an increasing number of them are hiring specialist bloggers to come on and run their blogs. I know of a number of bloggers who in the past month or two have been approached for such paid work. Check out &lt;a href="http://www.bloggersforhire.com/"&gt;Bloggers for Hire&lt;/a&gt; if you’re looking for this type of work.&lt;/p&gt; &lt;p&gt; &lt;strong&gt;Non Blogging Writing Opportunities&lt;/strong&gt; - Also becoming more common are bloggers being hired to write in non blogging mediums. Manolo’s recent &lt;a href="http://www.shoeblogs.com/wordpress/2005/07/26/manolo-the-columnist/"&gt;coup of a column in the Washington Post&lt;/a&gt; is just one example of this as bloggers are increasingly being approached to write for newspapers, magazines and other non blog websites. Along side this is the rise of bloggers as published book authors - this is to the extent that one blogger I spoke with this week complained to me that they were one of the few bloggers than they knew who didn’t have a book deal! &lt;/p&gt; &lt;p&gt; &lt;strong&gt;Donations&lt;/strong&gt; - Tip Jars and donation buttons have been a part of blogging for years now but this last year saw a number of bloggers go full time after fundraising drives. Perhaps the most high profile of these was Jason Kottke of &lt;a href="http://www.kottke.org/"&gt;kottke.org&lt;/a&gt; who through the generosity of his readership was able to quit his job and become a full time blogger. &lt;/p&gt; &lt;p&gt; &lt;strong&gt;Flipping Blogs&lt;/strong&gt; - Also more common in 2005 was the practice of ‘Blog Flipping’ - or selling of blogs. This has happened both on an individual blog level (I can think of about 20 blogs that sold this year) but also on a network level (the most obvious of these being the 8 figure sale of Weblogs Inc to AOL). &lt;/p&gt; &lt;p&gt; &lt;strong&gt;Merchandising&lt;/strong&gt; - My recent attempt to sell ProBlogger.net T-shirts wasn’t a raging success, but it is an example of how an increasing number of bloggers are attempting to make a few extra dollars from their blogs by selling branded products through programs like &lt;a href="http://www.cafepress.com/"&gt;Cafepress&lt;/a&gt; (although I have to say they’ve lost one of my own orders and are being quite unresponsive to my requests to follow it up at present). While I didn’t have a lot of success with merchandising - quite a few larger blogs are seeing significant sales - especially blogs with a cult following. I’m not at liberty to discuss details - but I know of one largish blog which will see sales over $20,000 in merchandise for the calendar year of 2005. &lt;/p&gt; &lt;p&gt; &lt;strong&gt;Consulting and Speaking&lt;/strong&gt; - While it has been popular for established consultants to add blogs to their businesses we’re also starting to see bloggers with no consulting background earning money by charging readers for their time in consulting scenarios BECAUSE of the profile that their blogs have built them. Blogging has the ability to establish people as experts on niche topics and we all know the value of being perceived as an expert. I spoke to one blogger last month who charges himself out at over $200 an hour for speaking and consulting work - his area of expertise was something that he knew little about 18 months ago - but through his blog he’s become a leader in his field and a minor celebrity in his industry. &lt;/p&gt; &lt;p&gt;As time rolls on there are more and more blog earning opportunities opening up. Feel free to suggest your own ideas in comments below.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-788055437682672580?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/788055437682672580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=788055437682672580' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/788055437682672580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/788055437682672580'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2007/10/income-streams-for-bloggers.html' title='Income Streams for Bloggers'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-7339354477006991959</id><published>2007-10-24T03:51:00.000-07:00</published><updated>2007-10-24T03:52:06.474-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Open source databases is "SIXTY%" cheaper !!!!!</title><content type='html'>You know .....that Open source databases can save enterprises up to 60 per cent over proprietary products, according to data collected by&lt;br&gt;recent searches. &lt;br&gt;&lt;br&gt;A senior analyst at famous database management systems, estimated that average savings on the total cost of ownership are about 50 per cent. The data is based on surveys and customer interviews.&lt;br&gt;&lt;br&gt;Open source databases such as Enterprise DB, Ingres and MySQL do not carry licence fees, and management tools. Soit is less expensive than for proprietary databases from Oracle, Microsoft and IBM.&lt;br&gt;&lt;br&gt;Open source offers especially their proprietary competitors in low-end applications with databases of less than 200GB in size outshininigly .&lt;br&gt;&lt;br&gt;The one fact os this research is that "Eighty per cent of the applications typically use only 30 per cent of the features found in commercial databases,"  and "The open source databases deliver those features today."&lt;br&gt;&lt;br&gt;But the hitch is that open source databases generally lack the features for mission critical applications, trailing behind their proprietary peers in security, uptime, performance and features such as XML support.&lt;br&gt;&lt;br&gt;Enterprise applications from Oracle and SAP also do not support open source databases today, but right now condition expects that to change "within a couple of years".&lt;br&gt;&lt;br&gt;Open source database vendors typically do not position their products as low-cost alternatives.&lt;br&gt;&lt;br&gt;But customers still consider price as the primary benefit of open source, ya this is fact.&lt;br&gt;&lt;br&gt;"The number one reason why any customer would choose an open source database is cost. That still holds true today" .&lt;br&gt;&lt;br&gt;But the low price is also enabling companies to set up new projects that would previously have been too expensive, such as data mining of log files and setting up data repositories.&lt;br&gt;&lt;br&gt;In an attempt to the competition from low-cost open source databases, Oracle launched a free database last year that is essentially a scaled down version of its enterprise grade Oracle Database 10g.&lt;br&gt;&lt;br&gt;The application targets test deployments for developers and students rather than enterprises.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-7339354477006991959?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/7339354477006991959/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=7339354477006991959' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/7339354477006991959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/7339354477006991959'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2007/10/open-source-databases-is-sixty-cheaper.html' title='Open source databases is &quot;SIXTY%&quot; cheaper !!!!!'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-2509326260620730434</id><published>2007-10-24T03:50:00.001-07:00</published><updated>2007-10-24T03:50:22.997-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>10 Valuable Tips for Creating Your Web Site</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Introduction&lt;/span&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;When looking for ways to build of your web site, even minor steps can make a huge difference. The most helpful information and best content will have little impact without simple protocols that make your Web site easier to use and more visually appealing. This paper focuses on 10 tips you can employ to ensure your web site is effec- tive from the day it goes live.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;1. Accessibility&lt;/span&gt;&lt;br&gt;&lt;br&gt;Web site accessibility has recently become a very important issue in the web community. Because of Section 508 of the Rehabilitation Act of 1973, all web sites and pages created by Federal agencies and Federal contrac-tors after June 21, 2001 must comply with its provisions. The purpose of the law is to make web sites accessi-ble to all individuals, including those with disabilities. The World Wide Web Consortium (W3C) developed Web&lt;br&gt;Content Accessibility Guidelines (May 1999), which expand the scope of Section 508.&lt;br&gt;&lt;br&gt;This is very important to all web developers, whether you are a government agency, a contractor who does work for the government, or a private firm with its own web site. An accessible web site refers to any content or information provided via an online medium that all individuals (including those with disabilities) could easily access and understand. Disabilities include not only visual impairments, but auditory, cognitive, and physical&lt;br&gt;impairments as well. They can range from very severe (total blindness, for example) to something as simple as the increasing inability to see contrasts that develop as we age. Greater accessibility means more people can fully utilize your web site’s features.&lt;br&gt;&lt;br&gt;There are a number of aids available for enhancing accessibility. These range from programs like Jaws or IBM’s Home Page Reader—which read the page aloud for the visually impaired—to sip-and-puff systems for the quadriplegic. It is up to the web developer to create pages that allow these systems to provide an equivalent alternative for these individuals. Think of accessing a web page as being similar to a play or opera. If you read the script without benefit of the actors’ interpretation, lights, scenery, or music, you are only experiencing one aspect of the author’s intent. The same is true of web access: if you can only hear the words being read, for example, with no description of the images on the page or other visual components, you would not fully expe-rience the information being provided on the page. That is why, when we include an image, it is important to use the “alt” attribute to provide a description of the image. This enables a screen reader to read this informa-&lt;br&gt;tion aloud for a visually impaired user.&lt;br&gt;&lt;br&gt;There are several other tips like using  table headers with tables of information, not just placeholders. Be careful of using the colors red and green together because of red/green colorblindness. Use sounds with care. Not everyone can hear, nor does everyone have speakers set up on their computers.&lt;br&gt;&lt;br&gt;So how do you know if your web site is accessible? Go to http://webxact.watchfire.com and enter the URL for a web page. This free application will test your page and let you know where it does not comply&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;2. Security&lt;/span&gt;&lt;br&gt;&lt;br&gt;Security is crucial to the success of your web site. There are several steps you can take to minimize the risk that your web sites will be subjected to a breech in security.&lt;br&gt;&lt;br&gt;    &lt;span style="font-weight: bold;"&gt;Security Updates&lt;/span&gt;&lt;br&gt;        Be sure you are running the most current version of your web Server. Monitor your         vendor updates, and per-form regular maintenance.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;    Validate User Input on the Client and the Server&lt;/span&gt;&lt;br&gt;        Validating user input on the client is great for user experience. However, you need to     validate input on the server side as well. Consider that there are tools that look and feel to your sever like a web site when in fact they are actually designed to fake input such as passwords.&lt;br&gt;&lt;br&gt;    &lt;span style="font-weight: bold;"&gt;Audit Logs&lt;/span&gt;&lt;br&gt;        Maintain and review server logs to check for suspicious activity.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;    Common Settings&lt;/span&gt;&lt;br&gt;        Be sure to minimize the risk to your server by minimizing the things users can do on your server. For example,  don’t permit users to browse the directory structure of your site unless it’s necessary.&lt;br&gt;&lt;br&gt; &lt;span style="font-weight: bold;"&gt;   Lockdown Your Server&lt;/span&gt;&lt;br&gt;        Most servers have standard development mode and then a production mode. For example, Microsoft’s Internet  Information Server (IIS) has a lockdown utility that minimizes the attack surface for your web site.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;3.Web Server Statistics&lt;/span&gt;&lt;br&gt;&lt;br&gt;How many visitors do you have? What pages do they frequent? What times do they log on? Utilize a web tool to assist you in not only collecting these statistics but also analyzing and correlating them. Web tools, such as Web Trends, will aid you in collecting and utilizing this knowledge to answer these questions about your site. Build a web page that not only follows appropriate standards, but also drives repeat visitations.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;4. Dynamic Technologies Styles&lt;/span&gt;&lt;br&gt;Are the pages within your site beginning to feel and act a little plain? Would you like more ways to format your documents and give users more interaction with them? If so, then your site could make use of languages such as Cascading Style Sheets and JavaScript.&lt;br&gt;&lt;br&gt;Cascading Style Sheets (CSS) technology gives you more control of page layout and the ability to control the design of multiple pages on your site from a single file. Additionally, CSS allows you to develop more sophisticat- ed layouts, more font schemes, and even more interactivity for your pages than was possible using just HTML.&lt;br&gt;&lt;br&gt;JavaScript techniques are needed to develop cutting-edge, interactive web sites. From opening windows to image-flipping and form validation, Javascript can help you build exciting, dynamic web pages.&lt;br&gt;&lt;br&gt;Integrating HTML, JavaScript, and Cascading Style Sheets techniques are collectively known as Dynamic HTML or DOM Scripting. Utilizing all three languages allow you to fully exploit the capabilities of Netscape Communicator, Firefox, and Microsoft Internet Explorer.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;5. Efficient Use of Appropriate Design Software&lt;/span&gt;&lt;br&gt;&lt;br&gt;In the past, many web developers eschewed graphical web editing packages and boasted of developing pages using a simple text editor (for example, Notepad). There is still a place for text editors, but efficient designers and developers both use appropriate design software, often manually tweaking the code. Such packages offer a what- you-see-is-what-you-get (WYSIWYG) environment for designers and code-writing tools for developers. These have&lt;br&gt;the software-complete repetitive steps, and let designers and developers focus on what they do best.&lt;br&gt;&lt;br&gt;    There are many options, but here are some of the major ones:&lt;br&gt;   &lt;span style="color: rgb(204, 102, 0);"&gt;Dreamweaver (Adobe, formerly Macromedia)&lt;/span&gt;&lt;br&gt;         • The most popular package&lt;br&gt;         • Offers both design (layout) and development (programming) support&lt;br&gt;    • Supports all major server-side scripting languages (ColdFusion, ASP, PHP, JSP), Javascript, XML, and&lt;br&gt;&lt;br&gt;    &lt;span style="color: rgb(255, 204, 51);"&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;ASP.NET (VB.NET and C#)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;        • Integrates well with Adobe Flash and Adobe Fireworks (both formerly Macromedia)&lt;br&gt;&lt;br&gt;    &lt;span style="color: rgb(204, 102, 0);"&gt;GoLive (Adobe)&lt;/span&gt;&lt;br&gt;        • Offers both design (layout) and development (programming) support&lt;br&gt;        • Supports several scripting and markup languages (PHP, JavaScript, SVG-t, SMIL)&lt;br&gt;        • Integrates well with long-standing Adobe products (Photoshop, Illustrator, InDesign)&lt;br&gt;&lt;br&gt;    &lt;span style="color: rgb(204, 102, 0);"&gt;FrontPage (Microsoft)&lt;/span&gt;&lt;br&gt;        • Offers both design (layout) and development (programming) support&lt;br&gt;        • Supports Microsoft JScript and ASP.NET (VB.NET and C#)&lt;br&gt;        • Integrates well with Visual Studio .NET and the Microsoft Office Suite&lt;br&gt;&lt;br&gt;    &lt;span style="color: rgb(204, 102, 0);"&gt;Microsoft Visual Studio (Microsoft)&lt;/span&gt;&lt;br&gt;        • Primarily provides development (programming) support&lt;br&gt;        • Integrated Design Environment (IDE) for developing in .NET environment&lt;br&gt;      • Supports .NET languages (primarily VB.NET and C#, but other extensions for other           &lt;br&gt;         languages provided by third parties)&lt;br&gt;&lt;span style="color: rgb(204, 102, 0);"&gt;&lt;br&gt;    Eclipse (open source)&lt;/span&gt;&lt;br&gt;        • Primarily provides development (programming) support&lt;br&gt;      • Integrated Design Environment (IDE) for developing in any environment, but mostly      &lt;br&gt;         ommonly used for  J2EE&lt;br&gt;        • Supports a multitude of programming languages (not language-specific).&lt;br&gt;&lt;br&gt;&lt;br style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;6. Standards and Browser Independence&lt;/span&gt;&lt;br&gt;&lt;br&gt;Web site development has come a long way. There are lots of new tools that will help with web-page design, not to mention web sites that offer suggestions and ideas for making your web site absolutely incredible. Probably the biggest movement is the increasing use of Cascading Style sheets to separate page content from formatting. We are also seeing more sophisticated use of JavaScript to make pages more dynamic and, therefore, more interesting. Along with this, the World Wide Web Consortium (W3C) has instituted an effort to standardize how browsers handle the display of web pages through the use of XHTML. It is hoped that among all of these initiatives, programming for the web will become less a matter of making sure our pages work on all browsers by testing against each one, and more one of creating web pages that are useful, accessible, and exciting.&lt;br&gt;&lt;br&gt;There are a vast number of resources on the web to help improve web sites. For information about the new XHTML standards, as well as help with Cascading Style Sheets and DOM Scripting (using JavaScript to make your web pages more dynamic), the W3C pages (http://www.w3.org) are invaluable. They include examples and tutorials, both of which are very well done. For some wonderful examples of Cascading Style Sheets, we recommend CSSZenGarden.com (http://www.csszengarden.com). The organization that runs this site supplies an html page with the required content. Designers are invited to create an external style sheet to format the page. New contributions are regularly posted.&lt;br&gt;&lt;br&gt;Another excellent resource is http://www.dynamicdrive.com. The Internet group on Google groups, formerly Deja, http://groups.google.com/groups is helpful as well. The good news is that you can post a question through Deja/Google groups. Within 24 hours you will usually get one-to-three technically correct answers. Other potential resources include:&lt;br&gt;&lt;br&gt;    &lt;b&gt;&lt;a href="http://www.developer.com/"&gt;http://www.developer.com&lt;/a&gt;&lt;/b&gt;&lt;br&gt;    This is a solid resource for most scripting/programming languages and is top-notch for Java.&lt;br&gt;    &lt;b&gt;&lt;a href="http://www.codehound.com/"&gt;http://www.codehound.com&lt;/a&gt;&lt;/b&gt;&lt;br&gt;    This is another language resource and is especially helpful with Microsoft .NET technologies.&lt;br&gt;    &lt;b&gt;&lt;a href="http://www.4GuysFromRolla.com"&gt;http://www.4GuysFromRolla.com&lt;/a&gt;&lt;/b&gt;&lt;br&gt;    This is the definitive place to get ASP or ASP.NET information.&lt;br&gt;    &lt;b&gt;&lt;a href="http://www.php.net"&gt;http://www.php.net&lt;/a&gt;&lt;/b&gt; A good resource for php.&lt;br&gt;    &lt;b&gt;&lt;a href="http://www.news.com"&gt;http://www.news.com&lt;/a&gt;&lt;/b&gt; CNET news.&lt;br&gt;    This site keeps you up-to-date on IT news.&lt;br&gt;    &lt;b&gt;&lt;a href="http://www.theinquirer.net"&gt;http://www.theinquirer.net&lt;/a&gt;&lt;/b&gt;&lt;br&gt;    This site provides a hardware outlook for six months to a year-and-a half.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;7. Database Access with Server-side Scripting Languages&lt;/span&gt;&lt;br&gt;&lt;br&gt;Static web pages are good place to start, but they quickly can become time intensive and not an efficient use of a designer or developer’s time. Database-driven web sites can refresh their own data, presenting up-to-the- minute data in way manual updates could never do. A dozen or so programmed pages can dynamically change so that they do the job of thousands of static pages. The benefits are clear: more timely information; fewer pages to maintain; and a freeing up of both designers and developers to enhance and further develop the functionality of a site, rather than its content.&lt;br&gt;&lt;br&gt;But by itself, HTML is not up to this kind of job; that’s not what it was designed to do. A server-side program-&lt;br&gt;ming language is needed. There are several options, but here are a few of the major products available:&lt;br&gt;   &lt;br&gt;    &lt;span style="color: rgb(153, 51, 153);"&gt;Active Server Pages (ASP) (Microsoft)&lt;/span&gt;&lt;br&gt;        • Written using VBScript (server-side JavaScript also possible, but rare)&lt;br&gt;        • Comes installed with Windows servers&lt;br&gt;        • Can run in UNIX/Linux environment using Sun ONE&lt;br&gt;        • Being somewhat overshadowed by ASP.NET&lt;br&gt;&lt;br&gt;    &lt;span style="color: rgb(204, 51, 204);"&gt;PHP Hypertext Preprocessor (PHP) (open source)&lt;/span&gt;&lt;br&gt;        • C-like programming language&lt;br&gt;        • No licensing cost (open-source)&lt;br&gt;        • Can run on UNIX/Linux servers or Windows-based servers&lt;br&gt;        • Close integration with MySQL database&lt;br&gt;&lt;br&gt;    &lt;span style="color: rgb(153, 51, 153);"&gt;ColdFusion (Adobe)&lt;/span&gt;&lt;br&gt;        • Written using tag-based language which integrates well with web-editing software (can         also be written using a scripting-like language)&lt;br&gt;        • Easy to learn, quick to create and maintain pages&lt;br&gt;        • Java-based architecture&lt;br&gt;        • Can run on UNIX/Linux server or Windows-based servers&lt;br&gt;&lt;br&gt;    &lt;span style="color: rgb(153, 51, 153);"&gt;Java 2 Enterprise Edition (J2EE) (Sun)&lt;/span&gt;&lt;br&gt;        • Written using cross-platform Java language&lt;br&gt;        • Most often deployed on UNIX/Linux, but can run on any system&lt;br&gt;        • Web page scripting using Java Server Pages (JSP)&lt;br&gt;        • Most appropriate for enterprise-wide installations involving multiple servers, databases, and possibly&lt;br&gt;        mainframe.&lt;br&gt;&lt;br&gt;    &lt;span style="color: rgb(153, 51, 153);"&gt;ASP.NET (Microsoft)&lt;/span&gt;&lt;br&gt;        • Written using VB.NET or C# (other languages possible)&lt;br&gt;        • Deployed in a Windows server environment&lt;br&gt;        • Requires use of Visual Studio .NET for development&lt;br&gt;        • Most appropriate for enterprise-wide installation with other Microsoft solutions&lt;br&gt;&lt;br&gt;    &lt;span style="color: rgb(153, 51, 153);"&gt;Perl (open source)&lt;/span&gt;&lt;br&gt;        • Not really a scripting language (doesn’t co-habitate with HTML)&lt;br&gt;        • Powerful, flexible language, good for dealing with patterns or manipulating data&lt;br&gt;        • Uses less modern Common Gateway Interface (CGI) model&lt;br&gt;        • More appropriate for communication between different applications on a server&lt;br&gt;   &lt;br&gt;    Any of these will work with any Relational Database Management System (RDBMS). Here are some common ones:&lt;br&gt;&lt;br&gt;   &lt;span style="color: rgb(51, 51, 0);"&gt; &lt;span style="color: rgb(102, 0, 0);"&gt;Oracle (Oracle Corporation)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;        • Fully featured, flexible, scalable&lt;br&gt;        • Works on UNIX/Linux or Windows servers&lt;br&gt;&lt;br&gt;   &lt;span style="color: rgb(102, 51, 0);"&gt; SQLServer (Microsoft)&lt;/span&gt;&lt;br&gt;        • Fully featured, flexible, scalable&lt;br&gt;        • Works on Windows servers&lt;br&gt;        • Integrates well with .NET&lt;br&gt;&lt;br&gt;    &lt;span style="color: rgb(102, 51, 0);"&gt;MySQL (open source)&lt;/span&gt;&lt;br&gt;        • Fully featured, flexible, scalable&lt;br&gt;        • No licensing costs (open-source)&lt;br&gt;        • Integrates especially well with PHP&lt;br&gt;&lt;br&gt;    &lt;span style="color: rgb(102, 51, 0);"&gt;Access (Microsoft)&lt;/span&gt;&lt;br&gt;        • Friendly user-interface for database management&lt;br&gt;        • Integrates well with MS Office suite&lt;br&gt;       • Not fully featured, limited capabilities, only appropriate for small-scale implementations.&lt;br&gt;&lt;br style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;8. Using Image Editors for Fast Loading Graphics&lt;/span&gt;&lt;br&gt;&lt;br&gt;Use Adobe Photoshop/Imageready or Fireworks to create the appropriate type of graphic file Typically GIF or&lt;br&gt;JPEG. There are other Image Editors available but Photoshop/Imageready and Fireworks are currently the most&lt;br&gt;popular and are considered the industry standard.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;9. Site Planning, Design, and Management&lt;/span&gt;&lt;br&gt;&lt;br&gt;“On time, within scope, and within budget” is the project management motto these days. This is also true for IT projects. IT managers can no longer live in the IT black hole. All IT requires fundamental project manage- ment best practices. Learn how to communicate with your staff. Clarify your project’s business goals to ensure that your project is aiding in the vision and meets your company’s vision. Learn how to follow through your project from inception to implementation. Apply your management skills to the concepts of web design. Apply a strategic focus within your organization to help save time and resources. Learn the benefits of various soft- ware packages to aid in efficiency.&lt;br&gt;&lt;br&gt;All of these project management practices can help your web site design projects run more smoothly and ensure your web site does what it’s suppose to do.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;10.Technological Flexibility&lt;/span&gt;&lt;br&gt;&lt;br&gt;If your web application is Data driven, it is imperative that sharing information with different applications and/or platforms be done in the most flexible way possible. Transforming Data from one format to the next, however, can be arduous and considerably time consuming. Fortunately, storing data in an extensible format, and working with it using XSL, has become relatively easy.&lt;br&gt;&lt;br&gt;&lt;br&gt;Extensible Markup Langauge (XML) allows developers to store raw data in a text file make up with an HTML-like syntax. With the use of Extensible Style Sheet Transformations (XSL - T), Formatting Objects (XSL - FO), and CSS developers now are able to transform this raw data into an application specific format. Languages com- monly used to augment an XML application are listed below:&lt;br&gt;&lt;br&gt;     • Extensible Markup Langauge (XML): Used to store raw data files&lt;br&gt;     • Document Type Definitions (DTDs): Used to validate XML documents&lt;br&gt;  • eXtensible Stylesheet Language (XSL) and Cascading Style Sheets (CSS): Used to transform the display of XML document into an application specific format. XML utilizes complexities like XPath, functions, modes, and dynamic modification of stylesheets commonly featured in many scripting and programming languages&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;To Summarize&lt;/span&gt;&lt;br&gt;     1. Make sure your web pages are accessible&lt;br&gt;     2. Take steps to minimize security risks&lt;br&gt;     3. Use web server statistics to determine how popular your site is&lt;br&gt;     4. Utilize dynamic technologies styles&lt;br&gt;     5. Be aware of web development software and how to use it efficiently to enhance your web site&lt;br&gt;     6. Use XHTML, DOM Scripting, and CSS to make your site browser and rule independent&lt;br&gt;     7. Choose an appropriate database to ensure it is more dynamic, and does the job of many static pages&lt;br&gt;     8. Use image editors for fast-loading graphics&lt;br&gt;     9. Learn to use planning and project management techniques to build great web sites with large teams&lt;br&gt;     10. Use new technologies like XML, DTDs, and XSL to help your application communicate with other plat-forms in the most flexible manner&lt;br&gt;&lt;br&gt;If you follow these simple rules, you too can create an excellent web site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-2509326260620730434?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/2509326260620730434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=2509326260620730434' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/2509326260620730434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/2509326260620730434'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2007/10/10-valuable-tips-for-creating-your-web.html' title='10 Valuable Tips for Creating Your Web Site'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-8135404477215206625</id><published>2007-10-24T03:48:00.000-07:00</published><updated>2007-10-24T03:49:23.826-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Understanding Domain Name System (DNS)</title><content type='html'>&lt;span style=""&gt;D&lt;/span&gt;omain Name System (DNS) makes it possible to refer to Internet Protocol (IP) based systems (hosts) by human-friendly names (domain names). &lt;span style="font-weight: bold;"&gt;Name Resolution&lt;/span&gt; is the act of determining the IP address (or addresses) of a given host name.&lt;br&gt;&lt;span class="fullpost"&gt;&lt;br&gt;&lt;span style="color: rgb(0, 0, 153); font-size: 130%;"&gt;Benefits of DNS&lt;/span&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;&lt;a id="KonaLink0" target="_top" class="kLink" style="text-decoration: underline ! important; position: static;" href="dns.html"&gt;&lt;span class="kLink" style=""&gt;Domain &lt;/span&gt;&lt;span class="kLink" style=""&gt;names&lt;/span&gt;&lt;/a&gt; can be logical and easily remembered.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Should the IP address for a host change, the domain name can still resolve transparently to the user or application.&lt;br&gt;&lt;/li&gt;&lt;/ul&gt; &lt;span style="color: rgb(0, 0, 153); font-size: 130%;"&gt;The structure of Domain Names&lt;/span&gt;&lt;br&gt;&lt;ul&gt;&lt;li&gt;Domain names are separated by dots, with the topmost element on the right. Eg:     &lt;span style="font-family: courier new;"&gt;www.yahoo.com&lt;/span&gt; . IP addresses have topmost element on the left.&lt;/li&gt;&lt;li&gt;Each element may be up to 63 characters long. The entire name may be atmost 255 characters long.&lt;/li&gt;&lt;li&gt;The right most element in a domain name is called the &lt;span style="font-weight: bold;"&gt;T&lt;/span&gt;op-&lt;span style="font-weight: bold;"&gt;L&lt;/span&gt;evel &lt;span style="font-weight: bold;"&gt;D&lt;/span&gt;omain (&lt;span style="font-weight: bold;"&gt;TLD&lt;/span&gt;). Referring the above example (&lt;span style="font-family: courier new;"&gt;www.yahoo.com&lt;/span&gt;), TLD is  &lt;span style="font-family: courier new;"&gt;'com'&lt;/span&gt;.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;If a domain name is not shortened, it is called the &lt;span style="font-weight: bold;"&gt;F&lt;/span&gt;ully &lt;span style="font-weight: bold;"&gt;Q&lt;/span&gt;ualified &lt;span style="font-weight: bold;"&gt;D&lt;/span&gt;omain     &lt;span style="font-weight: bold;"&gt;N&lt;/span&gt;ame (&lt;span style="font-weight: bold;"&gt;FQDN&lt;/span&gt;). For example, &lt;span style="font-family: courier new;"&gt;briefcase.yahoo.com&lt;/span&gt; can be specified by a machine in the &lt;span style="font-family: courier new;"&gt;yahoo.com&lt;/span&gt; domain as either &lt;span style="font-family: courier new;"&gt;briefcase.yahoo.com&lt;/span&gt; (FQDN) or as &lt;span style="font-family: courier new;"&gt;briefcase&lt;/span&gt;.&lt;br&gt;&lt;/li&gt;&lt;/ul&gt; &lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Host names map to IP addresses in a many-to-many relationship&lt;/span&gt;. A host name may have one or more IP addresses. Conversely, an IP address may have multiple host names associated with it.&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;Hosts that are designed to perform email routing are known as mail exchangers. These machines should have special purpose records in DNS called &lt;span style="font-weight: bold;"&gt;M&lt;/span&gt;ail e&lt;span style="font-weight: bold;"&gt;X&lt;/span&gt;changer (&lt;span style="font-weight: bold;"&gt;MX&lt;/span&gt;) records. When a SMTP server or mail server, needs to send mail to a remote domain, it does a &lt;a id="KonaLink1" target="_top" class="kLink" style="text-decoration: underline ! important; position: static;" href="dns.html"&gt;&lt;span class="kLink" style=""&gt;DNS &lt;/span&gt;&lt;span class="kLink" style=""&gt;lookup&lt;/span&gt;&lt;/a&gt; for the Mail Exchanger (MX) of that remote domain. A domain can and should have multiple mail exchangers. Mail that cannot be sent to one mail exchanger, can instead be delivered to an alternative &lt;a id="KonaLink2" target="_top" class="kLink" style="text-decoration: underline ! important; position: static;" href="dns.html"&gt;&lt;span class="kLink" style="color: rgb(68, 157, 52) ! important; font-weight: 400; position: static; font-family: Georgia,Serif;"&gt;server&lt;/span&gt;&lt;/a&gt;, thus providing failsafe redundancy.&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;span style="color: rgb(0, 0, 153); font-size: 130%;"&gt;Different types of Domain Name Servers&lt;/span&gt;&lt;br&gt;&lt;ol&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Root Name server&lt;/span&gt; - Each &lt;a id="KonaLink3" target="_top" class="kLink" style="text-decoration: underline ! important; position: static;" href="dns.html"&gt;&lt;span class="kLink" style=""&gt;top &lt;/span&gt;&lt;span class="kLink" style=""&gt;level &lt;/span&gt;&lt;span class="kLink" style=""&gt;domain&lt;/span&gt;&lt;/a&gt; (such as in,edu,com etc) has one or more root name servers which are responsible for determining where the individual records are held. These servers are fairly static and every machine on the internet has the capability of reaching any of them. A root name server is allocated like just one to three per country. For example, India has only 2 root name servers.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Authoritative Name Servers&lt;/span&gt; - These are the servers that the Root name servers sent queries to. These servers hold the actual information on an individual domain. This information is stored in a file called a zone file. Zone files are updated versions of the original HOSTS.TXT file.&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Resolving Name Server&lt;/span&gt; - These are the servers that do most of the work when you are trying to get to a machine with a certain host name. Besides being responsible for looking up data, they also temporarily store the data for host names that they have searched out in a cache, which allows them to speed up the resolution for host names that are frequently visited.&lt;br&gt;&lt;/li&gt;&lt;/ol&gt; &lt;span style="color: rgb(0, 0, 153); font-size: 130%;"&gt;Zone&lt;/span&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;A zone keeps the information about the domain &lt;a id="KonaLink4" target="_top" class="kLink" style="text-decoration: underline ! important; position: static;" href="dns.html"&gt;&lt;span class="kLink" style=""&gt;database&lt;/span&gt;&lt;/a&gt;. It does this by maintaining two types of files:&lt;br&gt;&lt;/div&gt; &lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Zone File&lt;/span&gt; - It is used to map host names to address, to identify the mail servers, and to provide other domain information.&lt;br&gt;&lt;/div&gt; &lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Reverse Zone File&lt;/span&gt; - This file is responsible for mapping IP address to host names, which is exactly the opposite of what the zone file does.&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;Note:&lt;/span&gt; The zone file and the reverse zone file has to be maintained by the user.&lt;br&gt;&lt;br&gt;&lt;span style="color: rgb(0, 0, 153); font-size: 130%;"&gt;Name Server Hierarchy&lt;/span&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Master Name Server&lt;/span&gt; - Also called primary server. This contains the master copy of data for a zone.&lt;br&gt;&lt;/div&gt; &lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Slave Name Server&lt;/span&gt; - Also known as secondary server. This provides a backup to the master name server. All slave servers maintain synchronization with their master name server.&lt;br&gt;&lt;/div&gt; A zone may have multiple slave servers. But there will be only one master name server per zone.&lt;br&gt;&lt;br&gt;               &lt;a name="112632223045511406"&gt;&lt;/a&gt;            &lt;h3 class="post-title"&gt;                Apache : Name-based Vs IP Based Virtual Hosting              &lt;/h3&gt;                          &lt;div style="text-align: justify;"&gt;&lt;span style="font-size: 180%;"&gt;O&lt;/span&gt;ften when, you attend interviews for network administration related jobs , the one question you may encounter while discussing about &lt;a id="KonaLink0" target="_top" class="kLink" style="text-decoration: underline ! important; position: static;" href="apache-name-based-vs-ip-based-virtual.html#"&gt;&lt;span class="kLink" style=""&gt;web &lt;/span&gt;&lt;span class="kLink" style=""&gt;servers&lt;/span&gt;&lt;/a&gt; is the difference between name-based and IP based virtual hosting. Here I will explain the difference between the two.&lt;br&gt;&lt;/div&gt; &lt;span class="fullpost"&gt;&lt;div style="text-align: justify;"&gt;&lt;br&gt;In &lt;span style="font-weight: bold;"&gt;IP-based virtual hosting&lt;/span&gt;, you are running more than one web site on the same server machine, but &lt;span style="font-weight: bold;"&gt;each web site has its own IP address&lt;/span&gt;. In order to do this, you have to first tell your operating system about the multiple IP addresses. See here &lt;b&gt;configuring multiple IP addresses on a single NIC&lt;/b&gt; . You also need to put each IP in your &lt;b&gt;DNS&lt;/b&gt;, so that it will resolve to the names that you want to give those addresses .&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;In &lt;span style="font-weight: bold;"&gt;Name-based virtual hosting&lt;/span&gt;, you &lt;span style="font-weight: bold;"&gt;host multiple websites on the same IP address&lt;/span&gt;. But for this to succeed, you have to put more than one DNS record for your IP address in the DNS &lt;a id="KonaLink1" target="_top" class="kLink" style="text-decoration: underline ! important; position: static;" href="apache-name-based-vs-ip-based-virtual.html#"&gt;&lt;span class="kLink" style="color: rgb(68, 157, 52) ! important; font-weight: 400; position: static; font-family: Georgia,Serif;"&gt;database&lt;/span&gt;&lt;/a&gt;. This is done using &lt;span style="font-family: courier new;"&gt;CNAME&lt;/span&gt; tag in BIND. You can have as many &lt;span style="font-family: courier new;"&gt;CNAME&lt;/span&gt;(s) as you like pointing to a particular machine. Of course, you also have to uncomment the &lt;span style="font-family: courier new;"&gt;NameVirtualHost&lt;/span&gt; section in &lt;span style="font-family: courier new;"&gt;httpd.conf&lt;/span&gt; file and point it to the IP address of your machine.&lt;br&gt;&lt;/div&gt; &lt;pre&gt;&lt;br&gt;#FILE: httpd.conf&lt;br&gt;...&lt;br&gt;&lt;span style="font-weight: bold;"&gt;NameVirtualHost 192.168.0.1&lt;/span&gt;&lt;br&gt;...&lt;br&gt;&lt;/pre&gt;&lt;/span&gt;                      &lt;a name="111655610535221729"&gt;&lt;/a&gt;            &lt;h3 class="post-title"&gt;                &lt;b&gt;Setting up multiple IP addresses on a single NIC&lt;/b&gt;              &lt;/h3&gt;                          &lt;div style="text-align: justify;"&gt;&lt;span style="font-size: 180%;"&gt;I&lt;/span&gt;n linux, you can bind multiple IP addresses on a single NIC. This is usually done in case you are using your linux machine as a webserver and is hosting multiple &lt;a id="KonaLink0" target="_top" class="kLink" style="text-decoration: underline ! important; position: static;" href="http://linuxhelp.blogspot.com/2005/05/setting-up-multiple-ip-addresses-on.html#"&gt;&lt;span class="kLink" style="color: rgb(68, 157, 52) ! important; font-weight: 400; position: static; font-family: Georgia,Serif;"&gt;domains&lt;/span&gt;&lt;/a&gt;  and you want to bind each domain to a unique IP address. This is  how it is done.&lt;br&gt;&lt;/div&gt; &lt;div style="text-align: justify;"&gt;Let us assume that you already have a NIC which is bound with a static IP address. Then you will have a file called &lt;span style="font-weight: bold; font-family: courier new;"&gt;/etc/sysconfig/network-scripts/ifcfg-eth0&lt;/span&gt; .My &lt;span style="font-family: courier new;"&gt;ifcfg-eth0&lt;/span&gt; file has the following entries:&lt;br&gt;&lt;/div&gt; &lt;blockquote style="font-family: courier new;"&gt;# File: ifcfg-eth0&lt;br&gt;DEVICE=eth0&lt;br&gt;ONBOOT=yes&lt;br&gt;BOOTPROTO=static&lt;br&gt;IPADDR=192.168.0.1&lt;br&gt;NETMASK=255.255.255.0&lt;br&gt;BROADCAST=192.168.0.255&lt;br&gt;NETWORK=192.168.0.0&lt;br&gt;HWADDR=00:80:48:34:C2:84&lt;br&gt;&lt;/blockquote&gt;Now to bind another IP address to the same NIC, I create a copy of the above file &lt;span style="font-family: courier new;"&gt;ifcfg-eth0&lt;/span&gt; and name it as &lt;span style="font-family: courier new;"&gt;ifcfg-eth0:1&lt;/span&gt;&lt;br&gt;&lt;blockquote style="font-family: courier new;"&gt;# &lt;span style="font-weight: bold;"&gt;cd /etc/sysconfig/networking-scripts&lt;/span&gt;&lt;br&gt;# &lt;span style="font-weight: bold;"&gt;cp ifcfg-eth0  ifcfg-eth0:1&lt;/span&gt;&lt;/blockquote&gt;Now just change the values of the DEVICE and IPADDR in the file as follows:&lt;br&gt;&lt;blockquote style="font-family: courier new;"&gt;# File: &lt;span style="color: rgb(204, 0, 0);"&gt;ifcfg-eth0:1&lt;/span&gt;&lt;br&gt;DEVICE=&lt;span style="color: rgb(204, 0, 0);"&gt;eth0:1&lt;/span&gt;&lt;br&gt;ONBOOT=yes&lt;br&gt;BOOTPROTO=static&lt;br&gt;IPADDR=&lt;span style="color: rgb(204, 0, 0);"&gt;192.168.0.5&lt;/span&gt;&lt;br&gt;NETMASK=255.255.255.0&lt;br&gt;BROADCAST=192.168.0.255&lt;br&gt;NETWORK=192.168.0.0&lt;br&gt;HWADDR=00:80:48:34:C2:84&lt;br&gt;&lt;/blockquote&gt;And lastly, restart the networking service. If you are using RedHat, then it is as simple as :&lt;br&gt;# &lt;span style="font-weight: bold;"&gt;service network restart&lt;br&gt;&lt;br&gt;&lt;/span&gt;                      &lt;a name="110544435232701068"&gt;&lt;/a&gt;            &lt;h3 class="post-title"&gt;                &lt;b&gt;How to install a Network card in linux&lt;/b&gt;              &lt;/h3&gt;                          &lt;div style="text-align: justify;"&gt;There are different ways of installing a network card in linux - and that too depending on the linux distribution that you are using. I will explain each one of these methods here.&lt;br&gt;&lt;/div&gt; &lt;span style="font-weight: bold;"&gt;1) The Manual method&lt;/span&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;First open the computer case and insert the network card into an empty PCI slot. Then boot up your machine to load linux. In linux login as root and then navigate to the directory &lt;span style="font-weight: bold; font-family: courier new;"&gt;/lib/modules/kernel_version_number/net/&lt;/span&gt; . Here you will find the modules supported by your system. Assuming that you have a 3Com ethernet card, in which case, the module name is &lt;span style="font-weight: bold; font-family: courier new;"&gt;3c59x&lt;/span&gt; , you have to add this in the &lt;span style="font-weight: bold; font-family: courier new;"&gt;/etc/modules.conf&lt;/span&gt; file to let the machine detect the card each time the machine boots.&lt;br&gt;&lt;/div&gt; &lt;blockquote&gt;#File: /etc/modules.conf&lt;br&gt;&lt;span style="font-family: courier new;"&gt;alias eth0 3c59x&lt;/span&gt;&lt;/blockquote&gt; &lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Note:&lt;/span&gt; If you have only one network card, it is known by the name &lt;span style="font-weight: bold; font-family: courier new;"&gt;eth0&lt;/span&gt;, the succeeding network cards in your &lt;a id="KonaLink0" target="_top" class="kLink" style="text-decoration: underline ! important; position: static;" href="http://linuxhelp.blogspot.com/2005/01/how-to-install-network-card-in-linux.html#"&gt;&lt;span class="kLink" style="color: rgb(68, 157, 52) ! important; font-weight: 400; position: static; font-family: Georgia,Serif;"&gt;computer&lt;/span&gt;&lt;/a&gt; go by the name &lt;span style="font-weight: bold; font-family: courier new;"&gt;eth1&lt;/span&gt;, &lt;span style="font-weight: bold; font-family: courier new;"&gt;eth2&lt;/span&gt; ... and so on.&lt;br&gt;&lt;/div&gt; Now you have to load the module into the kernel.&lt;br&gt;&lt;blockquote face="courier new"&gt;root# &lt;span style="font-weight: bold;"&gt;/sbin/insmod -v 3c59x&lt;/span&gt;&lt;/blockquote&gt; &lt;div style="text-align: justify;"&gt;Next configure an &lt;a id="KonaLink1" target="_top" class="kLink" style="text-decoration: underline ! important; position: static;" href="http://linuxhelp.blogspot.com/2005/01/how-to-install-network-card-in-linux.html#"&gt;&lt;span class="kLink" style=""&gt;IP &lt;/span&gt;&lt;span class="kLink" style=""&gt;address&lt;/span&gt;&lt;/a&gt; for the network card using ifconfig or netconfig or any other method if your machine gets its IP address from a DHCP server. Eg:&lt;br&gt;&lt;/div&gt; &lt;blockquote style="font-family: courier new;"&gt;root# &lt;span style="font-weight: bold;"&gt;ifconfig eth0 192.168.1.5 netmask 255.255.255.0 broadcast 192.168.1.255&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;2) The Easy way&lt;/span&gt;&lt;br&gt;RedHat/Fedora distributions of linux ships with Kudzu a device detection program which runs during systems initialization (&lt;span style="font-weight: bold; font-family: courier new;"&gt;/etc/rc.d/init.d/kudzu&lt;/span&gt;). This can detect a newly installed NIC and load the appropriate driver. Then use the program &lt;span style="font-weight: bold; font-family: courier new;"&gt;/usr/sbin/netconfig&lt;/span&gt; to configure the IP address and network settings. The configuration will be stored so that it will be utilized upon system boot.&lt;br&gt;&lt;span style="font-weight: bold;"&gt;&lt;br&gt;&lt;/span&gt;&lt;br&gt;&lt;h3 class="post-title"&gt; How to Assign an IP address&lt;/h3&gt;  &lt;div style="text-align: justify;"&gt;&lt;a id="KonaLink0" target="_top" class="kLink" style="text-decoration: underline ! important; position: static;" href="http://linuxhelp.blogspot.com/2005/01/how-to-assign-ip-address.html#"&gt;&lt;span class="kLink" style="color: rgb(68, 157, 52) ! important; font-weight: 400; position: static; font-family: Georgia,Serif;"&gt;Computers&lt;/span&gt;&lt;/a&gt; may be assigned a static IP address or assigned one dynamically (via DHCP). Here I will explain the steps needed to assign an IP address to your NIC.&lt;br&gt;&lt;/div&gt; &lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;Choose one of the following methods:&lt;br&gt;&lt;br&gt;&lt;b&gt;  =&amp;gt; Dynamic Host Configuration Protocol&lt;/b&gt; (&lt;b&gt;DHCP&lt;/b&gt;) is a protocol used by networked computers (&lt;i&gt;clients&lt;/i&gt;) to obtain IP addresses and other parameters such as the &lt;a href="http://en.wikipedia.org/wiki/Default_gateway" title="Default gateway"&gt;default gateway&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Subnet_mask" title="Subnet mask"&gt;subnet mask&lt;/a&gt;, and IP addresses of &lt;a href="http://en.wikipedia.org/wiki/Domain_name_system" title="Domain name system"&gt;DNS&lt;/a&gt; servers from a DHCP server.&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Command line : &lt;/span&gt;&lt;br&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;&lt;blockquote&gt;/sbin/ifconfig eth0 192.168.1.3 netmask 255.255.255.0 broadcast 192.168.1.255&lt;/blockquote&gt;&lt;/span&gt; &lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;GUI tool&lt;/span&gt; : You can use the GUI tool &lt;span style="font-weight: bold; font-family: courier new;"&gt;/usr/bin/neat&lt;/span&gt; - Gnome GUI network administration tool. It handles all interfaces and configures for both static assignment as well as dynamic assignment using DHCP.&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-weight: bold;"&gt;Console tool&lt;/span&gt; : &lt;span style="font-weight: bold; font-family: courier new;"&gt;/usr/sbin/netconfig&lt;/span&gt; (Only seems to work for the first network interface eth0 but not eth1,...)&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;div style="text-align: justify;"&gt;The &lt;span style="font-weight: bold; font-family: courier new;"&gt;ifconfig&lt;/span&gt; command &lt;span style="color: rgb(153, 0, 0);"&gt;does NOT&lt;/span&gt; store this information permanently. Upon reboot this information is lost. (Manually add the commands to the end of the file &lt;span style="font-weight: bold; font-family: courier new;"&gt;/etc/rc.d/rc.local&lt;/span&gt; to execute them upon boot.) The command &lt;span style="font-family: courier new;"&gt;netconfig&lt;/span&gt; and &lt;span style="font-family: courier new;"&gt;/usr/bin/neat&lt;/span&gt; make permanent changes to system network configuration files located in &lt;span style="font-weight: bold; font-family: courier new;"&gt;/etc/sysconfig/network-scripts/ &lt;/span&gt;, so that this information is retained.&lt;br&gt;&lt;/div&gt; &lt;div style="text-align: justify;"&gt;The Red Hat configuration tools store the configuration information in the file &lt;span style="font-weight: bold; font-family: courier new;"&gt;/etc/sysconfig/network&lt;/span&gt;. They will also allow one to configure routing information.&lt;br&gt;&lt;/div&gt; &lt;blockquote&gt;# File: &lt;span style="font-family: courier new;"&gt;/etc/sysconfig/network&lt;/span&gt;&lt;br&gt;# Static IP address Configuration:&lt;br&gt;&lt;span style="color: rgb(153, 0, 0); font-family: courier new;"&gt;NETWORKING=yes&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(153, 0, 0); font-family: courier new;"&gt;HOSTNAME=my-hostname&lt;/span&gt;  # Hostname is defined here and by command hostname&lt;br&gt;&lt;span style="color: rgb(153, 0, 0); font-family: courier new;"&gt;FORWARD_IPV4=true&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt; &lt;/span&gt;        # True for NAT firewall gateways and linux routers. False for&lt;br&gt;                                               # everyone else - desktops and &lt;a id="KonaLink1" target="_top" class="kLink" style="text-decoration: underline ! important; position: static;" href="http://linuxhelp.blogspot.com/2005/01/how-to-assign-ip-address.html#"&gt;&lt;span class="kLink" style="color: rgb(68, 157, 52) ! important; font-weight: 400; position: static; font-family: Georgia,Serif;"&gt;servers&lt;/span&gt;&lt;/a&gt;.&lt;br&gt;&lt;span style="color: rgb(153, 0, 0); font-family: courier new;"&gt;GATEWAY="XXX.XXX.XXX.YYY"&lt;/span&gt;   #  Used if your network is connected to another&lt;br&gt;                                                 #  network or the internet. &lt;/blockquote&gt;&lt;br&gt;#  Gateway not defined here for DHCP.&lt;br&gt;&lt;br&gt;&lt;blockquote&gt;#  Or for DHCP configuration: in the same file  /etc/sysconfig/network&lt;br&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;NETWORKING=yes&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;HOSTNAME=my-hostname &lt;/span&gt;     #  Hostname is defined here and by command hostname&lt;br&gt;                                              # Gateway is assigned by DHCP.&lt;/blockquote&gt;&lt;blockquote&gt;# File: &lt;span style="font-family: courier new;"&gt;/etc/sysconfig/network-scripts/ifcfg-eth0&lt;/span&gt;&lt;br&gt;# Static IP address configuration:&lt;br&gt;&lt;span style="color: rgb(153, 0, 0); font-family: courier new;"&gt;DEVICE=eth0&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(153, 0, 0); font-family: courier new;"&gt;BOOTPROTO=static&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(153, 0, 0); font-family: courier new;"&gt;BROADCAST=XXX.XXX.XXX.255&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(153, 0, 0); font-family: courier new;"&gt;IPADDR=XXX.XXX.XXX.XXX&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(153, 0, 0); font-family: courier new;"&gt;NETMASK=255.255.255.0&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(153, 0, 0); font-family: courier new;"&gt;NETWORK=XXX.XXX.XXX.0&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(153, 0, 0); font-family: courier new;"&gt;ONBOOT=yes&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;# OR for DHCP configuration:&lt;br&gt;&lt;span style="color: rgb(153, 0, 0); font-family: courier new;"&gt;DEVICE=eth0&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(153, 0, 0); font-family: courier new;"&gt;ONBOOT=yes&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(153, 0, 0); font-family: courier new;"&gt;BOOTPROTO=dhcp&lt;/span&gt;&lt;/blockquote&gt; &lt;div style="text-align: justify;"&gt;Used by script &lt;span style="font-weight: bold; font-family: courier new;"&gt;/etc/sysconfig/network-scripts/ifup&lt;/span&gt; to bring the various network interfaces on-line.&lt;br&gt;&lt;/div&gt; To disable DHCP change &lt;span style="color: rgb(153, 0, 0); font-family: courier new;"&gt;BOOTPROTO=dhcp&lt;/span&gt; to &lt;span style="color: rgb(153, 0, 0); font-family: courier new;"&gt;BOOTPROTO=none &lt;/span&gt;&lt;br&gt;In order for updated information in any of these files to take effect, one must issue the command:&lt;br&gt;&lt;span style="font-family: courier new;"&gt;root# &lt;span style="font-weight: bold;"&gt;service network restart&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-8135404477215206625?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/8135404477215206625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=8135404477215206625' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/8135404477215206625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/8135404477215206625'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2007/10/understanding-domain-name-system-dns.html' title='Understanding Domain Name System (DNS)'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-8946607558230348334</id><published>2007-10-24T03:47:00.000-07:00</published><updated>2007-10-24T03:48:31.565-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Open Source Law</title><content type='html'>&lt;p&gt;Columbia University Law Professor Eben Moglen today announced the formation of the Software Freedom Law Center, whose mission is to provide pro-bono legal services globally to eligible non-profit open source software projects and developers.&lt;/p&gt;  &lt;p&gt;"As the popularity and use of free and open source software increases and proprietary software development models are threatened, providing necessary legal services to open source developers is becoming increasingly important to prevent liability and other legal issues from interfering with its success," Moglen said. "The Law Center is being established to provide legal services to protect the legitimate rights and interests of free and open source software projects and developers, who often do not have the means to secure the legal services they need."&lt;/p&gt;  &lt;p&gt;OSDL has raised more than $4 million for a newly-established IP fund that will provide the seed money for the new and independent legal center based in New York. Last year, OSDL announced a separate $10 million Linux Legal Defense Fund to provide legal support for Linus Torvalds and end user companies subjected to Linux-related litigation by the SCO Group. The new Law Center announced today will be an independent organization not affiliated with OSDL.&lt;/p&gt;  &lt;p&gt;"OSDL is committed to supporting initiatives such as the Law Center to help protect the legitimate development and use of Linux and open source software," said Stuart Cohen, CEO of OSDL. "We encourage other companies and organizations like OSDL who are dedicated to securing the future of open source software to contribute to the Law Center and participate in its good works."&lt;/p&gt;  &lt;p&gt;Overseeing the Law Center will be a distinguished board of directors comprised of Moglen; Diane Peters, General Counsel at OSDL; Daniel Weitzner, Principal Research Scientist at MIT's Computer Science and Artificial Intelligence Laboratory; and Lawrence Lessig, Stanford Law Professor and author.&lt;/p&gt;  &lt;p&gt;"Both free and open source software face many emerging legal threats," said Lessig. "We should be skeptical of legal mechanisms that enable those most threatened by the success of open source and free software to resist its advance. The Law Center will serve as important support for the free and open source communities and for those that benefit from free and open source software."&lt;/p&gt;  &lt;p&gt;Moglen, regarded as one of the world's leading experts on copyright law as applied to software, will run the new Law Center from its headquarters in New York City. The Law Center will initially have two full-time intellectual property attorneys on staff and expects to expand to four attorneys later this year. Initial clients for the Law Center include the Free Software Foundation and the Samba Project.&lt;/p&gt;  &lt;p&gt;"Free software projects often face legal issues that need expert advice, but it can sometimes be difficult or prohibitively costly to obtain that advice through traditional legal channels," said Andrew Tridgell, head of the Samba project. "We are delighted that the Free Software Law Center is being setup under Eben Mogeln's excellent guidance. I think this is an important milestone in the maturity of the free software community."&lt;/p&gt;  &lt;p&gt;Legal services provided to eligible individuals and projects include asset stewardship, licensing, license defense and litigation support, and legal consulting and lawyer training. The Law Center will be software license neutral and intends to participate directly in work currently underway around revisions to the GNU General Public License (GPL) with the Free Software Foundation. The Law Center will also work on issues around the proliferation of open source licenses.&lt;/p&gt;  &lt;p&gt;The Law Centeris dedicated to assisting non-profit open source developers and projects who do not otherwise have access to necessary legal services.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.osdl.org/"&gt;&lt;/a&gt;OSDL is dedicated to accelerating the growth and adoption of Linux in the enterprise.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-8946607558230348334?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/8946607558230348334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=8946607558230348334' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/8946607558230348334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/8946607558230348334'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2007/10/open-source-law.html' title='Open Source Law'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-2265754704046623905</id><published>2007-10-24T03:46:00.002-07:00</published><updated>2007-10-24T03:47:33.074-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Ajax Tutorials for Beginners</title><content type='html'>This is the first in a three-part series of the top Ajax tutorials from around the web. Part one is for beginners, how to build your first ajax application, and understanding how it works. Part two will be for novices who have experience with ajax, but would like to take their skills to the next level. And part three will be for experts who want to... build their own gmail application? Why not. So we'll get started from the very beginning.&lt;br&gt;&lt;br&gt;What is Ajax? Ajax stands for Asynchronous JavaScript and XML. In a nutshell, it is the use of the nonstandard XMLHttpRequest() object to communicate with server-side scripts. It can send as well as receive information in a variety of formats, including XML, HTML, and even text files. Ajax’s most appealing characteristic, however, is its “asynchronous” nature, which means it can do all of this without having to refresh the page. This allows you to update portions of a page based upon user events. You can: Make requests to the server without reloading the page and Parse and work with XML documents.&lt;br&gt;&lt;br&gt;Our first tutorial is from the &lt;a href="http://developer.mozilla.org/en/docs/AJAX:Getting_Started#Step_1_.E2.80.93_say_.22Please.21.22_or_How_to_Make_an_HTTP_Request" target="_blank"&gt;Mozilla development page.&lt;/a&gt; This is the number one example because it provides you will all the information you &lt;i&gt;need&lt;/i&gt; to make a basic "hello world" ajax app. By the end of this article you will be able to make simple ajax application on your own.&lt;br&gt;&lt;br&gt;Our next tutorial is from &lt;a href="http://www.w3schools.com/ajax/ajax_example.asp" target="_blank"&gt;W3schools&lt;/a&gt;. Here we take what you learned in the previous article and we incorporate it into forms. So you can put together a log-in or registration form, and check for valid credentials without navigating away from the current page. Very convenient. The overall trick is not to put your input variables into a form tag. and your submit button should contain an onSubmit="javascript:function()"&amp;gt; so instead of directing the user to a new page, the javascript call will check the credentials in real time.&lt;br&gt;&lt;br&gt;Now let's migrate into XML a little bit. &lt;a href="http://www.webreference.com/programming/javascript/jf/column12/index.html" target="_blank"&gt;Web Reference&lt;/a&gt; has a great tutorial on the basics of using XML with Ajax. The method they use for parsing XML files is very similar to the method's used in the above two examples, so make sure you totally understand how XMLHttpRequest works.&lt;br&gt;&lt;br&gt;&lt;code&gt;function ajaxRead(file){&lt;br&gt;var xmlObj = null;&lt;br&gt;if(window.XMLHttpRequest){&lt;br&gt;   xmlObj = new XMLHttpRequest();&lt;br&gt;} else if(window.ActiveXObject){&lt;br&gt;   xmlObj = new ActiveXObject("Microsoft.XMLHTTP");&lt;br&gt;} else {&lt;br&gt;   return;&lt;br&gt;}&lt;br&gt;xmlObj.onreadystatechange = function(){&lt;br&gt; if(xmlObj.readyState == 4){&lt;br&gt;    updateObj('xmlObj', xmlObj.responseXML.getElementsByTagName('data')[0].firstChild.data);&lt;br&gt;  }&lt;br&gt; }&lt;br&gt; xmlObj.open ('GET', file, true);&lt;br&gt; xmlObj.send ('');&lt;br&gt;}&lt;br&gt;function updateObj(obj, data){&lt;br&gt;document.getElementById(obj).firstChild.data = data;&lt;br&gt;}&lt;/code&gt;&lt;br&gt;&lt;br&gt;Although javascript is required to complete the Ajax request, you don't have to know &lt;i&gt;a lot&lt;/i&gt; of javascript to make good use of Ajax. For example you can make a form, and onSubmit use javascript (document.getElementById()) to get the content of the input id's, and send them to a php file. Let PHP parse all the data, and return the result to javascript to display. Very minimal javascript is required, but if you know javascript is can be extremely helpful when you get into novice and advanced tutorials. &lt;a href="http://www.developer.com/lang/jscript/article.php/3592016" target="_blank"&gt;Developer.com&lt;/a&gt; has a great article called "Ajax from Scratch" that shows different methods than the above ones, for making ajax requests. They also have a lot of more advanced javascript helping them do this, so if you are a fan of (or at least understand) javascript, check it out.&lt;br&gt;&lt;br&gt;&lt;code&gt;1 function Mutex( cmdObject, methodName ) {&lt;br&gt;2   // define static variable and method&lt;br&gt;3   if (!Mutex.Wait) Mutex.Wait = new Map();&lt;br&gt;4   Mutex.SLICE = function( cmdID, startID ) {&lt;br&gt;5     Mutex.Wait.get(cmdID).attempt( Mutex.Wait.get(startID) );&lt;br&gt;6   }&lt;br&gt;7   // define instance method&lt;br&gt;8   this.attempt = function( start ) {&lt;br&gt;9     for (var j=start; j; j=Mutex.Wait.next(j.c.id)) {&lt;br&gt;10       if (j.enter || (j.number (j.number &amp;lt; number ="=" number =" 0;" c        =" cmdObject;" methodid =" methodName;" enter    =" true;" number   =" (new" enter    =" false;"&amp;gt;&lt;br&gt;&lt;/code&gt;&lt;br&gt;&lt;br&gt;Now the question is, what are you going to use for the back end of the ajax requests? The two most popular methods are ASP.NET and PHP. Personally I prefer PHP whether I'm using ajax or not, but that doesn't mean asp.net doesn't have it's advantages. &lt;a href="http://www.ajaxprojects.com/ajax/tutorialdetails.php?itemid=12" target="_blank"&gt;Ajax Projects&lt;/a&gt; has a nice "hello world" example using ASP.NET with your new ajax requests. Before moving on to the PHP back end of things, you should also check out "Ajax and PHP without XmlHttpRequest object" from &lt;a href="http://www.phpit.net/article/ajax-php-without-xmlhttprequest/" target="_blank"&gt;PHPit&lt;/a&gt;, it outlines a nice alternative to using the traditional ajax method.&lt;br&gt;&lt;br&gt;&lt;code&gt;url = document.location.href;&lt;br&gt;xend = url.lastIndexOf("/") + 1;&lt;br&gt;var base_url = url.substring(0, xend);&lt;br&gt;&lt;br&gt;function ajax_do (url) {&lt;br&gt;     if (url.substring(0, 4) != 'http') {&lt;br&gt;             url = base_url + url;&lt;br&gt;     }&lt;br&gt;     var jsel = document.createElement('SCRIPT');&lt;br&gt;     jsel.type = 'text/javascript';&lt;br&gt;     jsel.src = url;&lt;br&gt;     document.body.appendChild (jsel);&lt;br&gt;}&lt;/code&gt;&lt;br&gt;&lt;br&gt;Now on to some "good stuff". Lets put what you just learned to work with something useful. First we'll look at creating a comment system for your website. Comments are a great way for users to interact with a website, and often times it's easier to let them add a comment without leaving the page they're on. To do this we'll take a look at the Ajax Feedback Mechanism from &lt;a href="http://www.ibegin.com/blog/p_ajax_feedback_mechanism.html" target="_blank"&gt;iBegin&lt;/a&gt;. Although it's pre-written code you can still use and learn from it. There are a lot of advanced effects in this library (fading in and out when adding / removing comments) you will understand the basic concept of taking data from a from, sending it to a backend PHP script, and showing the user the new information (e.g. "Successful log in" or "Failed log in") without leaving the web page. &lt;a href="http://www.webpasties.com/xmlHttpRequest/" target="_blank"&gt;Web Pasties&lt;/a&gt; has a similar walk-thru (except no download is required) that goes through form creation and how to store, check and display data from the current page. Both of these articles are great resources to get you going on your first ajax project.&lt;br&gt;&lt;br&gt;Ajax isn't limited to just input boxes either. For example, &lt;a href="http://www.phpriot.com/d/articles/client-side/sortable-lists-with-php-and-ajax/index.html" target="_blank"&gt;phpRiot&lt;/a&gt; has a walk-thru that shows you out to create real-time sortable lists. You can click and drag items into a new order (much like you can in Netvibes or Google IG). This is very nifty for sites with lots of content in one area. This way users can decide what they want to see first. &lt;a href="http://tool-man.org/examples/sorting.html" target="_blank"&gt;The Tool Man&lt;/a&gt; takes the last example a few steps further by adding the ability to add multiple lists to one sorting method, add multi-row and column support and more.&lt;br&gt;&lt;br&gt;That wraps it up for part one of this three-part series. From this article you should know how to create an XMLHttpRequest object, how to grab data from inside text boxes (and other input areas), and how to display that information for the user in real-time without leaving your web page. In part two we will pick up where we left off here, and go into more advanced options, so be sure you know all the information here before reading on!&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-2265754704046623905?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/2265754704046623905/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=2265754704046623905' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/2265754704046623905'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/2265754704046623905'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2007/10/ajax-tutorials-for-beginners.html' title='Ajax Tutorials for Beginners'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-5182381666300048793</id><published>2007-10-24T03:46:00.001-07:00</published><updated>2007-10-24T03:46:55.120-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Mistakes made when developing with Ajax</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Using Ajax for the sake of Ajax.&lt;/span&gt;&lt;br&gt;&lt;br&gt;Sure Ajax is cool, and developers love to play with cool technology, but Ajax is a tool, not a toy. A lot of Ajax isn’t seriously needed to improve usability but rather experiments in what Ajax can do or trying to fit Ajax somewhere where it isn’t needed.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Breaking the back button&lt;/span&gt;&lt;br&gt;&lt;br&gt;The back button is a great feature of the standard web site user interface. Unfortunately, the back button doesn’t mesh very well with Javascript. Keeping back button functionality is one reason not to go with a pure Javascript web app.&lt;br&gt;&lt;br&gt;Keep in mind however that good web design provides the user with everything they would need to successfully navigate your site, and never relies on web browser controls.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Not giving immediate visual cues for clicking widgets&lt;/span&gt;&lt;br&gt;&lt;br&gt;If something I’m clicking on is triggering Ajax actions, you have to give me a visual cue that something is going on. An example of this is GMail loading button that is in the top right. Whenever I do something in GMail, a little red box in the top right indicates that the page is loading, to make up for the fact that Ajax doesn’t trigger the normal web UI for new page loading.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Leaving offline people behind&lt;/span&gt;&lt;br&gt;&lt;br&gt;As web applications push the boundaries further and further, it becomes more and more compelling to move all applications to the web. The provisioning is better, the world-wide access model is great, the maintenance and configuration is really cool, the user interface learning curve is short.&lt;br&gt;&lt;br&gt;However, with this new breed of Ajax applications, people who have spotty internet connections or people who just don’t want to switch to the web need to be accomodated as well. Just because technology ‘advances’ doesn’t mean that people are ready and willing to go with it. Web application design should at least consider offline access. With GMail it’s POP, Backpackit has SMS integration. In the Enterprise, it’s web-services.&lt;br&gt;Don’t make me wait&lt;br&gt;&lt;br&gt;With Firefox tabs, I can manage various waits at websites, and typically I only have to wait for a page navigation. With AJAX apps combined with poor network connectivity/bandwidth/latency I can have a really terrible time managing an interface, because every time I do something I have to wait for the server to return a response. However, remember that the ‘A’ in AJAX stands for ‘Asynchronous’, and the interaction can be designed so that the user is not prevented from continuing to work on the page while the earlier request is processed.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Sending sensitive information in the clear&lt;/span&gt;&lt;br&gt;&lt;br&gt;The security of AJAX applications is subject to the same rules as any web application, except that once you can talk asynchronously to the server, you may tend to write code that is very chatty in a potentially insecure way. All traffic must be vetted to make sure security is not compromised.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Assuming AJAX development is single platform development.&lt;/span&gt;&lt;br&gt;&lt;br&gt;Ajax development is multi-platform development. Ajax code will run on IE’s javascript engine, Spidermonkey (Mozilla’s js engine), Rhino (a Java js implementation, also from Mozilla), or other minor engines that may grow into major engines. So it’s not enough just to code to JavaScript standards, there needs to be real-world thorough testing as well. A major obstacle in any serious Javascript development is IE’s buggy JS implementation, although there are tools to help with IE JS development.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Forgetting that multiple people might be using the same application at the same time&lt;/span&gt;&lt;br&gt;&lt;br&gt;In the case of developing an Intranet type web application, you have to remember that you might have more than one person using the application at once. If the data that is being displayed is dynamically stored in a database, make sure it doesn’t go “stale” on you.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Too much code makes the browser slow&lt;/span&gt;&lt;br&gt;&lt;br&gt;Ajax introduces a way to make much more interesting javascript applications, unfortunately interesting often means more code running. More code running means more work for the browser, which means that for some javascript intensive websites, especially inefficiently coded ones, you need to have a powerful CPU to keep the functionality zippy. The CPU problem has actually been a limit on javascript functionality in the past, and just because computers have gotten faster doesn’t mean the problem has disappeared.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Not having a plan for those who do not enable or have JavaScript.&lt;/span&gt;&lt;br&gt;&lt;br&gt;According to the W3 schools browser usage statistics, which if anything are skewed towards advanced browsers, 11% of all visitors don’t have JavaScript. So if your web application is wholly dependent on JavaScript, it would seem that you have potentially cut a tenth of your audience.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Blinking and changing parts of the page unexpectedly&lt;/span&gt;&lt;br&gt;&lt;br&gt;The first A in Ajax stands for asynchronous. The problem with asynchronous messages is that they can be quite confusing when they pop in unexpectedly. Asynchronous page changes should only ever occur in narrowly defined places and should be used judiciously, flashing and blinking in messages in areas I don’t want to concentrate on harkens back to days of the html blink tag. “Yellow Fade”, “One Second Spotlight” and other similar techniques are used to indicate page changes unobtrusively.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Not using links I can pass to friends or bookmark&lt;/span&gt;&lt;br&gt;&lt;br&gt;Another great feature of websites is that I can pass URLs to other people and they can see the same thing that I’m seeing. I can also bookmark an index into my site navigation and come back to it later. Javascript, and thus Ajax applications, can cause huge problems for this model of use. Since the Javascript is dynamically generating the page instead of the server, the URL is cut out of the loop and can no longer be used as an index into navigation. This is a very unfortunate feature to lose, many Ajax webapps thoughtfully include specially constructed permalinks for this exact reason.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Blocking Spidering&lt;/span&gt;&lt;br&gt;&lt;br&gt;Ajax applications that load large amounts of text without a reload can cause a big problem for search engines. This goes back to the URL problem. If users can come in through search engines, the text of the application needs to be somewhat static so that the spiders can read it.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Asynchronously performing batch operations&lt;/span&gt;&lt;br&gt;&lt;br&gt;Sure with Ajax you can make edits to a lot of form fields happen immediately, but that can cause a lot of problems. For example if I check off a lot of check boxes that are each sent asynchronously to the server, I lose my ability to keep track of the overall state of checkbox changes and the flood of checkbox change indications will be annoying and disconcerting.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Scrolling the page and making me lose my place&lt;/span&gt;&lt;br&gt;&lt;br&gt;Another problem with popping text into a running page is that it can effect the page scroll. I may be happily reading an article or paging through a long list, and an asynchronous javascript request will decide to cut out a paragraph way above where I’m reading, cutting my reading flow off. This is obviously annoying and it wastes my time trying to figure out my place. But then again, that would be a very stupid way to program a page, with or without AJAX.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Inventing new UI conventions&lt;/span&gt;&lt;br&gt;&lt;br&gt;A major mistake that is easy to make with Ajax is: ‘click on this non obvious thing to drive this other non obvious result’. Sure, users who use an application for a while may learn that if you click and hold down the mouse on this div that you can then drag it and permanently move it to this other place, but since that’s it’s not in the common user experience, you increase the time and difficulty of learning the application, which is a major negative for any application. On the plus side, intuitiveness is a function of learning, and AJAX is popularising many new conventions which will become intuitive as time goes by. The net result will be greater productivity once the industry gets over the intuitiveness hump.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Character Sets&lt;/span&gt;&lt;br&gt;&lt;br&gt;One big problem with using AJAX is the lack of support for character sets. You should always set the content character set on the server-side as well as encoding any data sent by Javascript. Use ISO-8859-1 if you use plain english, or UTF-8 if you use special characters, like æ, ø and å (danish special characters) Note: it is usually a good idea to go with utf-8 nowadays as it supports many languages).&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Changing state with links (GET requests)&lt;/span&gt;&lt;br&gt;&lt;br&gt;The majority of Ajax applications tend to just use the GET method when working with AJAX. However, the W3C standards state that GET should only be used for retrieving data, and POST should only be used for setting data. Although there might be no noticable difference to the end user, these standards should still be followed to avoid problems with robots or programs such as Google Web Accelerator.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Not cascading local changes to other parts of the page&lt;/span&gt;&lt;br&gt;&lt;br&gt;Since Ajax/Javascript gives you such specific control over page content, it’s easy to get too focused on a single area of content and miss the overall integrated picture. An example of this is the Backpackit title. If you change a Backpackit page title, they immediately replace the title, they even remember to replace the title on the right, but they don’t replace the head title tag with the new page title. With Ajax you have to think about the whole picture even with localized changes.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Problem reporting&lt;/span&gt;&lt;br&gt;&lt;br&gt;In a traditional server-side application, you have visibility into every exception, you can log all interesting events and benchmarks, and you can even record and view (if you wish) the actual HTML that the browser is rendering. With client-side applications, you may have no idea that something has gone wrong if you don’t know how to code correctly and log exceptions from the remotely called pages to your database.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Return on Investment&lt;/span&gt;&lt;br&gt;&lt;br&gt;Sometimes AJAX can impressively improve the usability of an application (a great example is the star-rating feedback on Netflix), but more often you see examples of expensive rich-client applications that were no better than the plain HTML versions.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Mimicing browser page navigation behavior imperfectly&lt;/span&gt;&lt;br&gt;&lt;br&gt;One example of this is blinklist Ajax paging mechanism on the front page. As you click to see another page of links, ajax fills in the next page. Except that if you are used to a browser experience, you probably expect to go to the top of the page when you hit next page, something JavaScript driven page navigation doesn’t do. BlinkList actually anticipates this and tries to counteract by manipulating your scrolling to scroll upwards until you hit the top. Except this can be slow and if you try scrolling down you will fight the upwards scrolling JavaScript and it won’t let you scroll down. But then again, that is very stupid way to program a page, with or without AJAX.&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Another Tool&lt;/span&gt;&lt;br&gt;&lt;br&gt;It seems everyone has forgotten that Ajax is just another tool in the toolbox for Web Design. You can use it or not and misuse it or not. The old 80/20 rule always applies to applications (if you cover 80% of what all users want/need then you have a viable app) and if you lose 11% of your audience because they don’t switch on their javascript then you have to ask yourself if changing your app is worth capturing that 11% or stick with 89% that are currently using it and move on to something else. Also web apps should take advantage of all tricks to enable them to function quickly and efficiently. If that means using javascript for some part, Ajax for another and ASP callbacks for a third, so be it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-5182381666300048793?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/5182381666300048793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=5182381666300048793' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/5182381666300048793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/5182381666300048793'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2007/10/mistakes-made-when-developing-with-ajax.html' title='Mistakes made when developing with Ajax'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-1347049077995488292</id><published>2007-10-24T03:45:00.000-07:00</published><updated>2007-10-24T03:46:06.867-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>IE7 and AJAX. IE7 has added native XMLHTTPRequest object</title><content type='html'>&lt;h2&gt;Native XMLHTTPRequest object&lt;/h2&gt;    &lt;p&gt;I’m excited to mention that IE7 will support a scriptable native version of XMLHTTP. This can be instantiated using the same syntax across different browsers and decouples AJAX functionality from an ActiveX enabled environment. &lt;/p&gt; &lt;p&gt;&lt;b&gt;What is XMLHTTP?&lt;/b&gt;&lt;/p&gt; &lt;p&gt;XMLHTTP was first introduced to the world as an ActiveX control in Internet Explorer 5.0. Over time, this object has been implemented by other browsing platforms, and is the cornerstone of “AJAX” web applications. The object allows web pages to send and receive XML (or other data) via the HTTP protocol. XMLHTTP makes it possible to create responsive web applications that do not require redownloading the entire page to display new data. Popular examples of AJAX applications include the Beta version of &lt;a href="http://local.live.com/"&gt;Windows Live Local&lt;/a&gt;, Microsoft Outlook Web Access, and Google’s GMail.&lt;/p&gt; &lt;p&gt;&lt;b&gt;Charting the changes: XMLHTTP in IE7 vs. IE6&lt;/b&gt;&lt;/p&gt; &lt;p&gt;In IE6 and below, XMLHTTP is implemented as an ActiveX object provided by &lt;a href="http://msdn.microsoft.com/library/en-us/xmlsdk/html/b24aafc2-bf1b-4702-bf1c-b7ae3597eb0c.asp"&gt;MSXML.&lt;/a&gt; &lt;/p&gt; &lt;p&gt;In IE7, XMLHTTP is now also exposed as a native script object. Users and organizations that choose to disable ActiveX controls can still use XMLHTTP based web applications. (Note that an organization may use Group Policy or IE Options to disable the new native XMLHTTP object if desired.) As part of our continuing security improvements we now allow clients to configure and customize a security policy of their choice and simultaneously retain functionality across key AJAX scenarios.&lt;/p&gt; &lt;p&gt;IE7’s implementation of the XMLHTTP object is consistent with that of other browsers, simplifying the task of cross-browser compatibility.  Using just a bit of script, it’s easy to build a function which works with any browser that supports XMLHTTP:&lt;/p&gt; &lt;p&gt;&lt;span style="color: blue;"&gt;if (window.XMLHttpRequest){&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: blue;"&gt;          // If IE7, Mozilla, Safari, etc: Use native object&lt;br&gt;       var xmlHttp = new XMLHttpRequest()&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: blue;"&gt;}&lt;br&gt;else&lt;br&gt;{&lt;br&gt;if (window.ActiveXObject){&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: blue;"&gt;          // ...otherwise, use the ActiveX control for IE5.x and IE6&lt;br&gt;       var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");&lt;br&gt;       }&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: blue;"&gt;}&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Note that IE7 will still support the legacy ActiveX implementation of XMLHTTP alongside the new native object, so pages currently using the ActiveX control will not require rewrites.&lt;/p&gt; &lt;p&gt;I look forward to hearing any feedback and suggestions.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-1347049077995488292?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/1347049077995488292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=1347049077995488292' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/1347049077995488292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/1347049077995488292'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2007/10/ie7-and-ajax-ie7-has-added-native.html' title='IE7 and AJAX. IE7 has added native XMLHTTPRequest object'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-3776868661380670379</id><published>2007-10-24T03:44:00.000-07:00</published><updated>2007-10-24T03:45:28.172-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>How to reduce page loading time.</title><content type='html'>It is widely accepted that fast-loading pages improve the user experience.  In recent years, many sites have started using &lt;a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29"&gt;AJAX&lt;/a&gt; techniques to reduce latency.  Rather than round-trip through the server retrieving a completely new page with every click, often the browser can either alter the layout of the page instantly or fetch a small amount of HTML, XML, or javascript from the server and alter the existing page.  In either case, this significantly decreases the amount of time between a user click and the browser finishing rendering the new content.&lt;/p&gt;  &lt;p&gt;However, for many sites that reference dozens of external objects, the majority of the page load time is spent in separate HTTP requests for  images, javascript, and stylesheets.  AJAX probably could help, but speeding up or eliminating these separate HTTP requests might help more, yet there isn't a common body of knowledge about how to do so.&lt;/p&gt;  &lt;p&gt;While working on optimizing page load times for a high-profile AJAX application, I had a chance to investigate how much I could reduce latency due to external objects. Specifically, I looked into how the HTTP client implementation in common browsers and characteristics of common Internet connections affect page load time for pages with many small objects.&lt;/p&gt;Try some of the following:  &lt;ul&gt;&lt;li&gt;&lt;p&gt;Turn on &lt;a href="http://httpd.apache.org/docs/2.0/mod/core.html#keepalive"&gt;HTTP keepalives&lt;/a&gt; for external objects.  Otherwise you add an extra round-trip for every HTTP request.  If you are worried about hitting global server connection limits, set the keepalive timeout to something short, like 5-10 seconds.  Also look into serving your static content from a different webserver than your dynamic content.  Having thousands of connections open to a stripped down static file webserver can happen in like 10 megs of RAM total, whereas your main webserver might easily eat 10 megs of RAM per connection.  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Load fewer external objects.  Due to lower request overhead, one bigger file just loads faster than two smaller ones half its size.  Figure out how to globally reference the same one or two javascript files and one or two external stylesheets instead of many; if you have more, try preprocessing them when you publish them.  If your UI uses dozens of tiny GIFs all over the place, consider switching to a much cleaner &lt;a href="http://www.w3.org/Style/CSS/learning"&gt;CSS&lt;/a&gt;-based &lt;a href="http://www.csszengarden.com/"&gt;design&lt;/a&gt; which probably won't need so many images. Or load all of your common UI images in one request using a technique called "&lt;a href="http://www.informit.com/articles/article.asp?p=447210&amp;amp;rl=1"&gt;CSS sprites&lt;/a&gt;".  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;If your users regularly load a dozen or more uncached or uncacheable objects per page, consider evenly spreading those objects over four hostnames.  This usually means your users can have 4x as many outstanding connections to you.  Without HTTP pipelining, this results in their average request latency dropping to about 1/4 of what it was before.&lt;/p&gt;  &lt;p&gt;When you generate a page, evenly spreading your images over four hostnames is most easily done with a hash function, like MD5.  Rather than having all &lt;img&gt; tags load objects from http://static.example.com/, create four hostnames (e.g. static0.example.com, static1.example.com, static2.example.com, static3.example.com) and use two bits from an MD5 of the image path to choose which of the four hosts you reference in the &lt;img&gt; tag.  Make sure all pages consistently reference the same hostname for the same image URL, or you'll end up defeating caching.&lt;/p&gt;  &lt;p&gt;Beware that each additional hostname adds the overhead of an extra DNS lookup and an extra TCP three-way handshake.  If your users have pipelining enabled or a given page loads fewer than around a dozen objects, they will see no benefit from the increased concurrency and the site may actually  load more slowly.  The benefits only become apparent on pages with larger numbers of objects.  Be sure to measure the difference seen by your users if  you implement this.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p&gt;Possibly the best thing you can do to speed up pages for repeat visitors is to allow static images, stylesheets, and javascript to be unconditionally cached by the browser.  This won't help the first page load for a new user, but can substantially speed up subsequent ones.  &lt;/p&gt;&lt;p&gt;Set an &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21"&gt;Expires header&lt;/a&gt; on everything you can, with a date days or even months into the future.  This tells the browser it is okay to not revalidate on every request, which can add latency of at least one round-trip per object per page load for no reason.&lt;/p&gt;  &lt;p&gt;Instead of relying on the browser to revalidate its cache, if you change an object, change its URL.  One simple way to do this for static objects if you have staged pushes is to have the push process create a new directory named by the build number, and teach your site to always reference objects out of the current build's base URL.  (Instead of &lt;img src="http://example.com/logo.gif"&gt; you'd use &lt;img src="http://example.com/build/1234/logo.gif"&gt;.  When you do another build next week, all references change to &lt;img src="http://example.com/build/1235/logo.gif"&gt;.)  This also nicely solves problems with browsers sometimes caching things longer than they should -- since the URL changed, they think it is a completely different object.&lt;/p&gt;  &lt;p&gt;If you conditionally gzip HTML, javascript, or CSS, you probably want to add a "&lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9"&gt;Cache-Control&lt;/a&gt;: private" if you set an Expires header.  This will prevent problems with caching by proxies that won't understand that your gzipped content can't be served to everyone. (The Vary header was designed to do this more elegantly, but you can't use it because of IE brokenness.)&lt;/p&gt;  &lt;p&gt;For anything where you always serve the exact same content when given the same URL (e.g. static images), add "Cache-Control: public" to give proxies explicit permission to cache the result and serve it to different users.  If a local cache has the content, it is likely to have much less latency than you; why not let it serve your static objects if it can?&lt;/p&gt;  &lt;p&gt;Avoid the use of query params in image URLs, etc.  At least the &lt;a href="http://www.squid-cache.org/"&gt;Squid cache&lt;/a&gt; refuses to cache any URL containing a question mark by default. I've heard rumors that other things won't cache those URLs at all, but I don't have more information.  &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;On pages where your users are often sent the exact same content over and over, such as your home page or RSS feeds, implementing conditional GETs can substantially improve response time and save server load and bandwidth in cases where the page hasn't changed.&lt;/p&gt;  &lt;p&gt;When serving a static files (including HTML) off of disk, most webservers will generate &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.3.1"&gt;Last-Modified&lt;/a&gt; and/or &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.3.2"&gt;ETag&lt;/a&gt; reply headers for you and make use of the corresponding &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.25"&gt;If-Modified-Since&lt;/a&gt; and/or &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26"&gt;If-None-Match&lt;/a&gt; mechanisms on requests.  But as soon as you add server-side includes, dynamic templating, or have code generating your content as it is served, you are usually on your own to implement these.&lt;/p&gt;  &lt;p&gt;The idea is pretty simple: When you generate a page, you give the browser a little extra information about exactly what was on the page you sent.  When the browser asks for the same page again, it gives you this information back.  If it matches what you were going to send, you know that the browser already has a copy and send a much smaller 304 (Not Modified) reply instead of the contents of the page again. And if you are clever about what information you include in an ETag, you can usually skip the most expensive database queries that would've gone into generating the page.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p&gt;Minimize HTTP request size.  Often cookies are set domain-wide, which means they are also unnecessarily sent by the browser with every image request from within that domain.  What might've been a 400 byte request for an image could easily turn into 1000 bytes or more once you add the cookie headers.  If you have a lot of uncached or uncacheable objects per page and big, domain-wide cookies, consider using a separate domain to host static content, and be sure to never set any cookies in it.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p&gt;Minimize HTTP response size by enabling gzip compression for HTML and XML for browsers that support it.  For example, the 17k document you are reading takes 90ms of the full downstream bandwidth of a user on 1.5Mbit DSL.  Or it will take 37ms when compressed to 6.8k.  That's 53ms off of the full page load time for a simple change.  If your HTML is bigger and more redundant, you'll see an even greater improvement.&lt;/p&gt;  &lt;p&gt;If you are brave, you could also try to figure out which set of browsers will handle compressed Javascript properly.  (Hint: IE4 through IE6 asks for its javascript compressed, then breaks badly if you send it that way.) Or look into Javascript obfuscators that strip out whitespace, comments, etc and usually get it down to 1/3 to 1/2 its original size.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p&gt;Consider locating your small objects (or a mirror or cache of them) closer to your users in terms of network latency.  For larger sites with a global reach, either use a commercial &lt;a href="http://en.wikipedia.org/wiki/Content_Delivery_Network"&gt;Content Delivery Network&lt;/a&gt;, or add a colo within 50ms of 80% of your users and use one of the many &lt;a href="http://en.wikipedia.org/wiki/Global_Server_Load_Balancing"&gt;available methods&lt;/a&gt; for routing user requests to your colo nearest them.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p&gt;Regularly use your site from a realistic net connection.  Convincing the web developers on my project to use a "slow proxy" that simulates bad DSL in New Zealand (768Kbit down, 128Kbit up, 250ms RTT, 1% packet loss) rather than the gig ethernet a few milliseconds from the servers in the U.S. was a huge win.  We found and fixed a number of usability and functional problems very quickly.&lt;/p&gt;  &lt;p&gt;To implement the slow proxy, I used the &lt;a href="http://linux-net.osdl.org/index.php/Netem"&gt;netem&lt;/a&gt; and &lt;a href="http://www.die.net/doc/linux/man/man8/tc-htb.8.html"&gt;HTB&lt;/a&gt; kernel modules available in the Linux 2.6 kernel, both of which are set up with the &lt;a href="http://www.die.net/doc/linux/man/man8/tc.8.html"&gt;tc&lt;/a&gt; command line tool.  These offer the most accurate simulation I could find, but are definitely not for the faint of heart.  I've not used them, but supposedly &lt;a href="https://addons.mozilla.org/firefox/966/"&gt;Tamper Data&lt;/a&gt; for Firefox, &lt;a href="http://www.fiddlertool.com/"&gt;Fiddler&lt;/a&gt; for Windows, and &lt;a href="http://www.xk72.com/charles/"&gt;Charles&lt;/a&gt; for OSX can all rate-limit and are probably easier to set up, but they may not simulate latency properly.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p&gt;Use Google's &lt;a href="https://addons.mozilla.org/firefox/3371/"&gt;Load Time Analyzer&lt;/a&gt; extension for Firefox from a realistic net connection to see a graphical timeline of what it is doing during a page load.  This shows where Firefox has to wait for one HTTP request to complete before starting the next one and how page load time increases with each object loaded.  The &lt;a href="https://addons.mozilla.org/firefox/966/"&gt;Tamper Data&lt;/a&gt; extension can offer similar data in less easy to interpret form.  And the Safari team &lt;a href="http://webkit.org/blog/?p=75"&gt;offers a tip&lt;/a&gt; on a hidden feature in their browser that offers some timing data too.&lt;/p&gt;  &lt;p&gt;Or if you are familiar with the HTTP protocol and TCP/IP at the packet level, you can watch what is going on using &lt;a href="http://www.die.net/doc/linux/man/man8/tcpdump.8.html"&gt;tcpdump&lt;/a&gt;, &lt;a href="http://ngrep.sourceforge.net/"&gt;ngrep&lt;/a&gt;, or &lt;a href="http://www.ethereal.com/"&gt;ethereal&lt;/a&gt;.  These tools are indispensible for all sorts of network debugging.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p&gt;Try benchmarking common pages on your site from a local network with &lt;a href="http://httpd.apache.org/docs/trunk/programs/ab.html"&gt;ab&lt;/a&gt;, which comes with the &lt;a href="http://httpd.apache.org/"&gt;Apache webserver&lt;/a&gt;.  If your server is taking longer than 5 or 10 milliseconds to generate a page, you should make sure you have a good understanding of where it is spending its time.&lt;/p&gt;  &lt;p&gt;If your latencies are high and your webserver process (or CGI if you are using that) is eating a lot of CPU during this test, it is often a result of using a scripting language that needs to recompile your scripts with every request.  Software like &lt;a href="http://eaccelerator.net/"&gt;eAccelerator&lt;/a&gt; for PHP, &lt;a href="http://perl.apache.org/"&gt;mod_perl&lt;/a&gt; for perl, &lt;a href="http://www.modpython.org/"&gt;mod_python&lt;/a&gt; for python, etc can cache your scripts in a compiled state, dramatically speeding up your site.  Beyond that, look at finding a profiler for your language that can tell you where you are spending your CPU.  If you fix that, your pages will load faster and you'll be able to handle more traffic with fewer machines.&lt;/p&gt;  &lt;p&gt;If your site relies on doing a lot of database work or some other time-consuming task to generate the page, consider adding server-side caching of the slow operation.  Most people start with writing a cache to local memory or local disk, but that starts to fall down if you expand to more than a few web server machines.  Look into using &lt;a href="http://www.danga.com/memcached/"&gt;memcached&lt;/a&gt;, which essentially creates an extremely fast shared cache that's the combined size of the spare RAM you give it off of all of your machines.  It has clients available in most common languages.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;i&gt;(Optional)&lt;/i&gt; Petition browser vendors to turn on HTTP pipelining by default on new browsers.  Doing so will remove some of the need for these tricks and make much of the web feel much faster for the average user.  (Firefox has this disabled supposedly because some proxies, some load balancers, and some versions of IIS choke on pipelined requests.  But Opera has found sufficient workarounds to enable pipelining by default.  Why can't other browsers do similarly?)&lt;/p&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-3776868661380670379?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/3776868661380670379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=3776868661380670379' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/3776868661380670379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/3776868661380670379'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2007/10/how-to-reduce-page-loading-time.html' title='How to reduce page loading time.'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-3699530620450930307</id><published>2007-10-24T03:43:00.002-07:00</published><updated>2007-10-24T03:44:23.975-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>How do I find the geographical location of a host, given its IP address ?</title><content type='html'>In general, it is impossible - IP addresses are allocated arbitrarily, as there's no inherent connection between an IP address and it's physical location, and there's no reliable method to do the trick.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Yet, doing some detective work could help. Try following methods :&lt;/p&gt;&lt;br&gt;&lt;br&gt;&lt;ol&gt;&lt;br&gt;&lt;li&gt;Note the following links for reference :&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;A complete list of country codes&lt;br&gt;&lt;br&gt;&lt;a href="http://www.iana.org/domain-names.htm"&gt;http://www.iana.org/domain-names.htm&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;a href="http://www.ics.uci.edu/pub/websoft/wwwstat/country-codes.txt"&gt;http://www.ics.uci.edu/pub/websoft/wwwstat/country-codes.txt&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;A complete list of U.S. state abbreviation&lt;br&gt;&lt;br&gt;&lt;a href="http://www.usps.gov/ncsc/lookups/abbr_state.txt"&gt;http://www.usps.gov/ncsc/lookups/abbr_state.txt&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;A complete list of airport codes&lt;br&gt;&lt;br&gt;&lt;a href="http://www.aviationjobsonline.com/airports/citycode.html"&gt;http://www.aviationjobsonline.com/airports/citycode.html&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Microsoft's TerraServer - satellites pictures of geographical areas&lt;br&gt;&lt;br&gt;&lt;a href="http://www.terraserver.microsoft.com/"&gt;http://www.terraserver.microsoft.com/&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/li&gt;&lt;li&gt;Use reverse DNS to find out the host's name. This item could supply some clues that could help.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;E.g. given the IP address 132.74.18.2, the command 'nslookup 132.74.18.2' translates the address to construct.haifa.ac.il gives two hints -&lt;br&gt;&lt;br&gt;&lt;ol&gt;&lt;br&gt;&lt;li&gt;The TLD is .il, which hints the host is in Israel.&lt;br&gt;&lt;/li&gt;&lt;li&gt;The next two domains are haifa.ac, so this host belongs to the 'haifa' academical institute (a university, in this case).  The Haifa university happens to be in the city Haifa.&lt;br&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Reverse DNS translation doesnt always work - it depends on the host's [the host with the given IP address] DNS server's correct configuration.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Another trick is to execute a whois request on the IP address. Try to direct the whois query to whois.arin.net - if it doesn't have the reply it will tell you to query either whois.apnic.net or whois.ripe.net&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Notice that a host in one domain might be hosted in another country. This is due to both virtual hosting, where a domain of a company from one country or region, might be hosted where hosting is cheap.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Also notice that the .org, .com, and even .edu domains does not imply the host is in the U.S., as many of those domains belong to companies that are either not U.S. based, or are international, and might have some hosts all over the world.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/li&gt;&lt;li&gt;Some hosts support a DNS extension which allows for hosts to enter their geographical location into their DNS record, based on an extension to DNS described in &lt;a href="ftp://ftp.rfc-editor.org/in-notes/rfc1876.txt"&gt;RFC 1876&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;For further information see - &lt;a href="http://www.ckdhr.com/dns-loc/"&gt;http://www.ckdhr.com/dns-loc/&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Another attempt to express a host's geographical location via DNS is done in &lt;a href="ftp://ftp.rfc-editor.org/in-notes/rfc1712.txt"&gt;RFC 1712&lt;/a&gt;. Both RFCs define a DNS Resource Record to contain the geographical location.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/li&gt;&lt;li&gt;Visit the host's web server. A web site will sometimes contain hints regarding the site's location.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;E.g. for construct.haifa.ac.il, you can find info at both &lt;a href="http://www.haifa.ac.il/"&gt;http://www.haifa.ac.il/&lt;/a&gt; and &lt;a href="http://www.ac.il/"&gt;http://www.ac.il/&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/li&gt;&lt;li&gt;Use whois. The whois database contains administrative contact info for all domains, filled in during domain registration time, and updated from time to time. This admin info could give some hints.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;The whois database is not highly reliable - if an address belongs to a large &amp;amp; responsible company, the company will supply reliable info and update it, but as domain name registrators do not insist on keeping the database accurate and current, the data might be incorrect.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;The IP to Lat/Long page will attempt to display the same information in a graphical representation.&lt;br&gt;&lt;br&gt;&lt;a href="http://cello.cs.uiuc.edu/cgi-bin/slamm/ip2ll/"&gt;http://cello.cs.uiuc.edu/cgi-bin/slamm/ip2ll/&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;The Allwhois.com page allows whois requests for many countries.&lt;br&gt;&lt;br&gt;&lt;a href="http://www.allwhois.com/"&gt;http://www.allwhois.com/&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;A list of whois servers, collected by Matt Power, is available at &lt;a href="ftp://sipb.mit.edu/pub/whois/whois-servers.list"&gt;ftp://sipb.mit.edu/pub/whois/whois-servers.list&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Note that the data is usually given for the owners' main branch or contact points, but the IP addresses might be allocated to hosts that may be located at a different location(s).&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/li&gt;&lt;li&gt;Use traceroute. The names of the routers through which packets flow from your [or any] host to the host with the given IP address might hint at the geographical path which the packets follow, and at the final destination's physical location.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;br&gt;E.g. &amp;gt; traceroute www.mit.edu&lt;br&gt;traceroute to DANDELION-PATCH.MIT.EDU(18.181.0.31), ...&lt;br&gt;1 teg.technion.ac.il (132.68.7.254)              2 ms   1 ms   1 ms&lt;br&gt;2 tau-smds.man.ac.il (128.139.210.16)            5 ms   5 ms   5 ms&lt;br&gt;3 128.139.198.129 (128.139.198.129)              9 ms  11 ms  13 ms&lt;br&gt;4 TAU-shiber.route.ibm.net.il (192.115.73.5)   535 ms 549 ms 513 ms&lt;br&gt;5 fe7507.tlv.ibm.net.il (192.116.177.1)        562 ms 596 ms 600 ms&lt;br&gt;6 165.87.220.18 (165.87.220.18)               1195 ms1204 ms&lt;br&gt;7 nyc28-16-sar1.ny.us.ibm.net (165.87.28.19)  1208 ms1216 ms1233 ms&lt;br&gt;8 198.133.27.5 (198.133.27.5)                 1210 ms1239 ms1211 ms&lt;br&gt;9 sprint-nap.bbnplanet.net (192.157.69.51)    1069 ms1087 ms1122 ms&lt;br&gt;10 nyc1-br2.bbnplanet.net (4.0.1.25)           1064 ms1109 ms1061 ms&lt;br&gt;11 cambridge1-br1.bbnplanet.net (4.0.1.122)    1185 ms1146 ms1203 ms&lt;br&gt;12 cambridge2-br2.bbnplanet.net (4.0.2.26)     1185 ms1159 ms1073 ms&lt;br&gt;13 ihtfp.mit.edu (192.233.33.3)                1052 ms 642 ms 658 ms&lt;br&gt;14 W20-RTR-FDDI.MIT.EDU (18.168.0.8)            640 ms 665 ms 674 ms&lt;br&gt;15 DANDELION-PATCH.MIT.EDU (18.181.0.31)        702 ms 915 ms 868 ms&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;The 3rd hop takes the path to the academic network [checked by local whois lookup], the fifth hop takes the path to New-York [on the east coast], and the 10th hop takes the path to Cambridge [in Massachusetts, on the coast, northern to New-York].&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;There is a utility named VisualRoute (&lt;a href="http://www.visualware.com/visualroute/index.html"&gt;http://www.visualware.com/visualroute/index.html&lt;/a&gt;) which traceroutes a host, and displays the route on a map of the world. The host's location on the map is based on the whois query, which may be wrong - an Israely domain might be displayed as being in Israel though it is hosted in another country.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/li&gt;&lt;li&gt;Some of the services available on the host might give further info.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;br&gt;E.g. telnet construct.haifa.ac.il 13  &amp;lt;== Time of day service&lt;br&gt;  Trying 132.74.18.2...&lt;br&gt;  Connected to construct.haifa.ac.il.&lt;br&gt;  Escape character is '^]'.&lt;br&gt;  Wed Jan 21 08:32:53 1998         &amp;lt;== Time difference hints at the&lt;br&gt;                                       host's time zone.&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/li&gt;&lt;li&gt;Naming conventions of ISPs and back-bones&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;AT&amp;amp;T dialups : &amp;lt;port&amp;gt;.&amp;lt;router-location&amp;gt;.&amp;lt;state&amp;gt;.dial-access.att.net&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Port is 2-254 for the dial-up ports, and 1 for the router itself. location: example:  "los-angeles-2" (city and router #). state: 2-letter abbreviation.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;uu.net dialups :&lt;br&gt;&lt;br&gt;A. &amp;lt;port&amp;gt;.&amp;lt;device&amp;gt;.&amp;lt;city&amp;gt;.&amp;lt;state&amp;gt;.&amp;lt;iu&amp;gt;.uu.net&lt;br&gt;&lt;br&gt;&lt;br&gt;B. &amp;lt;port&amp;gt;.&amp;lt;device&amp;gt;.&amp;lt;airport&amp;gt;.&amp;lt;iu&amp;gt;.uu.net&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;iu = intended use (meaningless), state is per USPS ZIP code, deviceis Ascend 'TNT' # or Ascend 'MAX' #.&lt;br&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-3699530620450930307?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/3699530620450930307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=3699530620450930307' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/3699530620450930307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/3699530620450930307'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2007/10/how-do-i-find-geographical-location-of.html' title='How do I find the geographical location of a host, given its IP address ?'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-441471414996306515</id><published>2007-10-24T03:43:00.001-07:00</published><updated>2007-10-24T03:43:50.252-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>W3C DOM -Introduction</title><content type='html'>The &lt;em&gt;Document Object Model&lt;/em&gt; (DOM) is the model that describes how all elements in an HTML page, like input fields, images, paragraphs etc., are related to the topmost structure: the &lt;code&gt;document&lt;/code&gt; itself. By calling the element by its proper DOM name, we can influence it.&lt;/p&gt;  &lt;p&gt;On this page I give an introduction to the W3C Level 1 DOM that has been implemented in the newest generation of browsers. It will give you an overview of how the DOM works and what you can do with it.&lt;/p&gt;  &lt;p&gt;First some words about the DOM Recommendation  and the purpose of the DOM, then I teach you what nodes  are and how you can walk the DOM tree  from node to node. Then it's time to learn how to get  a specific node and how to change  its value or attributes. Finally, I'll teach you how to create nodes  yourself, the ultimate purpose of the new DOM.&lt;/p&gt;  &lt;h3 id="rec"&gt;The Recommendation&lt;/h3&gt;  &lt;p&gt;The &lt;a href="http://www.w3.org/TR/REC-DOM-Level-1/" class="external"&gt;Level 1 DOM Recommendation&lt;/a&gt; has been developed by the W3C to provide any programming language with access to each part of an XML document. As long as you use the methods and properties that are part of the recommendation, it doesn't matter if you parse an XML document with VBScript, Perl or JavaScript. In each language you can read out whatever you like and make changes to the XML document itself.&lt;/p&gt;  &lt;p class="smaller"&gt;As some of you might have guessed, this paragraph describes an ideal situation and differences (between browsers, for instance) do exist. Generally, however, they're far smaller than usual so that learning to use the W3C DOM in JavaScript will help you to learn using it in another programming language.&lt;/p&gt;  &lt;p&gt;In a way HTML pages can be considered as XML documents. Therefore the Level 1 DOM will work fine on an HTML document, as long as the browser can handle the necessary scripts.&lt;/p&gt;  &lt;p&gt;You can read out the text and attributes of every HTML tag in your document, you can delete tags and their content, you can even create new tags and insert them into the document so that you can really rewrite your pages on the fly, without a trip back to the server.&lt;/p&gt;  &lt;p&gt;Because it is developed to offer access to and change every aspect of XML documents, the DOM has many possibilities that the average web developer will never need. For instance, you can use it to edit the comments in your HTML document, but I don't see any reason why you would want to do so. Similarly, there are sections of the DOM that deal with the DTD/Doctype, with DocumentFragments (tiny bits of a document) or the enigmatic CDATA. You won't need these parts of the DOM in your HTML pages, so I ignore them and concentrate instead on the things that you'll need in your daily work.&lt;/p&gt;  &lt;h3 id="nodes"&gt;Nodes&lt;/h3&gt;  &lt;p&gt;The DOM is a Document Object Model, a model of how the various objects of a document are related to each other. In the Level 1 DOM, each object, whatever it may be exactly, is a &lt;em&gt;Node&lt;/em&gt;. So if you do&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt; &lt;br&gt;This is a paragraph&lt;br&gt;&lt;/pre&gt;  &lt;p&gt;you have created two nodes: an &lt;em&gt;element&lt;/em&gt; P and a &lt;em&gt;text node&lt;/em&gt; with content '&lt;em&gt;This is a paragraph&lt;/em&gt;'. The text node is inside the element, so it is considered a &lt;em&gt;child node&lt;/em&gt; of the element. Conversely, the element is considered the &lt;em&gt;parent node&lt;/em&gt; of the text node.&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;              &lt;p&gt; &amp;lt;-- element node&lt;br&gt;              |&lt;br&gt;              |&lt;br&gt;    This is a paragraph &amp;lt;-- text node&lt;br&gt;&lt;/p&gt;&lt;/pre&gt;  &lt;p&gt;If you do&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;&lt;p&gt;This is a &lt;b&gt;paragraph&lt;/b&gt;&lt;/p&gt;&lt;br&gt;&lt;/pre&gt;  &lt;p&gt;the element node P has two children, one of which has a child of its own:&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;              &lt;p&gt;&lt;br&gt;              |&lt;br&gt;        --------------&lt;br&gt;       |              |&lt;br&gt;   This is a         &lt;br&gt;                      |&lt;br&gt;                      |&lt;br&gt;                   paragraph&lt;br&gt;&lt;/p&gt;&lt;/pre&gt;  &lt;p&gt;Finally there are &lt;em&gt;attribute nodes&lt;/em&gt;. &lt;span class="smaller"&gt;(Confusingly, they are not counted as children of an element node. In fact, while writing this pages I've done a few tests that seem to indicate that Explorer 5 on Windows doesn't see attributes as nodes at all.)&lt;/span&gt; So&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;&lt;p align="right"&gt;This is a &lt;b&gt;paragraph&lt;/b&gt;&lt;/p&gt;&lt;br&gt;&lt;/pre&gt;  &lt;p&gt;would give something like&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;              &lt;p&gt; ----------------&lt;br&gt;              |                  |&lt;br&gt;        --------------         ALIGN&lt;br&gt;       |              |          |&lt;br&gt;   This is a                 |&lt;br&gt;                      |        right&lt;br&gt;                      |&lt;br&gt;                   paragraph&lt;br&gt;&lt;/p&gt;&lt;/pre&gt;  &lt;p&gt;So these are element nodes, text nodes and attribute nodes. They constitute about 99% of the content of an HTML page and you'll usually busy yourself with manipulating them. There are more kinds of nodes, but I skip them for the moment.&lt;/p&gt;  &lt;p&gt;As you'll understand, the element node P also has its own parent, this is usually the document, sometimes another element like a DIV. So the whole HTML document can be seen as a tree consisting of a lot of nodes, most of them having child nodes (and these, too, can have children).&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;                          |&lt;br&gt;              |-------------------------------------&lt;br&gt;              |                                     |&lt;br&gt;             &lt;p&gt; ----------------            lots more nodes&lt;br&gt;              |                  |&lt;br&gt;        --------------         ALIGN&lt;br&gt;       |              |          |&lt;br&gt;   This is a                  |&lt;br&gt;                      |        right&lt;br&gt;                      |&lt;br&gt;                   paragraph&lt;br&gt;&lt;/p&gt;&lt;/pre&gt;  &lt;h3 id="walk"&gt;Walking through the DOM tree&lt;/h3&gt;  &lt;p&gt;Knowing the exact structure of the DOM tree, you can walk through it in search of the element you want to influence. For instance, assume the element node P has been stored in the variable &lt;code&gt;x&lt;/code&gt; (later on I'll explain how you do this). Then if we want to access the BODY we do&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;x.parentNode&lt;br&gt;&lt;/pre&gt;  &lt;p&gt;We take the parent node of x and do something with it. To reach the B node:&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;x.childNodes[1]&lt;br&gt;&lt;/pre&gt;  &lt;p&gt;&lt;code&gt;childNodes&lt;/code&gt; is an array that contains all children of the node &lt;code&gt;x&lt;/code&gt;. Of course numbering starts at zero, so &lt;code&gt;childNodes[0]&lt;/code&gt; is the text node 'This is a' and &lt;code&gt;childNodes[1]&lt;/code&gt; is the element node B.&lt;/p&gt;  &lt;p&gt;Two special cases: &lt;code&gt;x.firstChild&lt;/code&gt; accesses the first child of x (the text node), while &lt;code&gt;x.lastChild&lt;/code&gt; accesses the last child of x (the element node B).&lt;/p&gt;  &lt;p&gt;So supposing the P is the first child of the body, which in turn is the first child of the document, you can reach the element node B by either of these commands:&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;document.firstChild.firstChild.lastChild;&lt;br&gt;document.firstChild.childNodes[0].lastChild;&lt;br&gt;document.firstChild.childNodes[0].childNodes[1];&lt;br&gt;etc.&lt;br&gt;&lt;/pre&gt;  &lt;p&gt;or even (though it's a bit silly)&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;document.firstChild.childNodes[0].parentNode.firstChild.childNodes[1];&lt;br&gt;&lt;/pre&gt;  &lt;h3 id="get"&gt;Getting an element&lt;/h3&gt;  &lt;p&gt;However, walking through the document in this way is quite cumbersome. You'll need to be absolutely certain of the structure of the entire DOM tree and since the whole purpose of the Level 1 DOM is to allow you to modify the DOM tree, this could lead to problems really quickly.&lt;/p&gt;  &lt;p&gt;Therefore there are several ways of jumping directly to an element of your choice. Once you have arrived there, you can walk the last bit of the DOM tree to where you want to be.&lt;/p&gt;  &lt;p&gt;So let's continue with our example. You want to access the element node B. The very simplest way is to directly jump to it. By the method &lt;code&gt;document.getElementsByTagName&lt;/code&gt; you can construct an array of all tags B in the document and then go to one of them. Let's assume that this B is the first one in the document, then you can simply do&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;var x = document.getElementsByTagName('B')[0]&lt;br&gt;&lt;/pre&gt;  &lt;p&gt;and &lt;code&gt;x&lt;/code&gt; contains the element node B. First you order the browser to get all elements B in the document (&lt;code&gt;document.getElementsByTagName('B')&lt;/code&gt;), then you select the first of all B's in the document (&lt;code&gt;[0]&lt;/code&gt;) and you've arrived where you want to be.&lt;/p&gt;  &lt;p&gt;You could also do&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;var x = document.getElementsByTagName('P')[0].lastChild;&lt;br&gt;&lt;/pre&gt;  &lt;p&gt;Now you go to the first paragraph in the document (we assume that our P is the first one) and then go to its &lt;code&gt;lastChild&lt;/code&gt;.&lt;/p&gt;  &lt;p&gt;The best way, the only way to be certain that you reach the correct element regardless of the current structure of the DOM tree, is to give the B an ID:&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;&lt;p align="right"&gt;This is a &lt;b id="hereweare"&gt;paragraph&lt;/b&gt;&lt;/p&gt;&lt;br&gt;&lt;/pre&gt;  &lt;p&gt;Now you can simply say&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;var x = document.getElementById('hereweare');&lt;br&gt;&lt;/pre&gt;  &lt;p&gt;and the element node B is stored in &lt;code&gt;x&lt;/code&gt;.&lt;/p&gt;  &lt;h3 id="change"&gt;Changing a node&lt;/h3&gt;  &lt;p&gt;Now that we have reached the node, we want to change something. Suppose we want to change the bold text to '&lt;em&gt;bold bit of text&lt;/em&gt;'. We then have to access the correct node and change its &lt;code&gt;nodeValue&lt;/code&gt;. Now the correct node in this case is not the element node B but its child text node: we want to change the text, not the element. So we simply do&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;document.getElementById('hereweare').firstChild.nodeValue='bold bit of text';&lt;br&gt;&lt;/pre&gt;  &lt;p&gt;and the node changes. Try it  and change it back again .&lt;/p&gt;  &lt;!-- function test(txt) {  if (document.getElementById &amp;&amp; document.createElement)   document.getElementById('hereweare').firstChild.nodeValue=txt;  else alert('Your browser doesn\'t support the Level 1 DOM'); }  function test2(val) {  if (document.getElementById &amp;&amp; document.createElement) {   node = document.getElementById('hereweare').parentNode;   node.setAttribute('align',val);  }  else alert('Your browser doesn\'t support the Level 1 DOM'); } // --&gt;   &lt;p align="right"&gt;This is a &lt;b id="hereweare"&gt;paragraph&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;You can change the &lt;code&gt;nodeValue&lt;/code&gt; of each text node or each attribute. Thus you can also change the ALIGN attribute of the paragraph. Try it   and change it back again .&lt;/p&gt;  &lt;p&gt;This, too, is quite simple. Take the node you need (the B's parentNode, in this case), then use the &lt;code&gt;setAttribute()&lt;/code&gt; method to set the ALIGN attribute to the value you want:&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;function test2(val) {&lt;br&gt; if (document.getElementById &amp;amp;&amp;amp; document.createElement)&lt;br&gt;{&lt;br&gt;  node = document.getElementById('hereweare').parentNode;&lt;br&gt;  node.setAttribute('align',val);&lt;br&gt;}&lt;br&gt; else alert('Your browser doesn\'t support the Level 1 DOM');&lt;br&gt;}&lt;br&gt;&lt;/pre&gt;  &lt;h3 id="create"&gt;Creating and removing nodes&lt;/h3&gt;  &lt;p&gt;Changing nodes is nice, it can even be useful, but it's nothing compared to actually creating your own nodes and inserting them into your document. I can easily add an HR  right below this paragraph and remove  it quite as easily.&lt;/p&gt;   &lt;!-- function test3() {  if (document.getElementById &amp;&amp; document.createElement) {   var x = document.createElement('HR');   document.getElementById('inserthrhere').appendChild(x);  }  else alert('Your browser doesn\'t support the Level 1 DOM'); }  function test4() {  if (document.getElementById &amp;&amp; document.createElement) {   var node = document.getElementById('inserthrhere')   node.removeChild(node.childNodes[0]);  }  else alert('Your browser doesn\'t support the Level 1 DOM'); } // --&gt;   &lt;span id="inserthrhere"&gt;&lt;/span&gt;  &lt;p&gt;Creating the element is done by a special method:&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;var x = document.createElement('HR');&lt;br&gt;&lt;/pre&gt;  &lt;p&gt;Thus an HR is created and temporarily stored in &lt;code&gt;x&lt;/code&gt;. The second step is to insert x into the document. I wrote a special SPAN with ID="inserthrhere" at point where it should appear. So we use the &lt;code&gt;appendChild()&lt;/code&gt; method on the SPAN and the HR is made a child of the SPAN and it magically appears:&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;document.getElementById('inserthrhere').appendChild(x);&lt;br&gt;&lt;/pre&gt;  &lt;p&gt;Removing it is slightly more complex. First I create a temporary variable &lt;code&gt;node&lt;/code&gt; to store the SPAN, then I tell it to remove its first child (the HR).&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;var node = document.getElementById('inserthrhere')&lt;br&gt;node.removeChild(node.childNodes[0]);&lt;br&gt;&lt;/pre&gt;  &lt;p&gt;In the same way we can create a new text node and append it to our faithful B ID="hereweare"&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;var x = document.createTextNode(' A new text node has been appended!');&lt;br&gt;document.getElementById('hereweare').appendChild(x);&lt;br&gt;&lt;/pre&gt;   &lt;!-- function test5() {  if (document.getElementById &amp;&amp; document.createElement)  {   var x = document.createTextNode(' A new text node has been appended!');   document.getElementById('hereweare').appendChild(x);  } } // --&gt;   &lt;p&gt;Try it , then go up  to see the result. You will notice that executing the old functions does not remove the new text node, that's because it has become a &lt;em&gt;separate node&lt;/em&gt;:&lt;/p&gt;  &lt;pre style="margin-right: -576px;"&gt;           &lt;br&gt;           |&lt;br&gt;      ------------&lt;br&gt;     |            |&lt;br&gt; paragraph    A new text node&lt;br&gt;              has been appended!&lt;br&gt;&lt;/pre&gt;  &lt;p class="smaller"&gt;(To merge them into one node use the &lt;code&gt;normalize()&lt;/code&gt; method that's sadly not supported by Explorer 5 on Windows).&lt;/p&gt;  &lt;p&gt;I won't tell you how to remove the text node, try writing that script yourself. It'll be a useful exercise.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-441471414996306515?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/441471414996306515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=441471414996306515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/441471414996306515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/441471414996306515'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2007/10/w3c-dom-introduction.html' title='W3C DOM -Introduction'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20572124121972732.post-4655066342710739392</id><published>2007-10-24T03:40:00.000-07:00</published><updated>2007-10-24T03:42:41.703-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Web 2.0 and the AJAX</title><content type='html'>&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;Web 2.0 is a strange thing in that it doesn't really exist. You can't buy Web 2.0; you can't buy a Web 2.0 programming language, and you can't buy Web 2.0 hardware. In many ways, the phrase "Web 2.0" is a marketing phrase like "paradigm shift" or "the big picture". The reason for this vagueness is that Web 2.0 doesn't have a tightly defined definition. What the phrase Web 2.0 tries to express is, that modern websites are so much better than early websites that they'd better be given a different name. So it is down to marketing.   &lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;Web developers need to demonstrate that they may use the same Internet, the same web browsers and the same web servers as their competitors, yet their websites are in fact an order of magnitude better. &lt;i&gt;“Our competitors only do websites. We do Web 2.0 websites!" &lt;/i&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;The client is, of course, hugely impressed that his new website will be a Web 2.0 website. But what should he expect to see for his money? What is the client's view of what Web 2.0 should offer? Is it all smelling of roses or are there some thorny issues too?  &lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;I propose that there are in fact three facets to a Web 2.0 website:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style=""&gt;1.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;AJAX&lt;/span&gt;&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style=""&gt;2.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;Social Networking (Building Communities)&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-left: 0.5in; text-indent: -0.25in;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;span style=""&gt;3.&lt;span style="font-family: &amp;quot;Times New Roman&amp;quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;Broadband&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;AJAX is technical and can only be performed by a technically skilled developer, social networking is vague, woolly and is based more on marketing models than web skills, and broadband has been popular for a long time. Even stranger is the fact that &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;has been available to developers for at least 5 years, and social networking has been around even longer. It is simply the re-branding of these things that is causing the rise in the popularity of these old but current "buzzword" technologies.   &lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;AJAX&lt;/span&gt;&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;is a mash up of technologies. We've had asynchronous JavaScript and XML for many years, but until somebody said "I name this mash up - &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;"&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; it remained out of the mainstream. The same goes with social networking. Forums, blogs, and community-based websites have been around for many years, but giving it a title like "social networking" combined with the success of websites such as &lt;a target="_blank" href="http://www.youtube.com/"&gt;www.Youtube.com&lt;/a&gt; and &lt;a target="_blank" href="http://www.linkedin.com/"&gt;www.Linkedin.com&lt;/a&gt;  makes it mainstream and popular. And to cap it all, the new names invented to re-brand existing technologies are combined into the all encompassing name of Web 2.0. &lt;i&gt;Web 2.0 is simply rebranding the rebranded.&lt;/i&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;In summary, we've had the ability to create Web 2.0 websites for years. It is not new technology; it is simply the renaming and repackaging of something we already have and enjoy. Marketing has made buzzwords of what we already knew and the public and developers are lapping it up. &lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;The third facet of Web 2.0 was broadband, or as I prefer to call it, broadband abuse. Many developers believe that Web 2.0 is defined by how long it takes to download a website or the size of the broadband connection required to view the site comfortably. They believe that the bigger the connection required or the longer the website takes to download, the more Web 2.0&lt;i style=""&gt;ish&lt;/i&gt; the website must be. In my opinion, however, adding vast images, video footage, badly implemented rounded corners and streaming music does not make a Web 2.0 website. It simply makes a regular website that is bloated and annoying.  &lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;Presuming that you understand what makes a Web 2.0 website and you are keen to build one, there is an important area that you should consider before you start. And that is the area of &lt;b style=""&gt;Search&lt;/b&gt; &lt;b style=""&gt;Engine&lt;/b&gt; &lt;b style=""&gt;Optimisation&lt;/b&gt;.  &lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;So what about search engines? Do Web 2.0 websites perform well on search engines? Do search engines need to change to keep pace with development? If we ignore the broadband abusers and look at the two key facets of Web 2.0, &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;,&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;and social networking we get two very different answers.&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;Working somewhat in reverse here, the conclusion is that &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;is a search engine killer. Adding &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;functionality to your website is like pulling the plug on your search engine strategy. Social networking sites on the other hand typically perform exceptionally well on search engines due to their vast amount of visitor provided content.  &lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;The reason &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;is a search engine killer is pretty obvious once you know how the technology works, and at the risk of offending all the people who know this already, I'll recap in a brief paragraph.  &lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;Simply put, &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;removes the need to refresh a page in a browser. Say for example, you are on the product-finding page of a website, you can type in a search phrase for the product you want to find and press the submit button. Without refreshing the page, the asynchronous JavaScript runs off, grabs the results of the search, and inserts the details of the found products into the very same page as you sit and look at it.  &lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;For the website user this addition of &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;to the website feels fantastic. No page reloads, no browser flicker, no click noise, but sheer joy. And so the rush for &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;websites begins, because the visitors will love it. &lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;But what about the search engines, what will they make of web pages that use &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;to find content? Importantly, search engines don't run JavaScript. Oh no, not ever, no way Jos&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;é&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;. So the search engine will never run your &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;. &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;To the search engine, huge areas of your website content are now hidden, never to be spidered, indexed, or found. This really limits the usefulness of &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;in many applications.    &lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;An ideal application of &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;is Google Maps, where as you drag the map around the browser window, the newly exposed areas of the map are retrieved and shown on the page without a page refresh—smooth, seamless, and very impressive. Does Google care if the single map page gets found by searching? Certainly not!&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;A very poor application of &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;is the product portfolio where you can find and view product details for hundreds of products without ever refreshing the page. Nice to use? Yes. Navigation friendly? No—try hitting the back button when the browser ignores your last 20 clicks because you have remained on the same page! Search engine friendly? Forget it. You are invisible.  &lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;So what is the solution to the &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;invisibility cloak that Master Harry Potter himself would be proud of? There are 5 options:  &lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;ol start="1" type="1"&gt;&lt;li class="MsoNormal" style="margin-bottom: 12pt;"&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;Build two websites, one using &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;that is lovely for visitors and another using more traditional techniques for search engine spiders to find. If you can find a client to finance both, you have found a client with too much money!&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 12pt;"&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;Drop &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;. &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;Let the visitors suffer the page refresh.&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 12pt;"&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;Run with &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;anyway and just put up with the fact that your perfectly formed website will receive no search engine visitors.&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style="margin-bottom: 12pt;"&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;Lobby the major search engines to rebuild their spidering algorithms to take into account &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;pages and to run JavaScript on the pages they index. This option might take some time :-)&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: Wingdings;" lang="EN-GB"&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class="MsoNormal" style=""&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;Increase your Google Ad words payments and ramp up traditional advertising to counteract the missing website traffic from the search engines.&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;And so, a bleak picture of &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;is painted and by implication of Web 2.0 as well. The good applications of &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;and Web 2.0 are few and far between, but when you do find them they are fantastic. Do you remember that feeling when you fist used Google Maps? Do you find that all other mapping websites now feel old fashioned? I would go as far as to say that it was Google Maps that single-handedly bought the technology of &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;AJAX&lt;/st1:city&gt;&lt;/st1:place&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;to the masses.  &lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;The second most impressive application of AJAX&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;is another Google idea, where when typing in the search field on the Google website, AJAX&lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt; &lt;/span&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;is used to find results even as you type the words—incredibly quick to use, fantastic for the website visitor, and really demonstrating the technology in a great light.&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size: 10pt;" lang="EN-GB"&gt;Isn't it hugely ironic then that the one website that demonstrates so well the very technology that, if used on our own websites, will force us to spend more on Google Ad words, is in fact Google.&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt; &lt;span style="font-size: 10pt;"&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20572124121972732-4655066342710739392?l=uropen.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://uropen.blogspot.com/feeds/4655066342710739392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20572124121972732&amp;postID=4655066342710739392' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/4655066342710739392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20572124121972732/posts/default/4655066342710739392'/><link rel='alternate' type='text/html' href='http://uropen.blogspot.com/2007/10/web-20-and-ajax.html' title='Web 2.0 and the AJAX'/><author><name>Who Am I?</name><uri>http://www.blogger.com/profile/15530634034141648605</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
