<?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/"
	>

<channel>
	<title>Andrew Hopper Boston Software Architect</title>
	<atom:link href="http://www.andrewhopper.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.andrewhopper.com</link>
	<description>Experiments and lessons in software development.</description>
	<pubDate>Sun, 27 Dec 2009 04:12:25 +0000</pubDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>BeautifulSoup Demo - screen scraping quickly with Python</title>
		<link>http://www.andrewhopper.com/development/beautifulsoup-demo-screen-scraping-quickly-with-python</link>
		<comments>http://www.andrewhopper.com/development/beautifulsoup-demo-screen-scraping-quickly-with-python#comments</comments>
		<pubDate>Sat, 26 Dec 2009 21:57:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[beautiful soup]]></category>

		<category><![CDATA[beautifulsoup]]></category>

		<category><![CDATA[python]]></category>

		<category><![CDATA[scraping]]></category>

		<category><![CDATA[screen scraping]]></category>

		<guid isPermaLink="false">http://www.andrewhopper.com/?p=187</guid>
		<description><![CDATA[From the BeautifulSoup website:
Beautiful Soup is a Python HTML/XML parser designed for quick turnaround projects like screen-scraping. Three features make it powerful:
   1. Beautiful Soup won&#8217;t choke if you give it bad markup. It yields a parse tree that makes approximately as much sense as your original document. This is usually good enough [...]]]></description>
			<content:encoded><![CDATA[<p>From the BeautifulSoup website:</p>
<p><em>Beautiful Soup is a Python HTML/XML parser designed for quick turnaround projects like screen-scraping. Three features make it powerful:</p>
<p>   1. Beautiful Soup won&#8217;t choke if you give it bad markup. It yields a parse tree that makes approximately as much sense as your original document. This is usually good enough to collect the data you need and run away.<br />
   2. Beautiful Soup provides a few simple methods and Pythonic idioms for navigating, searching, and modifying a parse tree: a toolkit for dissecting a document and extracting what you need. You don&#8217;t have to create a custom parser for each application.<br />
   3. Beautiful Soup automatically converts incoming documents to Unicode and outgoing documents to UTF-8. You don&#8217;t have to think about encodings, unless the document doesn&#8217;t specify an encoding and Beautiful Soup can&#8217;t autodetect one. Then you just have to specify the original encoding. </p>
<p>Beautiful Soup parses anything you give it, and does the tree traversal stuff for you. You can tell it &#8220;Find all the links&#8221;, or &#8220;Find all the links of class externalLink&#8221;, or &#8220;Find all the links whose urls match &#8220;foo.com&#8221;, or &#8220;Find the table heading that&#8217;s got bold text, then give me that text.&#8221;</p>
<p>Valuable data that was once locked up in poorly-designed websites is now within your reach. Projects that would have taken hours take only minutes with Beautiful Soup.</em></p>
<h3>Getting Started</h3>
<p>1. Install <a href="http://www.crummy.com/software/BeautifulSoup/">BeautifulSoup</a></p>
<p>2. Create a script that uses BeautifulSoup</p>
<pre>
from BeautifulSoup import BeautifulSoup
import re
import urllib2</code>

# download the page
response = urllib2.urlopen("http://www.boattrader.com/search-results/Type-any/Make-mako/Length-17,25/Zip-02445/Radius-100/Sort-Length:DESC/ ")
html = response.read()

# create a beautiful soup object
soup = BeautifulSoup(html)

# all links to detailed boat information have class lfloat
links = soup.findAll("a", { "class" : "lfloat" })
for link in links:
print link['href']
print link.string

# all prices are spans and have the class rfloat
prices = soup.findAll("span", { "class" : "rfloat" })
for price in prices:
print price
print price.string

# all boat images have attribute height=105
images = soup.findAll("img",height="105")
for image in images:
print image			# print the whole image tag
print image['src']	# print the url of the image only
</pre>
<h4>Helpful resources:</h4>
<ul>
<li><a href="http://www.crummy.com/software/BeautifulSoup/documentation.html">How to use python and Beautiful Soup to screen scrape the links from a Google Blog search</a></li>
<li><a href="http://www.crummy.com/software/BeautifulSoup/documentation.html">BeautifulSoup Documentation</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.andrewhopper.com/development/beautifulsoup-demo-screen-scraping-quickly-with-python/feed</wfw:commentRss>
		</item>
		<item>
		<title>SSH Tunnels Are Like a Free Cheap VPN</title>
		<link>http://www.andrewhopper.com/linux-admin/ssh-tunnels-are-like-a-free-cheap-vpn</link>
		<comments>http://www.andrewhopper.com/linux-admin/ssh-tunnels-are-like-a-free-cheap-vpn#comments</comments>
		<pubDate>Sat, 22 Aug 2009 02:51:34 +0000</pubDate>
		<dc:creator>Andrew Hopper1</dc:creator>
		
		<category><![CDATA[Linux Admin]]></category>

		<category><![CDATA[Networking]]></category>

		<category><![CDATA[Postgresql]]></category>

		<category><![CDATA[linkedin]]></category>

		<guid isPermaLink="false">http://www.hopperlabs.com/?p=83</guid>
		<description><![CDATA[If you&#8217;re not already familiar with the concept I bet you&#8217;d be very interested to learn that you can simulate VPN access to a network as long as you have access to a linux host on that network.
These instructions work on OS X and Linux.  Putty also has tunneling capabilities, but those are beyond [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re not already familiar with the concept I bet you&#8217;d be very interested to learn that you can simulate VPN access to a network as long as you have access to a linux host on that network.</p>
<p>These instructions work on OS X and Linux.  Putty also has tunneling capabilities, but those are beyond the scope of this post.</p>
<p>There are many uses for the technology.</p>
<h2>SSH Tunneling Applications</h2>
<ol>
<li><strong>Get online at a client site </strong>- If you&#8217;re visiting a client site and don&#8217;t have proxy access you can use a SSH SOCKS proxy to bypass the LAN proxy and get on the web</li>
<li> <strong>Encrypt traffic</strong> - to keep LAN admins from seeing what you&#8217;re looking at</li>
<li> <strong>Bypass corporate web filters</strong> - bypass corporate firewall to get access to Gmail, Facebook and other restricted resources.</li>
<li> <strong>Defeat QOS limitations </strong>- Bypass rate limiting and other service caps imposed by QOS rules</li>
<li> <strong>Access your database server</strong> - Access your database server even though remote access is disabled.</li>
</ol>
<h2>Access your database server</h2>
<p>Port forward Postgresql</p>
<p><code><br />
ssh -f root@server.yourdomain.com -L 5432:localhost:5432 -N<br />
</code></p>
<h2>Access the web using a Socks Proxy</h2>
<p><code>$ssh -D 9999 username@ip-address-of-ssh-server</code></p>
<p>Then go to Firefox-&gt;Preferences-&gt;Advanced-&gt;Network-&gt;Settings to configure the socksproxy.  The address is localhost.</p>
<h2>Further Reading on SSH Tunneling</h2>
<ul>
<li><a href="http://outflux.net/blog/archives/2006/12/07/paranoid-browsing-with-squid/">Kees Cook tells us how to tunnel DNS lookups</a></li>
<li>Don McArthur points out his <a href="http://www.linux.com/article.pl?sid=06/09/05/190250">excellent article</a> that addresses the same issue</li>
<li>verevi says the<a href="http://foxyproxy.mozdev.org/"> FoxyProxy extension</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.andrewhopper.com/linux-admin/ssh-tunnels-are-like-a-free-cheap-vpn/feed</wfw:commentRss>
		</item>
		<item>
		<title>Google Docs Turns a Blind Eye to Security</title>
		<link>http://www.andrewhopper.com/security/google-docs-turns-a-blind-eye-to-security</link>
		<comments>http://www.andrewhopper.com/security/google-docs-turns-a-blind-eye-to-security#comments</comments>
		<pubDate>Sat, 22 Aug 2009 02:40:07 +0000</pubDate>
		<dc:creator>Andrew Hopper1</dc:creator>
		
		<category><![CDATA[Security]]></category>

		<category><![CDATA[google docs]]></category>

		<guid isPermaLink="false">http://www.hopperlabs.com/?p=106</guid>
		<description><![CDATA[Google doesn&#8217;t use SSL for the Google Calendar or for Google Docs. When information is sent to and from Google the information is sent in clear text and is visible at all intermediate network routers.
I know that Google Docs is very convenient, but make sure not to store sensitive data on the Google Docs system.
You [...]]]></description>
			<content:encoded><![CDATA[<p>Google doesn&#8217;t use SSL for the Google Calendar or for Google Docs. When information is sent to and from Google the information is sent in clear text and is visible at all intermediate network routers.</p>
<p>I know that Google Docs is very convenient, but make sure not to store sensitive data on the Google Docs system.</p>
<p>You can read up on Google&#8217;s security at the link below.  I feel their document is a little misleading as it doesn&#8217;t fully disclose the face that information is not encrypted while in transit.</p>
<p><a href="http://www.google.com/apps/intl/en/business/infrastructure_security.html">http://www.google.com/apps/intl/en/business/infrastructure_security.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrewhopper.com/security/google-docs-turns-a-blind-eye-to-security/feed</wfw:commentRss>
		</item>
		<item>
		<title>Use nslookup to check DNS propagation and verify MX record configuration</title>
		<link>http://www.andrewhopper.com/linux-admin/use-nslookup-to-check-dns-propagation-and-verify-mx-record-configuration</link>
		<comments>http://www.andrewhopper.com/linux-admin/use-nslookup-to-check-dns-propagation-and-verify-mx-record-configuration#comments</comments>
		<pubDate>Sat, 22 Aug 2009 02:34:38 +0000</pubDate>
		<dc:creator>Andrew Hopper1</dc:creator>
		
		<category><![CDATA[Linux Admin]]></category>

		<category><![CDATA[Networking]]></category>

		<category><![CDATA[dns]]></category>

		<category><![CDATA[dns troubleshooting]]></category>

		<category><![CDATA[nslookup]]></category>

		<guid isPermaLink="false">http://www.hopperlabs.com/?p=107</guid>
		<description><![CDATA[NSLookup is a tool that can be immensely helpful when troubleshooting network connectivity issues.  Here are some example uses:
1.) You want to see if the DNS change you requested in live on the primary nameserver

hopper-macbook:~ andrewhopper$ nslookup
&#62; server dns1.noris.net
Default server: dns1.noris.net
Address: 213.95.0.65#53
&#62; set type=a
&#62; puma.com
Server:		dns1.noris.net
Address:	213.95.0.65#53

Name:	puma.com
Address: 128.167.119.25
2.) You just configured Google apps for your domain [...]]]></description>
			<content:encoded><![CDATA[<p>NSLookup is a tool that can be immensely helpful when troubleshooting network connectivity issues.  Here are some example uses:</p>
<p>1.) You want to see if the DNS change you requested in live on the primary nameserver<br />
<code><br />
hopper-macbook:~ andrewhopper$ nslookup<br />
&gt; server dns1.noris.net<br />
Default server: dns1.noris.net<br />
Address: 213.95.0.65#53<br />
&gt; set type=a<br />
&gt; puma.com<br />
Server:		dns1.noris.net<br />
Address:	213.95.0.65#53<br />
</code></p>
<p>Name:	puma.com<br />
Address: 128.167.119.25</p>
<p>2.) You just configured Google apps for your domain and want to verify MX records have been properly configured.<br />
<code><br />
hopper-macbook:~ andrewhopper$ nslookup<br />
&gt; set q=mx<br />
&gt; hopper.biz</code></p>
<p>Server:		208.59.247.45<br />
Address:	208.59.247.45#53</p>
<p>Non-authoritative answer:<br />
hopper.biz	mail exchanger = 20 alt1.aspmx.l.google.com.<br />
hopper.biz	mail exchanger = 20 alt2.aspmx.l.google.com.<br />
hopper.biz	mail exchanger = 30 aspmx2.googlemail.com.<br />
hopper.biz	mail exchanger = 30 aspmx4.googlemail.com.<br />
hopper.biz	mail exchanger = 30 aspmx3.googlemail.com.<br />
hopper.biz	mail exchanger = 30 aspmx5.googlemail.com.<br />
hopper.biz	mail exchanger = 10 aspmx.l.google.com.</p>
<p>Authoritative answers can be found from:<br />
hopper.biz	nameserver = NS2.SLICEHOST.NET.<br />
hopper.biz	nameserver = NS3.SLICEHOST.NET.<br />
hopper.biz	nameserver = NS1.SLICEHOST.NET.<br />
aspmx.l.google.com	internet address = 209.85.221.60<br />
alt1.aspmx.l.google.com	internet address = 72.14.247.27<br />
alt2.aspmx.l.google.com	internet address = 209.85.222.78<br />
aspmx2.googlemail.com	internet address = 209.85.135.27<br />
NS1.SLICEHOST.NET	internet address = 67.23.4.57</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrewhopper.com/linux-admin/use-nslookup-to-check-dns-propagation-and-verify-mx-record-configuration/feed</wfw:commentRss>
		</item>
		<item>
		<title>Macbook Pro Hard Drive Replacement</title>
		<link>http://www.andrewhopper.com/hardware/macbook-pro-hard-drive-replacement</link>
		<comments>http://www.andrewhopper.com/hardware/macbook-pro-hard-drive-replacement#comments</comments>
		<pubDate>Thu, 04 Jun 2009 13:20:45 +0000</pubDate>
		<dc:creator>Andrew Hopper</dc:creator>
		
		<category><![CDATA[Hardware]]></category>

		<category><![CDATA[macbook pro hard drive upgrade harddisk upgrade]]></category>

		<guid isPermaLink="false">http://www.hopperlabs.com/?p=62</guid>
		<description><![CDATA[My beloved Macbook keeps running out of space so I keep putting bigger hard drives in it.  The latest is a fabulously large 500GB Hitachi drive.  The drive runs quiet and cool.  Make sure to buy your new harddrive from Other World Computing.  They have a great selection, great shipping policies, and [...]]]></description>
			<content:encoded><![CDATA[<p>My beloved Macbook keeps running out of space so I keep putting bigger hard drives in it.  The latest is a fabulously large 500GB Hitachi drive.  The drive runs quiet and cool.  Make sure to buy your new harddrive from <a href="http://www.macsales.com/">Other World Computing</a>.  They have a great selection, great shipping policies, and good prices.</p>
<p>The process will void your warranty but is pretty straight forward thanks to the phenomenal instructions here-<a href="http://www.ifixit.com/Guide/Repair/MacBook-Pro-15-Inch-Core-Duo-Hard-Drive-Replacement/486/1">iFixIt Macbook Pro 15 Hard Drive Replacement Guide</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.andrewhopper.com/hardware/macbook-pro-hard-drive-replacement/feed</wfw:commentRss>
		</item>
		<item>
		<title>Postgres Update from function</title>
		<link>http://www.andrewhopper.com/postgresql/postgres-update-from-function</link>
		<comments>http://www.andrewhopper.com/postgresql/postgres-update-from-function#comments</comments>
		<pubDate>Thu, 04 Jun 2009 00:50:22 +0000</pubDate>
		<dc:creator>Andrew Hopper</dc:creator>
		
		<category><![CDATA[Postgresql]]></category>

		<guid isPermaLink="false">http://www.hopperlabs.com/?p=43</guid>
		<description><![CDATA[I always forgot the syntax of the Postgresql update from functionality

UPDATE employees SET sales_count = sales_count + 1 FROM accounts
  WHERE accounts.name = 'Acme Corporation'
  AND employees.id = accounts.sales_person;

]]></description>
			<content:encoded><![CDATA[<pre>I always forgot the syntax of the Postgresql update from functionality</pre>
<pre>
<pre class="PROGRAMLISTING">UPDATE employees SET sales_count = sales_count + 1 FROM accounts
  WHERE accounts.name = 'Acme Corporation'
  AND employees.id = accounts.sales_person;</pre>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.andrewhopper.com/postgresql/postgres-update-from-function/feed</wfw:commentRss>
		</item>
		<item>
		<title>Screen keyboard shortcuts</title>
		<link>http://www.andrewhopper.com/linux-admin/screen-keyboard-shortcuts</link>
		<comments>http://www.andrewhopper.com/linux-admin/screen-keyboard-shortcuts#comments</comments>
		<pubDate>Sun, 24 May 2009 16:53:37 +0000</pubDate>
		<dc:creator>Andrew Hopper</dc:creator>
		
		<category><![CDATA[Linux Admin]]></category>

		<category><![CDATA[linux screen command line]]></category>

		<guid isPermaLink="false">http://www.hopperlabs.com/?p=37</guid>
		<description><![CDATA[Screen is an amazing little utility that allows you to have multiple sessions going within one terminal session.
Here&#8217;s a link to the man page - http://man.cx/screen
Here&#8217;s a quick cheatsheet borrowed from http://www.pixelbeat.org/lkdb/screen.html



Key
Action
Notes


Ctrl+a c
new window



Ctrl+a n
next window
I bind F12 to this


Ctrl+a p
previous window
I bind F11 to this


Ctrl+a &#8220;
select window from list
I have window list in the status line


Ctrl+a [...]]]></description>
			<content:encoded><![CDATA[<p>Screen is an amazing little utility that allows you to have multiple sessions going within one terminal session.</p>
<p>Here&#8217;s a link to the man page - <a href="http://man.cx/screen">http://man.cx/screen</a></p>
<p>Here&#8217;s a quick cheatsheet borrowed from <a href="http://www.pixelbeat.org/lkdb/screen.html">http://www.pixelbeat.org/lkdb/screen.html</a></p>
<table class="pixelbeat" border="0">
<tbody>
<tr class="pbtitle">
<td><strong>Key</strong></td>
<td><strong>Action</strong></td>
<td><strong>Notes</strong></td>
</tr>
<tr>
<td>Ctrl+a c</td>
<td>new window</td>
<td></td>
</tr>
<tr>
<td>Ctrl+a n</td>
<td>next window</td>
<td>I bind F12 to this</td>
</tr>
<tr>
<td>Ctrl+a p</td>
<td>previous window</td>
<td>I bind F11 to this</td>
</tr>
<tr>
<td>Ctrl+a &#8220;</td>
<td>select window from list</td>
<td>I have window list in the status line</td>
</tr>
<tr>
<td>Ctrl+a Ctrl+a</td>
<td>previous window viewed</td>
<td></td>
</tr>
<tr class="pbtitle">
<td><strong> </strong></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Ctrl+a S</td>
<td>split terminal horizontally into regions</td>
<td>Ctrl+a c to create new window there</td>
</tr>
<tr>
<td>Ctrl+a :resize</td>
<td>resize region</td>
<td></td>
</tr>
<tr>
<td>Ctrl+a :fit</td>
<td>fit screen size to new terminal size</td>
<td>Ctrl+a F is the same. Do after resizing xterm</td>
</tr>
<tr>
<td>Ctrl+a :remove</td>
<td>remove region</td>
<td>Ctrl+a X is the same</td>
</tr>
<tr>
<td>Ctrl+a tab</td>
<td>Move to next region</td>
<td></td>
</tr>
<tr class="pbtitle">
<td><strong> </strong></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Ctrl+a d</td>
<td>detach screen from terminal</td>
<td>Start screen with -r option to reattach</td>
</tr>
<tr>
<td>Ctrl+a A</td>
<td>set window title</td>
<td></td>
</tr>
<tr>
<td>Ctrl+a x</td>
<td>lock session</td>
<td>Enter user password to unlock</td>
</tr>
<tr>
<td>Ctrl+a [</td>
<td>enter scrollback/copy mode</td>
<td>Enter to start and end copy region. Ctrl+a ] to leave this mode</td>
</tr>
<tr>
<td>Ctrl+a ]</td>
<td>paste buffer</td>
<td>Supports pasting between windows</td>
</tr>
<tr>
<td>Ctrl+a &gt;</td>
<td>write paste buffer to file</td>
<td>useful for copying between screens</td>
</tr>
<tr>
<td>Ctrl+a &lt;</td>
<td>read paste buffer from file</td>
<td>useful for pasting between screens</td>
</tr>
<tr class="pbtitle">
<td><strong> </strong></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Ctrl+a ?</td>
<td>show key bindings/command names</td>
<td>Note unbound commands only in man page</td>
</tr>
<tr>
<td>Ctrl+a :</td>
<td>goto screen command prompt</td>
<td>up shows last command entered</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.andrewhopper.com/linux-admin/screen-keyboard-shortcuts/feed</wfw:commentRss>
		</item>
		<item>
		<title>Learn VIM in 5 Minutes</title>
		<link>http://www.andrewhopper.com/linux-admin/learn-vim-in-5-minutes</link>
		<comments>http://www.andrewhopper.com/linux-admin/learn-vim-in-5-minutes#comments</comments>
		<pubDate>Thu, 21 May 2009 09:29:04 +0000</pubDate>
		<dc:creator>Andrew Hopper</dc:creator>
		
		<category><![CDATA[Linux Admin]]></category>

		<category><![CDATA[vi]]></category>

		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://www.hopperlabs.com/?p=21</guid>
		<description><![CDATA[I found a great Stack Overflow question on learning VIM here @
http://stackoverflow.com/questions/2573/vim-tutorials
VIM 5 Min Tutorial

"Here is your 5 minute tutorial. The easiest way to learn vi is to know what the letters stand for:"
y(ank) - copy
d(elete) - delete
c(hange) - change
p(aste) - put from buffer after cursor
o(pen) - start a new line
i(nsert) - insert before current [...]]]></description>
			<content:encoded><![CDATA[<p>I found a great Stack Overflow question on learning VIM here @<br />
<a href="http://stackoverflow.com/questions/2573/vim-tutorials">http://stackoverflow.com/questions/2573/vim-tutorials</a></p>
<h2>VIM 5 Min Tutorial</h2>
<pre>
"Here is your 5 minute tutorial. The easiest way to learn vi is to know what the letters stand for:"
y(ank) - copy
d(elete) - delete
c(hange) - change
p(aste) - put from buffer after cursor
o(pen) - start a new line
i(nsert) - insert before current character
a(fter) - insert after current character
w(ord) - moves to beginning of next word
b(ack) - moves to beginning of current word or prior word
e(end) - moves to end of current word or next word
f(ind) - moves to a character on the current line
movement keys you just need to learn: h,j,k,l

^ - beginning of text on a line
$ - end of text on a line
0 - first position on line

most commands can be prefaced with numeric modifiers.
2w - means move 2 words
5h - means move 5 charcters to the left
3k - means move 3 lines up
3fs - means move to the 3rd letter s folling the cursor

modification commands (d,c,y) need to know how much to work on.
dd - delete a line into memory
yy - yank a line into memory
cc - change the whole line
c$ - change from current position to the end
c2w - change the text spanning the next 2 words
3dd - delete 3 lines
d2f. - delete to the second period.

. - means redo the last modification command.
/ - searches for text, and then n(ext) will go the next found occurance. N will go prior.
? - searches backwards through the document.
</pre>
<h2>Further Reading about VIM</h2>
<ol>
<li><a href="http://rayninfo.co.uk/vimtips.html">http://rayninfo.co.uk/vimtips.html</a></li>
<li><a href="http://blog.interlinked.org/tutorials/vim_tutorial.html">http://blog.interlinked.org/tutorials/vim_tutorial.html</a></li>
<li><a href="http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html">http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.andrewhopper.com/linux-admin/learn-vim-in-5-minutes/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
