<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Query7 &#187; Web Development</title>
	<atom:link href="http://query7.com/tag/web-development/feed" rel="self" type="application/rss+xml" />
	<link>http://query7.com</link>
	<description>PHP, Javascript, Python and Web Development</description>
	<lastBuildDate>Sat, 25 Jun 2011 21:29:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Hadoop – Part 1</title>
		<link>http://query7.com/hadoop-%e2%80%93-part-1</link>
		<comments>http://query7.com/hadoop-%e2%80%93-part-1#comments</comments>
		<pubDate>Mon, 01 Nov 2010 11:15:30 +0000</pubDate>
		<dc:creator>Cary F</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[BigTable]]></category>
		<category><![CDATA[database management]]></category>
		<category><![CDATA[distributed processing]]></category>
		<category><![CDATA[GFS]]></category>
		<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[MapReduce]]></category>
		<category><![CDATA[Sourcebits]]></category>

		<guid isPermaLink="false">http://www.webdevelopmentbits.com/?p=694</guid>
		<description><![CDATA[Hadoop is an extremely powerful and popular framework for large-scale application and data distribution. Companies like Amazon, Twitter, Rakuten and Facebook deploy Hadoop across clusters of literally thousands of machines crunching petabytes of data under thousands of processing cores.]]></description>
			<content:encoded><![CDATA[<h1><span style="font-weight: normal; font-size: 13px;"><a href="http://hadoop.apache.org/">Hadoop</a> is an extremely powerful and <a href="http://wiki.apache.org/hadoop/PoweredBy">popular</a> framework for large-scale application and data distribution. Companies like Amazon, Twitter, Rakuten and Facebook deploy Hadoop across clusters of literally thousands of machines crunching <em>peta</em>bytes of data under thousands of processing cores. We’re going to take an in depth look at Hadoop over a series of articles, but in this first stab let’s get comfy with some of the buzz words needed to fully appreciate how Hadoop does all that it does.  I’m going to put my own spin on each category, but each heading will hyperlink to a Wikipedia entry for further reading. At times, too, we’ll paraphrase key passages from some well-established sources – which we’ll of course link to for your reference.  So off we go, let’s take the first steps on our journey into Hadoop!</span></h1>
<p><a href="http://en.wikipedia.org/wiki/Parallel_computing">Parallel Processing / Computing</a></p>
<p>Good old math!!! If it takes one person 10 days to do one job, how long will it take for 2 people of the same working caliber to do that same job? This is the thrust of parallel processing. Strictly speaking, parallel processing is the simultaneous processing of the same task on two or more <a href="http://www.wisegeek.com/how-do-microprocessors-work.htm">microprocessors</a> in order to obtain faster results. <a href="http://www.wisegeek.com/what-is-a-computer.htm">Computer</a> resources can include a single computer with multiple processors, or a number of computers connected by a network, or a combination of both. The processors access data through shared memory. Some <a href="http://www.wisegeek.com/what-is-a-supercomputer.htm">supercomputer</a> parallel processing systems have hundreds of thousands of microprocessors.<span style="font-family: 'Lucida Grande', Verdana, Arial, 'Bitstream Vera Sans', sans-serif; line-height: 18px; font-size: 11px; color: #333333;"> </span></p>
<p>A successful implementation of parallel computing involves two things apart from having a strong distributed processing system:</p>
<ul>
<li>Tasks should be structured in such a manner that they can be executed at the same time.<em> </em></li>
<li>The sequence of tasks which must be executed one after the other should be maintained.<em> </em></li>
</ul>
<p>Parallel processing can substantially reduce the time required to complete a project, coming in particularly handy for projects requiring complex computations such as weather modeling and digital special effects.</p>
<p>A few years ago people were remarking about how parallelism “is the future of computing,” and it’s safe to say this has now come to pass. Parallel processing has not just taken off among the geek fringe and supercomputing crowd. Commercial software engineers have begun taking advantage of the multiple processor cores increasingly found in consumer level machines, so while the average user may not be aware of it, parallel computing is quickly entering the mainstream.</p>
<p><a href="http://en.wikipedia.org/wiki/Concurrent_computing">Concurrent Computing</a></p>
<p>This is not so different from parallel processing. Essentially, concurrent computing is a collection of processes that can interact with each other and run in parallel. Potentially more powerful the parallel processing, the implementation can be rather more complicated. The biggest concern when writing concurrent programs is to make sure that the sequence and the interaction between programs are happening properly. By properly we mean 1) in the correct order and at the correct time, 2) with appropriate concurrent processes, and 3) allowing appropriate access to shared resources.</p>
<p>To maximize the computational power of parallelism, concurrent programs should be run on machines with multiple core processors or across networked machines, but concurrent programs can also be executed on machines with single core CPUs. We can think of concurrent computing as a kernel core performing several things simultaneously and seamlessly, despite being run under even a single core CPU. Therefore single core CPUs will be able to perform the same types of tasks as multi-core CPUs, just they’ll take (potentially much, much, much) more time.</p>
<p>Along with single versus multiple core CPUs, several other factors play a vital role in determining computational power, such as <a href="http://www.blogger.com/">shared memory</a> / <a href="http://en.wikipedia.org/wiki/Message_passing">message passing</a> (for communication between concurrent threads / processes / pieces of code).</p>
<p>Application throughput and high responsiveness are the key pain points addressed when opting for concurrent computing. But while parallel and concurrent computing may be fascinating to study and offer incredibly powerful programming opportunities, they’re terrifically complex and hard to implement for the uninitiated. I would strongly suggest exploring parallelism only after determining that you can&#8217;t make do with traditional techniques.</p>
<p><a href="http://en.wikipedia.org/wiki/Distributed_processing">Distributed Processing / Computing</a></p>
<p>Distributed processing / computing is much the same as parallel and concurrent processing, the only difference being multiple computers connect through a network to achieve the goal.</p>
<p><a href="http://en.wikipedia.org/wiki/Google_File_System">Google File System (GFS)</a></p>
<p>Google File System (GFS) is a proprietary technology designed by Google to meet their ever-increasing data processing demands. Without GFS, Google wouldn’t be able to crawl the Internet, index it, do keyword/content analysis, run website analytics, perform search, all the while knowing who is searching for what and smart-linking to advertising. GFS is what lets us run a Google search for, say, “Google File System” and get about 57,000,000 results in 0.13 seconds!!!  (<a href="http://www.google.com/search?q=ymmv">YMMV</a>.)</p>
<p>In fact it’s not much different than its predecessors (distributed file systems) in terms of performance, scalability, reliability and of course data redundancy.</p>
<p>Imagine the scale of the job: getting an application to process at speeds of around 800 to 1000 requests per second: database designing, caching, indexing, memory leaks, architectural constraints, horizontal and vertical scaling, code optimizations, server tweaking, and for sure a few hundred other things. How they can process this kind of load, all on the fly – nearly instantaneously – is a testament to the power of GFS. In terms of systems architecture, here is how they do it: Google File System, Big Table, and Map Reducer.</p>
<p>In order to digest the rest of this explanatory section on GFS, you’ll need a basic familiarity with the <a href="http://en.wikipedia.org/wiki/Master-slave_(technology)">Master-Slave</a> computing concept, in-memory database structures, metadata, data replication, GC (Garbage Collection), balancing and fault tolerance.</p>
<p>GFS has a Single Master and multiple chunk servers that will be accessed by several clients. Generally these machines/servers are made up of inexpensive commodity hardware, based on the capacity of the system, the chunk server, and whether the client can run on the same system.</p>
<p>Below is an extract from <a href="http://labs.google.com/papers/gfs-sosp2003.pdf">Google’s own paper</a> detailing the Google File System.</p>
<p style="padding-left: 60px;">Master will take care of assigning an immutable and globally unique 64 bit chunk handle at the time of chunk creation. Chunk servers store chunks on local disks as Linux files and read or write chunk data specified by a chunk handle and byte range. For reliability, each chunk is replicated on multiple chunk servers. By default, GFS stores three replicas, though users can designate different replication levels for different regions of the file namespace.</p>
<p style="padding-left: 60px;"><em> </em></p>
<p style="padding-left: 60px;">The master will maintain all file system metadata. This includes the namespace, access control information, the mapping from files to chunks, and the current locations of chunks. It also controls system-wide activities such as chunk lease management, garbage collection of orphaned chunks, and chunk migration between chunk servers. The master periodically communicates with each chunk server in HeartBeat messages to give it instructions and collect its state.</p>
<p style="padding-left: 60px;">
<p style="padding-left: 60px;">GFS client code linked into each application implements the file system API and communicates with the master and chunk servers to read or write data on behalf of the application. Clients interact with the master for metadata operations, but all data-bearing communication goes directly to the chunk servers.</p>
<p style="padding-left: 60px;">
<p style="padding-left: 60px;">Neither the client nor the chunk server caches file data. Client caches offer little benefit because most applications stream through huge files or have working sets too large to be cached. Not having them simplifies the client and the overall system by eliminating cache coherence issues. (Clients do cache metadata, however.) Chunk servers need not cache file data because chunks are stored as local files and so Linux’s buffer cache already keeps frequently accessed data in memory.</p>
<p style="padding-left: 60px;">
<div id="attachment_695" class="wp-caption aligncenter" style="width: 471px"><a href="http://query7.com/wp-content/uploads/GFS1.jpg"><img class="size-full wp-image-695 " title="GFS1" src="http://query7.com/wp-content/uploads/GFS1.jpg" alt="" width="461" height="212" /></a><p class="wp-caption-text">(click -&gt; big)</p></div>
<p style="text-align: left;">Image Credit:<a href="http://labs.google.com/papers/gfs-sosp2003.pdf"> gfs-sosp2003.pdf</a></p>
<p>GFS faces several challenges, such as enabling concurrent appends to the files, reading large sets of streaming data, random reads and processing huge data/storing huge data in sequential manner.</p>
<p>In-memory data structure was required to achieve faster garbage collection and load balancing. Master will take care of scanning the state of each chunk server periodically and take care of Garbage Collection and load balancing. These smaller chunks reduce the amount of metadata required to be stored.</p>
<p>Activities of a Master include Namespace management locking, replica management replacements, rebalancing, Garbage Collection, stale replica deduction and management.</p>
<p>To sum up, GFS offers:</p>
<ul>
<li>Fast recovery – but how? Using checkpoints.</li>
<li>Chunk replications – to achieve high availability.</li>
<li>Master replications – for reliability.</li>
</ul>
<p>But enough about GFS for now. For further details, please take the afternoon and study Google’s GFS overview: <a href="http://labs.google.com/papers/gfs-sosp2003.pdf">gfs-sosp2003.pdf</a></p>
<p><a href="http://en.wikipedia.org/wiki/BigTable">BigTable</a></p>
<p>BigTable is a distributed storage system for managing structured data. It’s been designed to scale to a very large size (call it zeta bytes of data across several thousands of commodity servers). It’s a database management system (DBMS), yet does not follow the principles of traditional DBMS concepts; it has millions of columns that can differ depending on context.</p>
<p>BigTable uses the GFS distributed File System to store data files. BigTable was designed with the thought in mind that even hundreds of thousands of servers might not be sufficient so it should be easy to scale horizontally by just adding more servers when required.</p>
<p>BigTable serves over 60 of Google’s own products and projects, including Analytics, Indexing, and Google Earth, each requiring their own massive databases, latency, high performance, etc.</p>
<p>BigTable’s characteristics are detailed in the <a href="http://static.googleusercontent.com/external_content/untrusted_dlcp/labs.google.com/en//papers/bigtable-osdi06.pdf">official BigTable document</a>, but in a nutshell it’s a sparse, distributed, persistent multi-dimensional sorted map. It has a row-key, column-key and timestamp.</p>
<p>It’s hard to think in terms of a column-oriented database after using traditional DBMS systems. New users will need to get familiar with Row Key, Column Families, Timestamps and flush out their existing DBMS knowledge to start designing DBMS for column-oriented databases.</p>
<div id="attachment_696" class="wp-caption aligncenter" style="width: 432px"><a href="http://query7.com/wp-content/uploads/GFS2.jpg"><img class="size-full wp-image-696  " title="GFS2" src="http://query7.com/wp-content/uploads/GFS2.jpg" alt="" width="422" height="109" /></a><p class="wp-caption-text">Figure 2. (row:string, column:string, time:int64) → string</p></div>
<p style="text-align: left;">Image Credit: <a href="http://labs.google.com/papers/bigtable-osdi06.pdf">bigtable-osdi06.pdf</a></p>
<p>Rows in a BigTable are uniquely identified by the row key. BigTable maintains data in lexicographic order by the row key. The row range is dynamically partitioned. Each range is called a tablet (used for the load balancing). Tables are split into multiple tablets – which can be thought of as segments of the table. Each tablet will be around 200MB approximately. When the size grows beyond the specified limit, compression takes place. There are multiple level hierarchies (analogous to a B+ tree) that store the Tablet information itself.</p>
<p><a href="http://query7.com/wp-content/uploads/GFS3.jpg"><img class="size-full wp-image-697 alignleft" title="GFS3" src="http://query7.com/wp-content/uploads/GFS3.jpg" alt="" width="325" height="205" /></a></p>
<p>The first level is known as the Chubby file, which contains the location of the Root tablet. The Root tablet contains the location of all tablets in a special METADATA tablet, which in turn contains the location of a set of user tables. (Since the Root tablet is the first tablet among METADATA tablets, it gets special treatment.)</p>
<p>Column keys are grouped into sets known as column families, forming the basic unit of access control. A column family has to be created before the data is stored into the family. Column keys are named as in ColumnFamily:Qualifier.</p>
<p>Each column key in an anchor family (as shown in the Figure 3) represents a single anchor. Qualifier is the name of the referring site, and cell content is the link text.</p>
<p>Timestamps are used for versioning the data in a specific table in BigTable. Each cell in BigTable can contain multiple versions of some specific data. These are distinguished by the timestamp.</p>
<p>Finally, BigTable also provides an API to create, delete and look up values.</p>
<p><a href="http://en.wikipedia.org/wiki/MapReduce">MapReduce</a></p>
<p>MapReduce is a programming model for processing and generating large datasets in a distributed processing environment.</p>
<p>The underlying architecture in systems like GFS and Hadoop are capable enough to make this kind of program (MapReduce) run in a parallel mode on a large number of computers (known as clusters). GFS and Hadoop take care of splitting the input data and creating as many mapper and reducer steps as required (self-configuring the number of mappers and reducers is also possible), schedules the program executions, handling machine failures, and inter-machine communications. The terms Map and Reduce come from the primitives present in Lisp (and other functional languages).</p>
<p>Input for the MapReduce programs is by way of a set of key/value pairs, which in turn produces a set of output key/value pairs.</p>
<p>Map: a piece of a program written by the user that takes an input pair and produces an intermediate key/value pair output. The Library takes care of splitting the huge data file into smaller chunks and sending it to different machines and receiving the intermediate outputs and combining them with other intermediate outputs of the same Key. The master node handles sending the data to worker nodes (until all the data is processed).</p>
<p>Reduce: another piece of a program written by the user, which takes the intermediate key and a set of values for that key and merges them together to form a smaller set of values. Aggregating all these output values (combined ones) will form the final output of the problem for the given data.</p>
<p>The big advantage of MapReduce is that it allows distributed processing of mappers and reducers. The MapReduce library (provided by GFS / Hadoop) will take care of the situation when a processing node (map or reduce) fails; it automatically reschedules the map and reduce task.</p>
<p>Following is a sample pseudo-code for map-reducer:</p>
<p>Lets count the number of occurrences of each word in a large collection of documents.</p>
<p>The Map function emits each word and a number (the count). Reducer simply receives the word and adds the count to the total count for each word. In the case of Map output, key is the word and count is the value.</p>
<p>The Reducer simply gets the key and the value and keeps adding to the value associated with the key, as in:</p>
<p>map (k1, v1) -&amp;gt; list (k2, v2)<strong> </strong></p>
<p>reduce(k2, list(v2)) -&amp;gt; list (v2)</p>
<div id="attachment_698" class="wp-caption aligncenter" style="width: 330px"><a href="http://query7.com/wp-content/uploads/GFS4.jpg"><img class="size-full wp-image-698 " title="GFS4" src="http://query7.com/wp-content/uploads/GFS4.jpg" alt="" width="320" height="230" /></a><p class="wp-caption-text">Figure 4</p></div>
<p style="text-align: center;">
<div id="attachment_699" class="wp-caption aligncenter" style="width: 432px"><a href="http://query7.com/wp-content/uploads/GFS5.jpg"><img class="size-full wp-image-699  " title="GFS5" src="http://query7.com/wp-content/uploads/GFS5.jpg" alt="" width="422" height="294" /></a><p class="wp-caption-text">Figure 5, showing the execution flow of a typical MapReduce program (in terms of GFS).</p></div>
<p style="text-align: center;">
<p>Step1: MR Library splits the huge data file into multiple chunks of 16 to 64 MB of data and starts as many copies of programs as required on the cluster.</p>
<p>Step2: One Copy acts as the Master. The rest are workers. The master has the information about which machine is idle and which is getting processed.</p>
<p>Step3: Get the input content, which is allocated to the worker.</p>
<p>Step4: Store the output into the local disk.</p>
<p>Step5: The master notifies the reducer whether the map output is available.</p>
<p>Step6: The reducer iterates the sorted intermediate data and produces an output that is appended to the final output file.</p>
<p>Step7: Master wakes up the user program when all the map/reduce programs are completed.</p>
<p>The Master node:</p>
<p>The Master node keeps track of each map and reducer and the tasks assigned to them, intermediate outputs, the states of tasks assigned to each map/reduce instance (forks) and the status of the worker machines.</p>
<p>The good thing about these MR libraries is that even if the Master task dies, it has created several checkpoints for a given job, so at next launch it won’t start a fresh job but rather pick up from the last checkpoint.</p>
<p>Phew!! All right, we&#8217;ve seen enough to lay the groundwork for more in depth discussion of Hadoop, so let’s take a breather before posting up the 2nd article in the Hadoop series.  Until then, if you’d like more information be sure to check out the following links or post a question in the comments.</p>
<p>Kannan R.<br />
Sourcebits Project Manager</p>
<p><a href="http://en.wikipedia.org/wiki/Distributed_computing">http://en.wikipedia.org/wiki/Distributed_computing</a></p>
<p><a href="http://en.wikipedia.org/wiki/GoogleFS">http://en.wikipedia.org/wiki/GoogleFS</a></p>
<p><a href="http://en.wikipedia.org/wiki/Concurrent_computing">http://en.wikipedia.org/wiki/Concurrent_computing</a></p>
<p><a href="http://en.wikipedia.org/wiki/Parallel_computing">http://en.wikipedia.org/wiki/Parallel_computing</a></p>
<p><a href="http://en.wikipedia.org/wiki/Hadoop">http://en.wikipedia.org/wiki/Hadoop</a></p>
<p><a href="http://en.wikipedia.org/wiki/MapReduce">http://en.wikipedia.org/wiki/MapReduce</a></p>
<p><a href="http://en.wikipedia.org/wiki/BigTable">http://en.wikipedia.org/wiki/BigTable</a></p>
<p><a href="http://en.wikipedia.org/wiki/HBase">http://en.wikipedia.org/wiki/HBase</a></p>
<p><a href="http://en.wikipedia.org/wiki/Google_File_System">http://en.wikipedia.org/wiki/Google_File_System</a></p>
<p><a href="http://labs.google.com/papers/gfs.html">http://labs.google.com/papers/gfs.html</a></p>
<p><a href="http://storagemojo.com/google-file-system-eval-part-i/">http://storagemojo.com/google-file-system-eval-part-i/</a></p>
<p><a href="http://storagemojo.com/google-file-system-eval-part-ii/">http://storagemojo.com/google-file-system-eval-part-ii/</a></p>
<p><a href="http://www.baselinemag.com/c/a/Infrastructure/How-Google-Works-1/">http://www.baselinemag.com/c/a/Infrastructure/How-Google-Works-1/</a></p>
<p><a href="http://queue.acm.org/detail.cfm?id=1594206">http://queue.acm.org/detail.cfm?id=1594206</a></p>
]]></content:encoded>
			<wfw:commentRss>http://query7.com/hadoop-%e2%80%93-part-1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Internationalization and Partial Rendering in the CodeIgniter Framework</title>
		<link>http://query7.com/internationalization-and-partial-rendering-in-the-codeigniter-framework</link>
		<comments>http://query7.com/internationalization-and-partial-rendering-in-the-codeigniter-framework#comments</comments>
		<pubDate>Mon, 06 Sep 2010 16:59:10 +0000</pubDate>
		<dc:creator>Prakash Mohanty</dc:creator>
				<category><![CDATA[Code Igniter]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[localization]]></category>
		<category><![CDATA[multi-language]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.webdevelopmentbits.com/?p=678</guid>
		<description><![CDATA[As experienced Web developers, it won’t shock you to find literally thousands of comparisons between CodeIgniter and the other popular frameworks you may be considering for your site. Each framework has its good and, ummm… less good points, but]]></description>
			<content:encoded><![CDATA[<p>As experienced Web developers, it won’t shock you to find literally thousands of comparisons between <a href="http://codeigniter.com/">CodeIgniter</a> and the other popular frameworks you may be considering for your site. Each framework has its good and, ummm… <em>less good </em>points, but let’s say you’re wedded to CodeIgniter for whatever reason, and you’ve got a few languages you’re tasked with supporting so you’re getting set to work on internationalization. So you go back and refresh your memory of just how to do that, and you begin coming across certain sites saying that CodeIgniter doesn&#8217;t support internationalization. So you begin to ponder ditching CodeIgniter, since you’re aces in a couple other frameworks, but that would be a mistake. CodeIgniter is a genius framework, and well optimized for so many other tasks that it’s worth sticking with. Plus, we have a nifty solution to your CodeIgniter internationalization issues.</p>
<p>If you’re going to be developing a multi-language site, then when you’re setting up your CMS, from the beginning be sure to go for a CodeIgniter CMS like CI-CMS or Pyro CMS in order to minimize languages issues down the road. {The <a href="http://www.zend.com/en/">Zend</a> framework, with its strong partial rendering, may seem like a better option in a pinch, but CodeIgniter trumps Zend in other crucial areas, so it’s worth sticking with.}</p>
<p>With CodeIgniter it makes great sense to build in modular separation (you can find the library <a href="http://maestric.com/doc/php/codeigniter_i18n">here</a>), though at first glace I’ll agree it looks like a tough implementation.</p>
<p>As you scan the library article, the lines to put most emphasis on will naturally deal with switching languages.</p>
<p>For example, you’ll find in the Notes section of the above library site:</p>
<pre>&lt;?php

anchor($this-&gt;lang-&gt;switch_uri('fr'),'Display current page in French');
$lang['about.gender'] = "Je suis un homme";

?&gt;</pre>
<p>Plug the lines below into your route.php and config.php files.</p>
<p>In config/route.php :</p>
<pre>&lt;?php

$route['^fr/(.+)$'] = "$1";

$route['^en/(.+)$'] = "$1";

// '/en' and '/fr' URIs -&gt; use default controller

$route['^fr$'] = $route['default_controller'];

$route['^en$'] = $route['default_controller'];

?&gt;</pre>
<p>In config/config.php,</p>
<p>$config['base_url']  must correspond to your configuration. For example,</p>
<pre>&lt;?php

$config['index_page'] = "";

?&gt;</pre>
<p>Creating the language file in system/application/language/english/about_lang.php was already clear to you.</p>
<pre>&lt;?php

$lang['about.gender'] = "I'm a man";
$lang['about.gender'] = "Je suis un homme";

?&gt;</pre>
<p>The controller part at</p>
<p>system/application/controllers/about.php should also be clear to you.</p>
<p>In the index function</p>
<pre>&lt;?php

$this-&gt;load-&gt;helper('language');

$this-&gt;load-&gt;helper('url');

// load language file‚

$this-&gt;lang-&gt;load('about');

$this-&gt;load-&gt;view('about');

?&gt;</pre>
<p>Once you&#8217;re done with these, browse to the welcome module on your local machine at http://localhost/ci/fr/welcome/test.<br />
You should find the language lines show up as expected.</p>
<p>Be sure to hit the CodeIgniter <a href="http://codeigniter.com/wiki/Language_Translation/">resource site</a> for some really useful, ready made down loadable translation files in zip format. This’ll save you heaps of time and work. Once you’ve extracted these zip archives, you’ll find files named as in the <em>about_lang.php </em>as above.</p>
<p>Next, while looking into partial rendering, we come across <a href="http://codeigniter.com/wiki/View_Object_PHP5/">this site</a>, which brings us more clarity.</p>
<pre>&lt;?php

$this-&gt;view-&gt;layout = 'master_layout_file'; // or leave this empty to render partials only

//Add a partial file and (optional) $data‚

$header = $this-&gt;view-&gt;load('header','header_file',$data);

// subheader‚

$header-&gt;load('sub_header','sub_header_file',$data);

$header-&gt;set($data);

$this-&gt;view-&gt;render();

?&gt;</pre>
<p>Now let’s render the partials in our master template:</p>
<pre>&lt;?php $header-&gt;render();?&gt;;</pre>
<p>And that&#8217;s about it. Pretty simple, right?</p>
<p>Before closing, just a brief note: PyroCMS is a multilingual CodeIgniter CMS with built-in language configuration options you can tailor to your site. You can find language settings inside the admin panel, and while the implementation will be similar to the approach we’ve outlined above it may not be an exact match.</p>
<p>Well, that&#8217;s it!  Thanks for reading, and I hope this helps.  If you have any questions about this specific tutorial or any other issues re: web development with CodeIgniter, Zend, or whatever else, drop us a line any time from our contact page!</p>
<p>Prakash R. Mohanty</p>
<p>Senior Software Engineer<br />
Sourcebits Technologies</p>
]]></content:encoded>
			<wfw:commentRss>http://query7.com/internationalization-and-partial-rendering-in-the-codeigniter-framework/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scrape the First Paragraph &amp; Image from a Wikipedia Entry</title>
		<link>http://query7.com/scrape-the-first-paragraph-image-from-a-wikipedia-entry</link>
		<comments>http://query7.com/scrape-the-first-paragraph-image-from-a-wikipedia-entry#comments</comments>
		<pubDate>Mon, 26 Jul 2010 14:10:40 +0000</pubDate>
		<dc:creator>Cary F</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Wikipedia]]></category>

		<guid isPermaLink="false">http://www.webdevelopmentbits.com/?p=652</guid>
		<description><![CDATA[Automate fetching Wikipedia descriptions and images for webpage content. Render content dynamically based on specific keywords.]]></description>
			<content:encoded><![CDATA[<p>by Kannan Ramakrishnan</p>
<p>One day, while you&#8217;re organizing the content for your latest and greatest website, you may find yourself wishing for an automated way to fetch a description for some of that content.  Perhaps an image, too, to pull into a header or elsewhere on your page.  And since you’ve got 100 other things on your plate, you’d like this content to be implemented automatically, dynamically appearing on certain pages based on a few keywords.  For novice Web developers, this sounds impossible, I know.  But… it’s totally doable.</p>
<p>So off you go in search of good, usable, public content.  Before long you’ll probably realize it yourself, but I’ll save you an hour of digging with this quick pro tip: Wikipedia is your friend. The bottomless content at Wikipedia is a perfect match for what we want to do.  The caveat, though, is it’s so vast we might scrape the wrong content.  And especially if you’re automating a task like this, constantly looking over your shoulder to confirm the content would defeat the entire purpose.  So relying <em>soley </em>on the Wiki gremlins is not the best way to go.</p>
<p><a href="http://query7.com/wp-content/uploads/250px-Red_Apple3.jpg"><img class="aligncenter size-full wp-image-663" title="250px-Red_Apple" src="http://query7.com/wp-content/uploads/250px-Red_Apple3.jpg" alt="" width="252" height="229" /></a></p>
<p>Let’s take for example a Wiki search for a popular technology company, say, <a href="http://www.apple.com">Apple</a>.  For a Web-savvy person like yourself, a Wiki search for ‘Apple’ turns up what you probably expect: the entry for <a href="http://en.wikipedia.org/wiki/Apple">a scrumptious kind of fruit</a>.  And as Web developers, we <em>should </em>be more astute in our search terms, but sometimes yes, well, there are those gremlins.</p>
<p>So&#8230; to cut the risk of unwanted fruit creeping onto your page, we’re going to combine a Wiki search with a Google search.</p>
<p>Following is the code for scraping the first paragraph and image of the entry from a page in Wikipedia.  As long as your keywords aren’t really crazy, this should get the job done!</p>
<p>Finally, make sure you don&#8217;t forget to credit Wikipedia on your page&#8230; and if you have any questions, <a href="mailto:webdevelopmentbits@sourcebits.com">drop us a line here</a> any time!!</p>
<p>Here&#8217;s the code:</p>
<pre>require  'hpricot'
require 'open-uri'

def fetch_description(query_item)
    page_title, uri_title = get_wiki_name(query_item)
    return get_wiki_description(page_title, uri_title)
end

def upload_photo(wiki_photo)
    begin
      base_uri = URI.parse(wiki_photo)
      uploaded_data = open(base_uri)
      def uploaded_data.original_filename; base_uri.path.split('/').last; end
      return uploaded_data.original_filename.blank? ? nil : uploaded_data
    rescue
      return nil
    end
end

#Method to fetch wiki page and strip first two

 Tags
def get_wiki_description(page_title, uri_title)
    url =  uri_title
    final_content = ""
    if url.size &gt; 10
      buffer = Hpricot(open(url, "UserAgent" =&gt; "reader"+rand(10000).to_s).read)
      #Capture first two paragraphs of text
      content = buffer.search("//div[@id='content']").search("//div[@id='bodyContent']").search("//p")[0..2]

      #Remove the extra spaces and strip html tags from the fetched content
      content.each do |c|
        final_content+=c.inner_html.gsub(/&lt; \/?[^&gt;]*&gt;/, '').gsub(/&amp;#\d+;/,'').gsub(/\([^\)]+\)/,'').gsub(/\[[^\]]+\]/,'').gsub(/ +/,' ')+"\n"
      end
    end
    return final_content
end

#Method to get the link for wikipedia from google search results
def get_wiki_name(query_item)
    search_keywords = query_item.strip.gsub(/\s+/,'+')
    url = "http://www.google.com/search?q=#{search_keywords}+site%3Aen.wikipedia.org"
    begin
      doc = Hpricot(open(url, "UserAgent" =&gt; "reader"+rand(10000).to_s).read)
      result = doc.search("//div[@id='ires']").search("//li[@class='g']").first.search("//a").first unless doc
    rescue
      return '',''
    end
    if result
      return result.inner_html.gsub(/&lt; \/?[^&gt;]*&gt;/,"").gsub(/./,""),result.attributes["href"]
    else
      return '',''
    end
end

wiki_description, wiki_photo = fetch_description("Apple")
upload_photo(wiki_photo)</pre>
<p>And this is how it looks implemented live, in context:</p>
<p><a href="http://query7.com/wp-content/uploads/smallerScreen-shot-2010-07-26-at-4.50.03-PM.png"><img class="aligncenter size-full wp-image-666" title="smallerScreen shot 2010-07-26 at 4.50.03 PM" src="http://query7.com/wp-content/uploads/smallerScreen-shot-2010-07-26-at-4.50.03-PM.png" alt="" width="500" height="245" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://query7.com/scrape-the-first-paragraph-image-from-a-wikipedia-entry/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blogger Template Wizardry</title>
		<link>http://query7.com/blogger-template-wizardry</link>
		<comments>http://query7.com/blogger-template-wizardry#comments</comments>
		<pubDate>Fri, 04 Jun 2010 03:46:49 +0000</pubDate>
		<dc:creator>Chinmay Chiranjeeb</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[blogger]]></category>
		<category><![CDATA[blogging]]></category>
		<category><![CDATA[customizing]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[template]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.webdevelopmentbits.com/?p=599</guid>
		<description><![CDATA[Google’s Blogger is the eighth most popular site on the entire Web today, and by far the most popular free blogging site.  According to Google, Blogger now hosts over 300 million blogs and publishes 388 million words per day – simply staggering figures.  Let’s look at some of the more compelling reasons for Blogger’s popularity.]]></description>
			<content:encoded><![CDATA[<p>Google’s Blogger is the eighth most popular site on the entire Web today, and by far the most popular free blogging site.  According to Google, Blogger now hosts over 300 million blogs and publishes 388 million words per day – simply staggering figures.  Let’s look at some of the more compelling reasons for Blogger’s popularity.</p>
<ul>
<li>Google’s services are ubiquitous, and you’ve probably already got an account for say, Gmail, Docs, YouTube or Calendar.  So when you land on the Blogger homepage, all you need to do is enter your login info and off you go!  No registration required.</li>
<li>It’s powered by Google, so there’s a better chance of placing high on search engine rankings.  From an SEO/SEM (search engine optimization / search engine marketing) point of view, that’s quite the big deal.</li>
<li>Users can create multiple blogs.  For Web developers or designers with diverse portfolios it’s easier than ever to start your own blogging network.</li>
<li>Blogger has a limited but respectable directory of templates with plenty of options for customization.  Inveterate tweakers should clear the afternoon.</li>
<li>Users can create and configure their own templates for upload, or download an existing template, customize it, then re-upload and use it.</li>
<li>Rather than keeping the off-the-shelf yourname.blogspot.com domain, users can register their own custom domain and point their Blogger page to that.</li>
</ul>
<p>Sure enough, there are plenty of good reasons Blogger’s gained traction the past few years, but it’s become a hell of a crowded field and for anyone looking to grow their audience it’s increasingly hard to stand out.</p>
<p>The fact is, even if you’re posting killer, must-read content you’ve lost the lion’s share of readers before their first click with a page designed from a yawn-inducing Blogger template.</p>
<p>So besides great content, you’re going to want a template with distinctive design. Read on to follow this basic tutorial and create your own fresh Blogger template.</p>
<h2>Create an HTML Template for Your Blog</h2>
<p>Go to the <a href="http://www.blogger.com/">Blogger homepage</a> and log in with your Google info to create a new blog.  With or without a Google account the signup is pretty painless.</p>
<p><a href="http://query7.com/wp-content/uploads/1.png"><img class="aligncenter size-full wp-image-602" title="1" src="http://query7.com/wp-content/uploads/1.png" alt="" width="531" height="178" /></a></p>
<p>If you&#8217;re an existing user, you&#8217;ll also get the status of your current blogs.</p>
<p><a href="http://query7.com/wp-content/uploads/22.png"><img class="aligncenter size-full wp-image-618" title="2" src="http://query7.com/wp-content/uploads/22.png" alt="" width="531" height="115" /></a></p>
<h2>Head to Layout and then Edit HTML</h2>
<p><a href="http://query7.com/wp-content/uploads/3.png"><img class="aligncenter size-full wp-image-604" title="3" src="http://query7.com/wp-content/uploads/3.png" alt="" width="531" height="115" /></a></p>
<p>Developers love code, but sometimes even laymen want a peek under the hood.  If you&#8217;re up for it, just scroll down and click View Classic Template.</p>
<p>Keep in mind that Blogger can only use XML-formatted templates, so you’ll need to create a blank XML file on your hard drive as &lt;Your Template name&gt;.xml.</p>
<p>Now add the following code to your XML document:</p>
<pre>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//ES" "<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd</a>"&gt;
&lt;html xmlns='<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>' xmlns:b='<a href="http://www.google.com/2005/gml/b">http://www.google.com/2005/gml/b</a>' xmlns:data='<a href="http://www.google.com/2005/gml/data">http://www.google.com/2005/gml/data</a>' xmlns:expr='<a href="http://www.google.com/2005/gml/expr">http://www.google.com/2005/gml/expr</a>'&gt;
&lt;head&gt;</pre>
<h2>Let’s start with the Blogger code to add a header element.</h2>
<p>Generally, Blogger code starts with &lt;b:</p>
<pre>&lt;b:include data='blog' name='all-head-content'/&gt;</pre>
<h2>Now we’ll add the title of the blog and post:</h2>
<pre>&lt;title&gt;&lt;data:blog.pageTitle/&gt;&lt;/title&gt;</pre>
<h2>Referencing the blog skin:</h2>
<pre>&lt;b:skin&gt;</pre>
<h2>And template details:</h2>
<pre>&lt;![CDATA[/*
/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Name: MacDevelopmentBits
Blogger template by Sourcebits Technologies
Author: Sourcebits Technologies
Author URL: <a href="http://www.sourcebits.com/">http://www.sourcebits.com</a>
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- */</pre>
<h2>Now let’s hide the default navigation bar.</h2>
<p><a href="http://query7.com/wp-content/uploads/5.png"><img class="aligncenter size-full wp-image-606" title="5" src="http://query7.com/wp-content/uploads/5.png" alt="" width="531" height="31" /></a></p>
<pre>/*-- (Hiding the navbar) --*/
#navbar-iframe {
height:0px;
visibility:hidden;
display:none;
}</pre>
<h2>And add some custom CSS to stylize the blog.</h2>
<pre>/*-- (CSS for Blog ) --*/
body{
font-family:Georgia, "Times New Roman", Times, serif;
font-size:12px;
color:#000000;
margin:0px;
padding:0px;
background:#dedede;
}

:focus {
outline: 0;
}

.clr{
clear:both;
}

.wrap{
margin:0 auto;
padding:0px;
min-width:1200px;
}

.head{
background:#cde3e4 url(your path to header image) repeat-x;
margin-top:-1px;
}

]]&gt;&lt;/b:skin&gt;</pre>
<p>If you don&#8217;t have a domain to host images then you can use Picasa, Flickr or any other image hosting services.  Just make sure that image viewing permissions are set to public.</p>
<h2>To generate feeds and archives for your blog:</h2>
<pre>&lt;script type='text/javascript'&gt;

function rp(json){ document.write(&amp;#39;&amp;lt;ul&amp;gt;&amp;#39;);for(var i=0;i&amp;lt;numposts;i++){document.write(&amp;#39;&amp;lt;li&amp;gt;&amp;#39;);var entry=json.feed.entry[i];var posttitle=entry.title.$t;var posturl;if(i==json.feed.entry.length)break;for(var k=0;k&amp;lt;entry.link.length;k++){if(entry.link[k].rel==&amp;#39;alternate&amp;#39;){posturl=entry.link[k].href;break}}posttitle=posttitle.link(posturl);var readmorelink=&amp;quot;(more)&amp;quot;;readmorelink=readmorelink.link(posturl);var postdate=entry.published.$t;var cdyear=postdate.substring(0,4);var cdmonth=postdate.substring(5,7);var cdday=postdate.substring(8,10);var monthnames=new Array();monthnames[1]=&amp;quot;Jan&amp;quot;;monthnames[2]=&amp;quot;Feb&amp;quot;;monthnames[3]=&amp;quot;Mar&amp;quot;;monthnames[4]=&amp;quot;Apr&amp;quot;;monthnames[5]=&amp;quot;May&amp;quot;;monthnames[6]=&amp;quot;Jun&amp;quot;;monthnames[7]=&amp;quot;Jul&amp;quot;;monthnames[8]=&amp;quot;Aug&amp;quot;;monthnames[9]=&amp;quot;Sep&amp;quot;;monthnames[10]=&amp;quot;Oct&amp;quot;;monthnames[11]=&amp;quot;Nov&amp;quot;;monthnames[12]=&amp;quot;Dec&amp;quot;;if(&amp;quot;content&amp;quot;in entry){var postcontent=entry.content.$t}else if(&amp;quot;summary&amp;quot;in entry){var postcontent=entry.summary.$t}else var postcontent=&amp;quot;&amp;quot;;var re=/&amp;lt;\S[^&amp;gt;]*&amp;gt;/g;postcontent=postcontent.replace(re,&amp;quot;&amp;quot;);document.write(posttitle);if(showpostdate==true)document.write(&amp;#39; - &amp;#39;+monthnames[parseInt(cdmonth,10)]+&amp;#39; &amp;#39;+cdday);if(showpostsummary==true){if(postcontent.length&amp;lt;numchars){document.write(postcontent)}else{postcontent=postcontent.substring(0,numchars);var quoteEnd=postcontent.lastIndexOf(&amp;quot; &amp;quot;);postcontent=postcontent.substring(0,quoteEnd);document.write(postcontent+&amp;#39;...&amp;#39;+readmorelink)}}document.write(&amp;#39;&amp;lt;/li&amp;gt;&amp;#39;)}document.write(&amp;#39;&amp;lt;/ul&amp;gt;&amp;#39;)}

var numposts = 5;
var showpostdate = false;
var showpostsummary = false;
var numchars = 40;

&lt;/script&gt;</pre>
<h2>You can also insert external JavaScript files:</h2>
<pre>&lt;script language='javascript' src='<a href="http://code.jquery.com/jquery-1.4.2.min.js">http://code.jquery.com/jquery-1.4.2.min.js</a>' type='text/javascript'/&gt;
&lt;script type='text/javascript'&gt;
//your code here
&lt;/script&gt;</pre>
<h2>Now let’s replace the default Blogger favicon with a custom jobbie that suits our taste.</h2>
<pre>&lt;link href='path to favicon' rel='shortcut icon' type='favicon'/&gt;
&lt;/head&gt;
&lt;body&gt;</pre>
<h2>Include your HTML code from the blog template created earlier and let’s add a widget to your header.</h2>
<pre>&lt;b:section id='top35' maxwidgets='1' showaddelement='no'&gt;
&lt;b:widget id='Header1' locked='true' title='MacDevelopmentBits (Header)' type='Header'&gt;

&lt;b:includable id='title'&gt;
&lt;A expr:href='data:blog.homepageUrl'&gt;&lt;div class='logo'&gt;&lt;data:title/&gt;&lt;/div&gt;&lt;/A&gt;
&lt;/b:includable&gt;

&lt;b:includable id='description'&gt;
&lt;h1 class='slogan'&gt;&lt;data:description/&gt;&lt;/h1&gt; &lt;!-- It fetches the description from basic settings page. --&gt;
&lt;/b:includable&gt;

&lt;b:includable id='main'&gt;
&lt;div class='slogan1'&gt;
&lt;b:include name='title'/&gt;
&lt;/div&gt;
&lt;b:include name='description'/&gt;
&lt;/b:includable&gt;

&lt;/b:widget&gt;
&lt;/b:section&gt;</pre>
<p>Note that you can use multiple widgets in the template but they should have unique id= &#8216;Your Unique ID&#8217; and maxwidgets=&#8217;No of widgets&#8217;</p>
<h2>Now add navigation:</h2>
<pre>&lt;b:include name='nextprev'/&gt;</pre>
<p>And the conditional statement to show/hide navigation is:</p>
<pre>&lt;b:if cond='data:newerPageUrl'&gt;

&lt;span id='blog-pager-newer-link'&gt;
&lt;a class='blog-pager-newer-link' expr:href='data:newerPageUrl' expr:id='data:widget.instanceId + &amp;quot;_blog-pager-newer-link&amp;quot;' expr:title='data:newerPageTitle'&gt;&lt;data:newerPageTitle/&gt;&lt;/a&gt;
&lt;/span&gt;

&lt;/b:if&gt;
&lt;b:if cond='data:olderPageUrl'&gt;
&lt;span id='blog-pager-older-link'&gt;
&lt;a class='blog-pager-older-link' expr:href='data:olderPageUrl' expr:id='data:widget.instanceId + &amp;quot;_blog-pager-older-link&amp;quot;' expr:title='data:olderPageTitle'&gt;&lt;data:olderPageTitle/&gt;&lt;/a&gt;
&lt;/span&gt;

&lt;/b:if&gt;</pre>
<h2>And include feed links:</h2>
<pre>&lt;b:include name='feedLinks'/&gt;</pre>
<h2>To display content only on the main and archive pages, include this tag with your content:</h2>
<pre>&lt;MainOrArchivePage&gt;
&lt;1-- Your Content for Home and Archive Page--&gt;
&lt;/MainOrArchivePage&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<h2>Phew!  Almost there.  Now after saving the XML file, it’s time to upload to Blogger.</h2>
<p>Back on the Layout tab, under Edit HTML, you’ll find:</p>
<p><a href="http://query7.com/wp-content/uploads/6.png"><img class="aligncenter size-full wp-image-607" title="6" src="http://query7.com/wp-content/uploads/6.png" alt="" width="533" height="33" /></a></p>
<p>After uploading, save the template so now you can edit the file online and preview changes as you go.</p>
<p><a href="http://query7.com/wp-content/uploads/7.png"><img class="aligncenter size-full wp-image-608" title="7" src="http://query7.com/wp-content/uploads/7.png" alt="" width="533" height="45" /></a></p>
<p>And feel free to experiment!  You can always hit the <strong>Clear Edits</strong> button to revert to the last saved version.</p>
<p>Let&#8217;s take a look at an outline of the page elements used in the template:</p>
<p><a href="http://query7.com/wp-content/uploads/8.png"><img class="aligncenter size-full wp-image-609" title="8" src="http://query7.com/wp-content/uploads/8.png" alt="" width="531" height="115" /></a></p>
<p>We can also place widgets with just a few clicks.</p>
<p><a href="http://query7.com/wp-content/uploads/4.png"><img class="aligncenter size-full wp-image-605" title="4" src="http://query7.com/wp-content/uploads/4.png" alt="" width="531" height="178" /></a></p>
<p>Clicking one of the Add a Gadget links drops you into a vast pool of Blogger and third party gadgets. Pick a gadget and add it by clicking the +, however many suit your needs.</p>
<p><a href="http://query7.com/wp-content/uploads/9.png"><img class="aligncenter size-full wp-image-610" title="9" src="http://query7.com/wp-content/uploads/9.png" alt="" width="533" height="180" /></a></p>
<p>And&#8230; VOILA!</p>
<p>Here’s a sample template we did up awhile ago with a basic but unique design, just FYI.</p>
<p style="text-align: center;"><a href="http://macdevelopmentbits.blogspot.com/"><img class="aligncenter size-full wp-image-611" title="10" src="http://query7.com/wp-content/uploads/10.png" alt="" width="531" height="178" /></a></p>
<p><a href="http://macdevelopmentbits.blogspot.com/">http://macdevelopmentbits.blogspot.com/</a></p>
<p>Feel free to drop us a line with any of your Blogger templating issues.  We&#8217;re happy to lend a hand. For that matter, we&#8217;re keen to discuss any Web development projects you&#8217;re interested in.  <a href="http://www.webdevelopmentbits.com/contact">Get in touch</a> any time!</p>
]]></content:encoded>
			<wfw:commentRss>http://query7.com/blogger-template-wizardry/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML Email Compatibility Across Mail Clients</title>
		<link>http://query7.com/html-email-compatibility-across-mail-clients</link>
		<comments>http://query7.com/html-email-compatibility-across-mail-clients#comments</comments>
		<pubDate>Mon, 17 May 2010 00:29:25 +0000</pubDate>
		<dc:creator>Prakash Mohanty</dc:creator>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Mail]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS Table]]></category>
		<category><![CDATA[HTML mail]]></category>
		<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false">http://www.webdevelopmentbits.com/?p=573</guid>
		<description><![CDATA[<p style="text-align: center;"><a href="http://query7.com/wp-content/uploads/Screen-shot-2010-05-17-at-9.20.44-PM.png"><img class="size-full wp-image-578  aligncenter" title="Screen shot 2010-05-17 at 9.20.44 PM" src="http://query7.com/wp-content/uploads/Screen-shot-2010-05-17-at-9.20.44-PM.png" alt="" width="530" height="181" /></a></p>
<p>Lots of compatibility issues occur when HTML developers deal with HTML-formatted emails generated using server side languages like PHP, PERL, JAVA, etc. in their projects.</p>
<p>From time to time you’ll find the odd gobbledygooked message in your Web-based email app, but generally speaking HTML-formatted messages render flawlessly on the Web.  On the other hand, desktop mail clients such as Outlook on Windows, Mail.app on OS X, and the rainbow flavors of desktop Linux (Ubuntu, Centos, and so on) routinely have rendering issues with HTML-based email.</p>
<p>Despite the incredible advances in modern software, why does this continue to happen?</p>
<p>The answer is quite simple: certain mail clients ignore certain HTML tags.  Now there’s no universal rule as to which ignores what, but the more you code the more you’ll learn, so for now let’s take a look at one case with Outlook.</p>
<p>For many users, email ‘stationery’ conjures up late 90s memories of <a href="http://www.incredimail.com/english/splash.aspx">Incredimail</a> and a general, unsavory n00bishness.  But for marketing purposes a well-designed mail template, consisting of a stylish background image, thoughtful font selection, layout and copy equates to sales.  Perhaps thousands of people – from prospective clients to the media – will view mail&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://query7.com/wp-content/uploads/Screen-shot-2010-05-17-at-9.20.44-PM.png"><img class="size-full wp-image-578  aligncenter" title="Screen shot 2010-05-17 at 9.20.44 PM" src="http://query7.com/wp-content/uploads/Screen-shot-2010-05-17-at-9.20.44-PM.png" alt="" width="530" height="181" /></a></p>
<p>Lots of compatibility issues occur when HTML developers deal with HTML-formatted emails generated using server side languages like PHP, PERL, JAVA, etc. in their projects.</p>
<p>From time to time you’ll find the odd gobbledygooked message in your Web-based email app, but generally speaking HTML-formatted messages render flawlessly on the Web.  On the other hand, desktop mail clients such as Outlook on Windows, Mail.app on OS X, and the rainbow flavors of desktop Linux (Ubuntu, Centos, and so on) routinely have rendering issues with HTML-based email.</p>
<p>Despite the incredible advances in modern software, why does this continue to happen?</p>
<p>The answer is quite simple: certain mail clients ignore certain HTML tags.  Now there’s no universal rule as to which ignores what, but the more you code the more you’ll learn, so for now let’s take a look at one case with Outlook.</p>
<p>For many users, email ‘stationery’ conjures up late 90s memories of <a href="http://www.incredimail.com/english/splash.aspx">Incredimail</a> and a general, unsavory n00bishness.  But for marketing purposes a well-designed mail template, consisting of a stylish background image, thoughtful font selection, layout and copy equates to sales.  Perhaps thousands of people – from prospective clients to the media – will view mail on this template and associate it with your corporate brand, so perfection is key.</p>
<p style="text-align: center;"><img class="size-medium wp-image-579   aligncenter" title="Ye Gods!!  Incredimail!!! " src="http://www.webdevelopmentbits.com/wp-content/uploads/2010/05/back1-300x240.gif" alt="" width="248" height="199" /></p>
<p style="text-align: left;">Now let’s focus on the background image.  Many HTML developers will begin by putting CSS styles in the header of the HTML email directly, or when that fails try working around the problem using div tags and inline CSS.  But either way the results are borked.  Why?  Because Outlook ignores the CSS property “background-image”.</p>
<p style="text-align: left;">After so much trial and error, the solution we finally decided on was a pure table-based layout with inline CSS – with the CSS being restricted to each individual table cell since Outlook does not ignore those.  We’ve found this not only renders properly in Outlook, but all the other major desktop and Web clients, too.</p>
<p>And here&#8217;s how good it can look.</p>
<p style="text-align: center;"><a href="http://query7.com/wp-content/uploads/Image-xbox.png"><img class="size-full wp-image-580  aligncenter" title="Image-xbox" src="http://query7.com/wp-content/uploads/Image-xbox.png" alt="" width="539" height="746" /></a></p>
<p>For your reference, here are few examples of HTML tags that are compatible with almost all desktop and Web-based mail clients.</p>
<pre>&lt;table cellspacing="0" cellpadding="0" bgcolor="#6b6f7a"&gt;
    &lt;tr&gt;
        &lt;td width="55" height="53" valign="top"&gt;
            &lt;img src="http://domainname/media/mail/header_01.jpg" alt="" width="78" height="53" /&gt;
        &lt;/td&gt;
        &lt;td style="font-family: Arial,sans-serif;" width="546" bgcolor="#ffffff"&gt;&lt;/td&gt;
        &lt;td style="border-bottom: 1px solid #ffffff; padding: 0pt 15px; background-color: #b6d354; color: #ffffff; text-transform: uppercase; height: 43px; vertical-align: middle; font-size: 12px;"&gt;&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;</pre>
<p>CSS style property -</p>
<pre>word-wrap: break-all;</pre>
<p>With the absence of a background tag, images can be used inside the</p>
<pre>&lt;table&gt;</pre>
<p>and</p>
<pre>&lt;td&gt;</pre>
<p>tags.</p>
<p>Happy HTML email  coding!!</p>
]]></content:encoded>
			<wfw:commentRss>http://query7.com/html-email-compatibility-across-mail-clients/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>No IE6 support on new W3C website?</title>
		<link>http://query7.com/no-ie6-support-on-new-w3c-website</link>
		<comments>http://query7.com/no-ie6-support-on-new-w3c-website#comments</comments>
		<pubDate>Fri, 27 Mar 2009 14:00:59 +0000</pubDate>
		<dc:creator>Dilip Shukla</dc:creator>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[IE6]]></category>
		<category><![CDATA[W3]]></category>
		<category><![CDATA[Web Standards]]></category>

		<guid isPermaLink="false">http://www.webdevelopmentbits.com/?p=445</guid>
		<description><![CDATA[<p><a title="World Wide Web Consortium" href="http://www.w3.org" target="_blank">W3.org</a> is overhauling its website in order to make it more user-friendly and quiet people who used to wonder (including me) why the administrator body of web have such dull, flat, unorganized and old fashioned website?</p>
<p>The new website looks more attractive and organized. 10 minutes tour of new website <a title="10 Minutes Tour of http://beta.w3.org/" href="http://dotsub.com/view/41e149bd-8b98-4103-a9f8-c96787497211" target="_blank">can be found here</a>. In contrast with the previous version, this new website uses rich content presentation, including JavaScript.</p>
<p>The website uses <a title="Download jQuery 1.3.2 from Google Code" href="http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.3.2.min.js" target="_blank">jQuery 1.3.2</a>, a very known and popular JavaScript library, instead of pure JavaScript. This is very good news and a big leap towards streamlining the use of JavaScript frameworks, specially in case of jQuery. In addition of core jQuery framework, <a title="Beta World Wide Web Consortium" href="http://beta.w3.org" target="_blank">beta.w3.org</a> also uses jQuery plugins (e.g.: <a title="jQuery Cycle Plugin" href="http://malsup.com/jquery/cycle/" target="_blank">http://malsup.com/jquery/cycle/</a>), to enhance the user experience.</p>
<p>The biggest news of the day is w3.org beta website doesn&#8217;t render correctly in IE6. It&#8217;s supposed to be a strong argument for web developers in order to inspire and take initiative towards to stop exclusive coding to render their websites correctly in IE6.</p>
<p style="text-align: center;"><img class="size-full wp-image-451 aligncenter" src="http://query7.com/wp-content/uploads/ie6.jpg" alt="" width="500" height="428" /></p>
]]></description>
			<content:encoded><![CDATA[<p><a title="World Wide Web Consortium" href="http://www.w3.org" target="_blank">W3.org</a> is overhauling its website in order to make it more user-friendly and quiet people who used to wonder (including me) why the administrator body of web have such dull, flat, unorganized and old fashioned website?</p>
<p>The new website looks more attractive and organized. 10 minutes tour of new website <a title="10 Minutes Tour of http://beta.w3.org/" href="http://dotsub.com/view/41e149bd-8b98-4103-a9f8-c96787497211" target="_blank">can be found here</a>. In contrast with the previous version, this new website uses rich content presentation, including JavaScript.</p>
<p>The website uses <a title="Download jQuery 1.3.2 from Google Code" href="http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.3.2.min.js" target="_blank">jQuery 1.3.2</a>, a very known and popular JavaScript library, instead of pure JavaScript. This is very good news and a big leap towards streamlining the use of JavaScript frameworks, specially in case of jQuery. In addition of core jQuery framework, <a title="Beta World Wide Web Consortium" href="http://beta.w3.org" target="_blank">beta.w3.org</a> also uses jQuery plugins (e.g.: <a title="jQuery Cycle Plugin" href="http://malsup.com/jquery/cycle/" target="_blank">http://malsup.com/jquery/cycle/</a>), to enhance the user experience.</p>
<p>The biggest news of the day is w3.org beta website doesn&#8217;t render correctly in IE6. It&#8217;s supposed to be a strong argument for web developers in order to inspire and take initiative towards to stop exclusive coding to render their websites correctly in IE6.</p>
<p style="text-align: center;"><img class="size-full wp-image-451 aligncenter" src="http://query7.com/wp-content/uploads/ie6.jpg" alt="" width="500" height="428" /></p>
]]></content:encoded>
			<wfw:commentRss>http://query7.com/no-ie6-support-on-new-w3c-website/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>See, Yes! Yes! – GO</title>
		<link>http://query7.com/see-yes-yes-go</link>
		<comments>http://query7.com/see-yes-yes-go#comments</comments>
		<pubDate>Tue, 09 Dec 2008 21:35:10 +0000</pubDate>
		<dc:creator>Dilip Shukla</dc:creator>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Web Standard]]></category>

		<guid isPermaLink="false">http://www.webdevelopmentbits.com/?p=326</guid>
		<description><![CDATA[Modular CSS needs to be developed and all inherited properties needs to commented within CSS declaration so one don't repeat same CSS again and selectors needs to named by some naming convention (e.g. prefixing every declaration by module).

Modules needs to be devised in such way so it remain plug and play if plugged in different application.]]></description>
			<content:encoded><![CDATA[<h3>ID vs Class Vs Tag Vs Pseudo selectors</h3>
<p>:</p>
<p>All CSS developers know this fact there are verity of CSS selectors, CSS rules can be applied by using any one or combination of available selectors. We can apply CSS rules by inline CSS as value of style attribute of HTML tags or internal CSS by using style tag, or we can go for external style sheet. Inline CSS is bad and must be avoided. Inline style declarations should be limited to for some run time CSS manipulation only.</p>
<p>In summery using external CSS is preferred way, Its success depends on use of inline or internal CSS, since in effectiveness of application of CSS rules hierarchy, inline CSS is topmost level after that comes internal CSS and external CSS comes bellow them.</p>
<p>Same way &#8216;id&#8217; is above &#8216;class&#8217; in hierarchy of effectiveness of CSS selectors. Id can&#8217;t be used more than once in a page (its preferred to use one id for same element throughout application not only withing page).</p>
<p>Rigid element&#8217;s CSS should be served by using &#8216;id&#8217; CSS selectors, which will be used only once e.g. header, footer etc. Elements with dynamic nature having shared or inherited property with possible multiple occurrence need fetch CSS rules by &#8216;class&#8217; selectors.</p>
<p>Use of &#8216;tag&#8217; selectors can be decided by doing some research on default look and feel of elements of application. psudo CSS selectors can be used if backward compatibility with older browsers not needed.</p>
<p>Inheritance playes a great role in  in this that&#8217;s why planning is uttermost important. we should always keep in mind we are just contributing in development of some application which might have multiple developers hence coding must stick to requirements and standards of application so any one can understand and edit code of each other.</p>
<p>Modular CSS needs to be developed and all inherited properties needs to commented within CSS declaration so one don&#8217;t repeat same CSS again and selectors needs to named by some naming convention (e.g. prefixing every declaration by module).</p>
<p>Modules needs to be devised in such way so it remain plug and play if plugged in different application.</p>
<h3>Resources</h3>
<p>:</p>
<ul>
<li><a href="http://www.smashingmagazine.com/2008/11/12/12-principles-for-keeping-your-code-clean/">Make your markup clean</a></li>
<li><a href="http://www.jquery.com">Don&#8217;t fear to java script RIA is future. Jquery might be good place to start (and possibly end of search).</a></li>
<li><a href="http://www.smashingmagazine.com">Keep a tab on latest, fresh and trust worthy tips, tricks, trends, news etc related to web development.</a></li>
<li><a href="http://code.google.com/p/doctype/">Get benefit and give benefit by being active part of revolution in web development. Join the wiki maintained by web developers for web developer from Google. </a></li>
<li><a href="http://www.alistapart.com/">Know more about standards, stick to them and force them upon you, make web development your passion and web standards your religion. </a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://query7.com/see-yes-yes-go/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>See, Yes! Yes! – READY</title>
		<link>http://query7.com/see-yes-yes-ready</link>
		<comments>http://query7.com/see-yes-yes-ready#comments</comments>
		<pubDate>Tue, 28 Oct 2008 15:58:08 +0000</pubDate>
		<dc:creator>Dilip Shukla</dc:creator>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Novice]]></category>
		<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false">http://www.webdevelopmentbits.com/?p=184</guid>
		<description><![CDATA[<p><span>In today&#8217;s web arena, CSS has proved its importance in rigid way. Web content is no more targeted to web browsers only, Web content is been served for a verity of media now days. To efficiently handle such situation CSS plays a very crucial role.</span></p>
<p><span>In order to extract maximum pulp from CSS fruit there are few things needs to keep in mind. Although rule of thumb is efficiency is directly proportional to experience but I&#8217;ll point out few options 3-part post series <a title="See Yes! Yes! -READY" href="http://www.webdevelopmentbits.com/see-yes-yes-ready/">See, Yes! Yes! &#8211; READY</a>,  <a href="http://www.webdevelopmentbits.com/see-yes-yes-steady/">See, Yes! Yes! &#8211; STEADY</a> and </span><a href="http://www.webdevelopmentbits.com/see-yes-yes-go/"><span>See, Yes! Yes! &#8211; GO</span></a>.<span> which can help novice CSS developers to take right diversions. </span></p>
<p><span>All of following points are optional and one can modify them according to needs and/or simply drop the idea.</span></p>
<h3>Big Picture:</h3>
<p>Planning is a must for mid or big projects&#8230;for small projects one can instantly start coding.</p>
<p>While coding for new design, web designer must analyze the design mock-up and slice the design by keeping in mind the facts which are resultant of observation and guideline of website/blog/web application.</p>
<p><strong>e.g.</strong></p>
<ul>
<li>What portion of design mock can be translated by using CSS rules instead</li></ul><p>&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p><span>In today&#8217;s web arena, CSS has proved its importance in rigid way. Web content is no more targeted to web browsers only, Web content is been served for a verity of media now days. To efficiently handle such situation CSS plays a very crucial role.</span></p>
<p><span>In order to extract maximum pulp from CSS fruit there are few things needs to keep in mind. Although rule of thumb is efficiency is directly proportional to experience but I&#8217;ll point out few options 3-part post series <a title="See Yes! Yes! -READY" href="http://www.webdevelopmentbits.com/see-yes-yes-ready/">See, Yes! Yes! &#8211; READY</a>,  <a href="http://www.webdevelopmentbits.com/see-yes-yes-steady/">See, Yes! Yes! &#8211; STEADY</a> and </span><a href="http://www.webdevelopmentbits.com/see-yes-yes-go/"><span>See, Yes! Yes! &#8211; GO</span></a>.<span> which can help novice CSS developers to take right diversions. </span></p>
<p><span>All of following points are optional and one can modify them according to needs and/or simply drop the idea.</span></p>
<h3>Big Picture:</h3>
<p>Planning is a must for mid or big projects&#8230;for small projects one can instantly start coding.</p>
<p>While coding for new design, web designer must analyze the design mock-up and slice the design by keeping in mind the facts which are resultant of observation and guideline of website/blog/web application.</p>
<p><strong>e.g.</strong></p>
<ul>
<li>What portion of design mock can be translated by using CSS rules instead of image?</li>
<li>Whether background is repeating? Design is fixed width or liquid?</li>
<li>What element of design is going to change dimension dynamically?</li>
<li>Re-usability issues needs to be addressed so back-end developer (if any) don&#8217;t face any difficulty to plug reusable components.</li>
<li>Sliced images need to save as optimized for  web, as PNG if element is using alpha transparency and if it uses square shape without tranparency JPG images work better in most cases.</li>
</ul>
<h3>CSS Reset:</h3>
<p>Purpose of using <a title="CSS Reset" href="http://perishablepress.com/press/2007/10/23/a-killer-collection-of-global-css-reset-styles/">CSS Reset</a> is to neutralize default rendering of browser, in order to equalize rendering of web page across different browsers.</p>
<p>Its entirly optional for web developers whether to use one or not. Even if Web Designer is very keen to use one, s/he must consider the big picture where the CSS is going to be used (including some future prediction).</p>
<p>In few cases i prefer not to use CSS reset as in Blogs where content is generated by user and web designer don&#8217;t have exact control over X/HTML tags.<br />
Following is my reset.css. I have cooked this starter dish by borrowing some spices from <a id="yla6" title="here" href="http://perishablepress.com/press/2007/10/23/a-killer-collection-of-global-css-reset-styles/">here</a> and few from experience.</p>
<p><code>/* Common CSS and CSS reset Start */<br />
html, body, div, span, applet, object, iframe, table, caption, tbody, tfoot, thead, tr, th, td,<br />
del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var,<br />
h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code,<br />
dl, dt, dd, ol, ul, li, fieldset, form, label, legend {<br />
vertical-align: baseline;<br />
font-family: inherit;<br />
font-weight: inherit;<br />
font-style: inherit;<br />
font-size: 100%;<br />
outline: 0;<br />
padding: 0;<br />
margin: 0;<br />
border: 0;<br />
}<br />
/* remember to define focus styles! */<br />
:focus {<br />
outline: 0;<br />
}<br />
/*links*/<br />
a{<br />
text-decoration:none;<br />
}<br />
a:hover{<br />
text-decoration:none;<br />
}<br />
/*List*/<br />
ol, ul {<br />
list-style: none;<br />
}<br />
/* tables still need cellspacing="0" in the markup */<br />
table {<br />
border-collapse: separate;<br />
border-spacing: 0;<br />
}<br />
caption, th, td {<br />
font-weight: normal;<br />
text-align: left;<br />
}<br />
/* Common Display Rules*/<br />
.block{<br />
display:block;<br />
}<br />
.none{<br />
display:none;<br />
}<br />
.inline{<br />
display:inline;<br />
}<br />
.clear{<br />
clear:both;<br />
}<br />
.relative{<br />
position:relative;<br />
}<br />
.absolute{<br />
position:absolute;<br />
}<br />
.floatleft{<br />
float:left;<br />
}<br />
.floatright{<br />
float:right;<br />
}<br />
.center_div{<br />
margin:0 auto;<br />
}<br />
.bold{<br />
font-weight:700;<br />
}<br />
.normal{<br />
font-weight:normal !important;<br />
}<br />
.underline, .underline:hover{<br />
text-decoration:underline;<br />
}<br />
/* Headings*/<br />
h1, h2, h3, h4, h5, h6{<br />
font-family:Arial, HelveticaNeue, Helvetica, sans-serif;<br />
font-weight:700;<br />
}<br />
h1{<br />
font-size:18px;<br />
}<br />
h2{<br />
font-size:17px;<br />
}<br />
h3{<br />
font-size:16px;<br />
}<br />
h4{<br />
font-size:14px;<br />
}<br />
h5{<br />
font-size:15px;<br />
}<br />
h6{<br />
font-size:13px;<br />
}<br />
/* Font Size */<br />
.fs8{<br />
font-size:8px;<br />
}<br />
.fs9{<br />
font-size:9px;<br />
}<br />
.fs10{<br />
font-size:10px;<br />
}<br />
.fs11{<br />
font-size:11px;<br />
}<br />
.fs12{<br />
font-size:12px;<br />
}<br />
.fs13{<br />
font-size:13px;<br />
}<br />
.fs14{<br />
font-size:14px;<br />
}<br />
.fs15{<br />
font-size:15px;<br />
}<br />
.fs16{<br />
font-size:16px;<br />
}<br />
.fs17{<br />
font-size:17px;<br />
}<br />
.fs18{<br />
font-size:18px;<br />
}<br />
.fs19{<br />
font-size:19px;<br />
}<br />
.fs20{<br />
font-size:20px;<br />
}<br />
.fs21{<br />
font-size:21px;<br />
}<br />
.fs22{<br />
font-size:22px;<br />
}<br />
.fs23{<br />
font-size:23px;<br />
}<br />
.fs24{<br />
font-size:24px;<br />
}<br />
.fs25{<br />
font-size:25px;<br />
}<br />
.fs26{<br />
font-size:26px;<br />
}<br />
.fs27{<br />
font-size:27px;<br />
}<br />
.fs28{<br />
font-size:28px;<br />
}<br />
.fs29{<br />
font-size:29px;<br />
}<br />
.fs30{<br />
font-size:30px;<br />
}<br />
/* Remove Inherited Style*/<br />
.no_margin{<br />
margin:0 !important;<br />
}<br />
.no_padding{<br />
padding:0 !important;<br />
}<br />
.no_border{<br />
border:none !important;<br />
}<br />
.no_dec{<br />
text-decoration:none !important;<br />
}<br />
/* Common CSS and CSS reset End */</code></p>
<p>Hmm&#8230;I think its a good breakfast.</p>
<p>So guys allow me to take a break&#8230;I&#8217;ll be digging further into CSS mine very soon on my next post <a href="http://www.webdevelopmentbits.com/see-yes-yes-steady/">See, Yes! Yes! &#8211; STEADY</a> .</p>
]]></content:encoded>
			<wfw:commentRss>http://query7.com/see-yes-yes-ready/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

