<?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>Texttheater &#187; Technik</title>
	<atom:link href="http://texttheater.net/category/technik/feed" rel="self" type="application/rss+xml" />
	<link>http://texttheater.net</link>
	<description>Die kleinste Bühne der Blogosphäre</description>
	<lastBuildDate>Sun, 13 May 2012 11:21:07 +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>Palindrome</title>
		<link>http://texttheater.net/palindrome</link>
		<comments>http://texttheater.net/palindrome#comments</comments>
		<pubDate>Wed, 25 Apr 2012 22:20:56 +0000</pubDate>
		<dc:creator>Kilian Evang</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Technik]]></category>

		<guid isPermaLink="false">http://texttheater.net/?p=3190</guid>
		<description><![CDATA[I’m beginning to teach myself Haskell, because we all have to. I started doing the 99 Haskell problems and came across a beautifully cunning solution to problem 6, “Find out whether a list is a palindrome.” Let’s first look at &#8230; <a href="http://texttheater.net/palindrome">Weiterlesen <span class="meta-nav">&#8594;</span></a>
No related posts.]]></description>
			<content:encoded><![CDATA[<p>I’m beginning to teach myself Haskell, because <a href="http://fpcomplete.com/the-downfall-of-imperative-programming/">we all have to</a>. I started doing the <a href="http://www.haskell.org/haskellwiki/99_questions/1_to_10">99 Haskell problems</a> and came across a beautifully cunning solution to problem 6, “Find out whether a list is a palindrome.” Let’s first look at the classic solution, which is maximally declarative. I use Prolog here to formulate it:</p>
<pre>palindrome(X) :-
  reverse(X,X).</pre>
<p>It reverses the list, then checks if the result is the same as the original (that&#8217;s the definition of a palindrome). It checks that by going through both lists and comparing elements at corresponding positions.</p>
<p>What&#8217;s ugly about this is that this is at least twice as many comparisons as needed. Since we know one list is the reverse of the other, it suffices to compare the first half of one to the last half of the other. (In lists of odd length, the center element does not to be compared at all, since it is always identical to itself.)</p>
<p>Alternatively, we could just traverse the list to check, carrying along a reversed version of what we have traversed so far, stop in the middle and then compare the reversed first half to the remainder (i.e. to the last half). The problem is: where to stop? We don&#8217;t know the length of the list until we have traversed the whole of it, hence we also don’t know what half is length is.</p>
<p>Enter the intriguing solution that was given on the Haskell Wiki, humbly titled <a href=http://www.haskell.org/haskellwiki/99_questions/Solutions/6">“Here&#8217;s one that does half as many compares”</a>, and that gave me a very nice lightbulb moment when I had gotten my head around it. Here&#8217;s my Prolog translation:</p>
<pre>palindrome(List) :-
  palindrome(List,[],List).

palindrome([First|Rest],Rev,[_,_|Rest2]) :-
  palindrome(Rest,[First|Rev],Rest2).
palindrome([_|Rev],Rev,[_]).
palindrome(Rev,Rev,[]).</pre>
<p>The trick is to carry along a second copy of the original list, popping <i>two</i> elements from it every time we pop <i>one</i> from the main copy. This way, when we reach the end of the second copy, we know we have reached the center of the first. There&#8217;s two recursion-ending clauses, one for odd-length and one for even-length lists. Ingenious!</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://texttheater.net/palindrome/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Technischer Rückschritt</title>
		<link>http://texttheater.net/technischer-rueckschritt</link>
		<comments>http://texttheater.net/technischer-rueckschritt#comments</comments>
		<pubDate>Sat, 28 Jan 2012 21:10:39 +0000</pubDate>
		<dc:creator>Kilian Evang</dc:creator>
				<category><![CDATA[Technik]]></category>
		<category><![CDATA[Welt]]></category>

		<guid isPermaLink="false">http://texttheater.net/?p=3133</guid>
		<description><![CDATA[Wehmütig blicke ich auf manche technische Errungenschaft vergangener Jahrzehnte zurück, die die Menschheit inzwischen schon lange verloren hat und vielleicht nie wieder zurückerlangen wird. Da ist zum Beispiel die Möglichkeit, am Anrufbeantworter (heute: Voicemail) einzustellen, wie oft er es klingeln &#8230; <a href="http://texttheater.net/technischer-rueckschritt">Weiterlesen <span class="meta-nav">&#8594;</span></a>
No related posts.]]></description>
			<content:encoded><![CDATA[<p>Wehmütig blicke ich auf manche technische Errungenschaft vergangener Jahrzehnte zurück, die die Menschheit inzwischen schon lange verloren hat und vielleicht nie wieder zurückerlangen wird. Da ist zum Beispiel die Möglichkeit, am Anrufbeantworter (heute: Voicemail) einzustellen, wie oft er es klingeln lässt, bevor er drangeht. Oder Audiodatenträger (bzw. Abspielvorrichtungen dafür), die sich über beliebig lange Hörpausen hinweg die Abspielposition merken. Vorbei, vorbei.</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://texttheater.net/technischer-rueckschritt/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Programming Tweets of 2011</title>
		<link>http://texttheater.net/programming-tweets-of-2011</link>
		<comments>http://texttheater.net/programming-tweets-of-2011#comments</comments>
		<pubDate>Wed, 28 Dec 2011 09:00:59 +0000</pubDate>
		<dc:creator>Kilian Evang</dc:creator>
				<category><![CDATA[Gezwitscher]]></category>
		<category><![CDATA[Technik]]></category>
		<category><![CDATA[Werk]]></category>

		<guid isPermaLink="false">http://texttheater.net/?p=3066</guid>
		<description><![CDATA[February The new Twitter takes the “eventually consistent” principle of NoSQL very seriously: the data displayed is consistent on Judgement Day. March “We cannot predict whether such a query will timeout every time. This will be learned heuristically between keyboard &#8230; <a href="http://texttheater.net/programming-tweets-of-2011">Weiterlesen <span class="meta-nav">&#8594;</span></a>
Related posts:<ol>
<li><a href='http://texttheater.net/translating-with-semantic-representations' rel='bookmark' title='Translating with Semantic Representations'>Translating with Semantic Representations</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<h3><a href="http://texttheater.net/tweetnest/2011/02">February</a></h3>
<ul>
<li>The new Twitter takes the “eventually consistent” principle of NoSQL very seriously: the data displayed is consistent on Judgement Day.</li>
</ul>
<h3><a href="http://texttheater.net/tweetnest/2011/03">March</a></h3>
<ul>
<li>“We cannot predict whether such a query will timeout every time. This will be learned heuristically between keyboard and chair.”</li>
<li>Switched another web forum over from Latin-1 to UTF-8. The world is now a better place.</li>
</ul>
<h3><a href="http://texttheater.net/tweetnest/2011/04">Apr</a></h3>
<ul>
<li>“We identified a tweak to the algorithm to prevent generation of swastika-like identicons.” <a href="http://social.microsoft.com/Forums/en-HK/suggest/thread/13ca5fea-80b4-4533-be79-2a07375bfb1f">http://bit.ly/jJsMgY</a></li>
</ul>
<h3><a href="http://texttheater.net/tweetnest/2011/05">May</a></h3>
<ul>
<li>Funny how ”foreign” in Prolog and “native” in Java mean very similar things.</li>
<li>Nutzen von grafischen Tracern, Folge 121: Ein System kennenlernen, um einen grafischen Tracer dafür zu schreiben.</li>
</ul>
<h3><a href="http://texttheater.net/tweetnest/2011/06">June</a></h3>
<ul>
<li>Duh, git users, Subversion has a “staging area” too. It’s called working directory. You’re welcome.</li>
<li>Wort des Tages: Commitsau</li>
<li>Heute: Race conditions.</li>
</ul>
<h3><a href="http://texttheater.net/tweetnest/2011/08">August</a></h3>
<ul>
<li>Eine Hochleistungs-Rechenanlage in Stanford hat angeblich einen String gefunden, der kein gültiges Perl-Programm ist.</li>
</ul>
<h3><a href="http://texttheater.net/tweetnest/2011/09">September</a></h3>
<ul>
<li>Vom Push-Paradigma zum Pull-Paradigma gewechselt, Tag gerettet.</li>
<li>Yay worst practices.</li>
<li>There’s no StackOverflowError that some randomly added System.out.println can’t fix. #Heisenbug #WTF #Java</li>
</ul>
<h3><a href="http://texttheater.net/tweetnest/2011/10">October</a></h3>
<ul>
<li>“It’s not botchy, it’s *modular*!”</li>
<li>xmllint is delusional, it thinks it’s cat.</li>
<li>“This will be done manually and annually.”</li>
<li>Of all the possible ways to represent a pair in #Prolog, (A, B) is probably the most braindead one. Especially if functor(B, (,), 2).</li>
<li>You know your bug tracking workflow is broken when Google Alerts is part of it.</li>
<li>The best things in life start with cat $file |</li>
<li>11 AM: type &#8216;pos_tags = &#8216;. 11:01 AM – 5:59 PM: read Ajax/jQuery introductions. 6:00 PM: hit backspace 11 times.</li>
<li>Nicht testen. Denken!</li>
<li>Immer wieder ernüchternd, wie weit „gut funktionierende Klasse“ von „gut funktionierende und erweiterbare Klasse“ entfernt ist. #OOP</li>
<li>Class names ending in “Helper”: not helping as far as understanding is concerned.</li>
<li>“Have you ever felt like you needed to be rewritten?”</li>
</ul>
<h3><a href="http://texttheater.net/tweetnest/2011/11">November</a></h3>
<ul>
<li>Heute: Deadlocks.</li>
<li>Si creavisses minimum exemplum, non quaesivisses.</li>
<li>Removed one if (&#8230;) { throw &#8230;; } – and so there was a new feature.</li>
<li>Curse you, 80/20 rule in UI design.</li>
<li>}]); #BeautifulLinesOfCode</li>
<li>Word of the day: errput (the data a program sends to STDERR)</li>
<li>Nu nog even lekker formatteren.</li>
<li>And this is where I fire up Eclipse to experimentally learn yet another fact about Java.</li>
<li>Wenn schon böser CSS-Hack, dann ruhig pixelgenau.</li>
</ul>
<h3><a href="http://texttheater.net/tweetnest/2011/12">December</a></h3>
<ul>
<li>seize.sh: mv $1 $1.bk; cp $1.bk $1; rm $1.bk</li>
<li>Welche Programmiersprache hat eigentlich diese Seuche „Ausrufezeichen als Negationsoperator“ eingeführt? Warum nicht gleich das Leerzeichen?</li>
<li>The one and only major version number: 0. The one and only development environment: production.</li>
</ul>
<p>Related posts:<ol>
<li><a href='http://texttheater.net/translating-with-semantic-representations' rel='bookmark' title='Translating with Semantic Representations'>Translating with Semantic Representations</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://texttheater.net/programming-tweets-of-2011/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unconditionally Make Implicit Prerequisites</title>
		<link>http://texttheater.net/unconditionally-make-implicit-prerequisites</link>
		<comments>http://texttheater.net/unconditionally-make-implicit-prerequisites#comments</comments>
		<pubDate>Sat, 24 Sep 2011 15:00:21 +0000</pubDate>
		<dc:creator>Kilian Evang</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Technik]]></category>

		<guid isPermaLink="false">http://texttheater.net/?p=2916</guid>
		<description><![CDATA[I’m pretty new to make so maybe the following is trivial and/or horribly bad practice, but here goes: I have this bunch of output directories, each containing a file called en.tok from which I want to make a corrected version, &#8230; <a href="http://texttheater.net/unconditionally-make-implicit-prerequisites">Weiterlesen <span class="meta-nav">&#8594;</span></a>
Related posts:<ol>
<li><a href='http://texttheater.net/simplify' rel='bookmark' title='Simplify'>Simplify</a></li>
<li><a href='http://texttheater.net/porter-stemmer-for-german-in-python' rel='bookmark' title='Porter Stemmer for German in Python'>Porter Stemmer for German in Python</a></li>
<li><a href='http://texttheater.net/cdu-politiker' rel='bookmark' title='CDU-Politiker'>CDU-Politiker</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>I’m pretty new to <a href="http://www.gnu.org/software/make/manual/make.html">make</a> so maybe the following is trivial and/or horribly bad practice, but here goes: I have this bunch of output directories, each containing a file called <code>en.tok</code> from which I want to make a corrected version, <code>en.tok.corr</code>. Apart from <code>en.tok</code>, <code>en.tok.corr</code> also depends on the script that applies the corrections, and on a MySQL database that contains the corrections. Since make doesn’t know about databases, I chose to represent the database by an empty file <code>en.tok.db</code> and use <code>touch</code> in a second rule to set its timestamp to that of the latest relevant correction so make knows whether to rerun the first rule:</p>
<pre>$(OUT)%/en.tok.corr : $(OUT)%/en.tok $(OUT)%/en.tok.db ${PYTHON}/correct_tokenization.py
&#09;${PYTHON}/correct_tokenization.py $> $@

$(OUT)%/en.tok.db :
&#09;touch -t $$(${PYTHON}/latest_correction.py $@) $@</pre>
<p>But how can I force make to apply that second rule every time? We need to know if there are new corrections in the database, after all. My first idea was to declare the target <code>$(OUT)%/en.tok.db</code> phony by making it a prerequisite of the special target <code>.PHONY</code>, but that doesn’t work since the <code>%</code> wildcard is apparently only interpreted in rules whose target contains it. Thanks to <a href="http://osdir.com/ml/gnu.utils/2006-08/msg00017.html">this post by James T. Kim</a>, I found a solution: instead of declaring <code>$(OUT)%/en.tok.db</code> phony itself, just make it depend on an explicit phony dummy target:</p>
<pre>$(OUT)%/en.tok.db : dummy
&#09;touch -t $$(${PYTHON}/latest_correction.py $@) $@

.PHONY : dummy</pre>
<p>Related posts:<ol>
<li><a href='http://texttheater.net/simplify' rel='bookmark' title='Simplify'>Simplify</a></li>
<li><a href='http://texttheater.net/porter-stemmer-for-german-in-python' rel='bookmark' title='Porter Stemmer for German in Python'>Porter Stemmer for German in Python</a></li>
<li><a href='http://texttheater.net/cdu-politiker' rel='bookmark' title='CDU-Politiker'>CDU-Politiker</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://texttheater.net/unconditionally-make-implicit-prerequisites/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My Debian Initiation</title>
		<link>http://texttheater.net/my-debian-initiation</link>
		<comments>http://texttheater.net/my-debian-initiation#comments</comments>
		<pubDate>Fri, 03 Jun 2011 15:55:38 +0000</pubDate>
		<dc:creator>Kilian Evang</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Leben]]></category>
		<category><![CDATA[Technik]]></category>

		<guid isPermaLink="false">http://texttheater.net/?p=2681</guid>
		<description><![CDATA[Having switched from Ubuntu to Debian Squeeze and pondering ways to combine the security of a largely stable operating system with the additional functionality afforded by individual newer software packages, I recently wondered: Apt pinning seems complicated, why not just &#8230; <a href="http://texttheater.net/my-debian-initiation">Weiterlesen <span class="meta-nav">&#8594;</span></a>
Related posts:<ol>
<li><a href='http://texttheater.net/texthtml-decoder' rel='bookmark' title='text/html decoder'>text/html decoder</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Having switched from Ubuntu to Debian Squeeze and pondering ways to combine the security of a largely stable operating system with the additional functionality afforded by individual newer software packages, I recently wondered: Apt pinning seems complicated, why not just add testing sources to sources.list and use apt-get -t testing to get whatever newer packages I need? I can now answer this question for myself: because if you are under the impression that upgrade tools like apt-get and Synaptic are aware of the “current distribution” and will never upgrade beyond that unless explicitly told so, then that impression is wrong, even if apt-get’s occasional “keeping back” packages and the name of the command to override this (dist-upgrade) may suggest it. You will thus inadvertently upgrade your whole system to a non-stable branch. And when you finally notice it, you will <em style="color: #444444; font-family: Georgia, 'Bitstream Charter', serif; line-height: 1.5; font-style: italic; border: initial none initial;">then</em>, more out of a desire for purity than out of actual concern for your system’s security, use Apt pinning to try and perform a downgrade. The downgrade will fail halfway through because the pre-remove script for something as obscure as openoffice.org-filter-binfilter has an obscure problem, leaving you with a crippled system and without even Internet access to try and get information on how to resolve the issue. By this point, reinstalling from scratch seems more fun than any other option. And so I did.</p>
<p>Another lesson learned: Do use the first DVD to install Debian, it contains a whole lot of very useful things such as network-manager-gnome or synaptic that are not included with the CD and that are a hassle to install one by one. And there’s also a new unanswered question: why did the i386 DVD install an amd64 kernel?</p>
<p>Related posts:<ol>
<li><a href='http://texttheater.net/texthtml-decoder' rel='bookmark' title='text/html decoder'>text/html decoder</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://texttheater.net/my-debian-initiation/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Unicode Man</title>
		<link>http://texttheater.net/unicode-man</link>
		<comments>http://texttheater.net/unicode-man#comments</comments>
		<pubDate>Mon, 02 May 2011 20:40:02 +0000</pubDate>
		<dc:creator>Kilian Evang</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Technik]]></category>
		<category><![CDATA[Zitate]]></category>

		<guid isPermaLink="false">http://texttheater.net/?p=2615</guid>
		<description><![CDATA[Holy shit, this is awesome: &#60;deep portentous voice used for film trailers&#62;When the fight for internationalisation hots up, mild mannered web developer Martin Sammtleben becomes Unicode Man, defender of diacritics, champion of challenging codepoints. Faced with an ASCII-fixated enemy, Unicode &#8230; <a href="http://texttheater.net/unicode-man">Weiterlesen <span class="meta-nav">&#8594;</span></a>
Related posts:<ol>
<li><a href='http://texttheater.net/zwiebelfischchen' rel='bookmark' title='Zwiebelfischchen'>Zwiebelfischchen</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Holy shit, this is awesome:</p>
<blockquote><p><a href="http://www.lassosoft.com/golivetalk?id=373117">&lt;deep portentous voice used for film trailers&gt;When the fight for internationalisation hots up, mild mannered web developer Martin Sammtleben becomes Unicode Man, defender of diacritics, champion of challenging codepoints. Faced with an ASCII-fixated enemy, Unicode Man must free the badly programmed text engines of the world of their inability to implement international standards before all are assimilated by their failure to put the right glyph in the right place&lt;/deep portentous voice used for film trailers&gt;</a></p></blockquote>
<p>Related posts:<ol>
<li><a href='http://texttheater.net/zwiebelfischchen' rel='bookmark' title='Zwiebelfischchen'>Zwiebelfischchen</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://texttheater.net/unicode-man/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Highbrow Java</title>
		<link>http://texttheater.net/highbrow-java</link>
		<comments>http://texttheater.net/highbrow-java#comments</comments>
		<pubDate>Wed, 30 Mar 2011 19:52:45 +0000</pubDate>
		<dc:creator>Kilian Evang</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Technik]]></category>

		<guid isPermaLink="false">http://texttheater.net/?p=2428</guid>
		<description><![CDATA[Here’s examples from my actual code of five lesser-known Java features, in increasing order of how much fun I had discovering they exist. Anonymous classes These are fairly well-known, so let’s go for a freaky example – an anonymous class &#8230; <a href="http://texttheater.net/highbrow-java">Weiterlesen <span class="meta-nav">&#8594;</span></a>
Related posts:<ol>
<li><a href='http://texttheater.net/latex-pstricks-pdftex-and-kile' rel='bookmark' title='LaTeX, PSTricks, pdfTeX and Kile'>LaTeX, PSTricks, pdfTeX and Kile</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Here’s examples from my actual code of five lesser-known Java features, in increasing order of how much fun I had discovering they exist.</p>
<h3>Anonymous classes</h3>
<p>These are fairly well-known, so let’s go for a freaky example – an anonymous class declaration within the head of a (labeled!) for loop:</p>
<pre>sentence : for (List children :
        node.getOrderedChildrenBySpan(
        sentence.getOrderedTerminals(), new Test() {

	@Override
	public boolean test(Node object) {
		return false;
	}

})) {
	for (Node child : children) {
		String tag = child.getLabel().getTag();

		if (tag.contains("-SBJ")) {
			break sentence;
		}

		tags.add(PTBUtil.pureTag(child));
	}
}</pre>
<h3>Enums</h3>
<p>Boring, I know. I’m mentioning them here for completeness because I found out about them rather late and was like, hey, cool, that’s much nicer and cleaner than working with explicit integer constants.</p>
<pre>public enum EditOperationType {

	DELETE, INSERT, SWAP, MATCH;

	@Override
	public String toString() {
		switch(this) {
		case DELETE:
			return "delete";
		case INSERT:
			return "insert";
		case SWAP:
			return "swap";
		default:
			return "match";
		}
	}

}</pre>
<h3>Generic methods</h3>
<p>Luckily, the following code is no longer live.</p>
<pre>@SuppressWarnings("unchecked")
public  T retrieve(
        Class type, int id) {
    return (T) getStoreForType(type).retrieve(id);
}}</pre>
<h3>Instance initializers</h3>
<p>I know I discovered these once thinking I needed a constructor in an anonymous class and wondering how to do this, because how would one declare a constructor in a class without a name? It did not remain in my workspace, however, and I never used an instance initializer again. In the case of anonymous classes, I tend to use final variables outside of the anonymous class, or derive them from classes whose constructors already handle everything I need. So I’m pulling an example from <a href="http://code.google.com/p/gralej/">someone else’s code</a>:</p>
<pre>_result = new ContainerBlock() {
    {
        setPanel(_panel);
        setLayout(LayoutFactory.getInstance()
                .getReentrancyLayout());
        addChild(unboundVarLabel);
    }
};</pre>
<h3>Multiple type bounds</h3>
<pre>public abstract class IncrementalComparator&lt;
        T extends HasSize &amp; HasID&gt; {
    // ...
}</pre>
<p>I wonder what’s next.</p>
<p>Related posts:<ol>
<li><a href='http://texttheater.net/latex-pstricks-pdftex-and-kile' rel='bookmark' title='LaTeX, PSTricks, pdfTeX and Kile'>LaTeX, PSTricks, pdfTeX and Kile</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://texttheater.net/highbrow-java/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Developments in Desktop Environments, Part 2: The Glorious Future</title>
		<link>http://texttheater.net/developments-in-desktop-environments-part-2-the-glorious-future</link>
		<comments>http://texttheater.net/developments-in-desktop-environments-part-2-the-glorious-future#comments</comments>
		<pubDate>Wed, 02 Feb 2011 20:33:18 +0000</pubDate>
		<dc:creator>Kilian Evang</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Technik]]></category>

		<guid isPermaLink="false">http://texttheater.net/?p=2265</guid>
		<description><![CDATA[Yesterday I looked at recent trends in the development of computer desktop environments and noted that the traditional desktop (+ windows + panels + menus) metaphor is being abandoned in favor of a simpler “one thing is on screen at &#8230; <a href="http://texttheater.net/developments-in-desktop-environments-part-2-the-glorious-future">Weiterlesen <span class="meta-nav">&#8594;</span></a>
Related posts:<ol>
<li><a href='http://texttheater.net/developments-in-desktop-environments-part-1-the-awkward-present' rel='bookmark' title='Developments in Desktop Environments, Part 1: The Awkward Present'>Developments in Desktop Environments, Part 1: The Awkward Present</a></li>
<li><a href='http://texttheater.net/dekorativ-aber-nicht-funktional-2' rel='bookmark' title='Dekorativ, aber nicht funktional (2)'>Dekorativ, aber nicht funktional (2)</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://texttheater.net/developments-in-desktop-environments-part-1-the-awkward-present">Yesterday</a> I looked at recent trends in the development of computer desktop environments and noted that the traditional desktop (+ windows + panels + menus) metaphor is being abandoned in favor of a simpler “one thing is on screen at a time” policy as already used in the graphical user interfaces of mobile devices. Like the developers of Mac OS X and GNOME Shell, I too think that the traditional desktop metaphor must die, but I want something completely different to replace it. Here’s some guidelines that should, in my opinion, be followed, to create next-generation desktop environments:<strong></strong></p>
<p><strong>“Navigational” elements</strong> like application launchers and overviews over active applications have no business being full-screen monsters by default, as is the case with Mission Control in Mac OS X or with the Activities view in GNOME Shell. There’s nothing wrong with traditional panels and menus. Make them as lean as possible while staying intuitive. I think Windows (with the task bar in Windows 7) and Ubuntu (with the launcher in <a href="http://tombuntu.com/index.php/2010/05/10/first-look-at-the-ubuntu-unity-desktop-environment/">Unity</a>) are on the right track by adopting the design pioneered by Mac OS X’s dock: frequently used and currently open applications are in the same place. This may first seem dubious conceptually, but it makes more and more sense as applications are becoming more and more state-persisting.<strong></strong></p>
<p><strong>No desktop!</strong> When the traditional desktop metaphor dies, make sure the desktop dies with it. Sadly, no major desktop environment seems to be tackling this. The desktop is sort of like a window, but can only be shown by moving all windows out of the way. It lacks a clearly defined purpose and tends to clutter up one way or the other. Get rid of it!<strong></strong></p>
<p><strong>Go tiling!</strong> Now that there’s no desktop before which windows can float, windows should float no more. What overstrains users’ (read: my) minds is not more than one window visible at a time. On the contrary, there are many tasks that require working with two applications simultaneously. What annoys users (read: me) is having to arrange windows themselves. Full-screen is a nice feature that moves and resizes <em>one</em> window so that it occupies the whole available screen space. I want that for two or more windows! They should always be arranged automatically to use the screen space optimally. The answer to this plea is <em>tiling window managers</em>, here’s one in action:</p>
<div id="attachment_2266" class="wp-caption aligncenter" style="width: 628px"><a href="http://texttheater.net/wp-content/4969412415_638db74a0e_o.png"><img class="size-full wp-image-2266" title="Tiling Window Manager" src="http://texttheater.net/wp-content/4969412415_638db74a0e_o.png" alt="" width="618" height="386" /></a><p class="wp-caption-text">A tiling window manager with four windows open and one panel (screenshot by Jonathas Rodrigues)</p></div>
<p>Current tiling window managers are for technical users willing to do quite some configuration before it works, do a hell of a lot of configuration before everything works nicely, and memorize a lot of keyboard commands. So far all of this has been putting me off going tiling. There is no reason why it should stay that way. Complex GUIs like those of Photoshop or Eclipse already consist of multiple “subwindows” called views that can be rearranged, docked, undocked, grouped etc. freely using the mouse. The same principle could be applied to the whole desktop, for example in a Linux distribution that makes sure there’s a decent set of standard configuration settings, and that special things like indicator applets and input methods work as we’re used to from the traditional GNOME desktop. <a href="http://xmonad.org">Mon</a>buntu, anyone?</p>
<p>Related posts:<ol>
<li><a href='http://texttheater.net/developments-in-desktop-environments-part-1-the-awkward-present' rel='bookmark' title='Developments in Desktop Environments, Part 1: The Awkward Present'>Developments in Desktop Environments, Part 1: The Awkward Present</a></li>
<li><a href='http://texttheater.net/dekorativ-aber-nicht-funktional-2' rel='bookmark' title='Dekorativ, aber nicht funktional (2)'>Dekorativ, aber nicht funktional (2)</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://texttheater.net/developments-in-desktop-environments-part-2-the-glorious-future/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Developments in Desktop Environments, Part 1: The Awkward Present</title>
		<link>http://texttheater.net/developments-in-desktop-environments-part-1-the-awkward-present</link>
		<comments>http://texttheater.net/developments-in-desktop-environments-part-1-the-awkward-present#comments</comments>
		<pubDate>Wed, 02 Feb 2011 02:09:33 +0000</pubDate>
		<dc:creator>Kilian Evang</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Technik]]></category>

		<guid isPermaLink="false">http://texttheater.net/?p=2254</guid>
		<description><![CDATA[Once upon a time, when computer operating systems learned to multi-task, their basic user interfaces started to reflect this ability: applications now ran simultaneously in a number of windows that could be freely opened, closed, moved around and resized on &#8230; <a href="http://texttheater.net/developments-in-desktop-environments-part-1-the-awkward-present">Weiterlesen <span class="meta-nav">&#8594;</span></a>
Related posts:<ol>
<li><a href='http://texttheater.net/developments-in-desktop-environments-part-2-the-glorious-future' rel='bookmark' title='Developments in Desktop Environments, Part 2: The Glorious Future'>Developments in Desktop Environments, Part 2: The Glorious Future</a></li>
<li><a href='http://texttheater.net/dekorativ-aber-nicht-funktional-2' rel='bookmark' title='Dekorativ, aber nicht funktional (2)'>Dekorativ, aber nicht funktional (2)</a></li>
<li><a href='http://texttheater.net/kleine-bilderode-an-den-kaffee' rel='bookmark' title='Kleine Bilderode an den Kaffee'>Kleine Bilderode an den Kaffee</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Once upon a time, when computer operating systems learned to multi-task, their basic user interfaces started to reflect this ability: applications now ran simultaneously in a number of windows that could be freely opened, closed, moved around and resized on the screen. This was (an important aspect of what is) called “the desktop metaphor”.</p>
<div id="attachment_2261" class="wp-caption aligncenter" style="width: 628px"><a href="http://www.microsoft.com/germany/presseservice/service/pressemappen/20jahre-windows.mspx"><img class="size-full wp-image-2261" title="Windows 95" src="http://texttheater.net/wp-content/Windows-95-Screenshot-PlugPlay1.jpg" alt="" width="618" height="464" /></a><p class="wp-caption-text">Windows 95 with two open windows, task bar and start menu (screenshot by Microsoft)</p></div>
<p>Always-visible gadgets like “task bars”, “docks” and “menu bars” were introduced for basic tasks like managing open windows and opening new ones.</p>
<p>It took for the advent of super-user-friendly mobile devices (limited multitasking ability, limited screen space) for developers to notice that unlike modern desktop computers, people aren’t actually very good at multitasking. At least for the tasks they do with mobile devices, people are perfectly happy with only having one window, or menu, open at a time.</p>
<div id="attachment_2256" class="wp-caption aligncenter" style="width: 628px"><a href="http://www.apple.com/macosx/lion/"><img class="size-full wp-image-2256" title="Launchpad" src="http://texttheater.net/wp-content/lion_springboard1_20101020.jpg" alt="" width="618" height="387" /></a><p class="wp-caption-text">The new Mac OS X Launchpad (screenshot by Apple)</p></div>
<p>This trend is now coming to the desktop computer. Apple recently announced a new release of Mac OS X, <a href="http://www.apple.com/macosx/lion/">explicitly stating that many of the new features are inspired by the iPhone and the iPad</a>. The most striking one is Launchpad. It is nothing more than a menu of all available applications, but one that takes up the whole screen. Together with Dashboard and Exposé (now called Mission Control), that’s quite a long list of special-purpose full-screen gadgets taking over window managing/application launching functions traditionally fulfilled by task bars etc. And together with Mac OS X’s new full-screen apps (not quite your traditional maximized windows), it quite clearly marks a turn toward a one-window-is-visible-at-a-time principle.</p>
<p style="text-align: left;">
<div id="attachment_2257" class="wp-caption aligncenter" style="width: 628px"><a href="http://www.flickr.com/photos/dvdmerwe/4355714681/"><img class="size-full wp-image-2257 " title="GNOME Shell Activities" src="http://texttheater.net/wp-content/4355714681_b6e981575d_o.jpg" alt="" width="618" height="494" /></a><p class="wp-caption-text">The Activities view of GNOME Shell (screenshot by DanieVDM)</p></div>
<p>A similar thing is going on in <a href="http://live.gnome.org/GnomeShell">GNOME Shell</a>. They are cramming everything for which there used to be panels and menus into one full-screen view called Activities, including Exposé-like overviews of the desktop(s). If the multitude of full-screen gadgets in Mac OS X seems confusing, the GNOME  approach of cramming so many things into one full-screen view seems  bizarre. If upon clicking a button with the ultimate goal of, say, firing up the calculator, the contents of the whole screen change and hide my currently open windows, I consider this a high price to pay. In return, there should at least be a gain in focus, as with the Mac OS X gadgets, each of which shows more or less one kind of thing only.</p>
<p>So what is a desktop environment developer to do if she really wants to advance the state of the art instead of just haphazardly introducing new misfeatures (or taking it slow with moving away from the traditional desktop metaphor, as Microsoft does)? Is there a happy medium between overview and focus? Bear with me for <a href="http://texttheater.net/developments-in-desktop-environments-part-2-the-glorious-future">Part 2: The Glorious Future</a>.</p>
<p>Related posts:<ol>
<li><a href='http://texttheater.net/developments-in-desktop-environments-part-2-the-glorious-future' rel='bookmark' title='Developments in Desktop Environments, Part 2: The Glorious Future'>Developments in Desktop Environments, Part 2: The Glorious Future</a></li>
<li><a href='http://texttheater.net/dekorativ-aber-nicht-funktional-2' rel='bookmark' title='Dekorativ, aber nicht funktional (2)'>Dekorativ, aber nicht funktional (2)</a></li>
<li><a href='http://texttheater.net/kleine-bilderode-an-den-kaffee' rel='bookmark' title='Kleine Bilderode an den Kaffee'>Kleine Bilderode an den Kaffee</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://texttheater.net/developments-in-desktop-environments-part-1-the-awkward-present/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>text/html decoder</title>
		<link>http://texttheater.net/texthtml-decoder</link>
		<comments>http://texttheater.net/texthtml-decoder#comments</comments>
		<pubDate>Mon, 17 Jan 2011 19:29:42 +0000</pubDate>
		<dc:creator>Kilian Evang</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[Technik]]></category>

		<guid isPermaLink="false">http://texttheater.net/?p=2216</guid>
		<description><![CDATA[Prompted by this page. Keywords: Firefox, Ubuntu Firefox Modifications, ubufox, WTF. Related posts: Tag stripper/text ripper Ich lobe Adobe
Related posts:<ol>
<li><a href='http://texttheater.net/tag-stripper-text-ripper' rel='bookmark' title='Tag stripper/text ripper'>Tag stripper/text ripper</a></li>
<li><a href='http://texttheater.net/ich-lobe-adobe' rel='bookmark' title='Ich lobe Adobe'>Ich lobe Adobe</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://texttheater.net/wp-content/Screenshot-No-packages-with-the-requested-plugins-found.png"><img class="size-full wp-image-2217 alignleft" title="Screenshot-No packages with the requested plugins found" src="http://texttheater.net/wp-content/Screenshot-No-packages-with-the-requested-plugins-found.png" alt="" width="507" height="191" /></a><br clear="all"/></p>
<p>Prompted by <a href="http://khmer.cc/members/homepage.html?member=mracura">this page</a>.</p>
<p>Keywords: Firefox, Ubuntu Firefox Modifications, ubufox, WTF.</p>
<p>Related posts:<ol>
<li><a href='http://texttheater.net/tag-stripper-text-ripper' rel='bookmark' title='Tag stripper/text ripper'>Tag stripper/text ripper</a></li>
<li><a href='http://texttheater.net/ich-lobe-adobe' rel='bookmark' title='Ich lobe Adobe'>Ich lobe Adobe</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://texttheater.net/texthtml-decoder/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

