<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>WEBarnes.ca (William Barnes)</title>
	
	<link>http://www.webarnes.ca</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sat, 19 May 2012 17:17:46 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/WEBarnesca" /><feedburner:info uri="webarnesca" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>WEBarnesca</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Exactly what I expected</title>
		<link>http://feedproxy.google.com/~r/WEBarnesca/~3/y5FHudIy598/</link>
		<comments>http://www.webarnes.ca/2012/04/exactly-what-i-expected/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 16:02:13 +0000</pubDate>
		<dc:creator>William Barnes</dc:creator>
				<category><![CDATA[Food]]></category>
		<category><![CDATA[cooking]]></category>

		<guid isPermaLink="false">http://www.webarnes.ca/?p=1390</guid>
		<description><![CDATA[Why can&#8217;t I prepare your products in a toaster oven? Our Product Development personnel do not recommend using a toaster oven due to the toaster oven&#8217;s small size and proximity of the heating element to the container. From Stouffer&#8217;s FAQ I feel kind of bad about tagging this &#8220;cooking&#8221;.]]></description>
				<content:encoded><![CDATA[<blockquote>
<div>
<h4>Why can&#8217;t I prepare your products in a toaster oven?</h4>
<p>Our Product Development personnel do not recommend using a toaster oven due to the toaster oven&#8217;s small size and proximity of the heating element to the container.</p>
</div>
</blockquote>
<div>
<p>From <a href="http://www.stouffers.com/faqs.aspx">Stouffer&#8217;s FAQ</a></p>
<p>I feel kind of bad about tagging this &#8220;cooking&#8221;.</p>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=y5FHudIy598:vHSARH5sz5U:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=y5FHudIy598:vHSARH5sz5U:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?i=y5FHudIy598:vHSARH5sz5U:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=y5FHudIy598:vHSARH5sz5U:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WEBarnesca/~4/y5FHudIy598" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webarnes.ca/2012/04/exactly-what-i-expected/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.webarnes.ca/2012/04/exactly-what-i-expected/</feedburner:origLink></item>
		<item>
		<title>Capifony fails on “bin/vendors install –reinstall”</title>
		<link>http://feedproxy.google.com/~r/WEBarnesca/~3/imw3I808WhY/</link>
		<comments>http://www.webarnes.ca/2012/04/capifony-fails-on-binvendors-install-reinstall/#comments</comments>
		<pubDate>Wed, 04 Apr 2012 02:28:15 +0000</pubDate>
		<dc:creator>William Barnes</dc:creator>
				<category><![CDATA[Computers & Internet]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.webarnes.ca/?p=1386</guid>
		<description><![CDATA[I was attempting to deploy my Symfony app using Capifony, but it just wouldn&#8217;t work. The first error in the train wreck was: &#8220;Warning: Wrong parameter count for parse_ini_file() in &#8230;/bin/vendors on line 69&#8243;. Like all problems that take forever to fix, this one was incredibly simple. My shared host had both php 5.2 and [...]]]></description>
				<content:encoded><![CDATA[<p>I was attempting to deploy my Symfony app using Capifony, but it just wouldn&#8217;t work. The first error in the train wreck was: &#8220;Warning: Wrong parameter count for parse_ini_file() in &#8230;/bin/vendors on line 69&#8243;. Like all problems that take forever to fix, this one was incredibly simple. My shared host had both php 5.2 and 5.3 installed. I added the following line to deploy.rb: <code>set :php_bin, "/usr/local/bin/php-5.3"</code></p>
<p>Your path may differ.</p>
<p>Update: If you are having this problem, you also need to fix $interpreter in &#8216;bin/vendors&#8217;.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=imw3I808WhY:0CJbMWidRyw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=imw3I808WhY:0CJbMWidRyw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?i=imw3I808WhY:0CJbMWidRyw:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=imw3I808WhY:0CJbMWidRyw:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WEBarnesca/~4/imw3I808WhY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webarnes.ca/2012/04/capifony-fails-on-binvendors-install-reinstall/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.webarnes.ca/2012/04/capifony-fails-on-binvendors-install-reinstall/</feedburner:origLink></item>
		<item>
		<title>HTML5 History API and Scrolling</title>
		<link>http://feedproxy.google.com/~r/WEBarnesca/~3/KelegGE4VQ0/</link>
		<comments>http://www.webarnes.ca/2012/04/html5-history-api-and-scrolling/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 23:22:05 +0000</pubDate>
		<dc:creator>William Barnes</dc:creator>
				<category><![CDATA[Computers & Internet]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.webarnes.ca/?p=1380</guid>
		<description><![CDATA[[Edit: The solution below has a bug. If the page is refreshed, then the states array is lost. I have an updated approach and will post it soon.] My new web app uses the HTML5 History API (as abstracted by History.js) to smooth out navigation. This proved to be a bit of a challenge because, [...]]]></description>
				<content:encoded><![CDATA[<p><em>[Edit: The solution below has a bug. If the page is refreshed, then the states array is lost. I have an updated approach and will post it soon.]</em></p>
<p>My new web app uses the HTML5 History API (as abstracted by <a href="https://github.com/balupton/History.js/">History.js</a>) to smooth out navigation. This proved to be a bit of a challenge because, despite all the Javascript, my app is supposed to act just like a normal web page. The main content of my app is dynamically loaded in an ordinary static-positioned DIV. Thus, the user scrolls the window like normal. Other elements are fixed to the viewport.</p>
<p>One major problem I encountered was that browsers have serious issues with remembering the window scroll position across pages Normally, when a user clicks the back button, they are taken to the previous page at the same place that they left it. Most browsers don&#8217;t actually reload the page, but store it in memory, so this happens almost instantaneously. When using the History API, this does not always work. In this post, I detail the problems and my solution.</p>
<p class="img"><a href="http://www.webarnes.ca/wp-content/uploads/2012/04/image.jpg"><img class="alignnone size-large wp-image-1381" title="image" src="http://www.webarnes.ca/wp-content/uploads/2012/04/image-560x420.jpg" alt="" width="560" height="420" /></a></p>
<p>In Webkit, when the user navigates (using links or the back/forward buttons) the scroll does not change from page to page unless the page is too short to support the scroll value. If the user scrolls on page 1 and clicks to page 2, window.scrollY on page2 is the same as it was on page 1. If they scroll on page 2 and navigate back to page 1, scrollY is now the new value. If page 3 is not long enough to scroll, then scrollY is zeroed. Going back to page 1, it remains 0. I like this behaviour because it is predictable. If I am overriding the browser&#8217;s navigation, I&#8217;d like to have complete control.</p>
<p>Firefox, however, is somewhat erratic in this area. Generally speaking, it behaves like a browser on a normal website. If scrollY on page 1 is 50 and the user clicks to page 2, scrollY is 0. If they scroll a bit so scrollY on page 2 is now 200, then navigate back to page 1, scrollY will be 50. <strong>However</strong>, if they navigate to page 3 (which doesn&#8217;t scroll) and then back to page 1, scrollY will be 0.</p>
<p>I worked around this by storing the scroll value myself, and scrolling to that on each History statechange. Originally, I only stored the current scroll value while handling the statechange event, but Firefox applies its remembered value before firing the event. This placed me in the awkward position of needing to know the value before the user did anything. I use the window.onscroll event to detect when the window has been scrolled <em>by the user</em> so that it does not store a value in the awkward time where new content is loading. Following <a href="ejohn.org/blog/learning-from-twitter/">John Resig&#8217;s example</a>, I store the value every half second using setInterval.</p>
<div id="wpshdo_1" class="wp-synhighlighter-outer"><div id="wpshdt_1" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_1"></a><a id="wpshat_1" class="wp-synhighlighter-title" href="#codesyntax_1"  onClick="javascript:wpsh_toggleBlock(1)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_1" onClick="javascript:wpsh_code(1)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_1" onClick="javascript:wpsh_print(1)" title="Print code"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_1" class="wp-synhighlighter-inner" style="display: block;"><pre class="javascript" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="kw2">var</span> loc <span class="sy0">=</span> <span class="br0">&#123;</span></div></li><li class="li1"><div class="de1">	currentState<span class="sy0">:</span> 0<span class="sy0">,</span></div></li><li class="li1"><div class="de1">	states<span class="sy0">:</span> <span class="br0">&#91;</span></div></li><li class="li1"><div class="de1">		<span class="br0">&#123;</span><span class="kw3">scroll</span><span class="sy0">:</span> 0<span class="br0">&#125;</span></div></li><li class="li2"><div class="de2">	<span class="br0">&#93;</span><span class="sy0">,</span></div></li><li class="li1"><div class="de1">	hasScrolled<span class="sy0">:</span> <span class="kw2">true</span><span class="sy0">,</span></div></li><li class="li1"><div class="de1">&nbsp;</div></li><li class="li1"><div class="de1">	initHistory<span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li><li class="li1"><div class="de1">		<span class="kw2">var</span> History <span class="sy0">=</span> baseWin.<span class="me1">global</span>.<span class="me1">History</span><span class="sy0">;</span></div></li><li class="li2"><div class="de2">		<span class="kw1">if</span> <span class="br0">&#40;</span>History.<span class="me1">enabled</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li><li class="li1"><div class="de1">			<span class="co1">// Before binding events, replace the state with the proper ID.</span></div></li><li class="li1"><div class="de1">			<span class="co1">// Otherwise, strange things happen.</span></div></li><li class="li1"><div class="de1">			History.<span class="me1">replaceState</span><span class="br0">&#40;</span><span class="br0">&#123;</span>state<span class="sy0">:</span>0<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1">			<span class="co1">// Bind the state change event (Dojo won't do this for some reason)</span></div></li><li class="li2"><div class="de2">			History.<span class="me1">Adapter</span>.<span class="me1">bind</span><span class="br0">&#40;</span>baseWin.<span class="me1">global</span><span class="sy0">,</span> <span class="st0">&quot;statechange&quot;</span><span class="sy0">,</span> loc.<span class="me1">handleStateChange</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1">			<span class="co1">// Bind the anchor click</span></div></li><li class="li1"><div class="de1">			on<span class="br0">&#40;</span>baseWin.<span class="me1">body</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st0">&quot;a[href]:click&quot;</span><span class="sy0">,</span> loc.<span class="me1">anchorClick</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1">			<span class="co1">// Bind the scroll event</span></div></li><li class="li1"><div class="de1">			on<span class="br0">&#40;</span>baseWin.<span class="me1">global</span><span class="sy0">,</span> <span class="st0">'scroll'</span><span class="sy0">,</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> loc.<span class="me1">hasScrolled</span> <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span> <span class="br0">&#125;</span><span class="br0">&#41;</span></div></li><li class="li2"><div class="de2">			<span class="co1">// Store the scroll position every 500ms</span></div></li><li class="li1"><div class="de1">			setInterval<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li><li class="li1"><div class="de1">				<span class="kw1">if</span> <span class="br0">&#40;</span>loc.<span class="me1">hasScrolled</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li><li class="li1"><div class="de1">					loc.<span class="me1">states</span><span class="br0">&#91;</span>loc.<span class="me1">currentState</span><span class="br0">&#93;</span>.<span class="kw3">scroll</span> <span class="sy0">=</span> baseWin.<span class="me1">global</span>.<span class="me1">scrollY</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1">					loc.<span class="me1">hasScrolled</span> <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span></div></li><li class="li2"><div class="de2">				<span class="br0">&#125;</span></div></li><li class="li1"><div class="de1">			<span class="br0">&#125;</span><span class="sy0">,</span> 500<span class="br0">&#41;</span></div></li><li class="li1"><div class="de1">		<span class="br0">&#125;</span></div></li><li class="li1"><div class="de1">	<span class="br0">&#125;</span><span class="sy0">,</span></div></li><li class="li1"><div class="de1">&nbsp;</div></li><li class="li2"><div class="de2">	anchorClick<span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li><li class="li1"><div class="de1">		<span class="kw2">var</span> History <span class="sy0">=</span> baseWin.<span class="me1">global</span>.<span class="me1">History</span><span class="sy0">,</span></div></li><li class="li1"><div class="de1">			rootUrl <span class="sy0">=</span> History.<span class="me1">getRootUrl</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span></div></li><li class="li1"><div class="de1">			node    <span class="sy0">=</span> e.<span class="me1">target</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1">&nbsp;</div></li><li class="li2"><div class="de2">		<span class="co1">// Remove orphaned states</span></div></li><li class="li1"><div class="de1">		loc.<span class="me1">states</span> <span class="sy0">=</span> loc.<span class="me1">states</span>.<span class="me1">slice</span><span class="br0">&#40;</span>0<span class="sy0">,</span> loc.<span class="me1">currentState</span> <span class="sy0">+</span> 1<span class="br0">&#41;</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1">		<span class="co1">// Initialize the new state</span></div></li><li class="li1"><div class="de1">		loc.<span class="me1">states</span><span class="br0">&#91;</span>loc.<span class="me1">currentState</span> <span class="sy0">+</span> 1<span class="br0">&#93;</span> <span class="sy0">=</span> <span class="br0">&#123;</span><span class="kw3">scroll</span><span class="sy0">:</span> 0<span class="br0">&#125;</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1">&nbsp;</div></li><li class="li2"><div class="de2">		<span class="co1">// If there is a span, b, i, etc inside the link, that will be the target node.</span></div></li><li class="li1"><div class="de1">		<span class="co1">// This loop finds the actual anchor.</span></div></li><li class="li1"><div class="de1">		<span class="kw1">while</span> <span class="br0">&#40;</span>node.<span class="me1">nodeName</span>.<span class="me1">toLowerCase</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="st0">'a'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li><li class="li1"><div class="de1">			node <span class="sy0">=</span> node.<span class="me1">parentNode</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1">		<span class="br0">&#125;</span></div></li><li class="li2"><div class="de2">&nbsp;</div></li><li class="li1"><div class="de1">		<span class="kw2">var</span> url 			<span class="sy0">=</span> domAttr.<span class="me1">get</span><span class="br0">&#40;</span>node<span class="sy0">,</span><span class="st0">&quot;href&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span></div></li><li class="li1"><div class="de1">			isInternalLink 	<span class="sy0">=</span> url.<span class="me1">substring</span><span class="br0">&#40;</span>0<span class="sy0">,</span>rootUrl.<span class="me1">length</span><span class="br0">&#41;</span> <span class="sy0">===</span> rootUrl <span class="sy0">||</span> url.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;:&quot;</span><span class="br0">&#41;</span> <span class="sy0">===</span> <span class="sy0">-</span><span class="nu0">1</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1">		<span class="kw1">if</span> <span class="br0">&#40;</span>isInternalLink<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li><li class="li1"><div class="de1">			event.<span class="kw3">stop</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span><span class="sy0">;</span></div></li><li class="li2"><div class="de2">			url <span class="sy0">=</span> url.<span class="me1">replace</span><span class="br0">&#40;</span>rootUrl<span class="sy0">,</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span></div></li><li class="li1"><div class="de1">			History.<span class="me1">pushState</span><span class="br0">&#40;</span><span class="br0">&#123;</span>state<span class="sy0">:</span>loc.<span class="me1">currentState</span> <span class="sy0">+</span> <span class="nu0">1</span><span class="br0">&#125;</span><span class="sy0">,</span><span class="st0">&quot;&quot;</span><span class="sy0">,</span>url<span class="br0">&#41;</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1">		<span class="br0">&#125;</span></div></li><li class="li1"><div class="de1">	<span class="br0">&#125;</span><span class="sy0">,</span></div></li><li class="li1"><div class="de1">&nbsp;</div></li><li class="li2"><div class="de2">	handleStateChange<span class="sy0">:</span> <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li><li class="li1"><div class="de1">		<span class="kw2">var</span> History <span class="sy0">=</span> baseWin.<span class="me1">global</span>.<span class="me1">History</span></div></li><li class="li1"><div class="de1">			state <span class="sy0">=</span> History.<span class="me1">getState</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1">&nbsp;</div></li><li class="li1"><div class="de1">		<span class="co1">// Load the state id</span></div></li><li class="li2"><div class="de2">		loc.<span class="me1">currentState</span> <span class="sy0">=</span> state.<span class="me1">data</span>.<span class="me1">state</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1">&nbsp;</div></li><li class="li1"><div class="de1">		<span class="co1">// IMPLEMENTATION SPECIFIC XHR STUFF</span></div></li><li class="li1"><div class="de1">		<span class="co1">// onSuccess: function() {</span></div></li><li class="li1"><div class="de1">			baseWin.<span class="me1">global</span>.<span class="me1">scrollTo</span><span class="br0">&#40;</span>0<span class="sy0">,</span> loc.<span class="me1">states</span><span class="br0">&#91;</span>loc.<span class="me1">currentState</span><span class="br0">&#93;</span>.<span class="kw3">scroll</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li><li class="li2"><div class="de2">		<span class="co1">// }</span></div></li><li class="li1"><div class="de1">	<span class="br0">&#125;</span></div></li><li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li></ol></pre></div></div>
<p>Naturally, the above code would have to be modified for another application, but I hope that the method is clear and is of use to someone.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=KelegGE4VQ0:oJfzNbnYLO0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=KelegGE4VQ0:oJfzNbnYLO0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?i=KelegGE4VQ0:oJfzNbnYLO0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=KelegGE4VQ0:oJfzNbnYLO0:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WEBarnesca/~4/KelegGE4VQ0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webarnes.ca/2012/04/html5-history-api-and-scrolling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.webarnes.ca/2012/04/html5-history-api-and-scrolling/</feedburner:origLink></item>
		<item>
		<title>Mobile Safari bugs so far</title>
		<link>http://feedproxy.google.com/~r/WEBarnesca/~3/zY_rG09nJ_0/</link>
		<comments>http://www.webarnes.ca/2012/04/mobile-safari-bugs-so-far/#comments</comments>
		<pubDate>Sun, 01 Apr 2012 18:23:49 +0000</pubDate>
		<dc:creator>William Barnes</dc:creator>
				<category><![CDATA[Computers & Internet]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobile safari]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.webarnes.ca/?p=1371</guid>
		<description><![CDATA[I just bought my first iOS device (the new iPad) and I&#8217;ve been busy squashing bugs in my latest project. And by bugs in my project I mean, of course, bugs in Safari. Here are some of the more annoying ones and how I fixed them. Changing CSS visibility breaks things Several of the problems [...]]]></description>
				<content:encoded><![CDATA[<p>I just bought my first iOS device (the new iPad) and I&#8217;ve been busy squashing bugs in my latest project. And by bugs in my project I mean, of course, bugs in Safari. Here are some of the more annoying ones and how I fixed them.</p>
<h2>Changing CSS visibility breaks things</h2>
<p>Several of the problems I had seem to have been caused by various problems with Safari&#8217;s handling of visibility. For example, a number of elements in the app use the following CSS transition to fade in and out:</p>
<div id="wpshdo_2" class="wp-synhighlighter-outer"><div id="wpshdt_2" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_2"></a><a id="wpshat_2" class="wp-synhighlighter-title" href="#codesyntax_2"  onClick="javascript:wpsh_toggleBlock(2)" title="Click to show/hide code block">Transitioning Opacity</a></td><td align="right"><a href="#codesyntax_2" onClick="javascript:wpsh_code(2)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_2" onClick="javascript:wpsh_print(2)" title="Print code"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_2" class="wp-synhighlighter-inner" style="display: block;"><pre class="css" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="re1">.hideable</span> <span class="br0">&#123;</span></div></li><li class="li1"><div class="de1">	opacity<span class="sy0">:</span> <span class="nu0">0</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1">	<span class="kw1">visibility</span><span class="sy0">:</span> <span class="kw2">hidden</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1">	transition<span class="sy0">:</span> <span class="kw1">visibility</span> 0.5s linear 0.5s<span class="sy0">,</span> opacity 0.5s ease<span class="sy0">;</span></div></li><li class="li2"><div class="de2">	-moz-transition<span class="sy0">:</span> <span class="kw1">visibility</span> 0.5s linear 0.5s<span class="sy0">,</span> opacity 0.5s ease<span class="sy0">;</span></div></li><li class="li1"><div class="de1">	-webkit-transition<span class="sy0">:</span> <span class="kw1">visibility</span> 0.5s linear 0.5s<span class="sy0">,</span> opacity 0.5s ease<span class="sy0">;</span></div></li><li class="li1"><div class="de1">	-o-transition<span class="sy0">:</span> <span class="kw1">visibility</span> 0.5s linear 0.5s<span class="sy0">,</span> opacity 0.5s ease<span class="sy0">;</span></div></li><li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li><li class="li1"><div class="de1">&nbsp;</div></li><li class="li2"><div class="de2">.<span class="kw2">visible</span> <span class="br0">&#123;</span></div></li><li class="li1"><div class="de1">	opacity<span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1">	<span class="kw1">visibility</span><span class="sy0">:</span> <span class="kw2">visible</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1">	transition-delay<span class="sy0">:</span>0s<span class="sy0">;</span></div></li><li class="li1"><div class="de1">	-moz-transition-delay<span class="sy0">:</span>0s<span class="sy0">;</span></div></li><li class="li2"><div class="de2">	-webkit-transition-delay<span class="sy0">:</span>0s<span class="sy0">;</span></div></li><li class="li1"><div class="de1">	-o-transition-delay<span class="sy0">:</span>0s<span class="sy0">;</span></div></li><li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li></ol></pre></div></div>
<p>I use visibility for two reasons: (1) elements can be sized according to their contents before being shown, (2) visibility can be transitioned. The second reason is important, because otherwise it would require additional Javascript to delay the hiding of the element until after the opacity transition runs. This works in Desktop Safari, Chrome, Firefox, <del>the Android Browser</del>, and Mobile Chrome. In Mobile Safari, however, the element does not get shown until you click on another link.</p>
<p>[<em>Edit: Apparently I was wrong about the Android Browser. I suspect this may be a problem in an older Webkit, since it definitely works in Mobile Chrome.</em>]</p>
<p>I originally solved this by disabling the visibility transition in iOS, but I ran into another problem. Merely toggling visibility breaks Mobile Safari&#8217;s new native &#8220;overflow: auto/scroll&#8221; functionality. I&#8217;ll talk about this problem in more detail later. For now, the solution is to disable the transition and use display instead of visibility in Mobile Safari:</p>
<div id="wpshdo_3" class="wp-synhighlighter-outer"><div id="wpshdt_3" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_3"></a><a id="wpshat_3" class="wp-synhighlighter-title" href="#codesyntax_3"  onClick="javascript:wpsh_toggleBlock(3)" title="Click to show/hide code block">Mobile Safari Fix</a></td><td align="right"><a href="#codesyntax_3" onClick="javascript:wpsh_code(3)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_3" onClick="javascript:wpsh_print(3)" title="Print code"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_3" class="wp-synhighlighter-inner" style="display: block;"><pre class="css" style="font-family:monospace;"><ol><li class="li1"><div class="de1">body<span class="re1">.iOS</span> <span class="re1">.hideable</span> <span class="br0">&#123;</span></div></li><li class="li1"><div class="de1">	<span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1">	opacity<span class="sy0">:</span> <span class="nu0">1</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1">	-webkit-transition<span class="sy0">:</span> <span class="kw2">none</span><span class="sy0">;</span></div></li><li class="li2"><div class="de2">	<span class="kw1">visibility</span><span class="sy0">:</span> <span class="kw2">visible</span><span class="sy0">;</span></div></li><li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li><li class="li1"><div class="de1">&nbsp;</div></li><li class="li1"><div class="de1">body<span class="re1">.iOS</span> .<span class="kw2">visible</span> <span class="br0">&#123;</span></div></li><li class="li1"><div class="de1">	<span class="kw1">display</span><span class="sy0">:</span> <span class="kw2">block</span><span class="sy0">;</span></div></li><li class="li2"><div class="de2"><span class="br0">&#125;</span></div></li></ol></pre></div></div>
<h2>Overflow scroll breaks on visibility toggle</h2>
<p>iOS5 finally introduced scrolling within an element. Previously, this had to be achieved with Javascript (e.g. <a href="http://cubiq.org/iscroll">iScroll</a>). Frankly, I was pretty happy with my Javascript solution, but some variation of the position fixed bug mentioned below was breaking it. The touchable portion of the inner DIV scrolled with the document, rather than remaining fixed.; if the document was scrolled partway down, the fixed element no longer scrolled.</p>
<p>iOS&#8217;s solution is fairly simple, just add the following to your CSS: &#8220;-webkit-overflow-scrolling: touch;&#8221; I imagine it&#8217;s done this way because they&#8217;re afraid of breaking apps that relied on overflow-scroll just not working. It works pretty well, though it does not use the custom scrollbars. It also does not work if the scrolling DIV is contained in an element that was previously visibility-hidden. This time, it has nothing to do with transitions. The only fix I can find is to use display instead of visibility.</p>
<h2> Javascript scrolling breaks touch events on position-fixed objects</h2>
<p>This was a weird one. I put buttons on the right edge of the screen to allow a user to page up and down the document. They were position-fixed (supported in iOS 5!) and they worked. Once. You couldn&#8217;t click them a second time. If you clicked one, all the other position-fixed buttons stopped working. If you then scrolled normally, everything started working again. Interestingly, if I just scrolled down 100px, the button would stop working, but if I then touched a spot 100px above the button, it would register. It&#8217;s as if Safari has a map of elements for the purpose of registering touch events that stays fixed to the page (ie: position absolute), while the visible representation of the elements stays fixed to the screen. Thus, when the page scrolls, the map goes with it. For whatever reason, Javascript doesn&#8217;t trigger a recalculation of where the elements are.</p>
<p>I disabled the buttons in iOS. <a href="http://stackoverflow.com/questions/8752220/mobile-safari-bug-on-fixed-positioned-button-after-scrolltop-programmatically-ch#comment12047676_9407174">Apple is aware of this</a>, so a fix may be coming.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=zY_rG09nJ_0:mSRYYg6sq9A:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=zY_rG09nJ_0:mSRYYg6sq9A:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?i=zY_rG09nJ_0:mSRYYg6sq9A:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=zY_rG09nJ_0:mSRYYg6sq9A:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WEBarnesca/~4/zY_rG09nJ_0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webarnes.ca/2012/04/mobile-safari-bugs-so-far/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.webarnes.ca/2012/04/mobile-safari-bugs-so-far/</feedburner:origLink></item>
		<item>
		<title>SEO experts capitalize on Mies van der Rohe architecture</title>
		<link>http://feedproxy.google.com/~r/WEBarnesca/~3/gHFECeWuMZU/</link>
		<comments>http://www.webarnes.ca/2012/03/seo-experts-capitalize-on-mies-van-der-rohe-architecture/#comments</comments>
		<pubDate>Tue, 27 Mar 2012 21:16:33 +0000</pubDate>
		<dc:creator>William Barnes</dc:creator>
				<category><![CDATA[Computers & Internet]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.webarnes.ca/?p=1360</guid>
		<description><![CDATA[It shouldn&#8217;t surprise me since it&#8217;s a sneaky SEO strategy (all SEO strategies are sneaky) that makes perfect sense. The Doodle ensures that millions of people will run a particular search that day (Mies van der Rohe architecture). If you create an article that uses those terms, then you can drive some extra traffic to [...]]]></description>
				<content:encoded><![CDATA[<p class="img"><a href="http://www.webarnes.ca/wp-content/uploads/2012/03/Screenshot-5.png"><img src="http://www.webarnes.ca/wp-content/uploads/2012/03/Screenshot-5-560x122.png" alt="" title="Screenshot-5" width="560" height="122" class="alignnone size-large wp-image-1361" /></a></p>
<p>It shouldn&#8217;t surprise me since it&#8217;s a sneaky SEO strategy (all SEO <i>strategies</i> are sneaky) that makes perfect sense. The Doodle ensures that millions of people will run a particular search that day (Mies van der Rohe architecture). If you create an article that uses those terms, then you can drive some extra traffic to your publication. People who come to find out who Ludwig Mies van der Rohe is will stay to read a couple other articles. Still, it saddens me to see news reporting subordinated to Google Doodles. It&#8217;s not the architect or the Doodle that&#8217;s the news, the news is SEO.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=gHFECeWuMZU:YNtuqpF6R1s:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=gHFECeWuMZU:YNtuqpF6R1s:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?i=gHFECeWuMZU:YNtuqpF6R1s:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=gHFECeWuMZU:YNtuqpF6R1s:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WEBarnesca/~4/gHFECeWuMZU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webarnes.ca/2012/03/seo-experts-capitalize-on-mies-van-der-rohe-architecture/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.webarnes.ca/2012/03/seo-experts-capitalize-on-mies-van-der-rohe-architecture/</feedburner:origLink></item>
		<item>
		<title>PHP/Symfony vs Ruby/Rails (slideshow)</title>
		<link>http://feedproxy.google.com/~r/WEBarnesca/~3/__YnQkl5l2o/</link>
		<comments>http://www.webarnes.ca/2011/12/phpsymfony-vs-rubyrails-slideshow/#comments</comments>
		<pubDate>Tue, 13 Dec 2011 19:31:16 +0000</pubDate>
		<dc:creator>William Barnes</dc:creator>
				<category><![CDATA[Computers & Internet]]></category>
		<category><![CDATA[Webfinds]]></category>
		<category><![CDATA[comparison]]></category>
		<category><![CDATA[languages]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://www.webarnes.ca/?p=1311</guid>
		<description><![CDATA[Brent Shaffer As I get more used to Symfony, I find myself wishing that I had given RoR a longer try back in the day. It&#8217;s too late for me to start my current project from scratch again, so PHP it is and will be. But gosh, Ruby looks fun.]]></description>
				<content:encoded><![CDATA[<div style="width:510px;margin:auto;text-align:center;" id="__ss_2277608"><iframe src="http://www.slideshare.net/slideshow/embed_code/2277608?rel=0" width="510" height="426" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"><a href="http://www.slideshare.net/bshafs" target="_blank">Brent Shaffer</a></div>
</div>
<p>As I get more used to Symfony, I find myself wishing that I had given RoR a longer try back in the day. It&#8217;s too late for me to start my current project from scratch again, so PHP it is and will be. But gosh, Ruby looks fun.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=__YnQkl5l2o:Ij-6gnSLMQg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=__YnQkl5l2o:Ij-6gnSLMQg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?i=__YnQkl5l2o:Ij-6gnSLMQg:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=__YnQkl5l2o:Ij-6gnSLMQg:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WEBarnesca/~4/__YnQkl5l2o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webarnes.ca/2011/12/phpsymfony-vs-rubyrails-slideshow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.webarnes.ca/2011/12/phpsymfony-vs-rubyrails-slideshow/</feedburner:origLink></item>
		<item>
		<title>Enable PHP autocompletion in Eclipse (Ubuntu 11.04)</title>
		<link>http://feedproxy.google.com/~r/WEBarnesca/~3/ZsRPCCODhZk/</link>
		<comments>http://www.webarnes.ca/2011/10/enable-php-autocompletion-in-eclipse-ubuntu-11-04/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 17:29:57 +0000</pubDate>
		<dc:creator>William Barnes</dc:creator>
				<category><![CDATA[Computers & Internet]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.webarnes.ca/?p=1276</guid>
		<description><![CDATA[For some reason, Eclipse (using PHP Development Tools) doesn&#8217;t include built-in PHP functions with a new project. Assuming you downloaded Eclipse from the Ubuntu repository and added PDT through Eclipse&#8217;s &#8220;Install new software&#8221; dialog: in Eclipse, right click on your project in the Explorer pane; choose Include Path, Configure Include Path; select the Libraries tab; [...]]]></description>
				<content:encoded><![CDATA[<p>For some reason, Eclipse (using PHP Development Tools) doesn&#8217;t include built-in PHP functions with a new project. Assuming you downloaded Eclipse from the Ubuntu repository and added PDT through Eclipse&#8217;s &#8220;Install new software&#8221; dialog: in Eclipse, right click on your project in the Explorer pane; choose Include Path, Configure Include Path; select the Libraries tab; click Add External Source Folder. The folder you need may vary depending on the version of Eclipse, it should look something like &#8220;~/.eclipse/org.eclipse.platform*/plugins/org.eclipse.php_core*/Resources/language/phpVERSION&#8221;.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=ZsRPCCODhZk:bhJMri7-fsY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=ZsRPCCODhZk:bhJMri7-fsY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?i=ZsRPCCODhZk:bhJMri7-fsY:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=ZsRPCCODhZk:bhJMri7-fsY:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WEBarnesca/~4/ZsRPCCODhZk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webarnes.ca/2011/10/enable-php-autocompletion-in-eclipse-ubuntu-11-04/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.webarnes.ca/2011/10/enable-php-autocompletion-in-eclipse-ubuntu-11-04/</feedburner:origLink></item>
		<item>
		<title>Python script to fix broken symlinks</title>
		<link>http://feedproxy.google.com/~r/WEBarnesca/~3/qjSOTUiCHZw/</link>
		<comments>http://www.webarnes.ca/2011/09/python-script-to-fix-broken-symlinks/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 20:47:08 +0000</pubDate>
		<dc:creator>William Barnes</dc:creator>
				<category><![CDATA[Computers & Internet]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[symlinks]]></category>

		<guid isPermaLink="false">http://www.webarnes.ca/?p=1185</guid>
		<description><![CDATA[I recently added a new hard drive and reorganized my increasingly chaotic and whimsically named storage and backup partitions. In the process, I moved a folder containing hundreds of symlinks to a different drive resulting in hundreds of broken symlinks (I should have used rsync). This script will repair symlinks after you&#8217;ve moved a folder. [...]]]></description>
				<content:encoded><![CDATA[<p>I recently added a new hard drive and reorganized my increasingly chaotic and whimsically named storage and backup partitions. In the process, I moved a folder containing hundreds of symlinks to a different drive resulting in hundreds of broken symlinks (I should have used <a href="http://linux.die.net/man/1/rsync">rsync</a>).</p>
<p>This script will repair symlinks after you&#8217;ve moved a folder. Change BASEDIR to the current location of your files and OLDBASE to where they used to be. For example, if you moved all your files from /mnt/Backup2 to /mnt/Backup2, then BASEDIR = &#8216;/mnt/Backup2&#8242; and OLDBASE = &#8216;/mnt/Backup1&#8242;. If you want to test (to make sure it will do what you expect) then change DEBUG to True.</p>
<p>This script will only fix symlinks that point to files/directories within the BASEDIR.</p>
<div id="wpshdo_4" class="wp-synhighlighter-outer"><div id="wpshdt_4" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_4"></a><a id="wpshat_4" class="wp-synhighlighter-title" href="#codesyntax_4"  onClick="javascript:wpsh_toggleBlock(4)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_4" onClick="javascript:wpsh_code(4)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_4" onClick="javascript:wpsh_print(4)" title="Print code"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_4" class="wp-synhighlighter-inner" style="display: block;"><pre class="python" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="co1">#!/usr/bin/env python</span></div></li><li class="li1"><div class="de1">&nbsp;</div></li><li class="li1"><div class="de1"><span class="kw1">import</span> <span class="kw3">os</span></div></li><li class="li1"><div class="de1">&nbsp;</div></li><li class="li2"><div class="de2"><span class="co1"># Configuration</span></div></li><li class="li1"><div class="de1">&nbsp;</div></li><li class="li1 ln-xtra"><div class="de1">BASEDIR = <span class="st0">'/mnt/NewStorage'</span></div></li><li class="li1 ln-xtra"><div class="de1">OLDBASE = <span class="st0">'/mnt/OldStorage'</span></div></li><li class="li1 ln-xtra"><div class="de1">DEBUG = <span class="kw2">False</span> <span class="co1"># I recommend a test run first</span></div></li><li class="li2"><div class="de2">&nbsp;</div></li><li class="li1"><div class="de1"><span class="kw1">def</span> relink<span class="br0">&#40;</span>path<span class="br0">&#41;</span>:</div></li><li class="li1"><div class="de1">    old_target = <span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">realpath</span><span class="br0">&#40;</span>path<span class="br0">&#41;</span></div></li><li class="li1"><div class="de1">    new_target = old_target.<span class="me1">replace</span><span class="br0">&#40;</span>OLDBASE,BASEDIR,1<span class="br0">&#41;</span></div></li><li class="li1"><div class="de1">    <span class="kw1">if</span> DEBUG:</div></li><li class="li2"><div class="de2">        <span class="kw1">print</span> <span class="st0">&quot;Relink: &quot;</span> + path + <span class="st0">&quot;<span class="es0">\n</span><span class="es0">\t</span>from &quot;</span> + old_target + <span class="st0">&quot;<span class="es0">\n</span><span class="es0">\t</span>to &quot;</span> + new_target</div></li><li class="li1"><div class="de1">    <span class="kw1">else</span>:</div></li><li class="li1"><div class="de1">        <span class="kw3">os</span>.<span class="me1">remove</span><span class="br0">&#40;</span>path<span class="br0">&#41;</span></div></li><li class="li1"><div class="de1">        <span class="kw3">os</span>.<span class="me1">symlink</span><span class="br0">&#40;</span>new_target,path<span class="br0">&#41;</span></div></li><li class="li1"><div class="de1">&nbsp;</div></li><li class="li2"><div class="de2"><span class="kw1">for</span> root, dirs, files <span class="kw1">in</span> <span class="kw3">os</span>.<span class="me1">walk</span><span class="br0">&#40;</span>BASEDIR<span class="br0">&#41;</span>:</div></li><li class="li1"><div class="de1">    <span class="kw1">for</span> filename <span class="kw1">in</span> files:</div></li><li class="li1"><div class="de1">        fullpath = <span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">join</span><span class="br0">&#40;</span>root,filename<span class="br0">&#41;</span></div></li><li class="li1"><div class="de1">        <span class="kw1">if</span> <span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">islink</span><span class="br0">&#40;</span>fullpath<span class="br0">&#41;</span>:</div></li><li class="li1"><div class="de1">            relink<span class="br0">&#40;</span>fullpath<span class="br0">&#41;</span></div></li><li class="li2"><div class="de2">    <span class="kw1">for</span> dirname <span class="kw1">in</span> dirs:</div></li><li class="li1"><div class="de1">        fullpath = <span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">join</span><span class="br0">&#40;</span>root,dirname<span class="br0">&#41;</span></div></li><li class="li1"><div class="de1">        <span class="kw1">if</span> <span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">islink</span><span class="br0">&#40;</span>fullpath<span class="br0">&#41;</span>:</div></li><li class="li1"><div class="de1">            relink<span class="br0">&#40;</span>fullpath<span class="br0">&#41;</span></div></li></ol></pre></div></div>
<p>If you save the script as <code>~/link-fix.py</code> then run it with <code>python ~/link-fix.py</code>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=qjSOTUiCHZw:wWw7k7Z0ovk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=qjSOTUiCHZw:wWw7k7Z0ovk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?i=qjSOTUiCHZw:wWw7k7Z0ovk:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=qjSOTUiCHZw:wWw7k7Z0ovk:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WEBarnesca/~4/qjSOTUiCHZw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webarnes.ca/2011/09/python-script-to-fix-broken-symlinks/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.webarnes.ca/2011/09/python-script-to-fix-broken-symlinks/</feedburner:origLink></item>
		<item>
		<title>Toggle Gnome screensaver lock on USB key insertion</title>
		<link>http://feedproxy.google.com/~r/WEBarnesca/~3/rDeRhfxG0hE/</link>
		<comments>http://www.webarnes.ca/2011/09/toggle-gnome-screensaver-lock-on-usb-key-insertion/#comments</comments>
		<pubDate>Sun, 25 Sep 2011 13:39:23 +0000</pubDate>
		<dc:creator>William Barnes</dc:creator>
				<category><![CDATA[Computers & Internet]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.webarnes.ca/?p=1172</guid>
		<description><![CDATA[While I like my computer to lock itself automatically when I leave, it gets annoying when it does it every time I get up for a few minutes. I decided that it would be nice if I could toggle the screen lock only when I&#8217;m out of the apartment. I decided that the trigger should [...]]]></description>
				<content:encoded><![CDATA[<p>While I like my computer to lock itself automatically when I leave, it gets annoying when it does it every time I get up for a few minutes. I decided that it would be nice if I could toggle the screen lock only when I&#8217;m out of the apartment. I decided that the trigger should be the USB key I have on my keychain. It&#8217;s always with me. If it&#8217;s plugged in to the computer, then I&#8217;m likely home.<del> I apologize for the (lack of) formatting of the code, I will be fixing that when I get my computer back up and running.</del></p>
<p>Ubuntu uses an event-based system called <a href="http://en.wikipedia.org/udev">udev</a> that, among other things, can run a script when a USB device is plugged in or unplugged. Local (ie: user-created) udev rules are stored in <code>/etc/udev/rules.d/</code>. Before you can create a rule, you need to know a little about the device that is going to trigger it. Open a terminal and type:</p>
<p><code>udevadm monitor --udev --environment</code></p>
<p>Connect your USB device. It doesn&#8217;t have to be a USB key, it could be a phone, for example. A bunch of text will come up. Look for &#8220;ID_SERIAL&#8221; and &#8220;ID_VENDOR_ID&#8221;. Write down the values of those. You can use other variables if they suit your device better, just change the rules file accordingly.</p>
<p>Create a file called &#8220;/etc/udev/rules.d/85-screen-lock-toggle.rules&#8221;. Put the following in it, replacing VALUE with the proper value:</p>
<div id="wpshdo_5" class="wp-synhighlighter-outer"><div id="wpshdt_5" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_5"></a><a id="wpshat_5" class="wp-synhighlighter-title" href="#codesyntax_5"  onClick="javascript:wpsh_toggleBlock(5)" title="Click to show/hide code block">File: /etc/udev/rules.d/85-screen-lock-toggle.rules</a></td><td align="right"><a href="#codesyntax_5" onClick="javascript:wpsh_code(5)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_5" onClick="javascript:wpsh_print(5)" title="Print code"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_5" class="wp-synhighlighter-inner" style="display: block;"><pre class="bash" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="re2">ACTION</span>==<span class="st0">&quot;remove&quot;</span>, ENV<span class="br0">&#123;</span>ID_SERIAL<span class="br0">&#125;</span>==<span class="st0">&quot;VALUE&quot;</span>, ENV<span class="br0">&#123;</span>ID_VENDOR_ID<span class="br0">&#125;</span>==<span class="st0">&quot;VALUE&quot;</span>, RUN+=<span class="st0">&quot;/usr/local/bin/gnome-lock-enable&quot;</span></div></li><li class="li1"><div class="de1"><span class="re2">ACTION</span>==<span class="st0">&quot;add&quot;</span>, ENV<span class="br0">&#123;</span>ID_SERIAL<span class="br0">&#125;</span>==<span class="st0">&quot;VALUE&quot;</span>, ENV<span class="br0">&#123;</span>ID_VENDOR_ID<span class="br0">&#125;</span>==<span class="st0">&quot;VALUE&quot;</span>, RUN+=<span class="st0">&quot;/usr/local/bin/gnome-lock-disable&quot;</span></div></li></ol></pre></div></div>
<p>Next create the scripts to actually disable and enable locking:</p>
<div id="wpshdo_6" class="wp-synhighlighter-outer"><div id="wpshdt_6" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_6"></a><a id="wpshat_6" class="wp-synhighlighter-title" href="#codesyntax_6"  onClick="javascript:wpsh_toggleBlock(6)" title="Click to show/hide code block">File: /usr/local/bin/gnome-lock-enable</a></td><td align="right"><a href="#codesyntax_6" onClick="javascript:wpsh_code(6)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_6" onClick="javascript:wpsh_print(6)" title="Print code"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_6" class="wp-synhighlighter-inner" style="display: block;"><pre class="bash" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="co0">#!/bin/bash</span></div></li><li class="li1"><div class="de1">&nbsp;</div></li><li class="li1"><div class="de1"><span class="re2">user</span>=<span class="sy0">`</span><span class="kw2">ps</span> aux <span class="sy0">|</span> <span class="kw2">grep</span> gnome-screensaver <span class="sy0">|</span> <span class="kw2">head</span> <span class="re5">-n</span> 1 <span class="sy0">|</span> <span class="kw2">awk</span> <span class="st_h">'{print $1}'</span><span class="sy0">`</span></div></li><li class="li1"><div class="de1">&nbsp;</div></li><li class="li2"><div class="de2"><span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re5">-n</span> <span class="re1">$user</span> <span class="br0">&#93;</span>; <span class="kw1">then</span></div></li><li class="li1"><div class="de1">	<span class="re2">GNOME_SCREENSAVER_PROC</span>=<span class="sy0">`</span><span class="kw2">ps</span> xa <span class="sy0">|</span> <span class="kw2">grep</span> gnome-screensaver <span class="sy0">|</span> <span class="kw2">head</span> <span class="re5">-n</span> 1 <span class="sy0">|</span> <span class="kw2">awk</span> <span class="st_h">'{print $1}'</span><span class="sy0">`</span></div></li><li class="li1"><div class="de1">	<span class="kw3">export</span> <span class="sy0">`</span><span class="kw2">grep</span> <span class="re5">-z</span> DBUS_SESSION_BUS_ADDRESS <span class="sy0">/</span>proc<span class="sy0">/</span><span class="re1">$GNOME_SCREENSAVER_PROC</span><span class="sy0">/</span>environ<span class="sy0">`</span></div></li><li class="li1"><div class="de1">	<span class="kw2">su</span> <span class="re1">$user</span> <span class="re5">-c</span> <span class="st0">&quot;gconftool-2 --set &quot;</span><span class="sy0">/</span>apps<span class="sy0">/</span>gnome-screensaver<span class="sy0">/</span>lock_enabled<span class="st0">&quot; --type bool 1&quot;</span></div></li><li class="li1"><div class="de1"><span class="kw1">fi</span></div></li></ol></pre></div></div>
<div id="wpshdo_7" class="wp-synhighlighter-outer"><div id="wpshdt_7" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_7"></a><a id="wpshat_7" class="wp-synhighlighter-title" href="#codesyntax_7"  onClick="javascript:wpsh_toggleBlock(7)" title="Click to show/hide code block">File: /usr/local/bin/gnome-lock-disable</a></td><td align="right"><a href="#codesyntax_7" onClick="javascript:wpsh_code(7)" title="Show code only"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_7" onClick="javascript:wpsh_print(7)" title="Print code"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://www.webarnes.ca/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_7" class="wp-synhighlighter-inner" style="display: block;"><pre class="bash" style="font-family:monospace;"><ol><li class="li1"><div class="de1"><span class="co0">#!/bin/bash</span></div></li><li class="li1"><div class="de1">&nbsp;</div></li><li class="li1"><div class="de1"><span class="re2">user</span>=<span class="sy0">`</span><span class="kw2">ps</span> aux <span class="sy0">|</span> <span class="kw2">grep</span> gnome-screensaver <span class="sy0">|</span> <span class="kw2">head</span> <span class="re5">-n</span> 1 <span class="sy0">|</span> <span class="kw2">awk</span> <span class="st_h">'{print $1}'</span><span class="sy0">`</span></div></li><li class="li1"><div class="de1">&nbsp;</div></li><li class="li2"><div class="de2"><span class="kw1">if</span> <span class="br0">&#91;</span> <span class="re5">-n</span> <span class="re1">$user</span> <span class="br0">&#93;</span>; <span class="kw1">then</span></div></li><li class="li1"><div class="de1">	<span class="re2">GNOME_SCREENSAVER_PROC</span>=<span class="sy0">`</span><span class="kw2">ps</span> xa <span class="sy0">|</span> <span class="kw2">grep</span> gnome-screensaver <span class="sy0">|</span> <span class="kw2">head</span> <span class="re5">-n</span> 1 <span class="sy0">|</span> <span class="kw2">awk</span> <span class="st_h">'{print $1}'</span><span class="sy0">`</span></div></li><li class="li1"><div class="de1">	<span class="kw3">export</span> <span class="sy0">`</span><span class="kw2">grep</span> <span class="re5">-z</span> DBUS_SESSION_BUS_ADDRESS <span class="sy0">/</span>proc<span class="sy0">/</span><span class="re1">$GNOME_SCREENSAVER_PROC</span><span class="sy0">/</span>environ<span class="sy0">`</span></div></li><li class="li1"><div class="de1">	<span class="kw2">su</span> <span class="re1">$user</span> <span class="re5">-c</span> <span class="st0">&quot;gconftool-2 --set &quot;</span><span class="sy0">/</span>apps<span class="sy0">/</span>gnome-screensaver<span class="sy0">/</span>lock_enabled<span class="st0">&quot; --type bool 0&quot;</span></div></li><li class="li1"><div class="de1"><span class="kw1">fi</span></div></li></ol></pre></div></div>
<p>Make the scripts executable:</p>
<p><code>sudo chmod a+x /usr/local/bin/gnome-lock-enable /usr/local/bin/gnome-lock-disable</code></p>
<p>Restart udev:</p>
<p><code>sudo restart udev</code></p>
<p>Enjoy the convenience.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=rDeRhfxG0hE:YnndaO1iDp0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=rDeRhfxG0hE:YnndaO1iDp0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?i=rDeRhfxG0hE:YnndaO1iDp0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=rDeRhfxG0hE:YnndaO1iDp0:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WEBarnesca/~4/rDeRhfxG0hE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webarnes.ca/2011/09/toggle-gnome-screensaver-lock-on-usb-key-insertion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.webarnes.ca/2011/09/toggle-gnome-screensaver-lock-on-usb-key-insertion/</feedburner:origLink></item>
		<item>
		<title>Move Gnome 2 panel to secondary monitor</title>
		<link>http://feedproxy.google.com/~r/WEBarnesca/~3/Ze5n68HM27Q/</link>
		<comments>http://www.webarnes.ca/2011/09/move-gnome-2-panel-to-secondary-monitor/#comments</comments>
		<pubDate>Sat, 24 Sep 2011 21:34:15 +0000</pubDate>
		<dc:creator>William Barnes</dc:creator>
				<category><![CDATA[Computers & Internet]]></category>
		<category><![CDATA[appearance]]></category>
		<category><![CDATA[gnome]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.webarnes.ca/?p=1167</guid>
		<description><![CDATA[This may be irrelevant with Gnome 3, Gnome Shell and Unity taking over, but if you have dual monitors and want the Gnome panel (e.g., menu bar) to span multiple monitors, you can follow these instructions: Here’s a step-by-step way of moving a panel to another screen: Right-click the panel you wish to move and [...]]]></description>
				<content:encoded><![CDATA[<p>This may be irrelevant with Gnome 3, Gnome Shell and Unity taking over, but if you have dual monitors and want the Gnome panel (e.g., menu bar) to span multiple monitors, you can follow these instructions:</p>
<blockquote><p>
Here’s a step-by-step way of moving a panel to another screen:</p>
<ol>
<li>Right-click the panel you wish to move and select “Properties”.</li>
<li>Uncheck the “Expand” option under the “General” tab.</li>
<li>Grab one of the edges of the panel by clicking on the left or right end (top or bottom end for vertical panels).</li>
<li>Drag the bar to the desired screen and position.</li>
<li>Check the “Expand” option in the “Panel Properties” window and click “Close”.</li>
</ol>
</blockquote>
<p>From <a href="http://chrisjean.com/2009/11/03/move-gnome-panels-to-a-different-monitor-in-ubuntu/">Chris Jean&#8217;s blog</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=Ze5n68HM27Q:WSyv6tcZzoY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=Ze5n68HM27Q:WSyv6tcZzoY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?i=Ze5n68HM27Q:WSyv6tcZzoY:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/WEBarnesca?a=Ze5n68HM27Q:WSyv6tcZzoY:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/WEBarnesca?d=qj6IDK7rITs" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/WEBarnesca/~4/Ze5n68HM27Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.webarnes.ca/2011/09/move-gnome-2-panel-to-secondary-monitor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.webarnes.ca/2011/09/move-gnome-2-panel-to-secondary-monitor/</feedburner:origLink></item>
	</channel>
</rss>
