<?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>Shekhar Govindarajan's Blog &#187; Linux</title>
	<atom:link href="http://www.shekhargovindarajan.com/tag/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.shekhargovindarajan.com</link>
	<description>My Notepad on the Web</description>
	<lastBuildDate>Sat, 04 Feb 2012 04:58:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com/" />
			<item>
		<title>Solved: Setting up D-LINK DWA-525 (RaLink Device 3060) Wireless Desktop PCI Adapter on Fedora 14 Linux</title>
		<link>http://www.shekhargovindarajan.com/tips-n-tricks/solved-setting-up-d-link-dwa-525-ralink-device-3060-wireless-desktop-pci-adapter-on-fedora-14-linux/?&#038;owa_medium=feed&#038;owa_sid=&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=solved-setting-up-d-link-dwa-525-ralink-device-3060-wireless-desktop-pci-adapter-on-fedora-14-linux</link>
		<comments>http://www.shekhargovindarajan.com/tips-n-tricks/solved-setting-up-d-link-dwa-525-ralink-device-3060-wireless-desktop-pci-adapter-on-fedora-14-linux/#comments</comments>
		<pubDate>Sat, 12 Feb 2011 06:06:52 +0000</pubDate>
		<dc:creator>Shekhar</dc:creator>
				<category><![CDATA[Tips N Tricks]]></category>
		<category><![CDATA[802.11n]]></category>
		<category><![CDATA[cnetworkmanager]]></category>
		<category><![CDATA[dlink]]></category>
		<category><![CDATA[dwa525]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[ralink]]></category>

		<guid isPermaLink="false">http://www.shekhargovindarajan.com/?p=2014</guid>
		<description><![CDATA[My new &#8220;desktop grade server machine&#8221; at home has a 802.11n wireless PCI adapter namely D-LINK DWA-525 Wireless N 150 Desktop Adapter.  An adapter like this plugs into one of the PCI slots and connects to a wireless or Wi-Fi network. This helps to keep the machine anywhere in the house and not necessarily near [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_2032" class="wp-caption alignleft" style="width: 310px"><a href="http://www.shekhargovindarajan.com/wp-content/uploads/2011/02/D-Link_DWA-525_Wireless_N_150_Desktop_Adapter1.jpg"><img class="size-medium wp-image-2032" title="D-Link DWA-525 Wireless N 150 Desktop Adapter" src="http://www.shekhargovindarajan.com/wp-content/uploads/2011/02/D-Link_DWA-525_Wireless_N_150_Desktop_Adapter1-300x225.jpg" alt="D-Link DWA-525 Wireless N 150 Desktop Adapter" width="300" height="225" /></a><p class="wp-caption-text">D-Link DWA-525 Wireless N 150 Desktop Adapter</p></div>
<p>My new &#8220;desktop grade server machine&#8221; at home has a 802.11n wireless PCI adapter namely <strong>D-LINK DWA-525 Wireless N 150 Desktop Adapter</strong>.  An adapter like this plugs into one of the PCI slots and connects to a wireless or Wi-Fi network. This helps to keep the machine anywhere in the house and not necessarily near a router or Ethernet port.</p>
<p>On my desktop, I did a minimal or base installation of Fedora 14 Linux. Fedora was not able to recognize the wireless adapter and hence could not connect to the Wi-Fi router at my home. But with some efforts, I was able to make the adapter work on Fedora 14. Additionally, I was also able to configure the wireless adapter from the command line. What follows is a crisp tutorial with the required steps to setup DIR-615 PCI adapter on Linux.</p>
<p><span id="more-2014"></span>The following steps worked on a fresh installation of Fedora 14. While the steps mentioned are specific to <a href="http://fedoraproject.org/get-fedora" target="_blank">Fedora 14</a> , they should work for other flavors of Linux with minor changes. For example, while the method of installing GCC (the C language compiler) may differ, installation of the drivers for the wireless adapter should work as mentioned.</p>
<p><strong>Identify your Wireless adapter </strong><br />
Besides checking out the box and the manual of the wireless adapter, there is another way to identify it. Issue the following command:</p>
<pre>lspci | grep RaLink</pre>
<p>If the output contains something as follows:</p>
<pre>Network controller: RaLink Device 3060</pre>
<p>then this blog post is for you <img src='http://www.shekhargovindarajan.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  But the same steps may work for a few other models (as explained in the section <strong>Download the drivers</strong>).</p>
<p><strong>Install the prerequisites</strong><br />
You will need to install gcc (C compiler) and kernel sources. On Fedora, they can be installed as follows:</p>
<pre>yum install gcc
yum install kernel-devel-`uname -r`</pre>
<p><strong>Download the drivers</strong><br />
Browse to the URL <a href="http://www.ralinktech.com/support.php?s=2">http://www.ralinktech.com/support.php?s=2</a>. Click on the link labeled <strong>RT3062PCI/mPCI/CB/PCIe(RT3060/RT3062/RT3562/RT3592)</strong>.<strong> </strong>Note the label. Besides 3060, it contains other model numbers too. Hence if the lspci command (see above) gives a different (from 3060) number, this blog post may still work for you.</p>
<p>On the subsequent page, type in your name and e-mail and click on the Accept button. This will download a file named DPO_RT3562_3592_3062_LinuxSTA_V2.4.1.1_20101217.tgz. In my case, I downloaded the drivers on my laptop and uploaded it on my desktop machine via SSH. The following steps should be executed on the machine with the wireless PCI adapter. Login as root.</p>
<p><strong>Install the drivers</strong><br />
Extract the downloaded file as:</p>
<pre>tar -zxvf DPO_RT3562_3592_3062_LinuxSTA_V2.4.1.1_20101217.tgz</pre>
<p>This will produce a directory named DPO_RT3562_3592_3062_LinuxSTA_V2.4.1.1_20101217. Open the file named config.mk, found in the directory DPO_RT3562_3592_3062_LinuxSTA_V2.4.1.1_20101217/os/linux/, in a text editor and modify the line:</p>
<pre>HAS_WPA_SUPPLICANT=n</pre>
<p>to</p>
<pre>HAS_WPA_SUPPLICANT=y</pre>
<p>Also change the line which says:</p>
<pre>HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n</pre>
<p>to:</p>
<pre>HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y</pre>
<p>Save the file. Next, change (cd) to the directory DPO_RT3562_3592_3062_LinuxSTA_V2.4.1.1_20101217 and issue the following commands:</p>
<pre>make
make install</pre>
<p>Reboot and voila! The wireless adapter should start working. You should be able to connect to your WiFi router or access point using NetwokManager in GNOME or KDE. In my case, I connected via the command line utility of NetworkManager called cnetworkmanager (as explained in the next section)</p>
<p><strong>Connect to WiFi from the command line</strong><br />
My WiFi router is configured to use WPA or WPA2 authentication as shown in the screenshot below:</p>
<div id="attachment_2029" class="wp-caption alignleft" style="width: 310px"><a href="http://www.shekhargovindarajan.com/wp-content/uploads/2011/02/WPA_settings_on_D-Link-DIR-615_Wireless_N_Router.png"><img class="size-medium wp-image-2029" title="WPA settings on D-Link DIR-615 Wireless N Router" src="http://www.shekhargovindarajan.com/wp-content/uploads/2011/02/WPA_settings_on_D-Link-DIR-615_Wireless_N_Router-300x157.png" alt="WPA settings on D-Link DIR-615 Wireless N Router" width="300" height="157" /></a><p class="wp-caption-text">WPA settings on D-Link DIR-615 Wireless N Router</p></div>
<p>Install cnetworkmanager as:</p>
<pre>yum install cnetworkmanager</pre>
<p>To connect to a wireless router using WPA, append the following lines to the file named rc.local found in /etc directory:</p>
<pre>sleep 5
cnetworkmanager -C &lt;SSID&gt;  --wpa-pass="&lt;WPA-Password&gt;" &amp;</pre>
<p>In the second line, substitute &lt;SSID&gt; with the SSID of your wireless router. Substitute &#8220;&lt;WPA-Password&gt;&#8221; with the password that you have specified in your router for WPA/WPA authentication. For example:</p>
<pre>cnetworkmanager -C SHEKHAR --wpa-pass="secret123" &amp;</pre>
<p>Upon a reboot, the machine should automatically connect to your wireless router. That&#8217;s all folks!</p>
<img src="http://www.shekhargovindarajan.com/?ak_action=api_record_view&id=2014&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.shekhargovindarajan.com/tips-n-tricks/solved-setting-up-d-link-dwa-525-ralink-device-3060-wireless-desktop-pci-adapter-on-fedora-14-linux/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Solved: Images load up partially when served by Apache Web Server</title>
		<link>http://www.shekhargovindarajan.com/tips-n-tricks/solved-images-load-up-partially-when-served-by-apache-web-server/?&#038;owa_medium=feed&#038;owa_sid=&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=solved-images-load-up-partially-when-served-by-apache-web-server</link>
		<comments>http://www.shekhargovindarajan.com/tips-n-tricks/solved-images-load-up-partially-when-served-by-apache-web-server/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 18:00:39 +0000</pubDate>
		<dc:creator>Shekhar</dc:creator>
				<category><![CDATA[Tips N Tricks]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[cifs]]></category>
		<category><![CDATA[enablesendfile]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[nfs]]></category>
		<category><![CDATA[samba]]></category>
		<category><![CDATA[smb]]></category>

		<guid isPermaLink="false">http://www.shekhargovindarajan.com/?p=1647</guid>
		<description><![CDATA[This was a very strange issue which showed up at one of my client&#8217;s Web application. The application is hosted on a Apache Web server and serves JPEG images. These JPEG files reside on a different server and mounted via CIFS (loosely called Samba mount) on the Linux machine running the Web server. Now the [...]]]></description>
			<content:encoded><![CDATA[<p>This was a very strange issue which showed up at one of my client&#8217;s Web application. The application is hosted on a Apache Web server and serves JPEG images. These JPEG files reside on a different server and mounted via CIFS (loosely called Samba mount) on the Linux machine running the Web server.</p>
<p>Now the issue was, many JPEG images, especially the larger ones, loaded up only partially in a Web browser (both Internet Explorer and Firefox). What made them load fully was pressing CTRL+R or clicking on Refresh/Reload several times. Bandwidth wasn&#8217;t an issue here, since this problem occurred even when browsing the JPEGs from the local network.<span id="more-1647"></span></p>
<p>At first, I doubted that it could be an issue with the way the JPEGs are produced, something related to the progressive rendering et al. But then I came across an instance (too involved to explain it here) which proved me wrong.</p>
<p>Testing the case further, I found that the JPEGs load absolutely fine in the Web browser, when opened up via File&gt;Open &#8211; instead of hitting the Web Server. This made me turn my eyes onto the Apache Web server. Googling around and reading the comments in the Apache configuration file gave a few hints. With some hit-n-trial, the solution that worked for me is as follows:</p>
<ul>
<li>Login as root</li>
<li>Open the httpd.conf file (the configuration file of Apache Web server) in a text editor (like vi). On RedHat/Fedora/CentOS Linux, this file can be found in the directory /etc/httpd/conf</li>
<li>Append the following line to the end of the file:
<pre>EnableSendfile off
</pre>
</li>
<li>Save the file.</li>
<li>Reload or restart the web server. On a RedHat/Fedora/CentOS Linux the command &#8216;service httpd reload&#8217; can be used for the same.</li>
</ul>
<p>The EnableSendFile directive in Apache is documented as: &#8220;Control whether the sendfile kernel support is used to deliver files (assuming that the OS supports it). The default is on; turn this off if you serve from NFS-mounted filesystems.&#8221;</p>
<p>What caught my attention was &#8220;turn this off if you serve from NFS-mounted filesystems&#8221;. But, in my case, the JPEG files were mounted via CIFS and not NFS. But reading more about the EnableSendFile directive at <a href="http://httpd.apache.org/docs/2.2/mod/core.html#enablesendfile">http://httpd.apache.org/docs/2.2/mod/core.html#enablesendfile</a>, reveals the it affects even SMB (and hence CIFS) or any other network mounted files. Following is the snippet from the document:</p>
<p><em>With a network-mounted DocumentRoot (e.g., NFS or SMB), the kernel may be unable to serve the network file through its own cache.</em></p>
<p>Also, I guess, this solution is not specific to JPEG files. The above mentioned issue and the solution should be applicable to other file types too, which are served from a network mounted drive.</p>
<img src="http://www.shekhargovindarajan.com/?ak_action=api_record_view&id=1647&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.shekhargovindarajan.com/tips-n-tricks/solved-images-load-up-partially-when-served-by-apache-web-server/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MySQL GUI Tools (Query Browser, Administrator) for Fedora 13</title>
		<link>http://www.shekhargovindarajan.com/open-source/mysql-gui-tools-query-browser-administrator-for-fedora-13/?&#038;owa_medium=feed&#038;owa_sid=&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mysql-gui-tools-query-browser-administrator-for-fedora-13</link>
		<comments>http://www.shekhargovindarajan.com/open-source/mysql-gui-tools-query-browser-administrator-for-fedora-13/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 04:10:06 +0000</pubDate>
		<dc:creator>Shekhar</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Fedora 13]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[mysql administrator]]></category>
		<category><![CDATA[mysql gui tools]]></category>
		<category><![CDATA[mysql query browser]]></category>
		<category><![CDATA[mysql workbench]]></category>
		<category><![CDATA[remi repository]]></category>

		<guid isPermaLink="false">http://www.shekhargovindarajan.com/?p=1604</guid>
		<description><![CDATA[In Fedora Linux, the mysql-gui-tools package provides the graphical (or GUI) clients to query and administer a MySQL database &#8211; useful alternatives to the command line client. While I&#8217;m very comfortable with the mysql command line client, I do switch to the GUI query browser to add/edit stored procedures/functions. &#8220;yum install mysql-gui-tools&#8221; was the simplest [...]]]></description>
			<content:encoded><![CDATA[<p>In <a href="http://fedoraproject.org/" target="_blank">Fedora Linux</a>, the mysql-gui-tools package provides the graphical (or GUI) clients to query and administer a MySQL database &#8211; useful alternatives to the command line client.</p>
<p>While I&#8217;m very comfortable with the mysql command line client, I do switch to the GUI query browser to add/edit stored procedures/functions.</p>
<p>&#8220;yum install mysql-gui-tools&#8221; was the simplest command to install the GUI tools for MySQL in Fedora Linux. But in Fedora 13, this results in &#8220;No package  mysql-gui-tools available&#8221;.</p>
<p>So what happened here?</p>
<p><span id="more-1604"></span><strong> </strong></p>
<p><strong>Why Fedora 13 repositories don&#8217;t have mysql-gui-tools package ?<br />
</strong>The reason for this is explained in a bug report <a href="https://bugzilla.redhat.com/show_bug.cgi?id=573405" target="_blank">here</a>. In a nutshell, the explanation is, the MySQL GUI tools is purposely removed from the Fedora 13 repositories because they have been buggy! Fair enough &#8211; it has crashed on me many a times.</p>
<p>But what is the alternative? The thread in the bug report suggests that it will be replaced with <a href="http://wb.mysql.com/" target="_blank">MySQL Workbench</a>. That&#8217;s great! MySQL Workbench has <a href="http://www.mysql.com/products/workbench/features.html" target="_blank">many more features</a>. So now can I issue a &#8216;yum-install mysql-workbench&#8217; to have it installed on Fedora 13? The answer is no. This is because the bug report sums up with the following note:</p>
<pre>mysql-workbench has not finished its review yet.  this is due to the enormous
amount of work needed as the mysql team follows lots of bad practices.

Until we can cleanly and sanely package mysql-workbench there will be nothing
available on fedora. 

<span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; white-space: normal; font-size: 13px;">The above reply is dated June 17, 2010. A 'no release date' left me desperate to look around (google).</span></pre>
<p><strong>The solution</strong><br />
There is always a solution and Google leads us to it. In a nutshell, I installed MySQL Workbench  from the <a href="http://rpms.famillecollet.com/" target="_blank">Remi repository</a>. A quick install of MySQL Workbench, on Fedora 13, is as follows:</p>
<ul>
<li>Login as root</li>
<li>Open a terminal window in GNOME/KDE or switch to the command line</li>
<li>Issue the command:<em> </em>
<pre><em>rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi </em></pre>
<p><em> </em></li>
<li>Next, issue the command:<em> </em>
<pre><em>yum install http://rpms.famillecollet.com/remi-release-13.rpm</em></pre>
<p><em> </em></li>
<li>Open the file named remi.repo, found in the directory /etc/yum.repos.d, in a text editor (say vi) and change line no. 5 from:<br />
<em> enabled=0 to enabled=1</em><br />
<span style="font-style: normal;">This will enable the [remi] repository.</p>
<p></span></li>
<li>Finally issue:
<pre><em>yum install mysql-workbench</em></pre>
<p>to install MySQL Workbench on Fedora 13.</li>
</ul>
<p>Henceforth, MySQL Workbench can be launched via a terminal window by issuing <em>mysql-workbench</em> or it can be found under Applications &gt;Programming in GNOME.</p>
<img src="http://www.shekhargovindarajan.com/?ak_action=api_record_view&id=1604&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.shekhargovindarajan.com/open-source/mysql-gui-tools-query-browser-administrator-for-fedora-13/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Solved: Garbled text in Putty</title>
		<link>http://www.shekhargovindarajan.com/tips-n-tricks/solved-garbled-text-in-putty/?&#038;owa_medium=feed&#038;owa_sid=&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=solved-garbled-text-in-putty</link>
		<comments>http://www.shekhargovindarajan.com/tips-n-tricks/solved-garbled-text-in-putty/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 07:19:17 +0000</pubDate>
		<dc:creator>Shekhar</dc:creator>
				<category><![CDATA[Tips N Tricks]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[gallery link=]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Microsoft Windows]]></category>
		<category><![CDATA[ncurses]]></category>
		<category><![CDATA[putty]]></category>
		<category><![CDATA[Secure Shell]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[utf8]]></category>

		<guid isPermaLink="false">http://www.shekhargovindarajan.com/?p=1426</guid>
		<description><![CDATA[Putty is a popular and free Linux terminal/shell client for Windows. It allows one to connect to a Linux server using SSH (Secure Shell) or Telnet. I have been using it for as long as I can recall. But this issue of garbled text in Putty is what I have been ignoring, until yesterday. Yesterday, I had [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/" target="_blank">Putty</a> is a popular and free Linux terminal/shell client for Windows. It allows one to connect to a Linux server using SSH (Secure Shell) or Telnet. I have been using it for as long as I can recall. But this issue of garbled text in Putty is what I have been ignoring, until yesterday.</p>
<p>Yesterday, I had setup <a href="http://en.wikipedia.org/wiki/Paradox_(database)" target="_blank">Paradox</a> database using <a href="http://www.dosemu.org/" target="_blank">DOSEMU</a> on Linux, for a client. On Putty, the Paradox interface showed garbled making it unusable for the client. My instant suspect was DOSEMU. A quick check revealed that it&#8217;s happening with other apps too - those with a <a href="http://en.wikipedia.org/wiki/Ncurses" target="_blank">ncurses</a> or text based user interface.<span id="more-1426"></span>For example: The garbled text, around the borders of UI elements, showed in ntsysv (as shown in the screenshots). ntsysv is a nifty console app, found in RedHat/CentOS/Fedora Linux, to start services during boot up.
<a href='http://www.shekhargovindarajan.com/tips-n-tricks/solved-garbled-text-in-putty/attachment/before-ntsysv-showing-garbled-text-in-putty/' title='Before - ntsysv showing garbled text in Putty'><img width="150" height="150" src="http://www.shekhargovindarajan.com/wp-content/uploads/2010/03/Before-ntsysv-showing-garbled-text-in-Putty-150x150.png" class="attachment-thumbnail" alt="Before - ntsysv showing garbled text in Putty" title="Before - ntsysv showing garbled text in Putty" /></a>
<a href='http://www.shekhargovindarajan.com/tips-n-tricks/solved-garbled-text-in-putty/attachment/putty-settings-to-fix-garbled-text/' title='Putty settings to fix garbled text'><img width="150" height="150" src="http://www.shekhargovindarajan.com/wp-content/uploads/2010/03/Putty-settings-to-fix-garbled-text-150x150.png" class="attachment-thumbnail" alt="Putty settings to fix garbled text" title="Putty settings to fix garbled text" /></a>
<a href='http://www.shekhargovindarajan.com/tips-n-tricks/solved-garbled-text-in-putty/attachment/after-ntsysv-after-the-change-in-settings-in-putty/' title='After - ntsysv after the change in settings in Putty'><img width="150" height="150" src="http://www.shekhargovindarajan.com/wp-content/uploads/2010/03/After-ntsysv-after-the-change-in-settings-in-Putty-150x150.png" class="attachment-thumbnail" alt="After - ntsysv after the change in settings in Putty" title="After - ntsysv after the change in settings in Putty" /></a>
</p>
<p><strong>The Solution<br />
</strong>Launch Putty. On the Category pane (on the left), click on Windows&gt;Translation. For the dropdown labeled &#8220;Received data assumed to be in which character set&#8221;, select UTF-8. To save this setting, click on Sessions (in the Category pane). On the right pane, select &#8220;Default Settings&#8221; and click on the button labeled Save. This is what worked for me with Putty version 0.60.</p>
<img src="http://www.shekhargovindarajan.com/?ak_action=api_record_view&id=1426&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.shekhargovindarajan.com/tips-n-tricks/solved-garbled-text-in-putty/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Web Scraping with Firefox and PHP, using XPath</title>
		<link>http://www.shekhargovindarajan.com/scripts/web-scraping-with-firefox-and-php-using-xpath/?&#038;owa_medium=feed&#038;owa_sid=&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=web-scraping-with-firefox-and-php-using-xpath</link>
		<comments>http://www.shekhargovindarajan.com/scripts/web-scraping-with-firefox-and-php-using-xpath/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 02:00:58 +0000</pubDate>
		<dc:creator>Shekhar</dc:creator>
				<category><![CDATA[Scripts]]></category>
		<category><![CDATA[automated]]></category>
		<category><![CDATA[automated Web scrapping]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[external tools]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[firebug]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[firexpath]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[PHP programmer]]></category>
		<category><![CDATA[regex]]></category>
		<category><![CDATA[regular expressions]]></category>
		<category><![CDATA[scheduler]]></category>
		<category><![CDATA[screen scraping]]></category>
		<category><![CDATA[tidy]]></category>
		<category><![CDATA[Tidy library]]></category>
		<category><![CDATA[Use Curl library]]></category>
		<category><![CDATA[web browser]]></category>
		<category><![CDATA[Web page lie]]></category>
		<category><![CDATA[Web scarping]]></category>
		<category><![CDATA[web scraping]]></category>
		<category><![CDATA[well-formed Web page An XPath expression]]></category>
		<category><![CDATA[well-formed Web page content]]></category>
		<category><![CDATA[well-formed Web pages]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[xpath]]></category>

		<guid isPermaLink="false">http://www.shekhargovindarajan.com/?p=968</guid>
		<description><![CDATA[Last year, I faced two projects which required automated Web scrapping &#8211; to aggregate content from web pages. I evaluated different methods for Web scraping with varied level of success. Thanks to the changing structure of Web pages, non well-formed pages and URL redirects. Amongst using regular expressions and DOM (Document Object Model) parsing, I [...]]]></description>
			<content:encoded><![CDATA[<p>Last year, I faced two projects which required automated Web scrapping &#8211; to aggregate content from web pages. I evaluated different methods for Web scraping with varied level of success. Thanks to the changing structure of Web pages, non well-formed pages and URL redirects.</p>
<p>Amongst using regular expressions and DOM (Document Object Model) parsing, I used XPath too. XPath works great for well-formed Web pages. <span id="more-968"></span>A HTML Web page is called well-formed when all the opening tags have corresponding closing tags and the tags are nested properly (refer to <a href="http://en.wikipedia.org/wiki/Well-formed_element" target="_blank">this link</a> for more). A well-formed HTML page is also called an XHTML page.</p>
<p>XPath is a query language to access content on a well formed page &#8211; XHTML or XML. All the content in a Web page lie within HTML elements or tag pairs. The following is needed to extract out the content, of interest, using XPath from a Web page:</p>
<ol>
<li>A well-formed Web page</li>
<li>An XPath expression for the HTML element of interest</li>
<li>XPath query using the expression</li>
</ol>
<p>An XPath expression looks as cryptic as  .//*[@id='home_featured']/div. Here is where Firefox web browser with a plugin called FireXPath comes to help (as explained below). The second and third requirements are met by PHP (in my case) which is used for automated Web scrapping using the XPath expression.</p>
<p><strong>Click and build XPath expressions<br />
</strong>Building the cryptic XPath expression is easy and intuitive with Firefox and a couple of its plugins &#8211; namely Firebug and FireXPath. Install Firebug from <a href="https://addons.mozilla.org/en-US/firefox/addon/1843" target="_blank">here</a>, followed by FireXPath from <a href="https://addons.mozilla.org/en-US/firefox/addon/11900" target="_blank">here</a> and restart Firefox. As of this writing, I&#8217;m using the following versions of Firefox and the plugins:</p>
<ul>
<li>Firefox 3.5.6</li>
<li>Firbug 1.4.5</li>
<li>FireXPath 0.9.1</li>
</ul>
<p>After, the Firefox restart, browse to the Web page of your interest. Next:</p>
<ul>
<li>Launch Firebug by clicking on the bug like icon on the right corner of the status bar.</li>
<li>Click on the tab named XPath (in FireBug)</li>
<li>Click on the arrow (blue arrow) and move your mouse over the content, of interest, on the web page</li>
<li>Once the required chunk is highlighted (with a blue border), note down the XPath expression in the textfield.</li>
</ul>
<p>For example, the screenshot below, shows the XPath expression (.//*[@id='home_featured']/div  ) for the &#8220;Featured Post&#8221; chunk, on the home page, of this blog:</p>
<div id="attachment_974" class="wp-caption alignleft" style="width: 310px"><a href="http://www.shekhargovindarajan.com/wp-content/uploads/2010/01/XPath-Expression-With-FireXPath.png"><img class="size-medium wp-image-974   " style="display: block;" title="With FireXPath, point your mouse on the chunk/element of interest, to build an XPath expression" src="http://www.shekhargovindarajan.com/wp-content/uploads/2010/01/XPath-Expression-With-FireXPath-300x284.png" alt="With FireXPath, point your mouse on the chunk/element of interest, to build an XPath expression" width="300" height="284" /></a><p class="wp-caption-text">With FireXPath, point your mouse on the chunk/element of interest, to build an XPath expression</p></div>
<p>A few examples of XPath expressions:</p>
<ul>
<li>.//*[@id='latest_post']/span[1] : The posted and modified dates of the latest post on this blog &#8211; http://www.shekhargovindarajan.com</li>
<li>.//*[@id='top-stories']/div[1]/h2/a : The headline of the top story on Google News &#8211; http://news.google.com</li>
<li>.//*[@id='mp-tfa']/p[1] : Contents of featured article on Wikipedia &#8211; http://en.wikipedia.org/wiki/Main_Page</li>
</ul>
<p><strong>Automated scarping using PHP<br />
</strong>With the XPath expression in hand, a PHP script as follows, can extract out the required content from the Web page:</p>
<pre>&lt;?php

class WebScrap
	{
	private $url;
	private $xpath;

	public function WebScrap($url,$xpath)
		{
		$this-&gt;url = $url;
		$this-&gt;xpath = $xpath;
		}

	public function GetScrap()
		{
		// use Tidy to try to make the page well formed
		$page = $this-&gt;TidyIt($this-&gt;url);

		// create a document out of the well formed content
		$domDocument=new DOMDocument();
		$domDocument-&gt;loadHTML($page);

		// create an XPath object out of the document and query it for the supplied xpath
		$domXPath = new DOMXPath($domDocument);
		$domNodeList = $domXPath-&gt;query($this-&gt;xpath);

		// Get the content (HTML) out of the NodeList returned by the DOMXPath::query
		$content = $this-&gt;GetHTMLFromNodeList($domNodeList);

		return $content;
		}

	private function TidyIt($url)
		{
		$tidy = new tidy();
		$tidy-&gt;parseFile($url);
		$tidy-&gt;cleanRepair();
		return $tidy;
		}

	private function GetHTMLFromNodeList($domNodeList)
		{
		$domDocument = new DOMDocument();

		$node = $domNodeList-&gt;item(0);   

		foreach($node-&gt;childNodes as $childNode)
			$domDocument-&gt;appendChild($domDocument-&gt;importNode($childNode, true));

		return $domDocument-&gt;saveHTML();
		}

	}

?&gt;</pre>
<p>Note that, the function/method called GetScrap( ) of the WebScrap PHP class first calls the TidyIt( ) method. This function uses the <a href="http://en.wikipedia.org/wiki/HTML_Tidy" target="_blank">Tidy</a> library to fix (if required) the HTML for well-formedness. The PHP class for Tidy is used to fetch the web page via the given URL and repair it. Henceforth the DomXPath object is used to query the well-formed Web page content for the XPath expression.</p>
<p>To use the above code, you will need to install PHP modules for XML and Tidy. On a RedHat/CentOS/Fedora Linux machine, these modules can be installed using the following command:</p>
<pre>yum install php-xml php-tidy</pre>
<p>Save the above code in a file named class.WebScrap.php (say). Subsequently, the WebScrap class can be used as:</p>
<pre>&lt;?php

include("class.WebScrap.php");
$scrap = new WebScrap("http://news.google.com",".//*[@id='top-stories']/div[1]/h2/a");
print($scrap-&gt;GetScrap());

?&gt;</pre>
<p>The code should be self explanatory for a seasoned PHP programmer. If not, shoot your questions via comments to this post. For repeated and automated Web scarping, a scheduler like Cron can be used to execute the above PHP script at regular intervals and fetch the latest content.</p>
<p><strong>The Leftovers<br />
</strong>The code above is readable, crisp and focusses on the subject. For this reason, it has deliberate exclusions.  In a real world application, you should:</p>
<ul>
<li>Use <a href="http://php.net/manual/en/book.curl.php" target="_blank">Curl</a> library in PHP  or external tools like <a href="http://en.wikipedia.org/wiki/Wget" target="_blank">Wget</a> to fetch the URL. Then pass on the fetched content to Tidy. Hint: use the  parseString( ) of Tidy instead of parseFile( )</li>
<li>Handle errors in case of errors in Tidy and XPath.</li>
<li>Fallback to other means (say regular expressions) in case of errors in Tidy or XPath querying</li>
</ul>
<p>Note that XPath may not always give you the structured content that you desire. For example, using the expression .//*[@id='latest_post']/span[1] (for posted and modified dates of the latest post on this blog) will result into something as follows:</p>
<pre>&lt;strong&gt;Posted on:&lt;/strong&gt;
January 8, 2010
&lt;span class="dot"&gt;⋅&lt;/span&gt;
&lt;strong&gt;Last modified:&lt;/strong&gt;
January 8, 2010 @ 4:49 pm</pre>
<p>So there are tags and text (like &#8220;Posted on:&#8221; and &#8220;Last modified:&#8221;) to be stripped out, to get the posted date (January 8, 2010) and the modified date (January 8, 2010 @ 4:49 pm). For this, you may still have to use regular expressions and/or string manipulation functions like split( ).</p>
<img src="http://www.shekhargovindarajan.com/?ak_action=api_record_view&id=968&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.shekhargovindarajan.com/scripts/web-scraping-with-firefox-and-php-using-xpath/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>My list of must-have Android apps</title>
		<link>http://www.shekhargovindarajan.com/google/my-list-of-must-have-android-apps/?&#038;owa_medium=feed&#038;owa_sid=&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=my-list-of-must-have-android-apps</link>
		<comments>http://www.shekhargovindarajan.com/google/my-list-of-must-have-android-apps/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 17:15:42 +0000</pubDate>
		<dc:creator>Shekhar</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[3G]]></category>
		<category><![CDATA[address search]]></category>
		<category><![CDATA[adp1]]></category>
		<category><![CDATA[Amsterdam]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[android dev phone 1]]></category>
		<category><![CDATA[android-wifi-tether]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[bluerss]]></category>
		<category><![CDATA[Bluetooth]]></category>
		<category><![CDATA[car mode]]></category>
		<category><![CDATA[CEO]]></category>
		<category><![CDATA[cyanogen]]></category>
		<category><![CDATA[Delhi]]></category>
		<category><![CDATA[driver]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[GPS]]></category>
		<category><![CDATA[Hennie J.M. Groot Koerkamp]]></category>
		<category><![CDATA[htc]]></category>
		<category><![CDATA[india]]></category>
		<category><![CDATA[Internet connection]]></category>
		<category><![CDATA[Internet Connection Sharing]]></category>
		<category><![CDATA[Internet tethering]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPod]]></category>
		<category><![CDATA[Kenya]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MAC address]]></category>
		<category><![CDATA[Microsoft Windows]]></category>
		<category><![CDATA[Morocco]]></category>
		<category><![CDATA[Motorola]]></category>
		<category><![CDATA[Nav4all]]></category>
		<category><![CDATA[Nav4All BV]]></category>
		<category><![CDATA[navigation supplier]]></category>
		<category><![CDATA[Navteq]]></category>
		<category><![CDATA[New Delhi]]></category>
		<category><![CDATA[Notification bar]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[rss reader]]></category>
		<category><![CDATA[Samsung]]></category>
		<category><![CDATA[Seesmic]]></category>
		<category><![CDATA[SMS]]></category>
		<category><![CDATA[Sony Ericsson]]></category>
		<category><![CDATA[speaker]]></category>
		<category><![CDATA[speaker phone]]></category>
		<category><![CDATA[Swift]]></category>
		<category><![CDATA[tethering]]></category>
		<category><![CDATA[The Netherlands]]></category>
		<category><![CDATA[the Philippines]]></category>
		<category><![CDATA[Tracking & Tracing]]></category>
		<category><![CDATA[TweetsRide]]></category>
		<category><![CDATA[Twidgit]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[TwitterRide]]></category>
		<category><![CDATA[USB]]></category>
		<category><![CDATA[WEP]]></category>
		<category><![CDATA[Wi-Fi]]></category>
		<category><![CDATA[wifi]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[Wireless Access]]></category>
		<category><![CDATA[Wireless Access Point]]></category>
		<category><![CDATA[www.nav4all.com]]></category>
		<category><![CDATA[www.nav4all.com/support]]></category>

		<guid isPermaLink="false">http://www.shekhargovindarajan.com/?p=1010</guid>
		<description><![CDATA[Ever since I ordered and got my Android Dev Phone 1 (a.k.a. ADP1), I have been taking it through various updates. The phone shipped with Android version 1.0 and upgraded to version 1.6. After 1.6, I opted to go for ROMs from CynaogenMod. Each time, I upgrade my phone, I wipe off its data. This [...]]]></description>
			<content:encoded><![CDATA[<p>Ever since I <a href="http://www.shekhargovindarajan.com/google/anroid-to-india-a-shipping-faq/" target="_blank">ordered</a> and got my Android Dev Phone 1 (a.k.a. ADP1), I have been taking it through various updates. The phone shipped with Android version 1.0 and upgraded to version 1.6. After 1.6, I opted to go for ROMs from <a href="http://www.cyanogenmod.com/" target="_blank">CynaogenMod</a>.</p>
<p>Each time, I upgrade my phone, I wipe off its data. This is because I took the upgrades as an opportunity to wipe off applications which I install, but do not use or use occasionally. But, following is the list of Android applications which I crave to install after each wipe off. These applications are my must-haves on my Android phone.<span id="more-1010"></span></p>
<p><strong>1. android-wifi-tether<br />
</strong>A computer or PC/Laptop can be connected to a phone via USB, Bluetooth or Wi-Fi to use the phone&#8217;s Internet connection &#8211; typically GPRS/EDGE/3G. This kind of connection sharing (with the phone) is called tethering. ADP1 does not ship with tethering capabilities. But thanks to the android-wifi-tether app which can be found <a href="http://code.google.com/p/android-wifi-tether/" target="_blank">here</a>. Don&#8217;t go by the &#8220;Wifi&#8221; in the app&#8217;s name. It supports tethering through Bluetooth too. I have used tethering via Wifi, till I switched to CyanogenMod (see below). Once installed, it turns your phone into a Wi-Fi ad-hoc point! Think about it as a Wireless Access Point. Therefore, no hassle of downloading drivers to connect to it from a laptop.</p>
<div id="attachment_1017" class="wp-caption alignleft" style="width: 210px"><a href="http://www.shekhargovindarajan.com/wp-content/uploads/2010/01/Android-Wifi-Tether.png"><img class="size-medium wp-image-1017" title="Android Wifi Tether" src="http://www.shekhargovindarajan.com/wp-content/uploads/2010/01/Android-Wifi-Tether-200x300.png" alt="Android Wifi Tether app for phone's Internet connection sharing via Wifi/Bluetooth" width="200" height="300" /></a><p class="wp-caption-text">android-wifi-tether app for phone&#39;s Internet connection sharing via Wifi/Bluetooth</p></div>
<p><em><strong><br />
</strong></em> Features:</p>
<ul>
<li>Tethering through Wi-Fi and Bluetooth</li>
<li>Access control based on MAC address. Notification, about connecting clients, on the phone&#8217;s notification bar &#8211; with sound.</li>
<li>128-bit WEP (Wired Equivalent Privacy)</li>
</ul>
<p>Pros:</p>
<ul>
<li>Behaves as a Wi-Fi ad-hoc point. This means, typically, no configuration/driver hassles on a PC/Laptop.</li>
<li>MAC address based access control.</li>
<li>Lots of configuration options for Wi-Fi, like SSID, channel, IP range etc.</li>
</ul>
<p>Cons:</p>
<ul>
<li>Requires ROM update (a kernel update)</li>
</ul>
<div id="attachment_1015" class="wp-caption alignleft" style="width: 210px"><a href="http://www.shekhargovindarajan.com/wp-content/uploads/2010/01/Android_USB_Tethering.png"><img class="size-medium wp-image-1015 " title="Android_USB_Tethering" src="http://www.shekhargovindarajan.com/wp-content/uploads/2010/01/Android_USB_Tethering-200x300.png" alt="Go to Settings&gt;Wireless controls and check Internet tethering. Works with CyanogenMod Android ROMs" width="200" height="300" /></a><p class="wp-caption-text">Go to Settings&gt;Wireless controls and check Internet tethering. Works with CyanogenMod Android ROMs</p></div>
<p>I no longer use android-wifi-tether &#8211; after flashing my phone with  CyanogenMod. With Cyanogen ROMs, the capability to tether via USB is built-in. USB tethering works both on Linux and Windows &#8211; I have it working on Fedora 12 Linux and Windows 7. android-wifi-tether works with the CyanogenMod (version 4.2.13, as of this wiring) without requiring the kernel update. But you will need to download and install the app from <a href="http://android-wifi-tether.googlecode.com/files/signed_andTether_1_60_pre1.apk" target="_blank">here</a>. With android-wifi-tether and CyanogenMod, you may like to enjoy the flexibility of tethering through USB, Wi-Fi and Bluetooth! Though, I&#8217;m my happy self with USB tethering.</p>
<p><strong> 2. BlueRSS<br />
</strong>Once I discovered this free RSS reader named BlueRSS, from the Android Market, I never felt the need to look for an alternative. Lots of features, yet fast and responsive. This is what sets this app apart, for my daily routine, to check out the tech world through RSS feeds. I&#8217;m using version 3.0.1 of BlueRSS, as of this writing.</p>
<div id="attachment_1021" class="wp-caption alignleft" style="width: 210px"><a href="http://www.shekhargovindarajan.com/wp-content/uploads/2010/01/BlueRSS_RSS_Reader_for_Android.png"><img class="size-medium wp-image-1021" title="BlueRSS_RSS_Reader_for_Android" src="http://www.shekhargovindarajan.com/wp-content/uploads/2010/01/BlueRSS_RSS_Reader_for_Android-200x300.png" alt="BlueRSS: A fast and feature rich RSS reader for Android phones" width="200" height="300" /></a><p class="wp-caption-text">BlueRSS: A fast and feature rich RSS reader for Android phones</p></div>
<p>Features:<em><strong><br />
</strong></em></p>
<ul>
<li>Discover RSS feeds on Websites or using keywords</li>
<li>Exports feeds to OPML, opens GMail (or the default mail client) with the OPML file attached, to send.</li>
<li>Automatic background update</li>
<li>Ability to refresh all feeds as well as individual feeds</li>
<li>Add feed items to Favourites</li>
<li>Full screen mode</li>
</ul>
<p>Pros:</p>
<ul>
<li>Fast and responsive. Don&#8217;t remember if I ever had to &#8220;Force Close&#8221; it</li>
<li>Import from Google reader</li>
</ul>
<p>Cons:<strong><br />
</strong></p>
<ul>
<li>No feed categories</li>
<li>The feed item&#8217;s description/summary does not open in landscape mode.</li>
</ul>
<p><strong>3. Twidroid (free version)<br />
</strong>This app does not require an introduction to Android users. It is undoubtedly the best Twitter client for Android. I started with using Twidroid as the Twitter client on my Android phone. I switched to numerous other Twitter apps to check out the alternatives. I tried Swift, Seesmic, Twidgit and TwitterRide (now called TweetsRide). But I kept coming back to Twidroid and have settled down to it. Twidroid is available from the Android Market and I&#8217;m using version 3.0.9.</p>
<div id="attachment_1040" class="wp-caption alignleft" style="width: 210px"><a href="http://www.shekhargovindarajan.com/wp-content/uploads/2010/01/Twidroid_Twitter_Client_for_Android.png"><img class="size-medium wp-image-1040" title="Twidroid_Twitter_Client_for_Android" src="http://www.shekhargovindarajan.com/wp-content/uploads/2010/01/Twidroid_Twitter_Client_for_Android-200x300.png" alt="Twidroid: The feature-rich Twitter client for Andorid" width="200" height="300" /></a><p class="wp-caption-text">Twidroid: The feature-rich Twitter client for Andorid</p></div>
<p>Features</p>
<ul>
<li>Supports Twitter lists and the new Retweet feature (or API) of Twitter</li>
<li>Ability to upload photos</li>
<li>Twitter Trends, Search and Favorites</li>
<li>Built it browser to open URLs</li>
<li>Options to choose a preferred URL shortening service and image upload service</li>
<li>Built-in profile browser with option to follow/unfollow</li>
<li>Autocomplete of Twitter usernames while Reply-ing or Direct Message</li>
<li>Share Tweets via Email, SMS and Bluetooth</li>
<li>Stores data on the SD card</li>
</ul>
<p>Pros</p>
<ul>
<li>Fast and responsive UI</li>
<li>One touch access to most functions like Reply, Direct Message and Retweet</li>
<li>New tweets notification, with the Tweets&#8217; text, in the Notification bar of the phone.</li>
<li>Automatically shortens the URLs</li>
<li>Remembers the scroll position with an option to jump to the latest Tweet</li>
<li>Frequent new releases.</li>
</ul>
<p>Cons</p>
<ul>
<li>Features like widgets, video and multiple accounts available only in the Pro version</li>
</ul>
<p><strong>4. Nav4All</strong><br />
I have been living in New Delhi, India for 31 years. But Connaught Place a.k.a. CP is a place where I always lose my way to the destination and back home. Thanks to the large number of roundabouts. I recall driving for more than a hour in CP to figure out my way. That&#8217;s when I desperately started looking for a navigation app for my GPS capable Android phone. Nav4All is what I got and what I use. It works great for the Delhi roads. Nav4All is available in the Android Market and I&#8217;m using version 9.0.25. To be true, I haven&#8217;t used all its features. Yet following is the jot down of the features that I see on the application&#8217;s screen:</p>
<div id="attachment_1057" class="wp-caption alignleft" style="width: 210px"><a href="http://www.shekhargovindarajan.com/wp-content/uploads/2010/01/Nav4All.png"><img class="size-medium wp-image-1057" title="Nav4All: A simple and free app that works for turn-by-turn voice based navigation" src="http://www.shekhargovindarajan.com/wp-content/uploads/2010/01/Nav4All-200x300.png" alt="Nav4All: A simple and free app that works for turn-by-turn voice based navigation" width="200" height="300" /></a><p class="wp-caption-text">Nav4All: A simple and free app that works for turn-by-turn voice based navigation</p></div>
<p>Features</p>
<ul>
<li>A huge list of countries</li>
<li>Option of large number of voices (for turn-by-turn navigation)</li>
<li>Can pick addresses from the phone&#8217;s contacts</li>
<li>View route to destination with turn by turn textual instructions and on the map</li>
<li>Details like distance, driving speed and journey time</li>
<li>&#8220;Start follow me&#8221; feature to trace your current route</li>
<li>Alternate routes</li>
</ul>
<p>Pros</p>
<ul>
<li>Free</li>
<li>Precise, numbered, exit points on roundabouts</li>
<li>Works in New Delhi, India</li>
<li>Narrows down to the building name!</li>
</ul>
<p>Cons</p>
<ul>
<li>Bad user interface, looks like wireframes</li>
<li>Buggy with the hardware keyboard of ADP1</li>
<li>Address search asks for too many details</li>
<li>Not so good looking map</li>
</ul>
<p>I haven&#8217;t been able to use the address search for Nav4All. It asks for too many details &#8211; upto the house number. The best way I use Nav4All is to record the destination coordinates &#8211; when I somehow reach the destination for the first time. On the contrary, Nav4All amazed me by telling the name of a client&#8217;s office building &#8211; located in the midest of a large number of houses.</p>
<p>Note that the Nav4All <a href="http://www.nav4all.com/" target="_blank">website</a> hints that the app will remain free until 1st Jan 2010. But I have been using it for free, on my Android phone, till now. Hope it continues to remain free.</p>
<p><strong>5. Car Mode<br />
</strong>How many times it has happened, that, while driving you get a phone call. You, then, struggle to put the phone on the speaker phone mode. Car Mode is a nifty app which when clicked, places itself on the phone&#8217;s notification bar. Subsequently, it automatically enables the speaker phone for subsequent calls. Car Mode can be disabled by clicking on its icon on the notification bar. It can be downloaded from the Android Market. I&#8217;m using version 1.2.0 of this app.</p>
<p>Pros</p>
<ul>
<li>A simple and free app which works!</li>
</ul>
<p>Cons</p>
<ul>
<li>It&#8217;s encourages to attend phone calls which driving <img src='http://www.shekhargovindarajan.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </li>
</ul>
<p>That&#8217;s all folks. Five must have Android apps that I live with. Note that this list does not include the built-in apps &#8211; like GMail, Calendar, Contacts, etc &#8211; else GMail will Gmail Push (instant push E-mail) is my most used app. Will keep this blog post updated with any future must-have apps which I get used to.</p>
<p><strong>Update (February 2, 2010):</strong> I said above that Nav4All may become paid, but the latest update is worse. Got an E-mail announcing that  Nav4All will be discontinued.  Following is the exact copy of the E-mail as sent by CEO of Nav4All:</p>
<p><em><strong>Subject: Nav4All navigation shut down by Navteq</strong></em></p>
<pre>Amsterdam, The Netherlands, 28-01-2010 16:30 GMT+1

Subject: Nav4All navigation shut down by Navteq

Letter to 27,625,631 Nav4All navigation customers

Dear Customers,

It is with the deepest regret that we hereby notify you that the
global navigation of Nav4All and the Tracking &amp; Tracing will go
offline in 3 days. The reason for the same is that the data licence
agreement with Navteq (a 100% Nokia subsidiary) was not extended, in
a totally unexpected manner. It is not possible to implement data
from another supplier in our Nav4All systems within the short term.
The Nav4All navigation system was developed for Navteq data. Nav4All
has therefore been constrained to stop.

We greatly regret the fact that we have to suspend the operation of
our service. With your help, we have developed Nav4All into a global
product with 27.5 million users in 56 languages, in 5 years. This has
made Nav4All the largest navigation supplier. This large number of
users also has to do with the fact that Nav4All works on hundreds of
different mobile telephones of many makes such as Blackberry, Sony
Ericsson, Samsung, Motorola, Android, HTC, Nokia, LG, Iphone, Ipod
etc.

After 5 years of testing and market development, we witnessed rapid -
in fact, exponential - growth during the last two years. That growth
was reported in the licence reports to Navteq. In mid-December 2009,
the global coverage was extended to include the Philippines, Morocco
and Kenya.

Please contact the Nav4All support desk in case you have any
questions: <a href="http://www.nav4all.com/support" target="_blank">www.nav4all.com/support</a>. If there is any further
information from Nav4All concerning the subject of this letter, the
same will be published on our website: <a href="http://www.nav4all.com/" target="_blank">www.nav4all.com</a>. For reasons
of privacy, Nav4All does not have the email addresses of all its
customers, and we therefore request you to forward this email to the
maximum extent possible, in order to ensure that everyone is
informed.

Kind Regards,

Hennie J.M. Groot Koerkamp (CEO)

Nav4All BV

Keizersgracht 62-64

1015 CS Amsterdam NL
</pre>
<img src="http://www.shekhargovindarajan.com/?ak_action=api_record_view&id=1010&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.shekhargovindarajan.com/google/my-list-of-must-have-android-apps/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>FTP Backups made easy</title>
		<link>http://www.shekhargovindarajan.com/tips-n-tricks/ftp-backups-made-easy/?&#038;owa_medium=feed&#038;owa_sid=&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ftp-backups-made-easy</link>
		<comments>http://www.shekhargovindarajan.com/tips-n-tricks/ftp-backups-made-easy/#comments</comments>
		<pubDate>Thu, 12 Nov 2009 11:54:23 +0000</pubDate>
		<dc:creator>Shekhar</dc:creator>
				<category><![CDATA[Tips N Tricks]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[incremental]]></category>
		<category><![CDATA[lftp]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[mirror]]></category>
		<category><![CDATA[redhat]]></category>
		<category><![CDATA[scheduled]]></category>
		<category><![CDATA[Secure Shell]]></category>
		<category><![CDATA[shared hosted server]]></category>
		<category><![CDATA[wget]]></category>
		<category><![CDATA[www.mysite.com]]></category>

		<guid isPermaLink="false">http://www.shekhargovindarajan.com/?p=862</guid>
		<description><![CDATA[I do not recall backing up data over FTP (File Transfer Protocol) in the near past. Thanks to the SSH (Secure SHell) suite of programs like SCP (Secure Copy) and SFTP (Secure FTP), and RSync. But recently I had to setup a scheduled and unattended backup of data lying on a shared hosted server using [...]]]></description>
			<content:encoded><![CDATA[<p>I do not recall backing up data over FTP (File Transfer Protocol) in the near past. Thanks to the SSH (Secure SHell) suite of programs like <a href="http://en.wikipedia.org/wiki/Secure_copy" target="_blank">SCP (Secure Copy)</a> and <a href="http://en.wikipedia.org/wiki/SSH_file_transfer_protocol" target="_blank">SFTP (Secure FTP)</a>, and <a href="http://en.wikipedia.org/wiki/Rsync" target="_blank">RSync</a>. But recently I had to setup a scheduled and unattended backup of data lying on a shared hosted server using FTP &#8211; the only available option at my disposal.<a href="http://en.wikipedia.org/wiki/Wget" target="_blank"></a></p>
<p><a href="http://en.wikipedia.org/wiki/Wget" target="_blank">Wget</a> is a popular and obvious choice to try out for FTP backups. But it didn&#8217;t work for me and threw an error saying cannot find .listing file. While I was about to dwell more into wget, I spotted the forgotten hero &#8211; lftp. <span id="more-862"></span>lftp is described as a &#8220;Sophisticated file transfer program&#8221;. Do not mistake sophistication with complexity. I found it simple to use for my task. I had to backup the data from the hosting server to a Linux based machine (running <a href="http://en.wikipedia.org/wiki/CentOS" target="_blank">CentOS</a>). I found lftp preinstalled on the machine. If not found installed, one can install it on a <a href="http://en.wikipedia.org/wiki/Red_Hat" target="_blank">RedHat</a>/<a href="http://en.wikipedia.org/wiki/Fedora_%28operating_system%29" target="_blank">Fedora</a>/CentOS based Linux by using the following command:</p>
<p><em>yum install lftp</em></p>
<p>To backup using lftp, the syntax is:</p>
<p><em>lftp  -p &lt;FTP-Port&gt; -u &#8216;&lt;FTP-Username&gt;&#8217;,'&lt;FTP-Password&gt;&#8217; -e &#8216;mirror &#8211;verbose &lt;FTP-Directory&gt; &lt;Local-Directory&gt; ;quit&#8217;   &lt;FTP-Host&gt;</em></p>
<p>For example:</p>
<p><em>lftp  -p 21 -u &#8216;shekhar&#8217;,'secret&#8217; -e &#8216;mirror &#8211;verbose /public_html /backup/website ;quit&#8217;   www.mysite.com</em></p>
<p>The above command will backup the subdirectories and files in the directory public_html of the website www.mysite.com to a directory named /backup/website on the local machine (on which the lftp command is executed). lftp will automatically create the local directory if it does not exist.</p>
<p>Note that the &#8220;mirror&#8221; option will backup only the files which have changed. This means for the first time, lftp will download/backup all the files from the site. But subsequently, lftp will backup only the new or edited files and directories. This option saves bandwidth by not re-downloading files, if the backup is up to date.</p>
<p>For scheduled and attended backups you can easily schedule a <a href="http://en.wikipedia.org/wiki/Cron" target="_blank">Cron</a> job with the above command. It&#8217;s simple, it works!</p>
<img src="http://www.shekhargovindarajan.com/?ak_action=api_record_view&id=862&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.shekhargovindarajan.com/tips-n-tricks/ftp-backups-made-easy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Postfix: Log E-mails&#8217; Subject</title>
		<link>http://www.shekhargovindarajan.com/tips-n-tricks/postfix-log-e-mails-subject/?&#038;owa_medium=feed&#038;owa_sid=&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=postfix-log-e-mails-subject</link>
		<comments>http://www.shekhargovindarajan.com/tips-n-tricks/postfix-log-e-mails-subject/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 14:56:03 +0000</pubDate>
		<dc:creator>Shekhar</dc:creator>
				<category><![CDATA[Tips N Tricks]]></category>
		<category><![CDATA[Append]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[E-mail]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Find]]></category>
		<category><![CDATA[header_checks]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[log]]></category>
		<category><![CDATA[logging]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[mail server]]></category>
		<category><![CDATA[maillog]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[production mail server]]></category>
		<category><![CDATA[redhat]]></category>
		<category><![CDATA[subject]]></category>
		<category><![CDATA[text editor]]></category>

		<guid isPermaLink="false">http://www.shekhargovindarajan.com/?p=731</guid>
		<description><![CDATA[In Linux, you can view the statistics of incoming and outgoing E-mails by peeking into a log file called maillog (typically found in /var/log directory). Maillog provides the general information about the mails, for example, the sender and recipient(s), status &#8211; sent, rejected, bounced etc. I typically use maillog to check the destiny of mails. [...]]]></description>
			<content:encoded><![CDATA[<p>In Linux, you can view the statistics of incoming and outgoing E-mails by peeking into a log file called maillog (typically found in /var/log directory). Maillog provides the general information about the mails, for example, the sender and recipient(s), status &#8211; sent, rejected, bounced etc. I typically use maillog to check the destiny of mails. At times, it becomes difficult to spot a particular mail due to the sheer volume of mails being logged &#8211; especially on a production mail server.</p>
<p>For example: what if we need to check whether a particular mail sent by Person A has been delivered to Person B. Note that Person A might be sending lots of mails to Person B but we need to spot that one particular mail &#8211; say the one, which was sent by Person A but did not reach Person B. The only identifier, to identify a particular mail, in the maillog is the cryptic message ID. A better and more readable identifier would be the subject of an E-mail.Unfortunately, the subject of the mails is not logged, by default, in the maillog. But we can configure a mail server like Postfix to log the subject line.<span id="more-731"></span></p>
<p><a href="http://www.postfix.org/" target="_blank">Postfix</a> is a popular E-mail server a.k.a. MTA (Mail Transfer Agent) in the Linux world. With Postfix, it is easy to dump the subject line of every E-mail (incoming and outgoing) in the maillog. Assuming that you have a setup, configured and running Postfix, following is how to achieve it. Note that the path of the configuration files mentioned below are typical to <a href="http://www.redhat.com/" target="_blank">RedHat</a>, <a href="http://www.centos.org/" target="_blank">CentOS</a> and <a href="http://fedoraproject.org/" target="_blank">Fedora</a> Linux.</p>
<ul>
<li>Open the file called main.cf, found in /etc/postfix, in a text editor</li>
<li>Find and uncomment (by removing the preceding #) the line which says:<em>header_checks = regexp:/etc/postfix/header_checks<br />
</em></li>
<li>Save the file</li>
<li>Next, open the file named header_checks, found in the directory /etc/postfix, in a text editor</li>
<li>Append the following line to the file:/^Subject:/ WARN</li>
<li>Save the file and activate the Postfix&#8217;s configuration changes by issuing &#8216;service postfix reload&#8217;</li>
</ul>
<p>That&#8217;s it. Now in the maillog,  you will see the subject line of every incoming and outgoing mail. It will show  as follows:</p>
<p>Jun 29 06:16:28 mailer postfix/cleanup[473]: 1A96CD40CA: warning: header Subject: It Works! from mailsrv.foo.com[10.1.1.50]; from=&lt;personA@foo.com&gt; to=&lt;personB@foo1.com&gt; &#8230;</p>
<p>Note that the Subject (&#8220;It Works!&#8221; in this case) is logged in the maillog to identify the E-mail quite easily.</p>
<img src="http://www.shekhargovindarajan.com/?ak_action=api_record_view&id=731&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.shekhargovindarajan.com/tips-n-tricks/postfix-log-e-mails-subject/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Secure File Transfer without Secure Shell</title>
		<link>http://www.shekhargovindarajan.com/tips-n-tricks/secure-file-transfer-without-secure-shell/?&#038;owa_medium=feed&#038;owa_sid=&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=secure-file-transfer-without-secure-shell</link>
		<comments>http://www.shekhargovindarajan.com/tips-n-tricks/secure-file-transfer-without-secure-shell/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 12:20:34 +0000</pubDate>
		<dc:creator>Shekhar</dc:creator>
				<category><![CDATA[Tips N Tricks]]></category>
		<category><![CDATA[access]]></category>
		<category><![CDATA[barred]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[denied]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[scp]]></category>
		<category><![CDATA[scponly]]></category>
		<category><![CDATA[Secure Shell]]></category>
		<category><![CDATA[sftp]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[text editor]]></category>

		<guid isPermaLink="false">http://www.shekhargovindarajan.com/?p=625</guid>
		<description><![CDATA[FTP (File Transfer Protocol) is the de-facto but unsecure method to transfer files. SSH (Secure Shell) and its family of services like SCP (Secure Copy) and SFTP (Secure FTP) allows you shell (telnet like) access as well as file transfer via SCP and SFTP, securely. By &#8220;securely&#8221; I mean the data is that flows across [...]]]></description>
			<content:encoded><![CDATA[<p>FTP (File Transfer Protocol) is the de-facto but unsecure method to transfer files. SSH (Secure Shell) and its family of services like SCP (Secure Copy) and SFTP (Secure FTP) allows you shell (telnet like) access as well as file transfer via SCP and SFTP, securely. By &#8220;securely&#8221; I mean the data is that flows across is encrypted including the username and password. SSH is a popular protocol for shell access and file transfer in the Linux world.</p>
<p>So given a choice, SCP/SFTP is a better option in terms of &#8220;security&#8221;. But enabling SFTP/SCP enables, by default, shell access too. Recently for one of my clients, the requirement was to use SCP instead of FTP while blocking shell access so that no user is able to login, in curiosity, nor could execute any program/script on the server, even by mistake. All they could do is to copy files across &#8211; from their desktop to the server and vice versa.  But, I could not find anything in  SSH configuration that barred SSH, while still allowing SCP.<span id="more-625"></span></p>
<p>The solution lied outside SSH and was trivial. It is called <strong>scponly</strong>. scponly is a shell program, just like Bash, Ksh which barrs shell access via SSH. I had <a href="http://www.centos.org/" target="_blank">CentOS</a> 5.2 running on the client&#8217;s server. scponly RPM was not available from the CentOS repositories. I then setup the <a href="https://rpmrepo.org/RPMforge/Using" target="_blank">RPMForge repository</a> as follows:</p>
<p><em> rpm -ivh http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm</em></p>
<p>Note that the above setup is specific to CentOS 5. Subsequently, I installed scponly as:</p>
<p><em>yum install scponly</em></p>
<p>Next, the shell of all the users, who are barred SSH access, must be set to /usr/bin/scponly. For existing users there are two ways to do it:</p>
<p><strong>Method 1: Using usermod (Recommended)<br />
</strong>Login as root and issue the following command:</p>
<p><em>usermod &#8211;shell /usr/bin/scponly &lt;username&gt;</em></p>
<p>Substitue &lt;username&gt; with the name of the user who will be barred shell access</p>
<p><strong>Method 2: Edit /etc/passwd<br />
</strong>Login as root and open the file named passwd, found in /etc directory, in a text editor. The file contains entry for each user on a seperate line along with their shell name. For example:</p>
<p><em>&lt;username&gt;:x:506:508::/home/&lt;username&gt;:/bin/bash</em></p>
<p>Replace /bin/bash with /usr/bin/scponly. Save the file. This will change the shell of the user named &lt;username&gt; to scponly.</p>
<p><strong>For new users<br />
</strong>For new users you can set the shell to scponly while creating the user via useradd command:</p>
<p><em>useradd &#8211;shell /usr/bin/scponly &lt;username&gt;</em></p>
<p>Once done, when one (who is barred the shell access) tries to SSH, he/she will be able to proceed upto the point of the password prompt. At the prompt, even after supplying a correct password, he/she will not be dropped into a shell. In fact it will appear as if the SSH login has hung &#8211; no errors, no access denied messages.</p>
<img src="http://www.shekhargovindarajan.com/?ak_action=api_record_view&id=625&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.shekhargovindarajan.com/tips-n-tricks/secure-file-transfer-without-secure-shell/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Display Microsoft Word&#8217;s Special Characters through Apache</title>
		<link>http://www.shekhargovindarajan.com/tips-n-tricks/display-microsoft-words-special-characters-through-apache/?&#038;owa_medium=feed&#038;owa_sid=&#038;utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=display-microsoft-words-special-characters-through-apache</link>
		<comments>http://www.shekhargovindarajan.com/tips-n-tricks/display-microsoft-words-special-characters-through-apache/#comments</comments>
		<pubDate>Wed, 25 Mar 2009 04:18:36 +0000</pubDate>
		<dc:creator>Shekhar</dc:creator>
				<category><![CDATA[Tips N Tricks]]></category>
		<category><![CDATA[AddDefaultCharset]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[Apache server]]></category>
		<category><![CDATA[Apache web server]]></category>
		<category><![CDATA[Apache web server side]]></category>
		<category><![CDATA[ascii]]></category>
		<category><![CDATA[Comment]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[ISO-8859-1]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[mail server]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[operating system]]></category>
		<category><![CDATA[special characters]]></category>
		<category><![CDATA[text editor]]></category>
		<category><![CDATA[web browser]]></category>
		<category><![CDATA[web browser problem]]></category>
		<category><![CDATA[web server]]></category>
		<category><![CDATA[web server side]]></category>
		<category><![CDATA[weird characters]]></category>
		<category><![CDATA[word]]></category>

		<guid isPermaLink="false">http://www.shekhargovindarajan.com/?p=583</guid>
		<description><![CDATA[Recently, I carried out a Linux server upgrade for a client where I did a clean install of the latest operating system/distribution. Since it was a clean install I had to backup and note down the earlier configuration (of mail server, web server, database) and redo those changes. Mostly I preferred not to simply overwrite [...]]]></description>
			<content:encoded><![CDATA[<p>Recently, I carried out a Linux server upgrade for a client where I did a clean install of the latest operating system/distribution. Since it was a clean install I had to backup and note down the earlier configuration (of mail server, web server, database) and redo those changes. Mostly I preferred not to simply overwrite with the backed up configuration files. I rather documented and edited the configuration manually.</p>
<p>It all seemed to have gone smoothly and the new server has been up and running. But one not-so-fine day, the client started complaining that some HTML pages are not displaying properly. These were showing question marks (?) and some other weird characters. I figured out that these HTML pages were generated using Microsoft Word and had those special characters (closing quotes, double hyphens etc.). I discussed with the client that this could be a web browser problem because it is not able to use the correct character set.<span id="more-583"></span>But the client insisted that such pages used to display properly earlier, before the upgrade.  This meant I have missed redoing some configuration. The obvious suspect was at Apache web server side. After all it is Apache which is serving these web pages to the browser. Hence, if the culprit is not the web browser then it better be the web server. After parsing through the Apache&#8217;s configuration file I spotted a comment against a directive (or configuration option) called AddDefaultCharset which said:</p>
<p># Specify a default charset for all content served; this enables<br />
# interpretation of all content as UTF-8 by default.  To use the<br />
# default browser choice (ISO-8859-1), or to allow the META tags<br />
# in HTML content to override this choice, comment out this<br />
# directive:</p>
<p>I followed it and commented out the directive and voila it worked!</p>
<p>To sum up, if HTML files served by an Apache web server  are not displaying special characters properly in a web browser (IE, Firefox etc.), the solution is:</p>
<ul>
<li>Open the Apache&#8217;s configuration file named httpd.conf (found in the directory /etc/httpd/conf for RedHat based Linux distributions) in a text editor</li>
<li>Comment out, by prefixing a hash (#), the line which says &#8220;AddDefaultCharset UTF-8&#8243; such that it looks as follows:<strong> </strong><strong><br />
# AddDefaultCharset UTF-8<br />
</strong></li>
<li>Save the file and reload/restart Apache server. For RedHat based distributions you can do this via &#8220;service httpd reload&#8221;</li>
</ul>
<img src="http://www.shekhargovindarajan.com/?ak_action=api_record_view&id=583&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://www.shekhargovindarajan.com/tips-n-tricks/display-microsoft-words-special-characters-through-apache/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

