<?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>Do Know Evil - A Blog by Tyler Mulligan &#187; Computers</title>
	<atom:link href="http://www.doknowevil.net/category/computers/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.doknowevil.net</link>
	<description>Tips and Tricks About Computers, Web Development, Linux, the Internet and the Like</description>
	<lastBuildDate>Thu, 29 Jul 2010 03:37:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>The Best Way to Tweet to Twitter, Post on Facebook from WordPress</title>
		<link>http://www.doknowevil.net/2010/07/26/the-best-way-to-tweet-to-twitter-post-on-facebook-from-wordpress/</link>
		<comments>http://www.doknowevil.net/2010/07/26/the-best-way-to-tweet-to-twitter-post-on-facebook-from-wordpress/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 02:47:47 +0000</pubDate>
		<dc:creator>Tyler Mulligan</dc:creator>
				<category><![CDATA[Application Management]]></category>
		<category><![CDATA[Computers]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Web Applications]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[internet marketing]]></category>
		<category><![CDATA[ping.fm]]></category>
		<category><![CDATA[publishing]]></category>
		<category><![CDATA[social networks]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.doknowevil.net/?p=762</guid>
		<description><![CDATA[I&#8217;ve been focusing some time recently to the foundation levels of Internet marketing. I&#8217;m aiming to increase visibility as strongly as possible at the core of a website giving it the power to leverage evolving trends as simply as possible. This of course means utilizing APIs from other web applications, such as social networks. The]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been focusing some time recently to the foundation levels of Internet marketing.  I&#8217;m aiming to increase visibility as strongly as possible at the core of a website giving it the power to leverage evolving trends as simply as possible.  This of course means utilizing APIs from other web applications, such as social networks.  The title of this post is true but deceptive.  I consider the following method the best way to tweet from WordPress but it&#8217;s actually a whole lot more than that. It&#8217;s a gateway to a large number of social media applications; one account to rule them all.  <a href="http://www.ping.fm">ping.fm</a> is a service that allows you to link multiple social network websites, such as <a href="http://www.facebook.com" target="_blank">facebook</a>, <a href="http://www.twitter.com" target="_blank">twitter</a>, <a href="http://www.linkedin.com" target="_blank">linkedin</a> and more.</p>
<p><a href="http://www.doknowevil.net/wp-content/uploads/2010/07/screenshot241.png" rel="shadowbox[post-762];player=img;"><img src="http://www.doknowevil.net/wp-content/uploads/2010/07/screenshot241.png" alt="" title="ping fm services (minus twitter)" width="757" height="854" class="alignnone size-full wp-image-763" /></a><br />
+ twitter</p>
<p>So the idea then, is to leverage then is to utilize the ping.fm application from your website.  If you&#8217;re using WordPress then you&#8217;re set, <a href="http://wordpress.org/extend/plugins/publish-2-pingfm">the simple no frills publish 2 ping.fm plugin</a> will allow you to interact with ping.fm from your blog/website.</p>
<p><a href="http://www.doknowevil.net/wp-content/uploads/2010/07/wordpress_ping_fm.png" rel="shadowbox[post-762];player=img;"><img src="http://www.doknowevil.net/wp-content/uploads/2010/07/wordpress_ping_fm.png" alt="" title="wordpress_ping_fm" width="815" height="818" class="alignnone size-full wp-image-764" /></a></p>
<p>I&#8217;ve tested this out with the free open-source GPL First Person Shooter, <a href="http://www.xonotic.org" target="_blank">Xonotic</a> and a new site I just started <a href="http://www.dumbtubes.com">dumbtubes.com</a>.  Both have twitter accounts that you can see publishing <a href="http://twitter.com/dumbtubes" target="_blank">twitter.com/dumbtubes</a>, <a href="http://twitter.com/xonotic" target="_blank">twitter.com/xonotic</a>.  Xonotic also publishes to many other social accounts, see the <a href="http://www.xonotic.org">Xonotic homepage</a> to find other accounts.</p>
<p>Stay tuned for more wordpress tips.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doknowevil.net/2010/07/26/the-best-way-to-tweet-to-twitter-post-on-facebook-from-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python Multi-head X (Nvidia TwinView / Dual Monitor) Development Notes</title>
		<link>http://www.doknowevil.net/2010/07/05/python-multi-head-x-nvidia-twinview-dual-monitor-development-notes/</link>
		<comments>http://www.doknowevil.net/2010/07/05/python-multi-head-x-nvidia-twinview-dual-monitor-development-notes/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 23:29:24 +0000</pubDate>
		<dc:creator>Tyler Mulligan</dc:creator>
				<category><![CDATA[Application Management]]></category>
		<category><![CDATA[Computers]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Operating Systems]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.doknowevil.net/?p=745</guid>
		<description><![CDATA[Preface The following development notes were written after researching the underlying handling of dual monitors in the X window system on Linux. I&#8217;ve included a code snippet that I built to help demonstrate behavior and create a proof of concept to show I can determine which monitor a window is on using only python and]]></description>
			<content:encoded><![CDATA[<h2>Preface</h2>
<p>The following development notes were written after researching the underlying handling of dual monitors in the <a href="http://en.wikipedia.org/wiki/X_Window_System" target="_blank">X window system</a> on Linux. I&#8217;ve included a code snippet that I built to help demonstrate behavior and create a proof of concept to show I can determine which monitor a window is on using only python and no statically set coordinates.  </p>
<h2>Introduction</h2>
<p>I mentioned in my previous post that I&#8217;m using an nVidia video card with &#8220;<a href="http://www.nvidia.com/object/feature_twinview.html" target="_blank">TwinView</a>&#8221; software that outputs my video as if it were one screen, which it technically is, one X screen.  This means that the distinction between monitors is not mapped in the X tree, it&#8217;s handled by the window manager. Unlike <a href="http://en.wikipedia.org/wiki/Xinerama" target="_blank">Xinerama</a>, which has an x session per monitor and stitches them together.  Xinerama, however, has is being deprecated in favor of <a href="http://en.wikipedia.org/wiki/RandR" target="_blank">RandR</a> but regardless, TwinView is my choice and is not an option for me to change to.</p>
<p>With all of that said, the decision to bridge python to c that interfaces with compiz is a deadend and would be better implemented based on the new 0.9.0 C++ api.  It would be nice to be able to return a list of windows from a &#8220;monitor&#8221; object.  However, that&#8217;s beyond my current scope.  I was able to whip up some python that to show that implementing the monitor management in python using the gtk module isn&#8217;t /that/ hacky.  I emphasize because I read some posts that claimed window decorations could be an issue in accurate calculations.</p>
<h2>Some Code</h2>
<p>Read the comment on line 2.  <a href="http://www.pygtk.org/docs/pygtk/" target="_blank">Learn more about pygtk here</a></p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;color: #ccc; font: 12px Consolas, Lucida Console, Monaco, monospace;"><span class="co1">#!/usr/bin/python</span>
<span class="co1"># Print some information about the X environment, the monitor setup, currently active window and cursor position</span>
<span class="kw1">import</span> gtk.<span class="me1">gdk</span>
&nbsp;
screen = gtk.<span class="me1">gdk</span>.<span class="me1">screen_get_default</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="kw1">print</span> <span class="st0">&quot;X default screen size: %d x %d&quot;</span> <span class="sy0">%</span> <span class="br0">&#40;</span>screen.<span class="me1">get_width</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, screen.<span class="me1">get_height</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="kw1">print</span> <span class="st0">&quot;xid of root window: %d&quot;</span> <span class="sy0">%</span> screen.<span class="me1">get_root_window</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">xid</span>
&nbsp;
monitors = <span class="kw2">int</span><span class="br0">&#40;</span>screen.<span class="me1">get_n_monitors</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="kw1">print</span> <span class="st0">&quot;== %d monitors ==&quot;</span> <span class="sy0">%</span> monitors
<span class="kw1">for</span> m <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span><span class="nu0">0</span>, monitors<span class="br0">&#41;</span>:
    <span class="kw1">print</span> <span class="st0">&quot; - geometry of monitor %d: %s&quot;</span> <span class="sy0">%</span> <span class="br0">&#40;</span>m, screen.<span class="me1">get_monitor_geometry</span><span class="br0">&#40;</span>m<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
window = screen.<span class="me1">get_active_window</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
win_x, win_y, win_w, win_h, win_bit_depth = window.<span class="me1">get_geometry</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="kw1">print</span> <span class="st0">&quot;active window on monitor: %d&quot;</span> <span class="sy0">%</span> screen.<span class="me1">get_monitor_at_point</span><span class="br0">&#40;</span><span class="br0">&#40;</span>win_x+<span class="br0">&#40;</span>win_w/<span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span>,<span class="br0">&#40;</span>win_y+<span class="br0">&#40;</span>win_h/<span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
<span class="kw1">print</span> <span class="st0">&quot;window geometry (x,y,w,h): %d, %d, %d, %d&quot;</span> <span class="sy0">%</span> <span class="br0">&#40;</span>win_x,win_y,win_w,win_h<span class="br0">&#41;</span>
&nbsp;
display = gtk.<span class="me1">gdk</span>.<span class="me1">display_get_default</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
pointer = display.<span class="me1">get_pointer</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
<span class="kw1">print</span> <span class="st0">&quot;cursor position (x, y): %d, %d&quot;</span> <span class="sy0">%</span> <span class="br0">&#40;</span>pointer<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>, pointer<span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span>
<span class="kw1">print</span> <span class="st0">&quot;cursor on monitor: %d&quot;</span> <span class="sy0">%</span> screen.<span class="me1">get_monitor_at_point</span><span class="br0">&#40;</span>pointer<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>,pointer<span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span></pre></div></div>

<p>thanks to those in #compiz-dev and #python on freenode who helped me come around to create this snippet.  I hope it will help others looking to develop for multi-head setups in Linux.  Please let me know if I missed anything or did something incorrectly, this is new territory for me.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doknowevil.net/2010/07/05/python-multi-head-x-nvidia-twinview-dual-monitor-development-notes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compiz 0.9.0 Released &#8211; Completely Rewritten in C++</title>
		<link>http://www.doknowevil.net/2010/07/04/compiz-0_9_0-released-completely-rewritten-in-c-plus-plus/</link>
		<comments>http://www.doknowevil.net/2010/07/04/compiz-0_9_0-released-completely-rewritten-in-c-plus-plus/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 02:44:16 +0000</pubDate>
		<dc:creator>Tyler Mulligan</dc:creator>
				<category><![CDATA[Application Management]]></category>
		<category><![CDATA[Compiz]]></category>
		<category><![CDATA[Computers]]></category>
		<category><![CDATA[Desktop Mods]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Operating Systems]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://www.doknowevil.net/?p=738</guid>
		<description><![CDATA[I was doing some in depth research / code hacking regarding the support of multi-headed output (dual monitors) on Linux. I won&#8217;t get into details but my video is being output to my monitors as &#8220;one screen&#8221; with a virtual distinctions handled by the window manager. Because of this, figuring out which of the monitors]]></description>
			<content:encoded><![CDATA[<p>I was doing some in depth research / code hacking regarding the support of multi-headed output (dual monitors) on Linux.  I won&#8217;t get into <a href="http://forum.compiz.org/viewtopic.php?f=89&#038;t=13362" title="managing windows across dual monitors in compiz?">details</a> but my video is being output to my monitors as &#8220;one screen&#8221; with a virtual distinctions handled by the window manager.  Because of this, figuring out which of the monitors you are on isn&#8217;t as straight forward as you might think.  Originally I was looking for a way to access the c functions in compiz through python but that point is now moot (likely for the better).</p>
<p>The <a href="http://lists.freedesktop.org/archives/compiz/2010-July/003429.html">first unstable release of the Compiz 0.9 series</a>, completely rewritten in C++.  As said, this &#8220;brings a whole new developer API, splits rendering into plugins, switches the buildsystem from automake to cmake and brings minor functionality improvements. This release represents the first developer and tester preview of what will eventually make the 0.10.x stable series. Please note that as such, it is not yet ready for general use as there are a number of known  ssues, regressions and incomplete functionality.&#8221;</p>
<p>Here is a <b>SLIGHTLY DATED</b> graph I got <a href="http://santiance.com/2009/10/compiz-code-comparison/">from Santiance.com</a>.</p>
<p><a href="http://www.doknowevil.net/wp-content/uploads/2010/07/compiz_comparison_chart.png" rel="shadowbox[post-738];player=img;"><img src="http://www.doknowevil.net/wp-content/uploads/2010/07/compiz_comparison_chart.png" alt="" title="compiz_comparison_chart" width="776" height="449" class="alignnone size-full wp-image-739" /></a></p>
<p>This is a really interesting turning point for the project and I&#8217;m glad I came across this while doing my research for multi-head handling in compiz. Knowing where the future lies could drastically change where I put my efforts in developing to support them.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doknowevil.net/2010/07/04/compiz-0_9_0-released-completely-rewritten-in-c-plus-plus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Python eBook, Much Better, Down and Dirty</title>
		<link>http://www.doknowevil.net/2010/07/01/new-python-ebook-much-better-down-and-dirty/</link>
		<comments>http://www.doknowevil.net/2010/07/01/new-python-ebook-much-better-down-and-dirty/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 00:50:14 +0000</pubDate>
		<dc:creator>Tyler Mulligan</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Computers]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.doknowevil.net/?p=729</guid>
		<description><![CDATA[Some friends recommended a book that&#8217;s a quicker pace with some better programming practices. Learn Python The Hard way (or quick way ). It reads more like a walk-through tutorial / quick reference and gives you easily repeatable programming practices that will get you a stronger feel for the language. It&#8217;s probably best used in]]></description>
			<content:encoded><![CDATA[<p>Some friends recommended a book that&#8217;s a quicker pace with some better programming practices.  <a href="http://learnpythonthehardway.org/index" target="_blank">Learn Python The Hard way</a> (or quick way <img src='http://www.doknowevil.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> ). It reads more like a walk-through tutorial / quick reference and gives you easily repeatable programming practices that will get you a stronger feel for the language.  It&#8217;s probably best used in combination with the <a href="http://docs.python.org/" target="_blank">Python Documentation</a>.  Also, a fair warning, <a href="http://oppugn.us/posts/1272050135.html">Dive Into Python has war declared against it</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doknowevil.net/2010/07/01/new-python-ebook-much-better-down-and-dirty/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>scp-notifications for GNOME and Ubuntu &#8211; Expanding on My Original Python Script</title>
		<link>http://www.doknowevil.net/2010/06/26/scp-notifications-for-gnome-and-ubuntu-expanding-on-my-original-python-script/</link>
		<comments>http://www.doknowevil.net/2010/06/26/scp-notifications-for-gnome-and-ubuntu-expanding-on-my-original-python-script/#comments</comments>
		<pubDate>Sun, 27 Jun 2010 00:11:15 +0000</pubDate>
		<dc:creator>Tyler Mulligan</dc:creator>
				<category><![CDATA[Compiz]]></category>
		<category><![CDATA[Computers]]></category>
		<category><![CDATA[Desktop Mods]]></category>
		<category><![CDATA[GNOME]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Operating Systems]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[The Internet]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Web Applications]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[libnotify]]></category>
		<category><![CDATA[notification-daemon]]></category>
		<category><![CDATA[pynotify]]></category>

		<guid isPermaLink="false">http://www.doknowevil.net/?p=698</guid>
		<description><![CDATA[I&#8217;ve only been coding Python for ~12 hours total, so don&#8217;t expect this to be perfect. Knowing what I know about creating/testing other software and doing my best to scour through very light pynotify documentation, I&#8217;ve begun to build out this script to be more useful / portable / configurable. As the Version 0.6 indicates,]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve only been coding Python for ~12 hours total, so don&#8217;t expect this to be perfect.  Knowing what I know about creating/testing other software and doing my best to scour through very light pynotify documentation, I&#8217;ve begun to build out this script to be more useful / portable / configurable.  As the Version 0.6 indicates, I&#8217;m not quite at my goal yet and there is still more to learn to bring it up to that point.</p>
<p>I&#8217;m releasing this early on my blog just in case I caught any people yesterday who&#8217;ve been experimenting with my research / code so far.  I&#8217;ll share it on github when I evolve it just a bit more.</p>
<p><a href="http://interwebninja.com/videos/compiz-screenshot-piped-to-notification-daemon-for-upload.ogv">Video of it in Action</a></p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;color: #ccc; font: 12px Consolas, Lucida Console, Monaco, monospace;"><span class="co1">#!/usr/bin/env python</span>
<span class="co1">#</span>
<span class="co1"># Title: scp-notifications</span>
<span class="co1"># Author: Tyler Mulligan (tyler@detrition.net)</span>
<span class="co1"># Date: 06/26/2010</span>
<span class="co1"># Version: 0.6</span>
<span class="co1"># Description:</span>
<span class="co1"># Used in combination with an event, such as an action or cronjob, this script</span>
<span class="co1"># will scp the latest file from a folder to your server.</span>
<span class="co1">#</span>
<span class="co1"># Optionally, it can copy the url to your clipboard and/or show a popup with a</span>
<span class="co1"># link to the file after succesfully uploading</span>
<span class="co1">#</span>
<span class="co1"># Orginally developed to be piped to from compiz screenshot tool</span>
<span class="co1"># http://interwebninja.com/videos/compiz-screenshot-piped-to-notification-daemon-for-upload.ogv</span>
<span class="co1">#</span>
<span class="co1"># The MIT License</span>
<span class="co1">#</span>
<span class="co1"># Copyright (c) 2010 Tyler Mulligan</span>
<span class="co1">#</span>
<span class="co1"># Permission is hereby granted, free of charge, to any person obtaining a copy</span>
<span class="co1"># of this software and associated documentation files (the &quot;Software&quot;), to deal</span>
<span class="co1"># in the Software without restriction, including without limitation the rights</span>
<span class="co1"># to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span>
<span class="co1"># copies of the Software, and to permit persons to whom the Software is</span>
<span class="co1"># furnished to do so, subject to the following conditions:</span>
<span class="co1">#</span>
<span class="co1"># The above copyright notice and this permission notice shall be included in</span>
<span class="co1"># all copies or substantial portions of the Software.</span>
<span class="co1">#</span>
<span class="co1"># THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
<span class="co1"># IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span>
<span class="co1"># FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span>
<span class="co1"># AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span>
<span class="co1"># LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span>
<span class="co1"># OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span>
<span class="co1"># THE SOFTWARE</span>
<span class="co1">#</span>
&nbsp;
<span class="kw1">import</span> pygtk
pygtk.<span class="me1">require</span><span class="br0">&#40;</span><span class="st0">'2.0'</span><span class="br0">&#41;</span>
<span class="kw1">import</span> pynotify
<span class="kw1">import</span> gtk
<span class="kw1">import</span> <span class="kw3">sys</span>
<span class="kw1">import</span> <span class="kw3">os</span>
<span class="kw1">import</span> <span class="kw3">subprocess</span>
&nbsp;
<span class="co1"># Set Variables</span>
<span class="co1">#####################################</span>
<span class="kw3">user</span> = <span class="st0">&quot;user&quot;</span>
host = <span class="st0">&quot;server.com&quot;</span>
<span class="co1"># All should have trailing slashes</span>
lfolder = <span class="st0">&quot;/home/user/screenshots/&quot;</span>
hfolder = <span class="st0">&quot;/home/remote_user/screenshots/&quot;</span>
httplink = <span class="st0">&quot;http://&quot;</span>+host+<span class="st0">&quot;/screenshots/&quot;</span>
&nbsp;
&nbsp;
<span class="co1"># Display</span>
<span class="co1">#####################################</span>
t1 = <span class="nu0">5000</span> <span class="co1"># timeout for screenshot upload dialog</span>
t2 = <span class="nu0">3000</span> <span class="co1"># timeout for screenshot preview</span>
t3 = <span class="nu0">7000</span> <span class="co1"># timeout for link dialog</span>
&nbsp;
screenshot_preview = <span class="nu0">1</span> <span class="co1"># If using with the compiz screenshot plugin, you may want this</span>
popup_link = <span class="nu0">1</span> <span class="co1"># another popup</span>
copy_to_clipboard = <span class="nu0">0</span> <span class="co1"># automatically copy text to keyboard</span>
&nbsp;
<span class="co1"># Position</span>
<span class="co1">#####################################</span>
&nbsp;
<span class="co1"># Get screensize &lt; &lt; used for relative positioning</span>
display = gtk.<span class="me1">gdk</span>.<span class="me1">display_get_default</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
screen = display.<span class="me1">get_default_screen</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
x = screen.<span class="me1">get_width</span><span class="br0">&#40;</span><span class="br0">&#41;</span> - <span class="nu0">1</span>
y = screen.<span class="me1">get_height</span><span class="br0">&#40;</span><span class="br0">&#41;</span> - <span class="nu0">1</span>
&nbsp;
<span class="co1"># 0 for Automatic Placement</span>
<span class="st0">&quot;&quot;&quot;
x1 = 0
y1 = 0
x2 = 0
y2 = 0
x3 = 0
y3 = 0
&quot;&quot;&quot;</span>
<span class="co1"># Define Relative Position (assuming top-right)</span>
x1 = x-<span class="nu0">1</span>
y1 = <span class="nu0">12</span>
x2 = x1
y2 = y1 + <span class="nu0">100</span>
x3 = x-<span class="nu0">1</span>
y3 = <span class="nu0">12</span>
<span class="co1"># Define Static (1920 puts it on my second monitor)</span>
<span class="st0">&quot;&quot;&quot;
x1 = 1919
y1 = 12
x2 = x1
y2 = y1 + 100
x3 = 1920
y3 = 12
&quot;&quot;&quot;</span>
<span class="co1">#####################################</span>
&nbsp;
<span class="kw1">def</span> upload_cb<span class="br0">&#40;</span>n, action<span class="br0">&#41;</span>:
    <span class="kw1">assert</span> action == <span class="st0">&quot;upload&quot;</span> 
&nbsp;
    <span class="kw3">subprocess</span>.<span class="me1">call</span><span class="br0">&#40;</span><span class="br0">&#91;</span><span class="st0">&quot;scp&quot;</span>, <span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">join</span><span class="br0">&#40;</span>lfolder, f<span class="br0">&#41;</span>, <span class="st0">'%s@%s:%s'</span> <span class="sy0">%</span> <span class="br0">&#40;</span><span class="kw3">user</span>, host, hfolder<span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>
&nbsp;
    <span class="co1"># setup URL in </span>
    <span class="kw1">if</span> copy_to_clipboard:
        clipboard = gtk.<span class="me1">clipboard_get</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
        clipboard.<span class="me1">set_text</span><span class="br0">&#40;</span>httplink + f<span class="br0">&#41;</span>
        <span class="co1"># make our data available to other applications</span>
        clipboard.<span class="me1">store</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
    <span class="co1"># Notification: Link for the clicking</span>
    <span class="kw1">if</span> popup_link:
        n3 = pynotify.<span class="me1">Notification</span><span class="br0">&#40;</span><span class="st0">&quot;Here is your link&quot;</span>,<span class="st0">&quot;&lt;a href='&quot;</span> + httplink + f + <span class="st0">&quot;'&gt;&quot;</span> + httplink + f + <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>
&nbsp;
        helper = gtk.<span class="me1">Button</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
        icon = helper.<span class="me1">render_icon</span><span class="br0">&#40;</span>gtk.<span class="me1">STOCK_DIALOG_INFO</span>, gtk.<span class="me1">ICON_SIZE_DIALOG</span><span class="br0">&#41;</span>
        n3.<span class="me1">set_icon_from_pixbuf</span><span class="br0">&#40;</span>icon<span class="br0">&#41;</span>
&nbsp;
        n3.<span class="me1">set_urgency</span><span class="br0">&#40;</span>pynotify.<span class="me1">URGENCY_NORMAL</span><span class="br0">&#41;</span>
        <span class="kw1">if</span> x3:
            n3.<span class="me1">set_hint</span><span class="br0">&#40;</span><span class="st0">&quot;x&quot;</span>, x3<span class="br0">&#41;</span>
        <span class="kw1">if</span> y3:
            n3.<span class="me1">set_hint</span><span class="br0">&#40;</span><span class="st0">&quot;y&quot;</span>, y3<span class="br0">&#41;</span>
        n3.<span class="me1">set_timeout</span><span class="br0">&#40;</span>t3<span class="br0">&#41;</span>
        n3.<span class="me1">connect</span><span class="br0">&#40;</span><span class="st0">&quot;closed&quot;</span>,closen3_cb<span class="br0">&#41;</span>
&nbsp;
        <span class="kw1">if</span> <span class="kw1">not</span> n3.<span class="me1">show</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:
            <span class="kw1">print</span> <span class="st0">&quot;Failed to send notification&quot;</span>
            <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>
&nbsp;
        closen1_cb<span class="br0">&#40;</span>n1<span class="br0">&#41;</span>
        closen2_cb<span class="br0">&#40;</span>n2<span class="br0">&#41;</span>
&nbsp;
    gtk.<span class="me1">main_quit</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>
&nbsp;
<span class="co1"># Notification 1 was closed</span>
<span class="kw1">def</span> closen1_cb<span class="br0">&#40;</span>n<span class="br0">&#41;</span>:
    n1.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span class="kw1">if</span> screenshot_preview:
        n2.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
    gtk.<span class="me1">main_quit</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
<span class="co1"># Notification 2 was closed</span>
<span class="kw1">def</span> closen2_cb<span class="br0">&#40;</span>n<span class="br0">&#41;</span>:
    n2.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
    gtk.<span class="me1">main_quit</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
<span class="co1"># Notification 2 was closed</span>
<span class="kw1">def</span> closen3_cb<span class="br0">&#40;</span>n<span class="br0">&#41;</span>:
    n3.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
    gtk.<span class="me1">main_quit</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
<span class="co1"># The Ignore button was clicked</span>
<span class="kw1">def</span> ignore_cb<span class="br0">&#40;</span>n, action<span class="br0">&#41;</span>:
    <span class="kw1">assert</span> action == <span class="st0">&quot;ignore&quot;</span>
&nbsp;
    closen1_cb<span class="br0">&#40;</span>n1<span class="br0">&#41;</span>
    closen2_cb<span class="br0">&#40;</span>n2<span class="br0">&#41;</span>
    gtk.<span class="me1">main_quit</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
<span class="co1"># Main</span>
<span class="kw1">def</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>:
    gtk.<span class="me1">main</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
<span class="co1"># Init</span>
<span class="kw1">if</span> __name__ == <span class="st0">'__main__'</span>:
    <span class="kw1">if</span> <span class="kw1">not</span> pynotify.<span class="me1">init</span><span class="br0">&#40;</span><span class="st0">&quot;Notifier 'scp' Option&quot;</span><span class="br0">&#41;</span>:
        <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>
&nbsp;
    <span class="co1"># Get latest file and build uri</span>
    start = <span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">abspath</span><span class="br0">&#40;</span>lfolder<span class="br0">&#41;</span>
    f = <span class="kw2">max</span><span class="br0">&#40;</span><span class="br0">&#91;</span><span class="br0">&#40;</span><span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">getmtime</span><span class="br0">&#40;</span><span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">join</span><span class="br0">&#40;</span>start,p<span class="br0">&#41;</span><span class="br0">&#41;</span>,p<span class="br0">&#41;</span>
         <span class="kw1">for</span> p <span class="kw1">in</span> <span class="kw3">os</span>.<span class="me1">listdir</span><span class="br0">&#40;</span>start<span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>
    uri = lfolder + f
&nbsp;
    <span class="co1"># Notification: Upload to Server</span>
    n1 = pynotify.<span class="me1">Notification</span><span class="br0">&#40;</span><span class="st0">&quot;Upload to Server?&quot;</span>,<span class="st0">&quot;Copy the file '&quot;</span> + f + <span class="st0">&quot;' to the server?&quot;</span><span class="br0">&#41;</span>
&nbsp;
    helper = gtk.<span class="me1">Button</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
    icon = helper.<span class="me1">render_icon</span><span class="br0">&#40;</span>gtk.<span class="me1">STOCK_DIALOG_QUESTION</span>, gtk.<span class="me1">ICON_SIZE_DIALOG</span><span class="br0">&#41;</span>
    n1.<span class="me1">set_icon_from_pixbuf</span><span class="br0">&#40;</span>icon<span class="br0">&#41;</span>
&nbsp;
    n1.<span class="me1">set_urgency</span><span class="br0">&#40;</span>pynotify.<span class="me1">URGENCY_NORMAL</span><span class="br0">&#41;</span>
    <span class="kw1">if</span> x1:
        n1.<span class="me1">set_hint</span><span class="br0">&#40;</span><span class="st0">&quot;x&quot;</span>, x1<span class="br0">&#41;</span>
    <span class="kw1">if</span> y1:
        n1.<span class="me1">set_hint</span><span class="br0">&#40;</span><span class="st0">&quot;y&quot;</span>, y1<span class="br0">&#41;</span>
    n1.<span class="me1">set_timeout</span><span class="br0">&#40;</span>t1<span class="br0">&#41;</span>
    n1.<span class="me1">add_action</span><span class="br0">&#40;</span><span class="st0">&quot;upload&quot;</span>, <span class="st0">&quot;Yes, Upload&quot;</span>, upload_cb<span class="br0">&#41;</span>
    n1.<span class="me1">add_action</span><span class="br0">&#40;</span><span class="st0">&quot;ignore&quot;</span>, <span class="st0">&quot;Ignore&quot;</span>, ignore_cb<span class="br0">&#41;</span>
    n1.<span class="me1">connect</span><span class="br0">&#40;</span><span class="st0">&quot;closed&quot;</span>,closen1_cb<span class="br0">&#41;</span>
&nbsp;
    <span class="kw1">if</span> <span class="kw1">not</span> n1.<span class="me1">show</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:
        <span class="kw1">print</span> <span class="st0">&quot;Failed to send notification&quot;</span>
        <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>
&nbsp;
    <span class="co1"># Notification: Screenshot Preview</span>
    <span class="kw1">if</span> screenshot_preview:
        n2 = pynotify.<span class="me1">Notification</span><span class="br0">&#40;</span><span class="st0">&quot;Screenshot Preview&quot;</span>, <span class="st0">&quot;&quot;</span>, uri<span class="br0">&#41;</span>
        n2.<span class="me1">set_urgency</span><span class="br0">&#40;</span>pynotify.<span class="me1">URGENCY_LOW</span><span class="br0">&#41;</span>
        <span class="kw1">if</span> x2:
            n2.<span class="me1">set_hint</span><span class="br0">&#40;</span><span class="st0">&quot;x&quot;</span>, x2<span class="br0">&#41;</span>
        <span class="kw1">if</span> y2:
            n2.<span class="me1">set_hint</span><span class="br0">&#40;</span><span class="st0">&quot;y&quot;</span>, y2<span class="br0">&#41;</span>
        n2.<span class="me1">set_timeout</span><span class="br0">&#40;</span>t2<span class="br0">&#41;</span>
        n2.<span class="me1">connect</span><span class="br0">&#40;</span><span class="st0">&quot;closed&quot;</span>,closen2_cb<span class="br0">&#41;</span>
&nbsp;
        <span class="kw1">if</span> <span class="kw1">not</span> n2.<span class="me1">show</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:
            <span class="kw1">print</span> <span class="st0">&quot;Failed to send notification&quot;</span>
            <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>
&nbsp;
    main<span class="br0">&#40;</span><span class="br0">&#41;</span></pre></div></div>

<p>I also rigged up a quick gallery script to parse the incoming images http://interwebninja.com/screenshots/ &#8212; I used <a href="http://scriptandstyle.com/automatically-generate-a-photo-gallery-from-a-directory-of-images">AutoGeneratingGallery</a> for this.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doknowevil.net/2010/06/26/scp-notifications-for-gnome-and-ubuntu-expanding-on-my-original-python-script/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://interwebninja.com/videos/compiz-screenshot-piped-to-notification-daemon-for-upload.ogv" length="2797703" type="video/ogg" />
		</item>
		<item>
		<title>Ubuntu Notifications (osd-notify) Sucks, notifications-daemon Rocks &#8211; Exploiting the Goodness with Compiz</title>
		<link>http://www.doknowevil.net/2010/06/25/ubuntu-notifications-osd-notify-sucks-notifications-daemon-rocks-exploiting-the-goodness-with-compiz/</link>
		<comments>http://www.doknowevil.net/2010/06/25/ubuntu-notifications-osd-notify-sucks-notifications-daemon-rocks-exploiting-the-goodness-with-compiz/#comments</comments>
		<pubDate>Sat, 26 Jun 2010 04:47:40 +0000</pubDate>
		<dc:creator>Tyler Mulligan</dc:creator>
				<category><![CDATA[Compiz]]></category>
		<category><![CDATA[Computers]]></category>
		<category><![CDATA[GNOME]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Operating Systems]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[gtk]]></category>
		<category><![CDATA[markedwontfix]]></category>
		<category><![CDATA[notifications]]></category>

		<guid isPermaLink="false">http://www.doknowevil.net/?p=677</guid>
		<description><![CDATA[Introduction The long name for this blog used to be &#8220;Tyler Mulligan&#8217;s Tips and Tricks for Increasing your Efficiency&#8220;. I love finding ways to increase my efficiency and let computers do the work while I focus on more interests aspects of what the computer is providing me with. When I recognize an issue, I find]]></description>
			<content:encoded><![CDATA[<h2>Introduction</h2>
<p>The long name for this blog used to be &#8220;<a href="http://www.doknowevil.net" target="_blank">Tyler Mulligan&#8217;s Tips and Tricks for Increasing your Efficiency</a>&#8220;.  I love finding ways to increase my efficiency and let computers do the work while I focus on more interests aspects of what the computer is providing me with.  When I recognize an issue, I find a way to cut out time by streamlining the process for the most accurate repetition, like any programmer would/should/could.</p>
<p>I noticed myself taking a lot of screenshots with compiz&#8217; built in screenshot tool (I can hold a hotkey and drag a box to take newspaper style clippings).  This is very fast and simple, I highly recommend enabling this option and getting used to it.  However, I don&#8217;t care much for clicking around on clunky websites to upload images.</p>
<p>This is where my adventure starts&#8230; when I find out <a href="http://ubuntuforums.org/showthread.php?t=1517950" title="notify-osd doesn't display popup balloons">a very useful feature was deprecated and not replaced in Ubuntu</a>.  I don&#8217;t use the new notification area, it has too much I don&#8217;t need, I never liked the behavior of these new osd-notify notifications which I found out now are even more worthless (sorry team).</p>
<h2>Using Sane Notifications in Ubuntu</h2>
<p>After <a href="http://ubuntuforums.org/showpost.php?p=8559795&#038;postcount=8">reinstalling the GNOME default notifications system in Ubuntu</a> I was able to use SANE notifications that actually&#8230; KICK ASS!  I don&#8217;t understand how osd-notify is better than these which even comes with it&#8217;s own notification properties panel.  Maybe it&#8217;s an under the hood thing&#8230;</p>
<p>Regardless, there is no doubt in my mind that notifications that you hover, can still slightly see but click through but cannot perform any actions, even a close, are just plan stupid and annoying..</p>
<p><img src="http://interwebninja.com/compiz-screenshots/screenshot5.png" title="Screenshot taken with Tyler Mulligan's Notification 'scp' Option python script for ubuntu and other Linux based operating systems" /><br />
Screenshot of the script I ended up writing using the &#8220;better&#8221; notification system to ask me if I want to upload the screenshot I just took to the server.</p>
<h2>Linking the notifications</h2>
<p>I linked the notifications the following way:</p>
<p><img src="http://interwebninja.com/compiz-screenshots/screenshot3.png" title="Screenshot taken with Tyler Mulligan's Notification 'scp' Option python script for ubuntu and other Linux based operating systems" /></p>
<h2>Python Script for Notification that Prompts for File Upload to Server</h2>
<p>Knowing diddly squat about Python, I chugged forward with my classic notification popups that allow for interaction as it had the most activity around it and some examples available in /usr/share/doc/python-notify/examples/</p>
<p>I ended coming up with the following script thanks to some help from a few people in #python on irc.freenode.org</p>
<p>This is outside of the scope of this blogpost but this script assumes you have setup passwordless ssh to your server.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;color: #ccc; font: 12px Consolas, Lucida Console, Monaco, monospace;"><span class="co1">#!/usr/bin/env python</span>
<span class="co1">#</span>
<span class="co1"># Title: Notification 'scp' Option</span>
<span class="co1"># Author: Tyler Mulligan (tyler@detrition.net)</span>
<span class="co1"># Date: 06/25/2010</span>
<span class="co1"># Description:</span>
<span class="co1"># Used in combination with an event, such as an action or cron</span>
<span class="co1"># the latest file from a folder will be scped to your server and will copy</span>
<span class="co1"># the http location of the that file to your clipboard</span>
<span class="co1">#</span>
<span class="co1"># Orginally developed to be piped to from compiz screenshot tool</span>
<span class="co1">#</span>
<span class="co1">#</span>
<span class="co1"># The MIT License</span>
<span class="co1">#</span>
<span class="co1"># Copyright (c) 2010 Tyler Mulligan</span>
<span class="co1">#</span>
<span class="co1"># Permission is hereby granted, free of charge, to any person obtaining a copy</span>
<span class="co1"># of this software and associated documentation files (the &quot;Software&quot;), to deal</span>
<span class="co1"># in the Software without restriction, including without limitation the rights</span>
<span class="co1"># to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span>
<span class="co1"># copies of the Software, and to permit persons to whom the Software is</span>
<span class="co1"># furnished to do so, subject to the following conditions:</span>
<span class="co1">#</span>
<span class="co1"># The above copyright notice and this permission notice shall be included in</span>
<span class="co1"># all copies or substantial portions of the Software.</span>
<span class="co1">#</span>
<span class="co1"># THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span>
<span class="co1"># IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span>
<span class="co1"># FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span>
<span class="co1"># AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span>
<span class="co1"># LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span>
<span class="co1"># OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span>
<span class="co1"># THE SOFTWARE</span>
<span class="co1">#</span>
&nbsp;
<span class="kw1">import</span> pygtk
pygtk.<span class="me1">require</span><span class="br0">&#40;</span><span class="st0">'2.0'</span><span class="br0">&#41;</span>
<span class="kw1">import</span> gtk
<span class="kw1">import</span> pynotify
<span class="kw1">import</span> <span class="kw3">sys</span>
<span class="kw1">import</span> <span class="kw3">os</span>
<span class="kw1">import</span> <span class="kw3">subprocess</span>
&nbsp;
<span class="kw3">user</span> = <span class="st0">&quot;user&quot;</span>
host = <span class="st0">&quot;server.com&quot;</span>
lfolder = <span class="st0">&quot;/home/user/screenshots/&quot;</span>
hfolder = <span class="st0">&quot;/home/remote_user/screenshots/&quot;</span>
httplink = <span class="st0">&quot;http://&quot;</span>+host+<span class="st0">&quot;/screenshots/&quot;</span>
timeout = <span class="nu0">5000</span>
&nbsp;
<span class="co1"># Set position</span>
display = gtk.<span class="me1">gdk</span>.<span class="me1">display_get_default</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
screen = display.<span class="me1">get_default_screen</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
x = screen.<span class="me1">get_width</span><span class="br0">&#40;</span><span class="br0">&#41;</span> - <span class="nu0">1</span>
y = screen.<span class="me1">get_height</span><span class="br0">&#40;</span><span class="br0">&#41;</span> - <span class="nu0">1</span>
<span class="co1">#x = 1919</span>
<span class="co1">#y = 12</span>
&nbsp;
<span class="kw1">def</span> upload_cb<span class="br0">&#40;</span>n, action<span class="br0">&#41;</span>:
    <span class="kw1">assert</span> action == <span class="st0">&quot;upload&quot;</span>
&nbsp;
    start = <span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">abspath</span><span class="br0">&#40;</span>lfolder<span class="br0">&#41;</span>
    f = <span class="kw2">max</span><span class="br0">&#40;</span><span class="br0">&#91;</span><span class="br0">&#40;</span><span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">getmtime</span><span class="br0">&#40;</span><span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">join</span><span class="br0">&#40;</span>start,x<span class="br0">&#41;</span><span class="br0">&#41;</span>,x<span class="br0">&#41;</span>
          <span class="kw1">for</span> x <span class="kw1">in</span> <span class="kw3">os</span>.<span class="me1">listdir</span><span class="br0">&#40;</span>start<span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>
&nbsp;
	<span class="co1"># setup URL in clipboard</span>
    clipboard = gtk.<span class="me1">clipboard_get</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
    clipboard.<span class="me1">set_text</span><span class="br0">&#40;</span>httplink + f<span class="br0">&#41;</span>
    <span class="co1"># make our data available to other applications</span>
    clipboard.<span class="me1">store</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
    <span class="kw3">os</span>.<span class="me1">system</span><span class="br0">&#40;</span><span class="st0">'scp &quot;%s&quot; &quot;%s@%s:%s&quot;'</span> <span class="sy0">%</span> <span class="br0">&#40;</span>lfolder + f, <span class="kw3">user</span>, host, hfolder<span class="br0">&#41;</span> <span class="br0">&#41;</span>.<span class="me1">wait</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
    n.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
    gtk.<span class="me1">main_quit</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
<span class="kw1">def</span> ignore_cb<span class="br0">&#40;</span>n, action<span class="br0">&#41;</span>:
    <span class="kw1">assert</span> action == <span class="st0">&quot;ignore&quot;</span>
    n.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
    gtk.<span class="me1">main_quit</span><span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
<span class="kw1">if</span> __name__ == <span class="st0">'__main__'</span>:
    <span class="kw1">if</span> <span class="kw1">not</span> pynotify.<span class="me1">init</span><span class="br0">&#40;</span><span class="st0">&quot;Notifier 'scp' Option&quot;</span><span class="br0">&#41;</span>:
        <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>
&nbsp;
	<span class="co1"># Setup Popup</span>
    n = pynotify.<span class="me1">Notification</span><span class="br0">&#40;</span><span class="st0">&quot;Upload to Server?&quot;</span><span class="br0">&#41;</span>
    n.<span class="me1">set_urgency</span><span class="br0">&#40;</span>pynotify.<span class="me1">URGENCY_NORMAL</span><span class="br0">&#41;</span>
    n.<span class="me1">set_timeout</span><span class="br0">&#40;</span>timeout<span class="br0">&#41;</span>                          
    n.<span class="me1">set_category</span><span class="br0">&#40;</span><span class="st0">&quot;device&quot;</span><span class="br0">&#41;</span>
    n.<span class="me1">add_action</span><span class="br0">&#40;</span><span class="st0">&quot;upload&quot;</span>, <span class="st0">&quot;Yes, Upload&quot;</span>, upload_cb<span class="br0">&#41;</span>
    n.<span class="me1">add_action</span><span class="br0">&#40;</span><span class="st0">&quot;ignore&quot;</span>, <span class="st0">&quot;Ignore&quot;</span>, ignore_cb<span class="br0">&#41;</span>
&nbsp;
    <span class="co1"># Set position</span>
    n.<span class="me1">set_hint</span><span class="br0">&#40;</span><span class="st0">&quot;x&quot;</span>, x<span class="br0">&#41;</span>
    n.<span class="me1">set_hint</span><span class="br0">&#40;</span><span class="st0">&quot;y&quot;</span>, y<span class="br0">&#41;</span>
&nbsp;
    <span class="kw1">if</span> <span class="kw1">not</span> n.<span class="me1">show</span><span class="br0">&#40;</span><span class="br0">&#41;</span>:
        <span class="kw1">print</span> <span class="st0">&quot;Failed to send notification&quot;</span>
        <span class="kw3">sys</span>.<span class="me1">exit</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>
&nbsp;
    gtk.<span class="me1">main</span><span class="br0">&#40;</span><span class="br0">&#41;</span></pre></div></div>

<p>edit: I updated the script with some position information &#8212; I love that I can put the notifications ANYWHERE on my screen.  I also variablized the timeout.</p>
<p>edit 2: Here is a video of my improved script in action &#8212; I&#8217;ll post the source later</p>
<p>http://interwebninja.com/videos/compiz-screenshot-piped-to-notification-daemon-for-upload.ogv</p>
<h2>Going Beyond</h2>
<p>The Compiz example is just something that server my immediate needs.  The possibilities are however endless.  You can for example, link this script to a cron job asking you if you want to sync some other sort of file.  Or perhaps you&#8217;d like to add multiple buttons to give yourself a folder / server choice.</p>
<p>Happy hacking</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doknowevil.net/2010/06/25/ubuntu-notifications-osd-notify-sucks-notifications-daemon-rocks-exploiting-the-goodness-with-compiz/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://cankill.us/videos/compiz-screenshot-piped-to-notification-daemon-for-upload.ogv" length="687321" type="video/ogg" />
<enclosure url="http://interwebninja.com/videos/compiz-screenshot-piped-to-notification-daemon-for-upload.ogv" length="687321" type="video/ogg" />
		</item>
		<item>
		<title>Patching NextGEN Voting Plugin to Allow Showing of the Vote Form on Single Images</title>
		<link>http://www.doknowevil.net/2010/05/30/patching-nextgen-voting-plugin-to-allow-showing-of-the-vote-form-on-single-images/</link>
		<comments>http://www.doknowevil.net/2010/05/30/patching-nextgen-voting-plugin-to-allow-showing-of-the-vote-form-on-single-images/#comments</comments>
		<pubDate>Sun, 30 May 2010 21:17:19 +0000</pubDate>
		<dc:creator>Tyler Mulligan</dc:creator>
				<category><![CDATA[The Internet]]></category>
		<category><![CDATA[Web Applications]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[NextGEN]]></category>
		<category><![CDATA[Wordpress Plugins]]></category>

		<guid isPermaLink="false">http://www.doknowevil.net/?p=669</guid>
		<description><![CDATA[Intro NextGEN Voting is a plugin for the wordpress plugin NextGEN Gallery plugin. Keeping this in mind made the task of extending easier. NextGEN Gallery hooks into wordpress functions, NextGEN Voting hooks into NextGEN Gallery. By default, NextGEN Voting hooks into the gallery view, giving access to a function that uses the image id for]]></description>
			<content:encoded><![CDATA[<h2>Intro</h2>
<p><a href="http://wordpress.org/extend/plugins/nextgen-gallery-voting/" target="_blank">NextGEN Voting</a> is a plugin for the wordpress plugin <a href="http://wordpress.org/extend/plugins/nextgen-gallery/" target="_blank">NextGEN Gallery</a> plugin.  Keeping this in mind made the task of extending easier.  NextGEN Gallery hooks into wordpress functions, NextGEN Voting hooks into NextGEN Gallery.</p>
<p>By default, NextGEN Voting hooks into the gallery view, giving access to a function that uses the image id for lookup.  The only reason we see nothing if we try to paste the same template code into a page other than the recommended <em>&#8220;nextgen-gallery/view/gallery.php&#8221;</em> is because that function is not given access in any other view.</p>
<h2>How-to Add Access to Use the Function in the Image Browser Template</h2>
<p>Open <em>&#8220;wp-content/plugins/nextgen-gallery-voting/ngg-voting.php&#8221;</em>,</p>
<p>Look for:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;color: #ccc; font: 12px Consolas, Lucida Console, Monaco, monospace;">add_filter<span class="br0">&#40;</span><span class="st0">&quot;ngg_show_gallery_content&quot;</span><span class="sy0">,</span> <span class="st0">&quot;nggv_show_gallery&quot;</span><span class="sy0">,</span> <span class="nu0">10</span><span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>

<p>Add After:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;color: #ccc; font: 12px Consolas, Lucida Console, Monaco, monospace;">add_filter<span class="br0">&#40;</span><span class="st0">&quot;ngg_show_imagebrowser_content&quot;</span><span class="sy0">,</span> <span class="st0">&quot;nggv_show_imagebrowser&quot;</span><span class="sy0">,</span> <span class="nu0">10</span><span class="sy0">,</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div>

<p>Look for:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;color: #ccc; font: 12px Consolas, Lucida Console, Monaco, monospace;"><span class="kw2">function</span> nggv_show_gallery<span class="br0">&#40;</span><span class="re0">$out</span><span class="sy0">,</span> <span class="re0">$gid</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="kw1">return</span> <span class="re0">$out</span><span class="sy0">.</span>nggc_voteForm<span class="br0">&#40;</span><span class="re0">$gid</span><span class="sy0">,</span> <span class="re0">$buffer</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>

<p>Add After:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;color: #ccc; font: 12px Consolas, Lucida Console, Monaco, monospace;"><span class="kw2">function</span> nggv_show_imagebrowser<span class="br0">&#40;</span><span class="re0">$out</span><span class="sy0">,</span> <span class="re0">$gid</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span class="kw1">return</span> <span class="re0">$out</span><span class="sy0">.</span>nggc_voteForm<span class="br0">&#40;</span><span class="re0">$gid</span><span class="sy0">,</span> <span class="re0">$buffer</span><span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div>

<p>Now we have given access to the function and can paste the following code into <em>&#8220;wp-content/plugins/nextgen-gallery/imagebrowser.php&#8221;</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;color: #ccc; font: 12px Consolas, Lucida Console, Monaco, monospace;"><span class="sy0">&lt;</span> ?php <span class="kw1">echo</span> nggv_imageVoteForm<span class="br0">&#40;</span><span class="re0">$image</span><span class="sy0">-&gt;</span><span class="me1">pid</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span></pre></div></div>

<h2>Conclusion</h2>
<p>I&#8217;ve tried to explain this in method in a way you can repeat an extend to suit your needs.  By following the same logic and tracing the hooks, you can apply this however you might need.</p>
<p>You&#8217;ll want to keep <em>&#8220;wp-content/plugins/nextgen-gallery/nggfunctions.php&#8221;</em> open as a reference for what hooks are available.  You can find hooks by searching for &#8220;apply_filters(&#8216;&#8221;, it will be the first parameter.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doknowevil.net/2010/05/30/patching-nextgen-voting-plugin-to-allow-showing-of-the-vote-form-on-single-images/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Mac Browsers + PNGs = Mismatching Image Colors with Same HTML Hex</title>
		<link>http://www.doknowevil.net/2010/05/28/mac-browsers-pngs-mismatching-image-colors-with-same-html-hex/</link>
		<comments>http://www.doknowevil.net/2010/05/28/mac-browsers-pngs-mismatching-image-colors-with-same-html-hex/#comments</comments>
		<pubDate>Fri, 28 May 2010 11:30:36 +0000</pubDate>
		<dc:creator>Tyler Mulligan</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[OSX]]></category>
		<category><![CDATA[Operating Systems]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[The Internet]]></category>
		<category><![CDATA[Web Applications]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[png]]></category>
		<category><![CDATA[steve jobs]]></category>

		<guid isPermaLink="false">http://www.doknowevil.net/?p=635</guid>
		<description><![CDATA[Most people with a Mac don&#8217;t know this but their gamma is set to 1.8 by default where the rest of the world is set to 2.2 for web/tv. The only reason I know this is because I had to figure out what was causing certain images to display darker on macs than Windows/Linux computers.]]></description>
			<content:encoded><![CDATA[<p>Most people with a Mac don&#8217;t know this but their gamma is set to 1.8 by default where the rest of the world is set to 2.2 for web/tv.  The only reason I know this is because I had to figure out what was causing certain images to display darker on macs than Windows/Linux computers.  Thankfully <a href="http://don.blogs.smugmug.com/author/onethumb/" target="_blank">Don MacAskill</a>, explained the basics of this &#8220;phenomenon&#8221; of <a href="http://don.blogs.smugmug.com/2007/02/14/this-is-your-mac-on-drugs/" target="_blank">Mac Browsers + PNGs = Mismatching Image Colors with Same HTML Hex&#8221;</a> in great detail and with <a href="http://www.smugmug.com/help/safari/safari.html" target="_blank">good examples</a></p>
<blockquote><p>Internet standards, including HTML, CSS, and Flash, are based on a gamma of 2.2, making colors partway between black &#038; white appear darker and higher contrast than 1.8 gamma makes them appear.</p></blockquote>
<p>Clearly this is a problem, as referenced by Ron, even <a href="http://support.apple.com/kb/HT2026?viewlocale=en_US" target="_blank">Apple recommends you change your default gamma from 1.8 to 2.2</a>, where they also link to some <a href="http://www.gballard.net/psd/srgbforwww.html" target="_blank">further reading</a>.</p>
<p>If images are delivered with the lower gamma information embedded, web browsers on macs tend to* (not all see note below) display them incorrectly if it&#8217;s not reading the color profile properly.</p>
<p>As a webdesigner / web developer / photographer, this might worry you.  You&#8217;ll want it too look the same to everyone or at least the majority (95%+ of the world uses windows). The easiest way I found to fix this in my work flow, using Ubuntu Linux was with <a href="http://en.wikipedia.org/wiki/Pngcrush" target="_blank">pngcrush</a>, a cross-platform application that allows you to not only reduce image filesize loseless, but allows you to remove information that can cause confusion with the way images appear in mac web browsers.</p>
<p>All I had to do to install it on Ubuntu was:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: #ccc; font: 12px Consolas, Lucida Console, Monaco, monospace;"><span class="kw2">sudo</span> <span class="kw2">apt-get</span> <span class="kw2">install</span> pngcrush</pre></div></div>

<p>Then I wrote the following command to strip all gAMA, cHTM, iCCP and sRGB information from all png files within a directory and move them to a folder called &#8220;crushed&#8221;</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: #ccc; font: 12px Consolas, Lucida Console, Monaco, monospace;">pngcrush <span class="re5">-d</span> crushed <span class="re5">-rem</span> gAMA <span class="re5">-rem</span> cHRM <span class="re5">-rem</span> iCCP <span class="re5">-rem</span> sRGB <span class="sy0">*</span>.png</pre></div></div>

<p>*It&#8217;s important to point out that <a href="http://support.apple.com/kb/ht3712">this does not effect OSX 10.6+ (snow leopard and beyond)</a>.  Further reading on <a href="http://www.earthboundlight.com/phototips/gamma-18-or-22.html" target="_blank">why apple chose 1.8 gamma as the default can be found here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doknowevil.net/2010/05/28/mac-browsers-pngs-mismatching-image-colors-with-same-html-hex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blocking Ads Cross-browser and Save Bandwith Using Your Hosts file</title>
		<link>http://www.doknowevil.net/2010/05/26/blocking-ads-cross-browser-and-save-bandwith-using-your-hosts-file/</link>
		<comments>http://www.doknowevil.net/2010/05/26/blocking-ads-cross-browser-and-save-bandwith-using-your-hosts-file/#comments</comments>
		<pubDate>Thu, 27 May 2010 01:49:06 +0000</pubDate>
		<dc:creator>Tyler Mulligan</dc:creator>
				<category><![CDATA[Application Management]]></category>
		<category><![CDATA[Computers]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[The Internet]]></category>
		<category><![CDATA[hosts]]></category>

		<guid isPermaLink="false">http://www.doknowevil.net/?p=638</guid>
		<description><![CDATA[Ethics of blocking ads vs. data mining aside, one of the smartest ways I found to block ads is at http://someonewhocares.org/hosts/zero/ where the author, Dan Pollock has compiled a list of urls, with the help of contributors that all redirect to 0.0.0.0 or 127.0.0.1 (localhost, your machine). By appending this list to your current hosts]]></description>
			<content:encoded><![CDATA[<p>Ethics of blocking ads vs. data mining aside, one of the smartest ways I found to block ads is at http://someonewhocares.org/hosts/zero/ where the author, Dan Pollock has compiled a list of urls, with the help of contributors that all redirect to 0.0.0.0 or 127.0.0.1 (localhost, your machine).  By appending this list to your current hosts file (or selectively adding parts), whenever your machine attempts to look up a domain name in this list, it will resolved to 0.0.0.0 or your machine.  It will never make a request on the internet to the intended server.  It will never even download the advertisement.</p>
<p>To take this a step further, you could develop a similar list for your router or DNS server (if you operate it).</p>
<p>I still use adblock plus on top for missed entries.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.doknowevil.net/2010/05/26/blocking-ads-cross-browser-and-save-bandwith-using-your-hosts-file/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Some Issues I found with Dual Monitors in KDE</title>
		<link>http://www.doknowevil.net/2010/05/13/some-issues-i-found-with-dual-monitors-in-kde/</link>
		<comments>http://www.doknowevil.net/2010/05/13/some-issues-i-found-with-dual-monitors-in-kde/#comments</comments>
		<pubDate>Thu, 13 May 2010 15:49:09 +0000</pubDate>
		<dc:creator>Tyler Mulligan</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Operating Systems]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Window Management]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[dual monitors]]></category>
		<category><![CDATA[kde 4.4]]></category>

		<guid isPermaLink="false">http://www.doknowevil.net/?p=613</guid>
		<description><![CDATA[I had originally made a thread on ubuntu forums essentially asking how to change the way kde or more specifically kwin treats dual monitors. When trying out KDE 4.4, I was trying to establish a similar workflow to what I have in my GNOME/compiz setup. I use dual monitors and heavily use the expo compiz]]></description>
			<content:encoded><![CDATA[<p>I had originally made a <a href="http://ubuntuforums.org/showthread.php?t=1416445" target="_blank">thread on ubuntu forums</a> essentially asking how to change the way kde or more specifically kwin treats dual monitors.</p>
<p>When trying out KDE 4.4, I was trying to establish a similar workflow to what I have in my GNOME/compiz setup.  I use dual monitors and heavily use the expo compiz plugin (equivalent to kwin&#8217;s &#8216;desktop grid&#8217;).  However, the behavior in KDE is a bit odd to me.</p>
<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/JYzBGBy6bE8&#038;hl=en_US&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/JYzBGBy6bE8&#038;hl=en_US&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object><br />
(not my video but gives you an idea about the effect, see below for how I lay mine out)</p>
<p>In compiz, I have 4 virtual desktops with dimensions that spanned both monitors.</p>
<pr>[    ] | [    ]<br />
[    ] | [    ]</p>
<p>In KDE however, each monitor is considered it&#8217;s own &#8220;activity&#8221; and as such, I have 8 virtual desktops</p>
<pre>[ ][ ] | [ ][ ]
[ ][ ] | [ ][ ]</pre>
<p>This in and of itself isn&#8217;t all so bad.  What bothers me however, is how they behave.</p>
<p>Labeling the virtual desktops..</p>
<pre>[1][2] | [1][2]
[3][4] | [3][4]</pre>
<p>When I click virtual desktop [1] on the left monitor, [1] on the right monitor zooms with it.  The behavior I&#8217;m used to in compiz would be to have both [1][2] on the left desktop zoom if I were to click [1].</p>
<p>Sure, this behavior &#8220;makes sense&#8221; knowing how KDE treats multiple monitors as separate activities but even after setting up matching desktop backgrounds on the monitors, I find it confusing to my workflow.</p>
<p><a href="http://pics.nexuizninjaz.com/viewer.php?file=gu6b56r305xemr7esym.png" rel="shadowbox[post-613];player=img;"><img src="http://pics.nexuizninjaz.com/images/gu6b56r305xemr7esym_thumb.png" /></a></p>
<p>What&#8217;s more, is that KDE seems to know this is what I want&#8230; but ignores this fact when creating activities:</p>
<p><img src="http://pics.nexuizninjaz.com/images/t8ds66c2d39fpe93fxl6.png" /></p>
<p>Has anyone come up with a clever solution to achieve this? I didn&#8217;t see anything about it planned for 4.5.</p>
<p>If it matters, I&#8217;m using twinview.</pr>
]]></content:encoded>
			<wfw:commentRss>http://www.doknowevil.net/2010/05/13/some-issues-i-found-with-dual-monitors-in-kde/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
