<?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>john&#039;s blog</title>
	<atom:link href="http://blog.jtclark.ca/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.jtclark.ca</link>
	<description>the web, technology and miscellaneous rants</description>
	<lastBuildDate>Mon, 22 Aug 2011 13:56:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>How long would it take to go over your Rogers High-Speed Internet usage limit?</title>
		<link>http://blog.jtclark.ca/2011/08/how-long-would-it-take-to-go-over-your-rogers-high-speed-internet-usage-limit/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=how-long-would-it-take-to-go-over-your-rogers-high-speed-internet-usage-limit</link>
		<comments>http://blog.jtclark.ca/2011/08/how-long-would-it-take-to-go-over-your-rogers-high-speed-internet-usage-limit/#comments</comments>
		<pubDate>Mon, 08 Aug 2011 15:10:49 +0000</pubDate>
		<dc:creator>John T. Clark</dc:creator>
				<category><![CDATA[Rants]]></category>
		<category><![CDATA[Reviews]]></category>
		<category><![CDATA[High Speed Internet]]></category>
		<category><![CDATA[Rogers]]></category>

		<guid isPermaLink="false">http://blog.jtclark.ca/?p=813</guid>
		<description><![CDATA[Using your Rogers High-speed internet connection at full speed for more than half a day will result in overage fees.]]></description>
			<content:encoded><![CDATA[<p>The following is a table showing how fast a Rogers user could eat through their monthly usage limit. Note: the numbers do not reflect a user&#8217;s actual usage and I&#8217;m not saying Rogers should let us download 10TB+ a month but I do think that the current plans are unreasonable. If we are not constantly monitoring our usage we could accidentally go over our limit in a matter of hours. I think all plans should start at 500GB a month and the highest plan should be somewhere around the 2TB mark. I also think the plans should increase by a couple hundred GB per year as more streaming services like Netflix become our primary media source.</p>
<table>
<thead>
<tr>
<td>Package</td>
<td>Download Speed</td>
<td>Usage Allowance</td>
<td>How long will it last?</td>
<td>Max. Potential Download</td>
</tr>
</thead>
<tbody>
<tr>
<td>Ultra Lite</td>
<td>0.5 Mbps</td>
<td>2 GB</td>
<td>0.37 days</td>
<td>162 GB</td>
</tr>
<tr>
<td>Lite</td>
<td>3 Mbps</td>
<td>15 GB</td>
<td>0.46 days</td>
<td>972 GB</td>
</tr>
<tr>
<td>Express</td>
<td>12 Mbps</td>
<td>60 GB</td>
<td>0.46 days</td>
<td>3,888 GB</td>
</tr>
<tr>
<td>Extreme</td>
<td>24 Mbps</td>
<td>100 GB</td>
<td>0.39 days</td>
<td>7,776 GB</td>
</tr>
<tr>
<td>Extreme Plus</td>
<td>32 Mbps</td>
<td>150 GB</td>
<td>0.43 days</td>
<td>10,368 GB</td>
</tr>
<tr>
<td>
Ultimate
</td>
<td>50 Mbps</td>
<td>250 GB</td>
<td>0.46 days</td>
<td>16,200 GB</td>
</tr>
</tbody>
</table>
<p>Point of interest. Running at full speed, no rogers plan will last more than half a day.</p>
<p>Calculations:<br />
Megabytes per second = Download Speed / 8<br />
Assuming 0 upload per month (which is impossible)<br />
Assuming 30 days per month.<br />
Assuming 1TB = 1,000,000 MB.<br />
Assuming 1GB = 1,000 MB.<br />
Number of seconds per month = 60 X 60 X 24 X 30 = 2,592,000<br />
Maximum potential download amount = Megabytes per second * Number of seconds per month<br />
Number of days internet will last = Monthly Usage Limit (MB) / Speed per megabyte / 60 / 60 / 24</p>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=How+long+would+it+take+to+go+over+your+Rogers+High-Speed+Internet+usage+limit%3F+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D813" title="Post to Twitter"><img class="nothumb" src="http://blog.jtclark.ca/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/intent/tweet?text=How+long+would+it+take+to+go+over+your+Rogers+High-Speed+Internet+usage+limit%3F+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D813" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.jtclark.ca/2011/08/how-long-would-it-take-to-go-over-your-rogers-high-speed-internet-usage-limit/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Why I still use Rogers for High Speed Internet</title>
		<link>http://blog.jtclark.ca/2011/07/why-i-still-use-rogers-for-high-speed-internet/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=why-i-still-use-rogers-for-high-speed-internet</link>
		<comments>http://blog.jtclark.ca/2011/07/why-i-still-use-rogers-for-high-speed-internet/#comments</comments>
		<pubDate>Fri, 22 Jul 2011 16:20:02 +0000</pubDate>
		<dc:creator>John T. Clark</dc:creator>
				<category><![CDATA[Rants]]></category>
		<category><![CDATA[Reviews]]></category>
		<category><![CDATA[High Speed Internet]]></category>
		<category><![CDATA[Rogers]]></category>
		<category><![CDATA[tier]]></category>

		<guid isPermaLink="false">http://blog.jtclark.ca/?p=808</guid>
		<description><![CDATA[Rogers has updated their High-Speed Internet Tiers but their upload speed is still lousy and the new usage limits are way lower than TekSavvy.]]></description>
			<content:encoded><![CDATA[<p>I was very close to dropping Rogers altogether and switching to TekSavvy for cable internet so I could finally be free of Rogers stupid Usage Limits. The only thing holding me back was the limited speeds of TekSavvy and the $99 fee to have someone come look at my line is something goes wrong. I was toying with the idea of having 2 cable connections (if there was a problem with my line Rogers would fix it for free) but it was going to cost way over $100 a month combined.</p>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-7721452953380183";
/* 728x90, created 2/20/10 */
google_ad_slot = "8097105470";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<p>Then Rogers released their <a href="http://redboard.rogers.com/2011/rogers-meets-changing-customer-needs-with-new-hi-speed-internet-tiers/" target="_blank">new plans and usage limits</a> on Wednesday. (The title of their article should be &#8220;Rogers takes a tiny step in the right direction to meet customer&#8217;s needs with new Hi-Speed Internet Tiers&#8221;) While they still stink compared to TekSavvy they are more reasonable. I have no complaints with Rogers service. It has always been excellent and in my experience their tech support and technicians are friendly and get the job done. They just won&#8217;t give us reasonable plans at reasonable prices.</p>
<p>The first company to offer me > 5Mbps upload speed and unlimited or 500GB+ monthly usage will be getting my business immediately. Although I despise Bell I would jump at the chance to switch to their Fibre 25 plan with 7Mbps upload if that service was available in my area. </p>
<p>So now I have upgraded to the Ultimate plan to take advantage of the new 250GB usage limit for $99 per month. The 1Mbps upgrade in speed is nice but I am not happy about the price. I don&#8217;t care at all about the 50Mbps speed. I have been using their SMC modem in bridge mode for over a year now and it works. I refused to touch the router functionality though. </p>
<p>Oh Canada, why are our internet plans so horrible? </p>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=Why+I+still+use+Rogers+for+High+Speed+Internet+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D808" title="Post to Twitter"><img class="nothumb" src="http://blog.jtclark.ca/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/intent/tweet?text=Why+I+still+use+Rogers+for+High+Speed+Internet+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D808" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.jtclark.ca/2011/07/why-i-still-use-rogers-for-high-speed-internet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pandora and Hulu in Canada with VPN script</title>
		<link>http://blog.jtclark.ca/2011/06/pandora-and-hulu-in-canada-with-vpn-script/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=pandora-and-hulu-in-canada-with-vpn-script</link>
		<comments>http://blog.jtclark.ca/2011/06/pandora-and-hulu-in-canada-with-vpn-script/#comments</comments>
		<pubDate>Mon, 20 Jun 2011 14:23:36 +0000</pubDate>
		<dc:creator>John T. Clark</dc:creator>
				<category><![CDATA[Because I Forget Things]]></category>
		<category><![CDATA[Rackspace Cloud]]></category>
		<category><![CDATA[Servers]]></category>

		<guid isPermaLink="false">http://blog.jtclark.ca/?p=802</guid>
		<description><![CDATA[Warning: Use this script at your own risk. I am not responsible if it messes up your server or if you lose data. I have tested the script on a fresh installation of Ubuntu 10.10 and recommend you also install this script on a fresh install. If you want to modify an existing installation this]]></description>
			<content:encoded><![CDATA[<p>Warning: Use this script at your own risk. I am not responsible if it messes up your server or if you lose data.</p>
<p>I have tested the script on a fresh installation of Ubuntu 10.10 and recommend you also install this script on a fresh install. If you want to modify an existing installation this script might work but I&#8217;d recommend you read my <a href="http://blog.jtclark.ca/2010/05/how-to-get-hulu-and-pandora-in-canada/">previous blog post</a> on this subject instead.<br />
<script type="text/javascript"><!--
google_ad_client = "ca-pub-7721452953380183";
/* 728x90, created 2/20/10 */
google_ad_slot = "8097105470";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br />
Copy and paste the following line into your ssh terminal.</p>
<pre class="brush:bash">
wget http://blog.jtclark.ca/wp-content/uploads/vpn-setup.sh;chmod +x vpn-setup.sh
</pre>
<p>Run the script</p>
<pre class="brush:bash">
./vpn-setup.sh
</pre>
<p>Next reboot the server and then create a PPTP VPN connection on your computer.<br />
The script automatically sets the login to user: user and pass: pass<br />
You can change this by editing /etc/ppp/chap-secrets<br />
<script type="text/javascript"><!--
google_ad_client = "ca-pub-7721452953380183";
/* 728x90, created 2/20/10 */
google_ad_slot = "8097105470";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br />
If you are curious of what the script does here is the source below.</p>
<pre class="brush:bash">
#!/bin/sh
apt-get install pptpd -y
echo "localip 192.168.123.1" >> /etc/pptpd.conf
echo "remoteip 192.168.123.234-238,192.168.123.245" >> /etc/pptpd.conf

echo "user pptpd pass *" >> /etc/ppp/chap-secrets
/etc/init.d/pptpd restart
echo "ms-dns 208.67.222.222" >> /etc/ppp/pptpd-options
echo "ms-dns 208.67.220.220" >> /etc/ppp/pptpd-options
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
sed -n '$!p' /etc/rc.local > /tmp/rc.local.temp
cp /tmp/rc.local.temp /etc/rc.local
rm /tmp/rc.local.temp
echo "/sbin/iptables -t nat -A POSTROUTING -s 192.168.123.0/24 -o eth0 -j MASQUERADE" >> /etc/rc.local
echo "exit 0" >> /etc/rc.local
</pre>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=Pandora+and+Hulu+in+Canada+with+VPN+script+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D802" title="Post to Twitter"><img class="nothumb" src="http://blog.jtclark.ca/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/intent/tweet?text=Pandora+and+Hulu+in+Canada+with+VPN+script+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D802" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.jtclark.ca/2011/06/pandora-and-hulu-in-canada-with-vpn-script/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PowWeb STILL Secretly Increasing Hosting Prices</title>
		<link>http://blog.jtclark.ca/2011/01/powweb-still-secretly-increasing-hosting-prices/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=powweb-still-secretly-increasing-hosting-prices</link>
		<comments>http://blog.jtclark.ca/2011/01/powweb-still-secretly-increasing-hosting-prices/#comments</comments>
		<pubDate>Sat, 29 Jan 2011 19:54:35 +0000</pubDate>
		<dc:creator>John T. Clark</dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[hosting]]></category>
		<category><![CDATA[PowWeb]]></category>
		<category><![CDATA[shared hosting]]></category>

		<guid isPermaLink="false">http://blog.jtclark.ca/?p=779</guid>
		<description><![CDATA[Last March I wrote a post about PowWeb&#8217;s Secret Price Increases. Well, I just received my latest invoice from them for my 2011 hosting, and guess what? Same story. They charged me $107.40, which works out to $8.95 per month. The regular price shown on their homepage is $7.77 per month. At that rate, my]]></description>
			<content:encoded><![CDATA[<p>Last March I wrote a post about <a href="http://blog.jtclark.ca/2010/03/powwebs-secret-price-increases/">PowWeb&#8217;s Secret Price Increases</a>. Well, I just received my latest invoice from them for my 2011 hosting, and guess what? Same story. They charged me $107.40, which works out to $8.95 per month. The regular price shown on their homepage is $7.77 per month. At that rate, my bill should have been $93.24. I must admit this year&#8217;s bill is slightly better than last year&#8217;s, when they tried to charge me $111.24. But still, it&#8217;s a far cry from the so-called regular price they advertise.<br />
<script type="text/javascript"><!--
google_ad_client = "ca-pub-7721452953380183";
/* 728x90, created 2/20/10 */
google_ad_slot = "8097105470";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<p>I immediately contacted PowWeb support and requested that they either bill me the correct amount or update their homepage to reflect the price they charged me. They chose to correct my invoice, as they did last year. And I have no doubt I&#8217;ll be placing the exact same support request next year.</p>
<p>As far as service and hosting reliability goes, PowWeb performs well for a shared host. Even so, that does not excuse these secret price increases. I could understand if they charged more for added features. Even if they decided to jack up their prices for no reason, I wouldn&#8217;t complain if they at least had the decency to inform their customers of the increase. But keeping an inaccurate price on their homepage year after year and hoping customers won&#8217;t notice the discrepancy? That&#8217;s just wrong.</p>
<p>I would recommend to anyone who is hosting with PowWeb that you check your invoice carefully. If you&#8217;re being charged more than $93.24 ($7.77 per month) contact support and tell them to charge you the correct amount, as shown on their homepage. You shouldn&#8217;t have to pay more.</p>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=PowWeb+STILL+Secretly+Increasing+Hosting+Prices+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D779" title="Post to Twitter"><img class="nothumb" src="http://blog.jtclark.ca/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/intent/tweet?text=PowWeb+STILL+Secretly+Increasing+Hosting+Prices+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D779" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.jtclark.ca/2011/01/powweb-still-secretly-increasing-hosting-prices/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Installing Xdebug in Zend Server CE 5.04 with PHP 5.3 on Windows 7 64-bit</title>
		<link>http://blog.jtclark.ca/2011/01/installing-xdebug-in-zend-server-ce-5-04-with-php-5-3-on-windows-7-64-bit/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=installing-xdebug-in-zend-server-ce-5-04-with-php-5-3-on-windows-7-64-bit</link>
		<comments>http://blog.jtclark.ca/2011/01/installing-xdebug-in-zend-server-ce-5-04-with-php-5-3-on-windows-7-64-bit/#comments</comments>
		<pubDate>Thu, 06 Jan 2011 02:13:37 +0000</pubDate>
		<dc:creator>John T. Clark</dc:creator>
				<category><![CDATA[Because I Forget Things]]></category>
		<category><![CDATA[Servers]]></category>
		<category><![CDATA[Workflow]]></category>
		<category><![CDATA[Xdebug]]></category>
		<category><![CDATA[Zend Server]]></category>

		<guid isPermaLink="false">http://blog.jtclark.ca/?p=758</guid>
		<description><![CDATA[I have installed the PHP extension Xdebug on multiple platforms and for some reason I keep forgetting how I manage to do it. ]]></description>
			<content:encoded><![CDATA[<p>I have installed the PHP extension Xdebug on multiple platforms and for some reason I keep forgetting how I manage to do it every time. </p>
<p>Below are the steps I followed to get Xdebug working with Zend Server CE 5.04 with PHP 5.3 on Windows 7 Ultimate 64-bit.</p>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-7721452953380183";
/* 336x280, created 2/20/10 */
google_ad_slot = "0786228221";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<ol>
<li>Download the correct Xdebug extension from <a href="http://www.xdebug.org/download.php">here</a>.<br />
Note: Although I am running a 64-bit OS, Zend Server CE 5.04 is 32-bit and requires 32-bit extensions so I downloaded the 32-bit version of Xdebug <a href="http://www.xdebug.org/files/php_xdebug-2.1.0-5.3-vc9-nts.dll">php_xdebug-2.1.0-5.3-vc9-nts.dll</a></li>
<li>Copy the DLL to C:\Program Files (x86)\Zend\ZendServer\lib\phpext\</li>
<li>Add the following lines ABOVE [Zend] in your php.ini file which is located at C:\Program Files (x86)\Zend\ZendServer\etc\php.ini
<pre class="brush:bash">
[xdebug]
zend_extension="C:\Program Files (x86)\Zend\ZendServer\lib\phpext\php_xdebug-2.1.0-5.3-vc9-nts.dll"
</pre>
</li>
<li>Restart Apache </li>
<li>Log in to the Zend Server GUI at http://localhost:10081/ZendServer and check the PHP Info page for Xdebug</li>
<li>If you have an Xdebug section then it works. Now you&#8217;ll want to probably add some more configuration to the [xdebug] section of the php.ini file. See xdebug.org for more info.</li>
</ol>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=Installing+Xdebug+in+Zend+Server+CE+5.04+with+PHP+5.3+on+Windows+7+64-bit+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D758" title="Post to Twitter"><img class="nothumb" src="http://blog.jtclark.ca/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/intent/tweet?text=Installing+Xdebug+in+Zend+Server+CE+5.04+with+PHP+5.3+on+Windows+7+64-bit+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D758" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.jtclark.ca/2011/01/installing-xdebug-in-zend-server-ce-5-04-with-php-5-3-on-windows-7-64-bit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Make your Zend Framework Error Controller handle PHP errors</title>
		<link>http://blog.jtclark.ca/2010/12/make-your-zend-framework-error-controller-handle-php-errors/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=make-your-zend-framework-error-controller-handle-php-errors</link>
		<comments>http://blog.jtclark.ca/2010/12/make-your-zend-framework-error-controller-handle-php-errors/#comments</comments>
		<pubDate>Fri, 03 Dec 2010 23:00:34 +0000</pubDate>
		<dc:creator>John T. Clark</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Error Handling]]></category>
		<category><![CDATA[set_error_handler]]></category>

		<guid isPermaLink="false">http://blog.jtclark.ca/?p=745</guid>
		<description><![CDATA[Zend Framework has great error handling capabilities but it requires a little code to get in catching more than just exceptions. ]]></description>
			<content:encoded><![CDATA[<p>The Zend Framework <a href="http://framework.zend.com/manual/en/learning.quickstart.intro.html">Quick Start</a> tutorial comes with a great example of the type of error handling Zend Framework can do. Any exception that is thrown almost anywhere in your application is caught and handled by the Error Controller. This allows for very customized development and/or user error messages. But what about generic PHP errors? What about PHP notices? It&#8217;s really annoying to see a white screen with a single PHP error after you&#8217;ve spent so long trying to get your pretty Error Controller handled errors looking so nice.</p>
<p>PHP has a nifty function called <a href="http://ca.php.net/manual/en/function.set-error-handler.php">set_error_handler</a> which allows you to, well, set the error handler. You provide it a callback function and it calls your function when something bad happens. While it obviously can&#8217;t catch all PHP errors, it does a pretty good job of catching most of the little annoying ones.</p>
<p>Below is a way to set your ErrorController as the PHP error handler. </p>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-7721452953380183";
/* 728x90, created 2/20/10 */
google_ad_slot = "8097105470";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<p>Add the following method to your Bootstrap.php class.</p>
<pre class="brush:php">
public function __construct($application) {
    parent::__construct($application);
    MyApp_Error_Handler::set();
}
</pre>
<p>Add this code to a file called library/MyApp/Error/Handler.php</p>
<pre class="brush:php">
class MyApp_Error_Handler {
    public static function handle($errno, $errstr, $errfile, $errline)
    {
        if (!error_reporting()) return;
        throw new Exception($errstr . " in $errfile:$errline". $errno);
    }

    public static function set()
    {
        set_error_handler(array(__CLASS__, 'handle'));
    }
}
</pre>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=Make+your+Zend+Framework+Error+Controller+handle+PHP+errors+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D745" title="Post to Twitter"><img class="nothumb" src="http://blog.jtclark.ca/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/intent/tweet?text=Make+your+Zend+Framework+Error+Controller+handle+PHP+errors+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D745" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.jtclark.ca/2010/12/make-your-zend-framework-error-controller-handle-php-errors/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Wishing Wagon: Your Online Wish List</title>
		<link>http://blog.jtclark.ca/2010/11/wishing-wagon-ultimate-online-wish-list/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wishing-wagon-ultimate-online-wish-list</link>
		<comments>http://blog.jtclark.ca/2010/11/wishing-wagon-ultimate-online-wish-list/#comments</comments>
		<pubDate>Tue, 09 Nov 2010 23:00:25 +0000</pubDate>
		<dc:creator>John T. Clark</dc:creator>
				<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[Reviews]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[gifts]]></category>
		<category><![CDATA[online wish list]]></category>

		<guid isPermaLink="false">http://blog.jtclark.ca/?p=727</guid>
		<description><![CDATA[I know I haven&#8217;t blogged since August but I have a good excuse. My team and I have been working really hard towards the public beta release of our new online wish list app Wishing Wagon. Basically, Wishing Wagon allows you to create lists of items you would like to receive for a special occasion]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.jtclark.ca/wp-content/uploads/2010/11/wishingwagon-logo-340x80.png"><img src="http://blog.jtclark.ca/wp-content/uploads/2010/11/wishingwagon-logo-340x80-300x70.png" alt="" title="wishingwagon-logo-340x80" width="300" height="70" class="alignright size-medium wp-image-735" /></a>I know I haven&#8217;t blogged since August but I have a good excuse. My team and I have been working really hard towards the public beta release of our new online wish list app <a href="http://www.wishingwagon.com">Wishing Wagon</a>. Basically, Wishing Wagon allows you to create lists of items you would like to receive for a special occasion like Christmas, birthday, wedding, etc. The advantage of Wishing Wagon over other store-based wish lists is that we aren&#8217;t store-based. You can add any item you want from any online or physical store.</p>
<p>Since my blog is primarily about technical topics and I&#8217;m not sure if promoting my web app can be classified as a miscellaneous rant, I&#8217;ll talk a bit about the architecture of Wishing Wagon.
</p>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-7721452953380183";
/* 728x90, created 2/20/10 */
google_ad_slot = "8097105470";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<p>The site was built using PHP and of course my favourite PHP framework, Zend Framework. For the database, instead of MySQL, this time we decided to use Couch DB. I must say that using documents instead of using relational databases feels so much more natural. Documents fit much better with models and I don&#8217;t have to worry about Many-to-Many relationships anymore.  Couch DB took a bit of time to get used to, but I am now hooked and will try to use Couch whenever eventual consistency is an option.  </p>
<p>During the development of Wishing Wagon, I&#8217;ve also come to appreciate the built-in Amazon API support in Zend Framework. Retrieving products and searching for items is a breeze. I was a little surprised at how easy it was.</p>
<p>The site is hosted on Rackspace Cloud and is load balanced using HAproxy. We use Rackspace Cloud files as our CDN and we use the Compass Rackspace Cloud Files Zend Framework Library to upload files to the CDN.</p>
<p>I&#8217;ll try to blog a bit more about our development experience in the next few weeks.</p>
<p>Don&#8217;t forget Christmas is only 45 days away! Why not <a href="http://www.wishingwagon.com">create a Wishing Wagon</a> and add some items? Oh, and did I mention it&#8217;s free?</p>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=Wishing+Wagon%3A+Your+Online+Wish+List+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D727" title="Post to Twitter"><img class="nothumb" src="http://blog.jtclark.ca/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/intent/tweet?text=Wishing+Wagon%3A+Your+Online+Wish+List+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D727" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.jtclark.ca/2010/11/wishing-wagon-ultimate-online-wish-list/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Accessing CouchDB with Zend Framework using Phly_Couch</title>
		<link>http://blog.jtclark.ca/2010/08/accessing-couchdb-with-zend-framework-using-phly_couch/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=accessing-couchdb-with-zend-framework-using-phly_couch</link>
		<comments>http://blog.jtclark.ca/2010/08/accessing-couchdb-with-zend-framework-using-phly_couch/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 16:00:46 +0000</pubDate>
		<dc:creator>John T. Clark</dc:creator>
				<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[Phly_Couch]]></category>

		<guid isPermaLink="false">http://blog.jtclark.ca/?p=689</guid>
		<description><![CDATA[Access your CouchDB instance with Zend Framework]]></description>
			<content:encoded><![CDATA[<p>If you have never heard of CouchDB here is the first Paragraph from the Apache CouchDB project <a href="http://couchdb.apache.org/docs/overview.html">documentation</a>: <quote>A CouchDB server hosts named databases, which store documents. Each document is uniquely named in the database, and CouchDB provides a RESTful HTTP API for reading and updating (add, edit, delete) database documents.</quote><br />
You can also read the free CouchDB book <a href="http://books.couchdb.org/relax/">here</a>.</p>
<p>The easiest way to get started is to sign up for a free CouchDB instance <a href="http://www.couch.io/get">here</a>.</p>
<p>In this tutorial I&#8217;m going to show you a quick way of getting CouchDb working with Zend Framework.</p>
<p>I&#8217;m assuming you already have a Zend Framework project setup if not get the quickstart <a href="http://framework.zend.com/manual/en/learning.quickstart.intro.html">here</a>.</p>
<p>Since the Zend Framework doesn&#8217;t currently support CouchDB a separate library is required.<br />
Matthew Weier O&#8217;Phinney has written a nice library that provides most of the functionality required to work with CouchDB. You can download Phly_Couch <a href="http://github.com/weierophinney/phly/tree/master/Phly_Couch">here</a>. Once downloaded extract it to your projects library directory.</p>
<p>Add this to your application.ini and modify with your info.</p>
<pre class="brush:php">
couchDb.host  = "username:password@youraccount.couchone.com"
couchDb.db    = "yourdb"
couchDb.port  = 80
</pre>
<p>Add this method to your Bootstrap.php</p>
<pre class="brush:php">
    /**
     * Adds configuration to Zend_Registry
     * Retrieval example: Zend_Registry::get('config')->couchDb->db
     * @return Zend_Config
     */
    protected function _initConfig()
    {
        $config = new Zend_Config($this->getOptions());
        Zend_Registry::set('config', $config);
        return $config;
    }
</pre>
<p><script type="text/javascript"><!--
google_ad_client = "ca-pub-7721452953380183";
/* 728x90, created 2/20/10 */
google_ad_slot = "8097105470";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br />
Use the following code to access your CouchDB instance.</p>
<pre class="brush:php">
    // Establish connection
    $couch = new Phly_Couch(Zend_Registry::get('config')->couchDb);

    // Create a new document
    $testId = uniqid('TEST-',true);
    $document = new Phly_Couch_Document($testId);
    $document->id = "NewPage";
    $document->title = "New Page";
    $document->content = "This is a new wiki page!";
    $document->created = date('Y-m-d H:i:s');
    $document->tags    = array('wiki', 'system');
    $couch->docSave($document);

    // Read Document
    $document = $couch->docOpen($testId);
    if ($document->getId() != $testId) throw new Exception("ID's do not match. ID=" . $document->getId());

    // Delete a document
    $document = $couch->docRemove($testId,
        array(
            'rev' => $document->getRevision()
    ));
</pre>
<p><strong>UPDATE:</strong><br />
I had forgotten that I had made some changes to Phly_Couch. I have uploaded the code to Google Code. You can download it <a href="https://code.google.com/p/jtclark-blog/source/browse/trunk/Zend+Framework/Libraries/Phly">here</a></p>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=Accessing+CouchDB+with+Zend+Framework+using+Phly_Couch+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D689" title="Post to Twitter"><img class="nothumb" src="http://blog.jtclark.ca/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/intent/tweet?text=Accessing+CouchDB+with+Zend+Framework+using+Phly_Couch+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D689" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.jtclark.ca/2010/08/accessing-couchdb-with-zend-framework-using-phly_couch/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Creating a JSON-RPC server with Zend Framework</title>
		<link>http://blog.jtclark.ca/2010/05/creating-a-json-rpc-server-with-zend-framework/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=creating-a-json-rpc-server-with-zend-framework</link>
		<comments>http://blog.jtclark.ca/2010/05/creating-a-json-rpc-server-with-zend-framework/#comments</comments>
		<pubDate>Fri, 21 May 2010 02:23:23 +0000</pubDate>
		<dc:creator>John T. Clark</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON-RPC]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Zend_Json_Server]]></category>

		<guid isPermaLink="false">http://blog.jtclark.ca/?p=654</guid>
		<description><![CDATA[Does setting up a JSON-RPC server sound complicated? Well with Zend Framework it certainly is not. ]]></description>
			<content:encoded><![CDATA[<p>For my latest project, I was determined to avoid confusing Ajax requests by implementing my own JSON-RPC. Again, Zend Framework has made this incredibly easy.</p>
<p>The documentation recommends not running your Ajax request through the MVC. At first I was a little concerned, but it makes sense as the MVC does add a lot of unnecessary overhead.</p>
<p>I found <a href="http://sourcecodebean.com/archives/creating-a-json-rpc-service-using-zend-json-server/422">this blog</a> very helpful in figuring out how to do this.<br />
The first step is to create a new bootstrap file.<br />
I created one in public/api/1.0/jsonrpc.php</p>
<pre class="brush:php">Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../../../application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath('../../../library'),
    get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);

$application-&gt;getBootstrap()
            -&gt;bootstrap('doctrine')
            -&gt;bootstrap('config');

// Instantiate server, etc.
$server = new Zend_Json_Server();
$server-&gt;setClass('App_Model_JsonRpc');

if ('GET' == $_SERVER['REQUEST_METHOD']) {
    // Indicate the URL endpoint, and the JSON-RPC version used:
    $server-&gt;setTarget('/api/1.0/jsonrpc.php')
           -&gt;setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2);

    // Grab the SMD
    $smd = $server-&gt;getServiceMap();

    // Return the SMD to the client
    header('Content-Type: application/json');
    echo $smd;
    return;
}

$server-&gt;handle();</pre>
<p>You may want to modify the $application-&gt;getBootstrap() line and add/remove bootstrap methods depending on your requirements. I need access to my database within my JSON-RPC server and use Doctrine as my ORM so I bootstrap that.</p>
<p>The most important line is:</p>
<pre class="brush:php">$server-&gt;setClass('App_Model_JsonRpc');</pre>
<p>This tells the server what class should handle all the JSON requests.</p>
<p>I also added a RedirectRule in my .htaccess file to hide the php extension. It&#8217;s unnecessary but the .php extension isn&#8217;t seen anywhere else on my site so I don&#8217;t want it on my JSON RPC server either.<br />
I added this line&#8230;</p>
<pre class="brush:bash">RewriteRule ^api/([0-9].[0-9])/jsonrpc$ /api/$1/jsonrpc.php [NC,L]</pre>
<p>&#8230;between these two lines:</p>
<pre class="brush:bash">RewriteRule ^.*$ - [NC,L]
RewriteRule ^api/([0-9].[0-9])/jsonrpc$ /api/$1/jsonrpc.php [NC,L]
RewriteRule ^.*$ index.php [NC,L]</pre>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-7721452953380183";
/* 728x90, created 2/20/10 */
google_ad_slot = "8097105470";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br />
I then created a class called App_Model_JsonRpc and put it in my models directory.<br />
/application/models/JsonRpc.php</p>
<pre class="brush:php">class App_Model_JsonRpc
{

    /**
     * Return sum of two variables
     *
     * @param  int $x
     * @param  int $y
     * @return array
     */
    public function add($x, $y)
    {
        return  $x + $y;
    }
}</pre>
<p>The doc blocks are very important as Zend_Json_Server generates the SMD based on the contents of the Doc block.</p>
<p>That&#8217;s it for the server. Send it the proper JSON code and it will add 2 numbers together and return the result.</p>
<p>Heres a quick example of how to use your new server.<br />
I recommend installing the ZendJsonRpc jQuery plugin as it makes talking to your server much easier. You can download the plugin <a href="http://www.tanabi.com/projects/jsonrpc">here</a>.</p>
<pre class="brush:javascript">&lt;script src="/js/json2.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="/js/jquery.zend.jsonrpc.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
$(document).ready(function(){
 myApi = jQuery.Zend.jsonrpc({url: '/api/1.0/jsonrpc'});

 alert('5+5=' + myApi.add(5,5));

 });
&lt;/script&gt;</pre>
<p>That&#8217;s it!<br />
<script type="text/javascript"><!--
google_ad_client = "ca-pub-7721452953380183";
/* 728x90, created 2/20/10 */
google_ad_slot = "8097105470";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=Creating+a+JSON-RPC+server+with+Zend+Framework+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D654" title="Post to Twitter"><img class="nothumb" src="http://blog.jtclark.ca/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/intent/tweet?text=Creating+a+JSON-RPC+server+with+Zend+Framework+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D654" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.jtclark.ca/2010/05/creating-a-json-rpc-server-with-zend-framework/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>How to get Hulu and Pandora in Canada</title>
		<link>http://blog.jtclark.ca/2010/05/how-to-get-hulu-and-pandora-in-canada/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=how-to-get-hulu-and-pandora-in-canada</link>
		<comments>http://blog.jtclark.ca/2010/05/how-to-get-hulu-and-pandora-in-canada/#comments</comments>
		<pubDate>Sat, 15 May 2010 14:53:54 +0000</pubDate>
		<dc:creator>John T. Clark</dc:creator>
				<category><![CDATA[Because I Forget Things]]></category>
		<category><![CDATA[Rackspace Cloud]]></category>
		<category><![CDATA[Hulu]]></category>
		<category><![CDATA[Pandora]]></category>
		<category><![CDATA[Proxy]]></category>
		<category><![CDATA[Rackspace]]></category>
		<category><![CDATA[VPN]]></category>
		<category><![CDATA[VPS]]></category>

		<guid isPermaLink="false">http://blog.jtclark.ca/?p=643</guid>
		<description><![CDATA[Finally a way to watch Hulu and listen to Pandora in Canada!]]></description>
			<content:encoded><![CDATA[<p>UPDATE: There was an error in one of the steps, the file /etc/ppp/options does not have to be edited, but /etc/ppp/pptpd-options does. The steps are now correct.</p>
<p>Like many Canadians I am jealous of the American&#8217;s and their ability to watch Hulu or listen to free music with Pandora. Both services claim they are working on making their site available to the world but I don&#8217;t like waiting.</p>
<script type="text/javascript"><!--
google_ad_client = "ca-pub-7721452953380183";
/* 728x90, created 2/20/10 */
google_ad_slot = "8097105470";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<p>The way these types of sites figure out that you are not an American is by your IP address. I don&#8217;t know of any way of using an American IP address on my computer at home but it just so happens I have several Cloud Servers that are located in the US which of course have American IP addresses.</p>
<p>I have heard of people outside the US using the Proxy server or VPN server method but I had no idea it was so easy to setup. If you already have a cloud server up and running you could literally have it working in about 5 minutes.  Setting it up from scratch should take about 10 minutes.</p>
<p>Below are the steps I followed to setup a Ubuntu based VPN server that allows me to access these coveted American sites from either my Mac or PC.</p>
<p><a href="https://www.rackspacecloud.com/signup/297-0-1-9.html" target="_blank"><img src="http://affiliates.rackspacecloud.com/banners/468x60.gif" border="0" alt="Cloud Computing &amp; Cloud Hosting by Rackspace" width="468" height="60" /></a></p>
<p>I use Rackspace Cloud Servers for all my cloud server accounts but any VPS or dedicated server provider (provided they&#8217;re servers are located in the US) will work. I used Ubuntu 10.04 but any version of Ubuntu should work.</p>
<p>Connect to your server via SSH and start typing commands</p>
<p>If you just created a new Rackspace Cloud Server you&#8217;ll want to change your password.</p>
<pre class="brush:bash">passwd</pre>
<p>Next update the package list and upgrade any packages that need updating.</p>
<pre class="brush:bash">apt-get update
apt-get upgrade</pre>
<p>Now install the PPTP server package.</p>
<pre class="brush:bash">apt-get install pptpd</pre>
<p>Specify the local and remote IP addresses. Default should work unless your local network is 192.168.123.0</p>
<pre class="brush:bash">nano /etc/pptpd.conf</pre>
<p>Add these lines (or uncomment and modify existing ones)</p>
<pre class="brush:bash">localip 192.168.123.1
remoteip 192.168.123.234-238,192.168.123.245</pre>
<p>Create a user account to connect to your server</p>
<pre class="brush:bash">nano /etc/ppp/chap-secrets</pre>
<p>Add a user to the file in the following format:<br />
username pptpd password *<br />
For example:</p>
<pre class="brush:bash">john pptpd abc123 *</pre>
<p>would create a user named john with a password abc123.<br />
<script type="text/javascript"><!--
google_ad_client = "ca-pub-7721452953380183";
/* 728x90, created 2/20/10 */
google_ad_slot = "8097105470";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br />
Now restart the pptpd service</p>
<pre class="brush:bash">/etc/init.d/pptpd restart</pre>
<p>You should be able to connect to your server via PPTP but you won&#8217;t be able to access any websites outside your server without a few more steps.</p>
<p>Setup DNS servers in the PPP Server options</p>
<pre class="brush:bash">nano /etc/ppp/pptpd-options</pre>
<p>Uncomment and change the 2 lines starting with ms-dns<br />
This sets up your server to make DNS requests via OpenDNS</p>
<pre class="brush:bash">ms-dns 208.67.222.222
ms-dns 208.67.220.220</pre>
<p>Open the system configuration file and setup IP forwarding</p>
<pre class="brush:bash">nano /etc/sysctl.conf</pre>
<p>Uncomment the following line</p>
<pre class="brush:bash">net.ipv4.ip_forward=1</pre>
<p>To make the system configuration changes take effect:</p>
<pre class="brush:bash">sysctl -p</pre>
<p>Edit this file</p>
<pre class="brush:bash">nano /etc/rc.local</pre>
<p>Add these two lines above exit (0) in this file:</p>
<pre class="brush:bash">/sbin/iptables -t nat -A POSTROUTING -s 192.168.123.0/24 -o eth0 -j MASQUERADE
/sbin/iptables -I FORWARD -p tcp -syn -i ppp+ -j TCPMSS -set-mss 1356</pre>
<p>Server is done. You can connect to this server using any PPTP client.</p>
<p><a href="https://www.rackspacecloud.com/signup/297-0-1-9.html" target="_blank"><img src="http://affiliates.rackspacecloud.com/banners/468x60.gif" border="0" alt="Cloud Computing &amp; Cloud Hosting by Rackspace" width="468" height="60" /></a></p>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=How+to+get+Hulu+and+Pandora+in+Canada+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D643" title="Post to Twitter"><img class="nothumb" src="http://blog.jtclark.ca/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/intent/tweet?text=How+to+get+Hulu+and+Pandora+in+Canada+http%3A%2F%2Fblog.jtclark.ca%2F%3Fp%3D643" title="Post to Twitter">Tweet This Post</a></p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.jtclark.ca/2010/05/how-to-get-hulu-and-pandora-in-canada/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

