<?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>Harsh J &#187; Computing Issues</title>
	<atom:link href="http://www.harshj.com/tags/personal/computing-issues/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.harshj.com</link>
	<description>Memoirs of a QWERTY Keyboard</description>
	<lastBuildDate>Thu, 29 Jul 2010 13:00:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
	<atom:link rel='hub' href='http://www.harshj.com/?pushpress=hub'/>
		<item>
		<title>Sieve of Euler in Erlang</title>
		<link>http://www.harshj.com/2010/06/06/sieve-of-euler-in-erlang/</link>
		<comments>http://www.harshj.com/2010/06/06/sieve-of-euler-in-erlang/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 17:45:28 +0000</pubDate>
		<dc:creator>Harsh</dc:creator>
				<category><![CDATA[Computing Issues]]></category>
		<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Euler]]></category>
		<category><![CDATA[Prime Numbers]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Sieve]]></category>

		<guid isPermaLink="false">http://www.harshj.com/?p=942</guid>
		<description><![CDATA[Learning Erlang is a fun task. Solving PE problems with it even more. You can never really beat PE problems unless you have your own fast implementations of primality tests, prime generation sieves and so on. A quick way to generate primes, as many would tell you, would be to implement and use the Sieve [...]]]></description>
			<content:encoded><![CDATA[<p>Learning Erlang is a fun task. Solving <a title="Project Euler - Learn and write programs to compute mathematical solutions." href="http://projecteuler.net" target="_blank">PE problems</a> with it even more. You can never really beat PE problems unless you have your own fast implementations of primality tests, prime generation sieves and so on.</p>
<p>A quick way to generate primes, as many would tell you, would be to implement and use the <strong>Sieve of Eratosthenes</strong>. Its a simple sieve that works by striking off all multiples of primes thus observed in sequence. <a title="Eratosthenes' sieve illustrated at Wikipedia" href="http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes" target="_blank">Wikipedia</a> has an illustration on its working technique.</p>
<p>There is another simple sieve derived from the same idea, known as the <strong>Sieve of Euler</strong>, which uses a filtering technique based on products of an encountered prime across the remaining elements. This sort of a sieve, again explained in a good manner at <a title="Euler's Sieve Illustrated at Wikipedia" href="http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes#Euler.27s_Sieve" target="_blank">Wikipedia</a>, is shorter and easier to implement in Erlang than the traditional Eratosthenes (and I mean <a title="Melissa E. O’Neill's paper on how the one-liner Haskell sieve solution is not the real Eratosthenes, and what it should be." href="http://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf" target="_blank">proper Eratosthenes</a>, mind you).<br />
<script type="text/javascript"><!--
google_ad_client = "pub-6470447295952949";
//Big-Posts-Journalist
google_ad_slot = "1391165574";
google_ad_width = 336;
google_ad_height = 280;
//--></script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br />
The following is the solution I came up with, a couple of days into learning Erlang for <a title="Learn You Some Erlang For Great Good" href="http://learnyousomeerlang.com/" target="_blank">great good</a>:</p>
<pre class="brush: erlang;">
-module(primes).
-export([generatePrimes/1]).

% Sieve of Euler %

generatePrimes (N) when is_integer(N) and (N &gt; 1) -&gt;
    Numbers = lists:seq(2,N),
    BeginIndex = 1,
    generatePrimes(Numbers, [], BeginIndex).

generatePrimes (Numbers, Numbers, _Index) -&gt;
    Numbers;

generatePrimes (Numbers, _PreviousNumbers, Index) -&gt;
    FilteredNumbers = ordsets:subtract(Numbers, multiples(lists:nth(Index, Numbers), Numbers)),
    generatePrimes(FilteredNumbers, Numbers, Index + 1).

multiples (Prime, Numbers) -&gt;
    lists:map(fun(Num) -&gt; Prime * Num end, Numbers).

% Compile as c(primes). %
</pre>
<p><script type="text/javascript"><!--
google_ad_client = "pub-6470447295952949";
//Big-Posts-Journalist
google_ad_slot = "1391165574";
google_ad_width = 336;
google_ad_height = 280;
//--></script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br />
The function <strong><em>primes</em></strong><em>:</em><strong><em>generatePrimes</em>(</strong><em>N</em><strong>)</strong> will generate all primes until N. On my <strong>2.93 GHz</strong> machine it takes about <strong>2.1s</strong> to generate all primes under a million (<strong>78498 primes</strong>).</p>
<p>As a bonus, you can go ahead and compute single-line inelegant solutions #3 and #10 of Project Euler as:</p>
<pre class="brush: erlang;">
% Solution to problem 3 %
lists:nth(1, lists:dropwhile(fun(X) -&gt; not(600851475143 rem X == 0) end, lists:reverse(primes:generatePrimes(trunc(math:sqrt(600851475143)))))).

% Solution to problem 10 %
lists:sum(primes:generatePrimes(2000000)).
</pre>
<p><strong>Notes</strong>: There is some redundant multiple calculation involved but I noticed that if I perform a sublist operation to remove that it slows the generation down, so I let it be. The sieving operation also terminates when it notices that no number was filtered in one of its call, as this marks the proper end of it. For instance, to generate all primes under 100, it only sieves through the first five primes.</p>
<p><strong>Update</strong>:</p>
<p>Kind commenter <strong>Angel</strong> (<strong>angel</strong> at <strong>uah</strong> dot <strong>es</strong>) posted a solution (and a multi-process one!) to a <em>proper</em> <strong>Eratosthenes&#8217; Sieve</strong> (based on the O&#8217;Neill&#8217;s paper I referenced above), which goes below:</p>
<pre class="brush: erlang; highlight: [3,26];">
% &quot;Genuine&quot; Erathostenes sieve in erlang
% based on www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf
% 2009 Angel Alvarez
%
% Process  1     2     3     4     5     6     7 ....
%
%         02    03    05    07    11    13    17
% P 02 -&gt; 04
% P 03    04 -&gt; 09
% C 04 == 04    09
% P 05    06    09 -&gt; 25
% C 06 == 06    09    25
% P 07    08    09    25 -&gt; 49
% C 08 == 08    09    25    49
% C 09    10 == 09    25    49
% C 10 == 10    12    25    49
% P 11    12    12    25    49 -&gt; 121
% C 12 == 12    12    25    49    121
% P 13    14    15    25    49    121 -&gt; 169
% C 14 == 14    15    25    49    121    169
% C 15    16 == 15    25    49    121    169
% C 16 == 16    18    25    49    121    169
% P 17    18    18    25    49    121    169 -&gt; 289

-module(multi_erathostenes).
-author(&quot;angel at uah dot es&quot;).
-compile(export_all).

compare(X,Y) when X &gt; Y -&gt; greater;
compare(X,Y) when X &lt; Y -&gt; smaller;
compare(_,_) -&gt; equal.

worker(Prime,UpperBound)-&gt;
	receive
		{test,Number,ParentPID} -&gt;
			ParentPID ! ok,
			case compare(Number,UpperBound) of
				equal -&gt;
%					io:format(&quot;[Worker of prime: ~w (~w)] Found composite: ~w~n&quot;,[Prime,UpperBound,Number]),
					worker(Prime,UpperBound + Prime);
				smaller -&gt;
					io:format(&quot;[Worker of prime: ~w (~w)] Spawn new worker for Prime: ~w~n&quot;,[Prime,UpperBound,Number]),
					NextPID =spawn(?MODULE,worker,[Number,Number*Number]),
					worker(Prime,UpperBound,NextPID)
			end;
		stop -&gt;
		    noop
	end.

worker(Prime,UpperBound,NextPID) -&gt;
	receive
		{test,Number,ParentPID} -&gt;
			ParentPID ! ok,
			case compare(Number,UpperBound) of
				equal -&gt;
%					io:format(&quot;[Worker of prime: ~w (~w)] Found composite: ~w~n&quot;,[Prime,UpperBound,Number]),
					worker(Prime,UpperBound + Prime,NextPID);
				smaller -&gt;
% 					io:format(&quot;[Worker of prime: ~w (~w)] passing along: ~w~n&quot;,[Prime,UpperBound,Number]),
					NextPID ! {test,Number,self()},
					receive
					    ok -&gt; ok
					end,
					worker(Prime,UpperBound,NextPID);
				greater -&gt;
% 					io:format(&quot;[Worker of prime: ~w (~w)] passing along: ~w~n&quot;,[Prime,UpperBound,Number]),
					NextPID ! {test,Number,self()},
					receive
					    ok -&gt; ok
					end,
 					worker(Prime,UpperBound+Prime,NextPID)
			end;
		stop -&gt;
		    NextPID ! stop,
		    noop
	end.

start(N) -&gt;
    OnePID=spawn(?MODULE,worker,[2,4]),
    cicle(3,N,OnePID).

cicle(Last,Last,Worker) -&gt;
    Worker ! stop;
cicle(Current,Last,Worker) -&gt;
    Worker ! {test,Current,self()},
    receive
	ok -&gt; ok
    end,
    cicle(Current+1,Last,Worker).
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.harshj.com/2010/06/06/sieve-of-euler-in-erlang/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Pomodoro and KDE</title>
		<link>http://www.harshj.com/2010/05/05/pomodoro-and-kde/</link>
		<comments>http://www.harshj.com/2010/05/05/pomodoro-and-kde/#comments</comments>
		<pubDate>Wed, 05 May 2010 09:52:54 +0000</pubDate>
		<dc:creator>Harsh</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[Pomodoro]]></category>
		<category><![CDATA[RSIBreak]]></category>
		<category><![CDATA[Timer]]></category>
		<category><![CDATA[Utilities]]></category>

		<guid isPermaLink="false">http://www.harshj.com/?p=876</guid>
		<description><![CDATA[Am no follower of the Pomodoro technique nor do I know its specifics but before you go ahead and try out those multiple Adobe AIR applications or use the GNOME-oriented Workrave, please try out this software called RSIBreak which was built for KDE specifically. It isn&#8217;t a full fledged timer feature but I think it [...]]]></description>
			<content:encoded><![CDATA[<p>Am no follower of the Pomodoro technique nor do I know its specifics but before you go ahead and try out those multiple Adobe AIR applications or use the GNOME-oriented <a title="Workrave - RSI software for GNOME" href="http://workrave.com" target="_blank">Workrave</a>, please try out this software called <strong><a title="RSIBreak - RSI Software for KDE" href="http://rsibreak.org" target="_blank">RSIBreak</a></strong> which was built for <strong>KDE</strong> specifically.<br />
<!--adsense--></p>
<div class="wp-caption aligncenter" style="width: 255px"><a href="http://rsibreak.org"><img class="  " title="RSIBreak - Repetitive Strain Injury prevention software for KDE" src="http://img263.imageshack.us/img263/2506/popup.png" alt="RSIBreak - Repetitive Strain Injury prevention software for KDE" width="245" height="73" /></a><p class="wp-caption-text">RSIBreak - Repetitive Strain Injury prevention software for KDE</p></div>
<p><!--adsense--><br />
It isn&#8217;t a full fledged timer feature but I think it will get your needs covered with its offerings easily enough. One of the amazing utilities I&#8217;ve used, built with KDE Libraries. It should be available in your Linux distribution&#8217;s software repository too.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.harshj.com/2010/05/05/pomodoro-and-kde/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PyQt &#8211; Creating interfaces visually with Designer</title>
		<link>http://www.harshj.com/2010/04/18/pyqt-creating-interfaces-visually-with-designer/</link>
		<comments>http://www.harshj.com/2010/04/18/pyqt-creating-interfaces-visually-with-designer/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 15:58:03 +0000</pubDate>
		<dc:creator>Harsh</dc:creator>
				<category><![CDATA[Computing Issues]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[PyQt]]></category>
		<category><![CDATA[PyQt Python Programming Tutorial Designer]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://www.harshj.com/?p=662</guid>
		<description><![CDATA[Note: If you&#8217;re new to using PyQt but are interested in great cross-platform GUI application development please read the PyQt Introduction article. Designing a graphical interface for an application could be a tiresome task. There are guidelines to keep track of, layouts to maintain and more of such stuff. In the PyQt code samples you&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><em><strong>Note:</strong> If you&#8217;re new to using PyQt but are interested in great cross-platform GUI application development please read the </em><a title="Introduction to PyQt and Nokia's Qt4" href="http://www.harshj.com/2009/04/26/the-pyqt-intro/" target="_self"><em>PyQt Introduction</em></a><em> article.</em></p></blockquote>
<p>Designing a graphical interface for an application could be a tiresome task. There are guidelines to keep track of, layouts to maintain and more of such stuff. In the PyQt code samples you&#8217;ve seen so far we&#8217;ve written our interfaces in pure code. While this is fun and easy to do for little applications that consist of about 5 to 10 widgets, it&#8217;s not worth spending the time upon in creating fully blown up interfaces for complete applications.</p>
<h1>The Qt Designer</h1>
<p>Fortunately, Qt provides us a tool to design interfaces and to port it to usable code automatically. This tool is called the Qt Designer, and it comes with the Qt library bundle you installed. Additionally we would require a converter for processing the XML .ui files Designer produces into a python module .py file; also installed with the PyQt4 bundle.</p>
<p>Thus, to design in PyQt we need the two following tools:</p>
<ul>
<li><strong>Qt Designer</strong> from Nokia&#8217;s Qt Software</li>
<li>The <strong>pyuic4</strong> script from Riverbank&#8217;s PyQt</li>
</ul>
<p>Once you have Designer and PyQt4 tools installed, let&#8217;s fire it up and get started.</p>
<p>The initial interface might look familiar to those who have used Visual Studio, or Glade and such tools. For the rest, it&#8217;s intuitive enough to learn smoothly. Read the <a title="Qt Designer Tutorial and Guide" href="http://qt.nokia.com/doc/latest/qt4-designer.html" target="_blank">Qt Designer guide</a> for more elaborate help if you still don&#8217;t find it usable.</p>
<div class="wp-caption aligncenter" style="width: 497px"><a href="http://pyqt.files.wordpress.com/2010/04/qt-designer-window.png"><img class=" " title="The Qt Designer" src="http://pyqt.files.wordpress.com/2010/04/qt-designer-window.png" alt="The Qt Designer" width="487" height="132" /></a><p class="wp-caption-text">The Qt Designer</p></div>
<p>In this article, we&#8217;ll be using Designer to design and create a simple <strong>Image Viewer application</strong>.</p>
<p>References: <a title="Qt Designer Documentation at Nokia" href="http://qt.nokia.com/doc/latest/qt4-designer.html" target="_blank">Qt Designer</a>, <a title="Using Qt Designer with PythonQt4" href="http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html#using-qt-designer" target="_blank">The PyQt + Qt Designer Documentation</a></p>
<h2>Image Viewer</h2>
<p>Our Image Viewer application would be a very simple one, with options to Open an image file of major types (JPEG, PNG, GIF, etc.) and another to Quit. Upon opening of an image, we shall also set the status bar to show the dimensions of the image.<br />
<!--adsense--></p>
<h3>Designing the GUI</h3>
<p>Open <strong>Qt Designer</strong> (&#8216;designer&#8217; command if on Linux) and choose File | New | &#8220;Main Window&#8221; under templates/forms expansion. This creates a new <strong>QMainWindow</strong> widget for us to work upon. The <em>QMainWindow</em> is basically a composition of a main-area widget, a menu-bar and a status-bar at the bottom, the very usual stuff an application consists of.</p>
<div class="wp-caption aligncenter" style="width: 399px"><img title="Design of the Image Viewer UI" src="http://pyqt.files.wordpress.com/2010/04/image-viewer-in-designer.png" alt="Design of the Image Viewer UI" width="389" height="331" /><p class="wp-caption-text">Design of the Image Viewer UI</p></div>
<p>From the Widget Box, drag a Label onto the main window&#8217;s area. Right-Click at any of the free space available on the same area, choose the &#8220;Lay out&#8221; sub-menu and then hit the &#8220;Lay out Horizontally&#8221; option. Designer will automatically stretch your Label across the area available this way. We need this layout (any layout will do here, actually) since we want the image to show in the entire window area.</p>
<p>Now on to menus, Add a File menu and under it add an Open and a Quit option, as shown below. To add these just click where it says &#8220;Type here&#8221; and get typing; Hit Enter/Return key to get to the next element in the menu after you&#8217;ve typed.</p>
<p>Under the Property Editor, select and set the Label&#8217;s <strong>text</strong> property to blank, and its <strong>alignment</strong> property to <strong>AlignHCenter and AlignVCenter</strong>. This completes our UI design in Qt Designer. But don&#8217;t quit already, do explore the other properties of the widgets used and figure out their possible uses; get used to the interface and available tools like Form Previews, etc.</p>
<div class="wp-caption aligncenter" style="width: 317px"><img title="The imageLabel (QLabel) object Properties" src="http://pyqt.files.wordpress.com/2010/04/image-viewer-label-properties.png" alt="The imageLabel (QLabel) object Properties" width="307" height="218" /><p class="wp-caption-text">The imageLabel (QLabel) object Properties</p></div>
<p>For instance, check out the properties like <strong>geometry</strong> (Height and Width), <strong>font</strong>, <strong>tooltip</strong>, etc. If you&#8217;re in a good reading mood, also checkout the amazing <a title="Qt Style Sheets" href="http://qt.nokia.com/doc/latest/stylesheet-reference.html" target="_blank">Style Sheet documentation</a> in Qt Assistant, as it explains a lot about each Widget&#8217;s construct and how to go about customizing it till your heart&#8217;s content.</p>
<p>Finally, renaming the widget elements&#8217; variables would be a good idea, since it will help us code our application in a much more readable manner. This is how I&#8217;ve named these widgets but feel free to follow whatever naming conventions you would like to use:</p>
<div class="wp-caption aligncenter" style="width: 316px"><img title="Image Viewer object names" src="http://pyqt.files.wordpress.com/2010/04/image-viewer-object-names.png" alt="Image Viewer object names" width="306" height="192" /><p class="wp-caption-text">Image Viewer object names</p></div>
<p>Just double-click on the Object Name items and edit them in-line after that. Note and remember your <strong>QMainWindow</strong> class&#8217;s object name. Once you&#8217;re done, save the file as &#8216;<strong><em>ImageViewerUI.ui</em></strong>&#8216;.</p>
<p>References: <a title="QLabel Class Reference" href="http://qt.nokia.com/doc/latest/qlabel.html" target="_blank">QLabel</a>, <a title="QAction Class Reference" href="http://qt.nokia.com/doc/latest/qaction.html" target="_blank">QAction</a>, <a title="QMenuBar Class Reference" href="http://qt.nokia.com/doc/latest/qmenubar.html" target="_blank">QMenuBar</a>, <a title="Using Layouts in Qt Designer - A Guide" href="http://qt.nokia.com/doc/latest/designer-layouts.html" target="_blank">Layouts Guide</a></p>
<h3>Using PyQt&#8217;s pyuic4 script</h3>
<p>Our next step requires the use of the aforementioned pyuic4 tool. It&#8217;s usage syntax is as follows:</p>
<pre class="brush: bash;">pyuic4 input_file.ui -o output_file.py
# Optionally takes -x parameter to make the generated code executable.</pre>
<p>Thus we should run, for our UI file:</p>
<pre class="brush: bash;">pyuic4 ImageViewerUI.ui -o ImageViewerUI.py</pre>
<p>This will create a file <strong>ImageViewerUI.py</strong> that we can now use. Looking into the file will show you that its just a long list of widget constructs and of applying property settings. There is no need to edit this file, and is advised not to since pyuic4 will over-write all changes in it if you run it once again after some changes you wanted to do.</p>
<p>Whenever you edit your .ui files, make sure to run the pyuic4 tool to convert it into its Python equivalent (or to update existing Python code such that it reflects the new changes).</p>
<p>Additional info: Try `<strong>pyuic4 &#8211;help</strong>` for more fine-tuning options.</p>
<h3>Running the basic GUI</h3>
<p>Create a new file <strong>ImageViewer.py</strong> to finally add the application logic. Before we get to the code part, let me explain how the Qt&#8217;s subclass approach works. A Qt Designer file is inherited by the QMainWindow-derived class, and then the interface is setup using the <strong>setupUi()</strong> call with an instance. This creates all the objects/widgets for the interface as attributes of the derived QMainWindow class so that it&#8217;s ready to show. Next, we need to add the application-level logic to this derived class as normal methods. Since we have access to all the widgets used in the interface via our class, we can do as we like with their available features. The following diagram explains the hierarchy we ought to follow each time we need to implement a UI class for use:</p>
<div class="wp-caption aligncenter" style="width: 277px"><img title="Image Viewer Inheritance Diagram" src="http://pyqt.files.wordpress.com/2010/04/imageviewerinheritance.png" alt="Image Viewer Inheritance Diagram" width="267" height="166" /><p class="wp-caption-text">Image Viewer Inheritance Diagram</p></div>
<p>Thus, a basic class that can be run would look like:</p>
<pre class="brush: python;">
#!/usr/bin/python

from PyQt4 import QtGui, QtCore
import sys

# Import the interface class
import ImageViewerUI

class ImageViewer(QtGui.QMainWindow, ImageViewerUI.Ui_mainWindow):
    &quot;&quot;&quot; The second parent must be 'Ui_&lt;obj. name of main widget class&gt;'.
        If confusing, simply open up ImageViewer.py and get the class
        name used. I'd named mine as mainWindow, hence Ui_mainWindow. &quot;&quot;&quot;

    def __init__(self, parent=None):
        super(ImageViewer, self).__init__(parent)
        # This is because Python does not automatically
        # call the parent's constructor.
        self.setupUi(self)
        # Pass this &quot;self&quot; for building widgets and
        # keeping a reference.

    def main(self):
        self.show()

if __name__=='__main__':
    app = QtGui.QApplication(sys.argv)
    imageViewer = ImageViewer()
    imageViewer.main()
    app.exec_()
    # This shows the interface we just created. No logic has been added, yet.</pre>
<p>Run this class and you can see the window you just created.</p>
<div class="wp-caption aligncenter" style="width: 376px"><img title="Basic GUI of Image Viewer during Runtime" src="http://pyqt.files.wordpress.com/2010/04/image-viewer-ui.png" alt="Basic GUI of Image Viewer during Runtime" width="366" height="341" /><p class="wp-caption-text">Basic GUI of Image Viewer during Runtime</p></div>
<p>You MUST call <strong>self.setupUi(self)</strong> to make the UI file run the setup statements and build the GUI interface for use by our class.</p>
<p>References: <a title="QMainWindow Class Reference" href="http://qt.nokia.com/doc/latest/qmainwindow.html" target="_blank">QMainWindow</a><br />
<!--adsense--></p>
<h3>Adding Application Logic and other Code</h3>
<p>Now to add the opening-an-image feature, let&#8217;s define a few methods in the class as:</p>
<pre class="brush: python; highlight: [22,24,25,30,34,37,38,39,40,41,42,45,46];">
#!/usr/bin/python
# -*- coding: utf-8 -*-

from PyQt4 import QtGui, QtCore
import sys

# Import the interface class
import ImageViewerUI

class ImageViewer(QtGui.QMainWindow, ImageViewerUI.Ui_mainWindow):
    &quot;&quot;&quot; The second parent must be Ui_&lt;obj. name of main widget class&gt;. \
      If confusing, simply open up ImageViewer.py and get the class \
      name used. I'd named mine as mainWindow and hence the use. &quot;&quot;&quot;

    def __init__(self, parent=None):
        super(ImageViewer, self).__init__(parent)
        # This is because Python does not automatically
        # call the parent's constructor.
        self.setupUi(self)
        # Pass this &quot;self&quot; for building widgets and
        # keeping a reference.
        self.connectActions()

    def connectActions(self):
        self.actionQuit.triggered.connect(QtGui.qApp.quit)
        # Connect the Quit action's triggered signal
        # to a proper Quit method
        # given by qApp (which points to your QApplication
        # object).
        self.actionOpen.triggered.connect(self.openImage)
        # Connect the Open action's triggered signal
        # to load an image onto the image label.

    def openImage(self):
        # Lets get a user-provided file to open
        # using PyQt's QFileDialog class.
        fileName = QtGui.QFileDialog.getOpenFileName(
                        self,
                        &quot;Open Image File&quot;,
                        QtCore.QDir.homePath(),
                        &quot;Image Files (*.jpg *.jpeg *.gif *.png)&quot;
                    )
        # Don't attempt to open if open dialog
        # was cancelled away.
        if fileName:
            self.imageLabel.setPixmap(QtGui.QPixmap(fileName))
            # Load the image file as a pixmap onto the
            # labelImage QLabel GUI object.

    def main(self):
        self.show()

if __name__=='__main__':
    app = QtGui.QApplication(sys.argv)
    imageViewer = ImageViewer()
    imageViewer.main()
    app.exec_()
</pre>
<p>Note the two new method additions <strong>connectActions()</strong> and <strong>openImage()</strong>. They complete the application logic that&#8217;s involved for our image viewing application example. Try to understand them better by seeing the PyQt classes used in them and referring them up in Qt Assistant for much more detailed information.</p>
<p>Now the application can open images via <strong>File | Open</strong> and can also be quit via <strong>File | Quit</strong>.</p>
<p>This is the final result of our work:</p>
<div class="wp-caption aligncenter" style="width: 276px"><img title="Image Viewer in Action" src="http://pyqt.files.wordpress.com/2010/04/image-viewer-in-action.png" alt="Image Viewer in Action" width="266" height="238" /><p class="wp-caption-text">Image Viewer in Action</p></div>
<p>References: <a title="QPixmap Class Reference" href="http://qt.nokia.com/doc/latest/qpixmap.html" target="_blank">QPixmap</a>, <a title="QFileDialog Class Reference" href="http://qt.nokia.com/doc/latest/qfiledialog.html" target="_blank">QFileDialog</a>, <a title="qApp Macro Documentation" href="http://qt.nokia.com/doc/4.6/qapplication.html#qApp" target="_blank">qApp</a></p>
<h2>Exercise</h2>
<p>Try to build a simple text-based evaluator application that contains of two things:</p>
<ul>
<li>A text input box that allows for mathematical expressions input.</li>
<li>An output label or text area (non-editable) for showing results of these expressions.</li>
</ul>
<p>Classes you could use are <a title="QLabel Class Reference" href="http://qt.nokia.com/doc/latest/qlabel.html" target="_blank">QLabel</a>, <a title="QLineEdit Class Reference" href="http://qt.nokia.com/doc/latest/qlineedit.html" target="_blank">QLineEdit</a> and <a title="QTextArea Class Reference" href="http://qt.nokia.com/doc/latest/qtextedit.html" target="_blank">QTextEdit</a>. Another hint is to use Python&#8217;s &#8216;<a title="Python's eval - built-in function (evaluator of expressions and code)" href="http://docs.python.org/library/functions.html#eval" target="_blank">eval</a>&#8216; function. As a bonus try to make the evaluation via Python safe.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.harshj.com/2010/04/18/pyqt-creating-interfaces-visually-with-designer/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>KDE and the .gtkrc</title>
		<link>http://www.harshj.com/2010/04/17/kde-and-the-gtkrc/</link>
		<comments>http://www.harshj.com/2010/04/17/kde-and-the-gtkrc/#comments</comments>
		<pubDate>Sat, 17 Apr 2010 11:11:34 +0000</pubDate>
		<dc:creator>Harsh</dc:creator>
				<category><![CDATA[Computing Issues]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[.gtkrc]]></category>
		<category><![CDATA[Customization]]></category>
		<category><![CDATA[KDE4]]></category>
		<category><![CDATA[QtCurve]]></category>
		<category><![CDATA[theme]]></category>

		<guid isPermaLink="false">http://www.harshj.com/?p=841</guid>
		<description><![CDATA[In my quest to have a perfectly usable dark theme I found I would require two things: The QtCurve Style for KDE Applications The darkPearl QtCurve theme for QtCurve and its KDE Color Scheme Having acquired those, I went on to install and select them via System Settings&#8217;s Appearance applet and all my Qt4+KDE4 applications [...]]]></description>
			<content:encoded><![CDATA[<p>In my quest to have a perfectly usable dark theme I found I would require two things:</p>
<ul>
<li>The <a title="QtCurve for GTK, KDE3 and KDE4" href="http://kde-look.org/content/show.php?content=40492" target="_blank">QtCurve Style</a> for KDE Applications</li>
<li>The <a title="darkPearl - A great dark theme for KDE4/QtCurve" href="http://kde-look.org/content/show.php/darkPearl+for+QtCurve?content=97644" target="_blank">darkPearl QtCurve theme</a> for QtCurve and its KDE Color Scheme</li>
</ul>
<p><!--adsense--><br />
Having acquired those, I went on to install and select them via <em>System Settings&#8217;s Appearance</em> applet and all my Qt4+KDE4 applications looked neat in their dark avatars. Next I had to make <em>Chromium</em> reflect and respect the native theme settings and found an option for it to &#8220;<em>Use GTK Theme&#8221; under Settings &#8211; Options &#8211; Personal Stuff</em>.</p>
<p>However upon switching that on I realized that GTK themes were indeed showing the coloring of darkPearl right but not the <em>widget styling</em> that the darkPearl + QtCurve provide together, despite placing a proper QtCurve <strong>.gtkrc</strong> and its other known aliases at all key positions. Sometimes it&#8217;d work after doing the last action, but only for the current KDE session and it would all go back to simple-coloring hell post a re-logon.<br />
<!--adsense--><br />
The solution to this was apparently under <em>System Settings&#8217;s Appearance &#8211; Colors</em> applet itself. I&#8217;d missed an option under the <strong>Options</strong> tab of <em>Colors</em> that said &#8220;<strong>Apply color to non-KDE4 Applications</strong>&#8220;. Un-check this and the custom .gtkrc you place sticks like its supposed to. Chromium looks great now! So does GIMP, the second of the two GTK-using applications I use.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.harshj.com/2010/04/17/kde-and-the-gtkrc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UML Blues</title>
		<link>http://www.harshj.com/2010/03/29/uml-blues/</link>
		<comments>http://www.harshj.com/2010/03/29/uml-blues/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 17:04:26 +0000</pubDate>
		<dc:creator>Harsh</dc:creator>
				<category><![CDATA[Computing Issues]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Diagrams]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Umbrello]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[Violet]]></category>

		<guid isPermaLink="false">http://www.harshj.com/?p=829</guid>
		<description><![CDATA[Turn those blues to violet using Violet Violet was the UML modelling tool I had to use to save me some fun-later-time and make the whole process quick and painless. It also supports exporting to an image format and all in all it is a lovable, simple and just-works tool. But do note that it [...]]]></description>
			<content:encoded><![CDATA[<p>Turn those blues to violet using <a title="Violet UML Editor" href="http://alexdp.free.fr/violetumleditor/page.php" target="_blank">Violet</a> <img src='http://www.harshj.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Violet</strong> was the UML modelling tool I had to use to save me some fun-later-time and make the whole process quick and painless. It also supports exporting to an image format and all in all it is a lovable, simple and <em>just-works</em> tool. But do note that it uses Java to do all that magic.</p>
<p>The other alternative I had was <a title="Umbrello UML Modeller" href="http://uml.sourceforge.net/" target="_blank">Umbrello</a> which sadly isn&#8217;t in a very usable state yet. Perhaps this summer its GSoC fix may make it better. Wish I knew enough of QGraphicsView stuff to try it myself <img src='http://www.harshj.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.harshj.com/2010/03/29/uml-blues/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Using the BSNL 3G Data Card on Linux</title>
		<link>http://www.harshj.com/2010/03/22/using-the-bsnl-3g-data-card-on-linux/</link>
		<comments>http://www.harshj.com/2010/03/22/using-the-bsnl-3g-data-card-on-linux/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 04:19:07 +0000</pubDate>
		<dc:creator>Harsh</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[3G]]></category>
		<category><![CDATA[BSNL]]></category>
		<category><![CDATA[BSNL Broadband]]></category>
		<category><![CDATA[Chennai]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Wireless]]></category>
		<category><![CDATA[wvdial]]></category>

		<guid isPermaLink="false">http://www.harshj.com/?p=819</guid>
		<description><![CDATA[This article shall detail the steps to setup, configure and begin using the Huawei E156 HSDPA (3G) USB Stick on Linux (fondly called by them BSNL employees as a &#8216;Data Card&#8217;). On Windows, one generally uses the bundled &#8216;Huawei Mobile Partner&#8217; software which does wonderful things like read messages, compute statistics, etc. There isn&#8217;t a [...]]]></description>
			<content:encoded><![CDATA[<p>This article shall detail the steps to setup, configure and begin using the Huawei E156 HSDPA (3G) USB Stick on Linux (fondly called by them BSNL employees as a &#8216;Data Card&#8217;).</p>
<p>On Windows, one generally uses the bundled &#8216;Huawei Mobile Partner&#8217; software which does wonderful things like read messages, compute statistics, etc. There isn&#8217;t a similar software on Linux providing all of those under one roof, however.</p>
<p><!--adsense--></p>
<p>First off, you need to create a BSNL 3G dialer profile, and you would require a software known as <strong>wvdial</strong>. Install it by either of these commands, in the Terminal application:</p>
<pre class="brush: bash;"># On Ubuntu
sudo aptitude install wvdial

# On ArchLinux
sudo pacman -S wvdial</pre>
<p>Now as root (or using sudo), open the file: /etc/wvdial.conf</p>
<pre class="brush: bash;"># If you use GNOME, try:
sudo gedit /etc/wvdial.conf

# If on KDE, try:
sudo kwrite /etc/wvdial.conf</pre>
<p>Paste into your editor, the following lines:</p>
<pre class="brush: plain; highlight: [10];">
[Dialer bsnlnet]
Modem Type = Analog Modem
Phone = *99#
ISDN = 0
Baud = 460800
Username = &quot; &quot;
Password = &quot; &quot;
Modem = /dev/ttyUSB0
Init1 = ATZ
Init2 = at+cgdcont=1,&quot;ip&quot;,&quot;bsnlnet&quot;
Stupid Mode = 1
</pre>
<p><!--adsense--></p>
<p>Save the changes and close the editor. Now to get connected, you have to ask the wvdial command to start a particular connection. So simply do, on each startup:</p>
<pre class="brush: bash;">wvdial bsnlnet</pre>
<p>And lo, you&#8217;re online with blazing 3G speeds!</p>
<p><strong>Note</strong>: You may be supposed to use a different APN like <strong>bsnlsouth</strong> sometimes (instead of bsnlnet or etc.), so change that in the highlighted line.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.harshj.com/2010/03/22/using-the-bsnl-3g-data-card-on-linux/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>BitlBee and Google Apps</title>
		<link>http://www.harshj.com/2010/02/09/bitlbee-and-google-apps/</link>
		<comments>http://www.harshj.com/2010/02/09/bitlbee-and-google-apps/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 05:23:15 +0000</pubDate>
		<dc:creator>Harsh</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[BitlBee]]></category>
		<category><![CDATA[Gmail]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Apps]]></category>

		<guid isPermaLink="false">http://www.harshj.com/?p=801</guid>
		<description><![CDATA[Well, since I couldn&#8217;t fix a particular bug myself and the other developers think all is working well with Yahoo under KDE&#8217;s Kopete software, I had to switch over to the second best way to connect to IM networks &#8211; BitlBee via Konversation. This post is merely a note to self for adding Jabber accounts [...]]]></description>
			<content:encoded><![CDATA[<p>Well, since I couldn&#8217;t fix a <a href="https://bugs.kde.org/show_bug.cgi?id=200945">particular bug</a> myself and the other developers think all is working well with Yahoo under KDE&#8217;s Kopete software, I had to switch over to the second best way to connect to IM networks &#8211; <a href="http://bitlbee.org">BitlBee</a> via <a href="http://konversation.kde.org/">Konversation</a>. This post is merely a note to self for adding Jabber accounts for GMail and Google Apps Mail accounts in BitlBee, once setup.</p>
<p><!--adsense--><!--adsense--></p>
<p>To add GMail is easy, using the Jabber protocol:</p>
<pre class="brush: bash;">account add jabber username@gmail.com password</pre>
<p>To add Google Apps Mail needs one more step:</p>
<pre class="brush: bash;">account add jabber username@domain.tld password
account set 0/server talk.google.com
# You may want to replace '0' with your account number via 'account list'</pre>
<p><em>account on</em> and have fun with your now-more-powerful IRC Client.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.harshj.com/2010/02/09/bitlbee-and-google-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google&#8217;s Public DNS</title>
		<link>http://www.harshj.com/2010/01/01/googles-public-dns/</link>
		<comments>http://www.harshj.com/2010/01/01/googles-public-dns/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 16:32:15 +0000</pubDate>
		<dc:creator>Harsh</dc:creator>
				<category><![CDATA[Computing Issues]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[OpenDNS]]></category>
		<category><![CDATA[Public DNS]]></category>

		<guid isPermaLink="false">http://www.harshj.com/?p=775</guid>
		<description><![CDATA[Been a while since Google launched its Public DNS service and having used it for that long, I felt it was very unreliable. I had issues opening websites that had a lot of external items in it, and the most frustrating experience was with BBC UK&#8217;s site whose newsimg sub-server failed to resolve when using [...]]]></description>
			<content:encoded><![CDATA[<p>Been a while since Google launched its <a href="http://code.google.com/speed/public-dns/">Public DNS</a> service and having used it for that long, I felt it was very unreliable. I had issues opening websites that had a lot of external items in it, and the most frustrating experience was with BBC UK&#8217;s site whose <em>newsimg</em> sub-server failed to resolve when using their DNS &#8211; I do much news reading on BBC during my random bursts of surfing.</p>
<div class="mceTemp mceIEcenter">
<dl class="wp-caption aligncenter" style="width: 141px;">
<dt class="wp-caption-dt"><a href="http://code.google.com/speed/public-dns" target="_blank"><img class=" " title="Speedometer" src="http://code.google.com/speed/public-dns/images/adwords_features_v2_l.gif" alt="Speedometer, as found on Google's Public DNS Homepage" width="131" height="60" /></a></dt>
</dl>
</div>
<p>However, I noted that these failures in resolving (or could be something else) were very odd, happening even <em>after</em> I&#8217;d successfully opened a web page. Switching to my former DNS, <a href="http://www.opendns.com">OpenDNS</a>, makes all the issues go away, making me certain about the fault lying within Google&#8217;s service. I&#8217;m continuing to use OpenDNS here-on, until a good news article about the other trickles down my feed reader someday.<br />
<!--adsense--><!--adsense--><br />
I leave it to my lurking readers to identify an oddity in the speedometer image used on Google&#8217;s DNS page.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.harshj.com/2010/01/01/googles-public-dns/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>One page to last you a whole winter</title>
		<link>http://www.harshj.com/2009/12/21/one-page-to-last-you-a-whole-winter/</link>
		<comments>http://www.harshj.com/2009/12/21/one-page-to-last-you-a-whole-winter/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 04:26:20 +0000</pubDate>
		<dc:creator>Harsh</dc:creator>
				<category><![CDATA[Computing Issues]]></category>
		<category><![CDATA[Fun]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Multitouch]]></category>
		<category><![CDATA[New Releases]]></category>
		<category><![CDATA[TUIO]]></category>

		<guid isPermaLink="false">http://www.harshj.com/?p=747</guid>
		<description><![CDATA[The TUIO specification is absolutely amazing. You can never get tired of working with the variety of software found on their page, its almost overwhelming! If you&#8217;re bored of your single-point input already, do check these MT stuff out. Ignore if am too late and the train has already left]]></description>
			<content:encoded><![CDATA[<p>The <abbr title="Tangible User Interface Objects">TUIO</abbr> specification is absolutely amazing. You can never get tired of working with the variety of software found on <a href="http://www.tuio.org/?software">their page</a>, its almost overwhelming!</p>
<p>If you&#8217;re bored of your single-point input already, do check these MT stuff out. Ignore if am too late and the train has already left <img src='http://www.harshj.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.harshj.com/2009/12/21/one-page-to-last-you-a-whole-winter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scratching my itch</title>
		<link>http://www.harshj.com/2009/12/08/scratching-my-itch/</link>
		<comments>http://www.harshj.com/2009/12/08/scratching-my-itch/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 18:34:54 +0000</pubDate>
		<dc:creator>Harsh</dc:creator>
				<category><![CDATA[Computing Issues]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Bugs]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[Contribution]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[KDE 4.4]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.harshj.com/?p=738</guid>
		<description><![CDATA[If you like open source software, you end up doing that someday sooner or later &#8211; you scratch your itch and make a contribution. That&#8217;s how it rolls. Well unless you&#8217;re sponsored to do so, of course. I did the same for KDE, having had an on/off relationship with it since 3.x, and finally settling [...]]]></description>
			<content:encoded><![CDATA[<p>If you like open source software, you end up doing that someday sooner or later &#8211; you scratch your itch and make a contribution. That&#8217;s how it rolls. Well unless you&#8217;re <em>sponsored</em> to do so, of course.</p>
<p>I did the same for KDE, having had an on/off relationship with it since 3.x, and finally settling onto 4.3, I managed to get into writing code for it. Although not a fan of the entire desktop, it is what I use on a daily basis and I do feel the lack of a few things sometimes. There&#8217;s already too much to customize; and am sure I don&#8217;t know the half of it yet.</p>
<p><!--adsense--></p>
<p>I read a lot of comic books in my free time, on the PC. While I do have my collections named and arranged neatly, it has always been hard finding a particular file since there were no previews of its covers on KDE 4. Since Okular, KDE&#8217;s magnificent all-in-one document reader, reads the files (.cbr, .cbz type) why not also preview it. That became my itch, my <em>want</em>. And I <a href="http://websvn.kde.org/trunk/KDE/kdebase/runtime/kioslave/thumbnail/comiccreator.cpp?view=markup">scratched it</a> with copious amounts of help provided by its development community. However, I&#8217;d be glad if some artist came along and gave the format an Oxygen-style icon as well &#8211; since it still lacks one.</p>
<p>In KDE 4.4, you will have <a title="Comic Book Thumbnails KDE 4" href="http://kde-look.org/content/show.php/ComicBook+Thumbnail+Plugin?content=114266" target="_blank">comic book previews</a> which would show you the comic book covers in its file manager&#8217;s preview mode. This should make your life easier. However, for .cbr thumbnails to work, you&#8217;d need the <strong>non-free version of unrar</strong> cause the free ones don&#8217;t do version 3+ files well. It isn&#8217;t a hard dependency, and .cbz ZIP files would work just fine without unrar. I&#8217;d also written support for .cbt, but it&#8217;d have to wait until KDE 4.5 cause of their &#8216;feature freeze&#8217;.</p>
<p>Since I made it this far, I also fixed certain minor annoyances &#8211; some reported by other people as well. A small list:</p>
<ul>
<li><a href="https://bugs.kde.org/show_bug.cgi?id=194979">Move spelling suggestions to top level menu</a></li>
<li><a href="https://bugs.kde.org/show_bug.cgi?id=152149">Add timezone data to KRFB while sending desktop invites</a></li>
<li><a href="https://bugs.kde.org/show_bug.cgi?id=191309">Don&#8217;t show &#8216;add to places&#8217; in dolphin if item is already in there</a></li>
<li><a href="http://websvn.kde.org/?diff_format=h&amp;view=revision&amp;revision=1044770" target="_blank">Fix the new Kickoff menu for recent applications</a></li>
<li><a href="https://bugs.kde.org/show_bug.cgi?id=192873" target="_blank">Fix a minor annoyance with KMail&#8217;s Composer shortcuts</a></li>
</ul>
<p><!--adsense--></p>
<p>I&#8217;ll be more than glad to hammer more bugs, once the feature freeze melts. Go here to read about <a title="What's new in KDE 4.4" href="http://www.harshj.com/2009/11/18/kde-4-4-desktop-an-early-preview/" target="_blank">what&#8217;s new in KDE 4.4</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.harshj.com/2009/12/08/scratching-my-itch/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
