<?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>silentYak &#187; Software</title>
	<atom:link href="http://www.silentyak.com/tag/software/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.silentyak.com</link>
	<description>...a universal platform for global junk...</description>
	<lastBuildDate>Sun, 09 Oct 2011 07:19:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Money Ain’t Everything</title>
		<link>http://www.silentyak.com/2009/03/14/money-aint-everything/</link>
		<comments>http://www.silentyak.com/2009/03/14/money-aint-everything/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 07:01:57 +0000</pubDate>
		<dc:creator>RRI</dc:creator>
				<category><![CDATA[Daily Rant]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.silentyak.com/?p=734</guid>
		<description><![CDATA[Boy, Facebook sure knows how to make money. Taking advantage of the fact that people like to receive gifts, Facebook has this feature whereby anyone can send a ‘gift’ to any of their friends. A gift, it turns out, consists of a little icon with a personal message attached to it. And it costs real [...]]]></description>
			<content:encoded><![CDATA[<p>Boy, <a  href="http://www.facebook.com">Facebook</a> sure knows how to make money.</p>
<p>Taking advantage of the fact that people like to receive gifts, Facebook has this feature whereby anyone can send a ‘gift’ to any of their friends. A gift, it turns out, consists of a little icon with a personal message attached to it. And it costs real money to send one.</p>
<p>Ever had someone tell you that instead of buying you a gift for your birthday, they were giving it away as charity? That wasn’t…fun, was it? Now imagine that instead of <em>charity</em>, they gave it away to Facebook. Here is some cash Facebook, so that my dearest friend gets a silly little icon as a token of your appreciation. Lame.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.silentyak.com/2009/03/14/money-aint-everything/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Software Update Paradox</title>
		<link>http://www.silentyak.com/2009/03/13/the-software-update-paradox/</link>
		<comments>http://www.silentyak.com/2009/03/13/the-software-update-paradox/#comments</comments>
		<pubDate>Sat, 14 Mar 2009 04:55:07 +0000</pubDate>
		<dc:creator>RRI</dc:creator>
				<category><![CDATA[Daily Rant]]></category>
		<category><![CDATA[Gentoo]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.silentyak.com/?p=730</guid>
		<description><![CDATA[I like to keep my software up-to-date, so I sync it with the repository every day, and see if there’s anything that needs updating. And yet, I don’t like the fact that it takes time to perform the update, or that there is a chance that my stable system could be broken by the change, [...]]]></description>
			<content:encoded><![CDATA[<p>I like to keep my software up-to-date, so I sync it with the repository every day, and see if there’s anything that needs updating.</p>
<p>And yet, I don’t like the fact that it takes time to perform the update, or that there is a chance that my stable system could be broken by the change, or that a package may fail to build.</p>
<p>So I run the update command, hoping that there’s nothing new.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.silentyak.com/2009/03/13/the-software-update-paradox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>KDE 4.1: Now In Portage</title>
		<link>http://www.silentyak.com/2008/10/11/kde-41-now-in-portage/</link>
		<comments>http://www.silentyak.com/2008/10/11/kde-41-now-in-portage/#comments</comments>
		<pubDate>Sun, 12 Oct 2008 03:11:17 +0000</pubDate>
		<dc:creator>RRI</dc:creator>
				<category><![CDATA[Daily Rant]]></category>
		<category><![CDATA[Gentoo]]></category>
		<category><![CDATA[KDE 4.1]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Windows Vista]]></category>

		<guid isPermaLink="false">http://www.silentyak.com/?p=572</guid>
		<description><![CDATA[The wait is finally over. KDE 4.1 is now in the official portage repository, which means that Gentoo users can upgrade to it without having to unmask any packages or setting up an overlay. I upgraded to the new and shiny KDE 4.1 today for the first time. I could have easily gotten it from [...]]]></description>
			<content:encoded><![CDATA[<p>The wait is finally over. KDE 4.1 is now in the official portage repository, which means that Gentoo users can upgrade to it without having to unmask any packages or setting up an overlay.</p>
<p>I upgraded to the new and shiny KDE 4.1 today for the first time. I could have easily gotten it from an overlay a long time ago, but then I figured it was best to wait for it to mature. Like its predecessor (KDE 3.5), this version of KDE looks quite unpolished until you spend some time customizing it. For instance, I cannot fathom the reasons behind not enabling font anti-aliasing by default. Without this tweak, all fonts look jagged and ugly. KDE also seems to have taken the path of Microsoft’s Windows Vista in terms of its color scheme: gray and black seem to be the norm.</p>
<p>Overall, I am not too disappointed with the upgrade, but I realize now that I’m going to have to wait for future releases for many pieces of functionality that I used to love in KDE. This is one of the downsides of having software redesigned from scratch. For instance, Amarok 2 (still in beta) included in this version of KDE, is missing several key features, such as track-queuing and equalizer support. I just wish the KDE developers had focused on having a 4.1 release that was on par with 3.5.10 in terms of features, rather than worry about the details.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.silentyak.com/2008/10/11/kde-41-now-in-portage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Idempotence In System Architecture</title>
		<link>http://www.silentyak.com/2008/10/03/idempotence-in-system-architecture/</link>
		<comments>http://www.silentyak.com/2008/10/03/idempotence-in-system-architecture/#comments</comments>
		<pubDate>Fri, 03 Oct 2008 08:01:30 +0000</pubDate>
		<dc:creator>RRI</dc:creator>
				<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[FSM]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[System Architecture]]></category>

		<guid isPermaLink="false">http://www.silentyak.com/?p=483</guid>
		<description><![CDATA[A useful paradigm that should be considered when a stateful software system is to be designed is idempotence. Leaving aside its exact definition in mathematics and computer science, idempotence can be roughly described as a system characteristic whereby, calling an operation multiple times is equivalent to doing it exactly once. For instance, setting the value [...]]]></description>
			<content:encoded><![CDATA[<p>A useful paradigm that should be considered when a stateful software system is to be designed is <em>idempotence</em>. Leaving aside its exact definition in mathematics and computer science, idempotence can be roughly described as a system characteristic whereby, calling an operation multiple times is equivalent to doing it exactly once.</p>
<p>For instance, setting the value of a variable <em>X</em> is an idempotent operation, because setting its value to be <em>Y</em> several times has the same effect as setting it just once. On the other hand, <em>incrementing</em> its value is not an idempotent method because the result depends on the number of times the operation is called.</p>
<p><strong>Implementation</strong></p>
<p>Before delving into <em>why</em> you might want to have idempotence, let’s have a look at how it can be implemented. One way of doing it is like this:</p>
<p><em><strong>Design a state machine<br />
</strong></em></p>
<p>A <a  title="FSM" href="http://en.wikipedia.org/wiki/State_machine">state machine</a> identifies every unique state that the system can exist in, with a clear indication of which states the system can transition to from any given state, and under what conditions.</p>
<p><em><strong>Design a minimal API</strong></em></p>
<p>An <a  title="API" href="http://en.wikipedia.org/wiki/API">application programming interface</a> is the gateway for external systems to interact with the service. We start by designing a <em>minimal</em> API, identifying all the methods <em>that could change the state of the system</em>. It is best not to clutter the API with non-critical methods at this stage.</p>
<p>Expressed differently, an API method represents a single transition in the state diagram. For example, a system could have states such as <em>ReadyToPurchase</em> and <em>TaxAdded</em>. The <em>addTax()</em> method, if successful, provides the transition from the first state to the second. This method can never be applied a second time, because by then the system has already moved on to the next state.</p>
<p>An important restriction on the API is that if the state has some attributes, they must be maintained meticulously and checked against incoming requests. Suppose the <em>addTax()</em> method takes a parameter called <em>amount</em>. If the method is called again with the same <em>amount</em>, then the expected response is success, since the system is indeed in a state that the function call was <em>supposed</em> to move it to. However, if <em>amount</em> is different, then the response should be a failure, or at least some kind of partial failure — otherwise, the client will assume that the <em>new</em> tax amount had been added. A state should never change its internal attributes once they have been set.</p>
<p><em><strong>Transitions should be atomic</strong></em></p>
<p>It goes without saying that transitions need to be atomic, so that multiple requests do not corrupt the state <em>while the system is transitioning</em>. This can be achieved easily by acquiring a lock on a <a  title="Mutex" href="http://en.wikipedia.org/wiki/Mutex">mutex</a> at the start of a transition, and releasing it on completion.</p>
<p><strong>Why Idempotence?</strong></p>
<p>Naturally, it is a good idea to ask why we are putting in so much effort. While this may seem inordinately complex at first, you will soon discover that such a design actually <em>simplifies</em> the system tremendously when there is a great deal of concurrency. When there are a large number of processes or threads communicating with each other and the number of messages exchanged is huge, idempotence provides a guarantee of sorts about what the system can or cannot do. The state machine approach allows you to simply worry about the system in its current state, rather than the system as a whole. As a debugging technique, the developer simply needs to say, “<em>This</em> was the previous state A, and now it has moved into this new state B — what combination of parameters caused such a transition?” Idempotence makes this approach even more robust, ensuring that the system works in the face of message duplication and errors.</p>
<p>This robustness also allows the design to sacrifice a reliable communication layer in exchange for speed. For example, TCP (which has a larger overhead) can be replaced with UDP, since the application is resilient to message loss and duplication.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.silentyak.com/2008/10/03/idempotence-in-system-architecture/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

