<?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>lukx.de</title>
	<atom:link href="http://www.lukx.de/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lukx.de</link>
	<description>Ich schreibe über das, was mir gerade einfällt.</description>
	<lastBuildDate>Sat, 22 Jan 2011 01:23:37 +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>When Applications are Smarter Than I Am</title>
		<link>http://www.lukx.de/blog/2011/01/when-applications-are-smarter-than-i-am/</link>
		<comments>http://www.lukx.de/blog/2011/01/when-applications-are-smarter-than-i-am/#comments</comments>
		<pubDate>Sat, 22 Jan 2011 01:23:37 +0000</pubDate>
		<dc:creator>Lukx</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.lukx.de/?p=155</guid>
		<description><![CDATA[Well, there was a time. There was a time when people who knew about computers were able to use one. And all the others weren&#8217;t. But then came Excel. Excel is one of the few programmes that believe to be more clever than the people using it. So as, when I try to enter a [...]]]></description>
			<content:encoded><![CDATA[<p>Well, there was a time. There was a time when people who knew about computers were able to use one. And all the others weren&#8217;t. But then came Excel.</p>
<p>Excel is one of the few programmes that believe to be more clever than the people using it. So as, when I try to enter a value span of, let&#8217;s say, &#8220;10-12&#8243;, meaning &#8220;ten to twelve&#8221; as in &#8220;ten to twelve hours to finish this task&#8221;, in a cell, Excel is pretty sure that I am meaning to say &#8220;10 December&#8221;. And, honestly, noone in a German-speaking country ever meant the tenth of december when writing &#8220;10-12&#8243;; that&#8217;s just not our way to write dates.</p>
<p>Anyway, Excel. While they do offer means of explicitly formatting a cell to a literal (what we developers would call &#8220;String&#8221;) value, my &#8220;10-12&#8243; would transform to 40887. Which is, &#8230;, well, not what I was trying to enter into the cell at the first place.</p>
<p>Excel thus believes it is smarter than me. A user interface which is programmed to be better than the person using it. So is the iOS Autocorrect-Feature (&#8220;No, ye ain&#8217;t writin&#8217; the right thing although you&#8217;ve tried to correct it twice&#8221;), and even Google (&#8220;No, ye ain&#8217;t typing the right words, so I am using my fuzzy search to display you some of the less relevant results instead&#8221;).</p>
<p>Why? Shouldn&#8217;t a programm be built to serve the user? Of course, that is hard to do. Respecting the fact, that, in Excel&#8217;s and Google&#8217;s and iOS&#8217;s native countries, they are probably behaving correctly &#8211; I guess it wouldn&#8217;t be such a hard thing to recognize that a user has replaced the 40887-Auto-Cell-Format-Value into the original text more than four times in only one spreadsheet? I mean, c&#8217;mon!</p>
<p>What am I trying to say with this entry? Not that Excel is a piece of crap (which it is, honestly, not; neither are Google ore iOS). But, your apps being so smart, why don&#8217;t you build a mechanism to identify whether or not your user is smart, and then adapt your UI and the application&#8217;s behaviour accordingly?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lukx.de/blog/2011/01/when-applications-are-smarter-than-i-am/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Commented Code is good code &#8211; or is it?</title>
		<link>http://www.lukx.de/blog/2010/11/commented-code-is-good-code-or-is-it/</link>
		<comments>http://www.lukx.de/blog/2010/11/commented-code-is-good-code-or-is-it/#comments</comments>
		<pubDate>Tue, 16 Nov 2010 00:07:24 +0000</pubDate>
		<dc:creator>Lukx</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.lukx.de/?p=148</guid>
		<description><![CDATA[Why do so many people believe that commented code equals well-written code? I do believe, and I must admit that I have somehow adopted this opinion from three great people (Matthias, Ben, Jochen) whom I have learned from, that well-written code requires less comment blocks than poorly elaborated code. I mean, let&#8217;s quickly have a [...]]]></description>
			<content:encoded><![CDATA[<p>Why do so many people believe that commented code equals well-written code?<br />
<span id="more-148"></span></p>
<pre class="brush: plain; title: ; notranslate">
/*
 *i tried to find a witty comment for this method but i don't understand it anymore, honestly
 */
</pre>
<p>I do believe, and I must admit that I have somehow adopted this opinion from three great people (Matthias, Ben, Jochen) whom I have learned from, that well-written code requires <em>less</em> comment blocks than poorly elaborated code.</p>
<p>I mean, let&#8217;s quickly have a look at a line of code that is pretty common for our company&#8217;s coding conventions:</p>
<pre class="brush: plain; title: ; notranslate">
if( $objUser-&gt;isLoggedIn() ) {
    $objUser-&gt;redirectToProfilePage();
}
</pre>
<p>While, of course, one might argue whether or not it is useful to use type prefixes in a typeless language like PHP, one thing is still for sure:</p>
<p><strong>No one mastering the english language will ever have any trouble understanding what is going on there.</strong> Obviously, some user is being checked for his login status and afterwards redirected to his profile page.</p>
<p>This is a result of smart method names. While it surely requires some extra typing work to create method names like &#8220;getUsersByFirstName&#8221; instead of &#8220;gubyfn&#8221;, think about it: <strong>Why would you ever want to get away from human language?</strong> I mean, seriously. Let&#8217;s re-write the example above in a &#8220;well-but-this-is-waaaaay-shorter&#8221;-Way, which I have seen in other agencies (and I have <em>not</em> worked with that many&#8230;):</p>
<pre class="brush: plain; title: ; notranslate">
if( $row-&gt;check() ) {
    $tP-&gt;r('prf');
}
</pre>
<p>(tP is, once you know it, a template processor, just to get it clear. r is a redirecting method.)</p>
<p>Would you have guessed what is happening there? No! The developer above would have needed to spend some extra time commenting wittily. In a best-case scenario this would&#8217;ve sounded like <em>&#8220;Find out whether the User is logged in and, if so, redirect him to his profile page, which you will find in prf.php&#8221;</em>.<br />
But, in worst (and, rather likely, the actual) case, he&#8217;d write: &#8220;Check result and redirect&#8221;</p>
<p>Now, thank you. That does help, aight?</p>
<p>Always keep in mind that not everyone understands what the heck you are thinking about while writing the code. If you are anything like me, Unicorns and Rainbows might be it. So instead of trying to clarify your comments, why not accustom to write genuine human-readable code in the first place? <strong>Why not make your <em>I-talk-to-people</em>-Language your coding guidelines?</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lukx.de/blog/2010/11/commented-code-is-good-code-or-is-it/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kevins Zukunftspläne</title>
		<link>http://www.lukx.de/blog/2010/10/kevins-zukunftsplane/</link>
		<comments>http://www.lukx.de/blog/2010/10/kevins-zukunftsplane/#comments</comments>
		<pubDate>Sun, 03 Oct 2010 19:43:07 +0000</pubDate>
		<dc:creator>Lukx</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.lukx.de/?p=132</guid>
		<description><![CDATA[<a href="http://www.lukx.de/wp-content/uploads/2010/10/IMAG0003-1.jpg"><img class="size-medium wp-image-133 alignnone" title="kevin-pfanne" src="http://www.lukx.de/wp-content/uploads/2010/10/IMAG0003-1-300x221.jpg" alt="" width="300" height="221" /></a><br/>(Klicken zum Vergrößern)<br/>
Nach einer Idee von Tom Reinert.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lukx.de/wp-content/uploads/2010/10/IMAG0003-1.jpg"><img class="size-medium wp-image-133 alignnone" title="kevin-pfanne" src="http://www.lukx.de/wp-content/uploads/2010/10/IMAG0003-1-300x221.jpg" alt="" width="300" height="221" /></a><br/>(Klicken zum Vergrößern)<br/><br />
Nach einer Idee von Tom Reinert.<br />
<span id="more-132"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lukx.de/blog/2010/10/kevins-zukunftsplane/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Studying.</title>
		<link>http://www.lukx.de/blog/2010/09/studying/</link>
		<comments>http://www.lukx.de/blog/2010/09/studying/#comments</comments>
		<pubDate>Thu, 23 Sep 2010 13:33:50 +0000</pubDate>
		<dc:creator>Lukx</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[itunes]]></category>
		<category><![CDATA[media]]></category>
		<category><![CDATA[procrastination]]></category>
		<category><![CDATA[studying]]></category>

		<guid isPermaLink="false">http://www.lukx.de/?p=119</guid>
		<description><![CDATA[Key Numbers of my day&#8230;]]></description>
			<content:encoded><![CDATA[<p>Key Numbers of my day&#8230;<br />
<a href="http://www.lukx.de/wp-content/uploads/2010/08/100923_dayinnumbers.jpg"><img class="size-medium wp-image-120 alignnone" title="100923_dayinnumbers" src="http://www.lukx.de/wp-content/uploads/2010/08/100923_dayinnumbers-300x165.jpg" alt="" width="300" height="165" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lukx.de/blog/2010/09/studying/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FlashSwitcher and Firefox 3.6</title>
		<link>http://www.lukx.de/blog/2010/04/flashswitcher-and-firefox-3-6/</link>
		<comments>http://www.lukx.de/blog/2010/04/flashswitcher-and-firefox-3-6/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 07:33:50 +0000</pubDate>
		<dc:creator>Lukx</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.lukx.de/?p=112</guid>
		<description><![CDATA[Those of you who frequently debug or test Adobe Flash applications may have stumbled across the great Firefox Plugin &#8220;Flash Switcher&#8221; by Alessandro Crugnola. It is a great plugin that allows you to change the Flash Player version used by your Firefox in order to see how your code behaves in, for example, older or [...]]]></description>
			<content:encoded><![CDATA[<p>Those of you who frequently debug or test Adobe Flash applications may have stumbled across the great Firefox Plugin <a href="http://www.sephiroth.it/firefox/flash_switcher/#install">&#8220;Flash Switcher&#8221; by Alessandro Crugnola</a>. It is a great plugin that allows you to change the Flash Player version used by your Firefox in order to see how your code behaves in, for example, older or non-debug versions.<br />
Anyhow, ever since I have upgraded my Firefox to version 3.6 on my Windows XP and Windows 7 machines, FlashSwitcher kept throwing &#8220;<em>NS_ERROR_FILE_ALREADY_EXISTS</em>&#8221; errors when trying to switch to another Flash Player Version.</p>
<p>Here&#8217;s what I did to fix this bug:</p>
<p>I edited the os.js in <em>c:\Dokumente und Einstellungen\<strong>{username}</strong>\Anwendungsdaten\Mozilla\Firefox\Profiles\<strong>{yourProfile}</strong>\extensions\flash_switcher@sephiroth.it\content\js</em> so that it deletes the old flash plugin file prior to copying the selected one. You may <a href="http://www.lukx.de/wp-content/uploads/2010/04/os.js_1.txt">download my Version of os.js here!</a></p>
<p>Obviously &#8211; this is happening on your own risk. Promise to create a backup of your old version first, and not to sue me if it kills your browser <img src='http://www.lukx.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>I am just saying that this works for me in Firefox 3.6, Windows XP and 7, and version 2.0.2 and 2.0.3 of <em>Flash Switcher</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lukx.de/blog/2010/04/flashswitcher-and-firefox-3-6/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Why Steve hates everyone now</title>
		<link>http://www.lukx.de/blog/2010/04/why-steve-hates-everyone-now/</link>
		<comments>http://www.lukx.de/blog/2010/04/why-steve-hates-everyone-now/#comments</comments>
		<pubDate>Sun, 11 Apr 2010 15:33:07 +0000</pubDate>
		<dc:creator>Lukx</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[satire]]></category>

		<guid isPermaLink="false">http://www.lukx.de/?p=97</guid>
		<description><![CDATA[This is what I believe what happened.]]></description>
			<content:encoded><![CDATA[<p>This is what I believe what happened.</p>
<p><a href="http://www.lukx.de/wp-content/uploads/2010/04/100411_WhySteveHates.jpg"><img class="size-medium wp-image-96" title="100411_WhySteveHates" src="http://www.lukx.de/wp-content/uploads/2010/04/100411_WhySteveHates-300x240.jpg" alt="" width="300" height="240" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lukx.de/blog/2010/04/why-steve-hates-everyone-now/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSocial / Google Gadgets API: Teil 2 &#8211; Persistent speichern</title>
		<link>http://www.lukx.de/blog/2009/12/opensocial-google-gadgets-api-teil-2-persistent-speichern/</link>
		<comments>http://www.lukx.de/blog/2009/12/opensocial-google-gadgets-api-teil-2-persistent-speichern/#comments</comments>
		<pubDate>Sat, 05 Dec 2009 20:12:13 +0000</pubDate>
		<dc:creator>Lukx</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[gadget]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[lokalisten]]></category>
		<category><![CDATA[meinvz]]></category>
		<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[schuelervz]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[studivz]]></category>

		<guid isPermaLink="false">http://www.lukx.de/?p=67</guid>
		<description><![CDATA[Gadgets und Applikationen in Social Networks wie StudiVZ, Xing und Lokalisten.de sind das nächste große Ding im Web 2.0. Im Selbstversuch erlerne ich die Google Gadget und OpenSocial-API und alles drum und dran. Hier möchte ich zeigen, wie ich auf meinem Weg zum Gadget Developer vorankomme und wie man solche Gadgets überhaupt baut. Nachdem ich [...]]]></description>
			<content:encoded><![CDATA[<p>Gadgets und Applikationen in Social Networks wie StudiVZ, Xing und Lokalisten.de sind das nächste große Ding im Web 2.0. Im Selbstversuch erlerne ich die Google Gadget und OpenSocial-API und alles drum und dran. Hier möchte ich zeigen, wie ich auf meinem Weg zum Gadget Developer vorankomme und wie man solche Gadgets überhaupt baut.</p>
<p>Nachdem ich in <a href="http://www.lukx.de/?p=32">Teil 1</a> gezeigt habe, wie man einfache Get-Requests benutzt, um sein Gadget mit Inhalt zu versorgen, werde ich heute zum ersten Mal auf die Persistenzschicht zugreifen, die die API zur Verfügung stellt. Als Beispiel dient dabei ein &#8220;Pastebin&#8221;, also ein Textfeld, in das ich munter Sachen schreibe oder paste, die mir dann überall auf meiner iGoogle-Seite zur Verfügung stehen. <a href="http://www.lukx.de/wp-content/uploads/2009/12/pastebin-1.xml_.txt">Den fertigen Code für selbstversteher</a> gibts natürlich auch.</p>
<p><span id="more-67"></span></p>
<h2>1. Grundgerüst mit HTML</h2>
<p>Wir fangen wieder an mit dem Grundgerüst. Das einzige, was wir hier an HTML brauchen, ist eine Textarea, das eine ID enthält. Diese wird mit ein wenig CSS-Code schön gemacht.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;Module&gt;
  &lt;ModulePrefs title=&quot;Pastemap&quot; height=&quot;65&quot;&gt;
    &lt;Require feature=&quot;opensocial-0.8&quot;/&gt;
  &lt;/ModulePrefs&gt;
  &lt;Content type=&quot;html&quot;&gt;
  &lt;![CDATA[
    &lt;style type=&quot;text/css&quot;&gt;
      #pastearea {
        width: 100%; font-family: Arial, sans-serif;
        font-size: 12px; height: 60px;
      }
    &lt;/style&gt;
    &lt;textarea id=&quot;pastearea&quot;&gt;&lt;/textarea&gt;
  ]]&gt;
  &lt;/Content&gt;
&lt;/Module&gt;
</pre>
<p>Wie ihr seht verlangt dieses Gadget wieder, dass die opensocial-0.8 API bereitgestellt wird. Außerdem habe ich dieses Mal eine Höhe von 65px vorgegeben, damit sich die Textarea wunderbar in den Container schmiegt.</p>
<p>Nun müssen wir als erstes zusehen, dass unsere Änderungen im Textfeld auch auf Googles Festplatten ankommt (ein Kollege sagte zynisch: &#8220;Interessanter wäre, wie man das verhindert!&#8221;). Versehen wir unsere Textarea also mit einem onchange-Event.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;textarea id=&quot;pastearea&quot; onchange=&quot;updatePasteData()&quot;&gt;&lt;/textarea&gt;
</pre>
<h2>2. Speichern</h2>
<p>Wenn wir Änderungen im Textfeld vornehmen, wird also immer die Javascript-Funktion &#8220;updatePasteData()&#8221; aufgerufen.  Da diese noch nicht existiert, fügen wir, wie im ersten Teil, einen Script-Block am Anfang des Content-Knotens ein, der die folgende Funktion enthält:</p>
<pre class="brush: jscript; title: ; notranslate">
function updatePasteData() {
  var pasteContent = document.getElementById(&quot;pastearea&quot;).value;
  var req = opensocial.newDataRequest();
  req.add(
    req.newUpdatePersonAppDataRequest(&quot;VIEWER&quot;,
                &quot;pasteContent&quot;, pasteContent),
    &quot;setPasteData&quot;);
  req.send();
}
</pre>
<p>Super, oder?</p>
<p>Als erstes wird eine Variable deklariert, die den aktuellen Inhalt der Textarea (der wir ja die ID #pastearea zugewiesen haben) enthält.</p>
<p>Danach erfolgt ein DataRequest nach der Form, wie alle möglichen Anfragen innerhalb der API vonstatten geht: Man erstellt sich ein generisches DataRequest-Object, fügt spezifische Requests hinzu (in meinem Falle einen AppData Request), und sendet ihn ab. Die ganze req.add-Geschichte läuft dabei wie folgt:</p>
<p>Die Methode &#8216;add&#8217; der DataRequest-Klasse verlangt zwei Argumente, nämlich den eigentlichen, spezifischen Request, sowie einen Namen, unter dem man das Ergebnis des Requests in seinem DataResult-Object ansprechen möchte. Da wir in diesem Falle aber auf ein Result-Handling verzichten, schreibe ich dazu später mehr.</p>
<p>Interessant ist aber das spezifische Request-Object, welches ich als erstes Attribut übergebe. Dies ist nämlich vom Typen &#8220;UpdatePersonAppData&#8221;. Das tut &#8211; oh Wunder &#8211; nichts anderes, als Daten, die sowohl Personen- als auch Anwendungsbezogen sind, in die Persistenzschicht der API zu schreiben / aktualisieren. Das erste Argument gibt dabei die ID der Person, auf die diese Daten bezogen werden, an. Eine von zwei Spezial-Personen-IDs ist &#8220;VIEWER&#8221;, also ein abstrakte Bezeichnung für die Person, die gerade mit dem Gadget interagiert (die andere Spezial-ID ist &#8220;OWNER&#8221;, aber dazu an anderer Stelle mehr)</p>
<p>Als Zweites übergeben wir einen String als Namen für das Feld. Den brauchen wir, um später die Inhalte vernünftig zuordnen zu können. Stellt es euch vor, wie einen Key in einem benamten Array; oder, simpler aber falscher, als einer Art Variablennamen.</p>
<p>Der Dritter Parameter ist der Inhalt, der gespeichert werden soll. Das ist in diesem Fall ein String (der Inhalt der Textarea), darf aber auch z.B. ein Array oder gar ein komplexes Objekt sein.</p>
<p>Nachdem wir unseren Request hinzugefügt haben, schicken wir ihn einfach mit der Methode &#8220;send()&#8221; ab, und schon weiß Google, was wir gerade in unsere Textarea geschrieben haben.</p>
<h2>3. Lesen</h2>
<p>So ein Pastebin wäre natürlich unglaublich sinnlos, wenn man seine Inhalte nicht auch wieder auslesen könnte.</p>
<p>Ich will, dass beim Laden des Gadgets meine Inhalte vom Google-Server ausgelesen und in die Textarea eingefügt werden. Der erste Teil ist also, eine Aktion beim Laden des Gadgets anzustoßen. Wie das geht, haben wir schon im ersten Teil gesehen, nämlich:</p>
<pre class="brush: jscript; title: ; notranslate">

gadgets.util.registerOnLoadHandler(getPersistantPasteData);
</pre>
<p>Diese Zeile kommt wie gehabt einfach ans Ende unseres Script-Blocks.</p>
<p>Was kann aber diese Funktion, getPersistantPasteData?</p>
<pre class="brush: jscript; title: ; notranslate">
function getPersistantPasteData() {
  var idspec = opensocial.newIdSpec({ &quot;userId&quot; : &quot;VIEWER&quot;,
                                      &quot;groupId&quot; : &quot;SELF&quot; });
  var req = opensocial.newDataRequest();
  req.add(
    req.newFetchPersonRequest(&quot;VIEWER&quot;),
    &quot;viewer&quot;);
  req.add(
    req.newFetchPersonAppDataRequest(idspec, &quot;pasteContent&quot;),
    &quot;pastedata&quot;);

  req.send( pasteDataRetreiveHandler );
 }
</pre>
<p>Was an dieser Funktion jetzt wirklich neu ist, ist das sogenannte ID-Spektrum. Damit gebe ich einen Bereich vor, mit welchen IDs ich später arbeiten möchte. Da ich nur für mich selbst die Daten erfragen will, setze ich die User-ID auf die Pseudo-ID &#8220;VIEWER&#8221;, und die Gruppen-ID auf die Pseudo-ID &#8220;SELF&#8221;. Alternativ könnte man als zweiten Parameter auch dinge wie &#8220;FRIENDS&#8221; angeben, womit man die Daten aller Freunde des Viewers abfragen würde. Das ist mir aber momentan noch zu unheimlich.</p>
<p>Dass ich jetzt zwei mal mit der Add-Methode einen Request hinzufüge, hat gleich mehrere Gründe: Zum einen brauchen wir beide Informationen; zum anderen will ich für beide Requests nur einmal das Ergebnis behandeln müssen.</p>
<p>Warum brauchen wir beide Infos?</p>
<p>Der zweite Request ist wahrscheinlich einfacher erklärt: Er liefert uns die Daten, die wir in der Persistenzschicht unter dem Schlüssel &#8220;pasteContent&#8221; eingelagert haben, und zwar für alle im ID-Spektrum definierten User (Also derzeit nur der Viewer). In unserem Result-Objekt wird uns dieser Datensatz unter dem Schlüssel &#8220;pastedata&#8221; zur verfügung stellen. Soweit noch klar?</p>
<p>Der erste Request, der FetchPersonRequest nämlich, brauchen wir, damit wir endlich die echte ID des VIEWERs erfahren. Die Pseudo-ID wird nämlich unbrauchbar, wenn man sich mal die Datenstruktur ansieht, die so ein FetchPersonAppDataRequest zurückgibt:</p>
<pre class="brush: plain; title: ; notranslate">

0000123456789 = Object {

pasteData = 'Hallo, ich bin dein persönlicher Paste-Inhalt'

}
</pre>
<p>Allem voran geht also ein Object, das nach unserer ID benannt ist, welches wir also gleich in unserem Result-Handler ansprechen müssen. Und dazu brauchen wir die Viewer-ID. Aye?</p>
<p>Der Parameter, den ich der send()-Methode mitgebe, ist übrigens der Name der Result Handler Funktion.</p>
<h2>4. Ergebnisbehandlung</h2>
<p>Und eben dieser Result-Handler fehlt uns noch. Was müssen wir machen?</p>
<ul>
<li>Wir müssen gucken, ob der Request erfolgreich war oder nicht.</li>
<li>Wir müssen an unsere Viewer-ID kommen</li>
<li>Wir müssen wissen, welche Paste-Daten für diesen User gespeichert sind.</li>
</ul>
<pre class="brush: jscript; title: ; notranslate">
var viewerObject = null;
function pasteDataRetreiveHandler(response) {
  if (response.hadError()) {
    /* the fetch failed ... insert code to handle the error */
  } else {
    var viewer = response.get(&quot;viewer&quot;);
    viewerObject = viewer.getData();

    var data = response.get(&quot;pastedata&quot;).getData();
    var pasteData = data[viewerObject.getId()];
    document.getElementById(&quot;pastearea&quot;).innerHTML = pasteData.pasteContent;
  }
}
</pre>
<p>Argh. Viel Zeug.</p>
<p>Nun gut. Weil ich nicht bei jedem verdammten Request meinen Viewer abfragen möchte, deklariere ich eine Variable &#8220;viewerObject&#8221;, die uns zur ganzen Laufzeit zur Verfügung stehen soll. Dann beginnt die eigentliche Funktion.</p>
<p>Wie auch im HTTP-Request-Result-Handling aus Teil 1 wird der Result-Handler automatisch mit dem Response-Object gefüttert. Das überprüfe ich zunächst auf einen Fehler (z.B. wenn ich noch keine Daten gespeichert habe o.ä.). Ein Error Handling erspare ich uns allen an dieser Stelle.</p>
<p>Interessant wird jetzt aber, wie man mit den beiden unterschiedlichen, im gleichen Schritt ausgeführten Request-Typen umgeht: Die in Schritt 3 (funktion getPersistantPasteData) definierten Namen für die Requests kann ich jetzt nutzen, um gezielt die Informationen aus meinem Response-Object zu bekommen &#8211; und zwar mit einem einfachen get(&#8220;viewer&#8221;) für den &#8220;viewer&#8221;-Request. Das dadurch erstellte Objekt  &#8216;viewer&#8217; ist aber auch nochmal ein wenig verschachtelt und zeigt uns erst mit Aufruf der Methode getData() seinen wahren Kern &#8211; ein Objekt vom Typen <a href="http://wiki.opensocial.org/index.php?title=Opensocial.Person_%28v0.8%29" target="_blank">opensocial.Person</a>, das Kernobjekt, das Alles-Monster des Social Networkings.</p>
<p>Um an den Inhalt des Ergebnisses meines zweiten Requests, &#8220;pastedata&#8221;, zu kommen, kürze ich die zwei Schritte ab und rufe direkt die getData() Methode auf, ohne vorher noch ein Hilfsobjekt zu behelligen.</p>
<p>Weiter Oben habe ich die Datenstruktur dieses Objekts beschrieben. Danach lassen sich auch die folgenden Zeilen erklären: &#8216;data&#8217; ist das Objekt, viewerObject.getId() gibt mir den benötigten Schlüssel. Und auf der nächsten Ebene steht mein String mit dem Bezeichner &#8216;pasteContent&#8217;, den ich schließlich in meine Textarea pumpe.</p>
<p>Fertig. Doch recht einfach, oder?<br />
Ach ja, und hier nochmal <a href='http://www.lukx.de/wp-content/uploads/2009/12/pastebin-1.xml_.txt'>das fertige Listing</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lukx.de/blog/2009/12/opensocial-google-gadgets-api-teil-2-persistent-speichern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSocial / Google Gadgets API: Teil 1 &#8211; Grundlagen</title>
		<link>http://www.lukx.de/blog/2009/12/opensocial-google-gadgets-api-teil-1-grundlagen/</link>
		<comments>http://www.lukx.de/blog/2009/12/opensocial-google-gadgets-api-teil-1-grundlagen/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 22:24:56 +0000</pubDate>
		<dc:creator>Lukx</dc:creator>
				<category><![CDATA[OpenSocial]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[gadget]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[lokalisten]]></category>
		<category><![CDATA[meinvz]]></category>
		<category><![CDATA[schuelervz]]></category>
		<category><![CDATA[studivz]]></category>
		<category><![CDATA[xing]]></category>

		<guid isPermaLink="false">http://www.lukx.de/?p=32</guid>
		<description><![CDATA[Gadgets und Applikationen in Social Networks wie StudiVZ, Xing und Lokalisten.de sind das nächste große Ding im Web 2.0. Im Selbstversuch erlerne ich die Google Gadget und OpenSocial-API und alles drum und dran. Hier möchte ich zeigen, wie ich auf meinem Weg zum Gadget Developer vorankomme und wie man solche Gadgets überhaupt baut. In Teil [...]]]></description>
			<content:encoded><![CDATA[<p>Gadgets und Applikationen in Social Networks wie <a href="http://www.studivz.net">StudiVZ</a>, <a href="http://www.xing.com/">Xing </a>und <a href="http://www.lokalisten.de">Lokalisten.de</a> sind das nächste große Ding im Web 2.0. Im Selbstversuch erlerne ich die Google Gadget und OpenSocial-API und alles drum und dran. Hier möchte ich zeigen, wie ich auf meinem Weg zum Gadget Developer vorankomme und wie man solche Gadgets überhaupt baut.</p>
<p>In Teil 1 dieser Reihe zeige ich, wie man ein recht simples Gadget erstellt, das Inhalte per Request von einer dritten (nämlich normalerweise Deiner eigenen) Seite empfängt.</p>
<p>(Ach ja, und Leute, die das alles nicht lesen, sondern nur das Beispiel haben wollen, um selbst draus schlau zu werden, können sich auch den <a href="http://www.lukx.de/wp-content/uploads/2009/12/myfirstgadget.xml_.txt">Ergebniscode im Ganzen ansehen.</a>)</p>
<p><span id="more-32"></span>OpenSocial Gadgets sind kleine webbasierte Applikationen, die man in eine Reihe von Social Networks einbinden kann. Auf Facebook sind ähnliche Applikationen seit einiger Zeit sehr beliebt, studiVZ zieht am 07.12.2009 mit einer Implementierung des OpenSocial-Frameworks nach. Voraussetzung zur Entwickung solcher Gadgets sind solide Grundlagen über HTML, Javascript und AJAX, später ist sicherlich eine serverseitige Sprache wie PHP sinnvoll. Außerdem braucht ihr einen offen zugänglichen Webspace (der dann später auch die besagte serverseitige Sprache unterstützt).</p>
<h2>1. Die Testumgebung</h2>
<p>Irgendwo muss uns ja das <a href="http://www.opensocial.org/" target="_blank">OpenSocial</a>-Framework zur Verfügung stehen, damit wir sinnvoll entwickeln und testen können. Hier bieten einige Social Networks, so auch StudiVZ, eigens eine Developer Sandbox an. Doch bis man sich dort angemeldet hat, dauert; und der Deploy erfolgt meines Wissens aufwändig als gepacktes Archiv auf irgendwelche studiVZ-Server.</p>
<p>Da kommt uns doch ganz gelegen, dass Google ein bisschen weniger restriktiv ist, und jeden alle möglichen Gadgets ganz einfach per Feed in seine iGoogle-Startseite einbinden lässt. Solltest du also noch keinen Google Account haben, ist jetzt der richtige Augenblick gekommen, dich zu registrieren und mit iGoogle, der anpassbaren Google Startseite vertraut zu machen. Ich warte hier so lange.</p>
<h2>2. Der Aufbau</h2>
<p>Bereit? Gut. Auch wenn ich es eigentlich überspringen wollte, eignet sich ein klassisches Hello-World-Beispiel doch recht gut, um den Aufbau eines jeden Gadgets zu zeigen. Das ist nämlich zunächst nichts anderes als eine XML-Datei:</p>
<pre class="brush: xml; title: ; notranslate">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;Module&gt;
  &lt;ModulePrefs title=&quot;Mein erstes Gadget&quot;&gt;
    &lt;Require feature=&quot;dynamic-height&quot; /&gt;
    &lt;Require feature=&quot;opensocial-0.8&quot;/&gt;
  &lt;/ModulePrefs&gt;
  &lt;Content type=&quot;html&quot;&gt;
    &lt;![CDATA[
       &lt;p&gt;Hello World&lt;/p&gt;
    ]]&gt;
  &lt;/Content&gt;
&lt;/Module&gt;
</pre>
<p>Was da passiert? Ganz einfach!</p>
<p>Innerhalb des &lt;Module&gt;-Tags finden sich die Knoten &lt;ModulePrefs&gt; (&#8220;Moduleinstellungen&#8221;). Dort wird als Attribut der Name des Gadgets geliefert. Anschließend legen wir fest, dass das Gadget nur eingebettet werden darf auf Seiten, die uns das Feature &#8220;dynamic-height&#8221; sowie die &#8220;opensocial-0.8&#8243;-API bereitstellen.</p>
<p>Der Content mit dem darin enthaltenen CDATA-Block ist im Prinzip nichts anderes als der &lt;Body&gt;-Konten in HTML und wird später &#8211; wer hätte es gedacht &#8211; allen Inhalt und alles Javascript des Gadgets enthalten. Speichern wir das ganze doch mal auf unserem Webspace als &#8220;myfirstgadget.xml&#8221;.</p>
<div id="attachment_45" class="wp-caption alignleft" style="width: 150px"><a href="http://www.lukx.de/wp-content/uploads/2009/12/addxmltogoogle.jpg"><img class="size-medium wp-image-45 " title="Gadget-XML zur iGoogle-Seite hinzufügen" src="http://www.lukx.de/wp-content/uploads/2009/12/addxmltogoogle-280x300.jpg" alt="Gadget-XML zur iGoogle-Seite hinzufügen" width="140" height="150" /></a><p class="wp-caption-text">Gadget-XML zur iGoogle-Seite hinzufügen</p></div>
<h2>3. Der erste Test</h2>
<p>In iGoogle siehst du oben rechts den Link &#8220;Gadgets hinzufügen&#8221;. Dahinter verbirgt sich eine Auswahlseite, die uns wiederum einen Link zum Hinzufügen von Gadgets oder Feeds via URL bereitstellt. Draufklicken, URL zum soeben erstellten XML hineinpasten, hinzufügen und gut is&#8217;.</p>
<p>Schau doch mal, was deine Startseite jetzt sagt! Buenos Dias, Mundo!</p>
<p>Und Mundo bist in diesem Falle du.</p>
<h2>4. Requesting</h2>
<p>Wir wollten ja ein Gadget bauen, das seinen Inhalt dynamisch per HTTP-Request erhält. Das klingt nach AJAX, ist es irgendwie auch. Passiert also in Javascript. Fügen wir also den folgenden Script-Block unter den öffnenden &lt;Content&gt;-Tag in unserem Beispiel ein:</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot;&gt;
function init() {
    var params = {};
    params[gadgets.io.RequestParameters.CONTENT_TYPE]
                        = gadgets.io.ContentType.TEXT;
    params[gadgets.io.RequestParameters.REFRESH_INTERVAL] = 5;
    var requestUri = &quot;http://www.example.org/apitest.php?random=&quot;
                        + Math.floor(Math.random()*11);
    gadgets.io.makeRequest(requestUri, testApiResultHandler, params);
}
function testApiResultHandler(data) {
    document.getElementById('articleText').innerHTML = data.text;
    gadgets.window.adjustHeight();
}
gadgets.util.registerOnLoadHandler(init);

&lt;/script&gt;
</pre>
<p>Wieder einmal: Was passiert hier?</p>
<p><strong>Erstens</strong> erstelle ich eine Funktion init(). Die ist für den eigentlichen Request zuständig. Wie aus der <a href="http://wiki.opensocial.org/index.php?title=JavaScript_API_Reference" target="_blank">OpenSocial-API-Referenz</a> ersichtlich, wird der HTTP-Request mit der gadgets.io-Klasse vollzogen und darf eine Zielurl, eine Callback-Funktion und Parameter als Argumente erhalten. Ein passende instanz der gadget-Klasse stellt mir das Framework übrigens automatisch bereit.</p>
<p>Bauen wir uns also zunächst die Parameter zusammen. Hinter den langen Konstantennamen, die dem params-Objekt als Keys mitgegeben werden, stehen gültige Schlüssel aus dem Optionenkatalog der gadgets.io-Klasse. Ich definiere also, dass ich als Content-Type für die Antwort meines Requests simplen Text erwarte.</p>
<p>Außerdem stelle ich klar, dass Google die Request-Antwort für maximal 5 Sekunden cachen darf. Dieser Wert ist für Developmentzwecke super, kann aber im Livebetrieb extrem serverauslastend wirken. Denkt daran! Das Framework gibt uns schon eine Spitzenmöglichkeit, einfach zu cachen, so sollte man sie auch benutzen.</p>
<p>In der requestUri-Variablen steht &#8211; welch Wunder &#8211; die Adresse, an die der Request gehen soll. Ich füge außerdem eine Zufallszahl als Get-Parameter an, sodass noch einmal das Caching wunderbar umgangen wird.</p>
<p>Schließlich rufe ich mit der makeRequest-Methode der gadgets.io-Klasse den tatsächlichen Request auf. Das erste und letzte Argument kennt ihr bereits, der zweite ist der Name der Callbackfunktion, also der Funktion, die aufgerufen wird, wenn der Request eine Antwort geliefert hat.</p>
<p>Die <strong>Zweite</strong> Funktion wird aufgerufen, nachdem wir eine Antwort auf unseren Request erhalten haben. Der Wert für &#8220;data&#8221; wird uns reingeschmissen und enthält das Result-Object &#8211; und das, ohne dass wir noch etwas dafür tun müssen!</p>
<p>Wir könnten &#8220;data&#8221; an dieser Stelle einmal im Firebug inspizieren &#8211; außer dem später benutzen Attribut &#8220;text&#8221; gibt es nämlich noch ein paar andere, wie den HTTP-Statuscode der Antwort und mehr. Doch dazu ein anderes Mal.</p>
<p>Jetzt injizieren wir nämlich erstmal die Response in unser DOM, nämlich in ein Element mit der ID &#8220;articleText&#8221;. Das solltet Ihr natürlich erstellen, zum Beispiel als &lt;div&gt; unterhalb des &#8220;Hello World!&#8221;-Containers. Als neuen Inhalt für dieses Element dient &#8211; wie gerade angedeutet &#8211; der Inhalt des &#8220;text&#8221;-Attributs von &#8220;data&#8221;.</p>
<p>Die letzte Zeile dieser Funktion greift wieder auf die gadgets-API zurück, um die Höhe des Gadgets (z.B. auf der iGoogle-Startseite) automatisch dem Inhalt anzupassen. Genau dafür brauchten wir nämlich auch die erste RequireFeature-Zeile im Grundgerüst.</p>
<p>Schnell den onLoadHandler definiert (ebenfalls aus der gadgets-API): Hier wird gesagt, dass die Funktion &#8220;init&#8221; aufgerufen werden soll, sobald das Gadget geladen wird.</p>
<p>Fertig. Wenn das zu schnell ging, könnt ihr euch <a href="http://www.lukx.de/wp-content/uploads/2009/12/myfirstgadget.xml_.txt">das gesamte Listing nochmal ansehen.</a></p>
<h2>5. Und Serverseitig?</h2>
<p>Diejenigen, die schonmal mit AJAX-Technologien gearbeitet haben wird es kaum wundern &#8211; meine apitest.php, die der Request in meinem Beispiel aufruft, macht nichts anderes, als irgendwelchen Content auszugeben (z.B. in PHP per &#8216;echo&#8217;). Das bedeutet &#8211; statt auf eine .php-Datei zu requesten, könnten wir auch jede beliebige HTML-Datei oder was auch immer anfragen. Cool, aye? Ein Beispiel dazu wäre:</p>
<pre><code>&lt;?php echo "Schau, der Server spricht mit mir!"; ?&gt;</code></pre>
<h2>6. Außerdem beachten</h2>
<p>Irgendwie wird anscheinend doch mehr gecached, als man denkt. Daher nicht verzweifeln, wenn die neueste Änderung immer noch nicht zum richtigen Ergebnis geführt hat, sondern ein Käffchen kochen und danach nochmal auf F5 drücken <img src='http://www.lukx.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>In Teil 2 speichere ich Daten, die ein Benutzer in meinem Gadget eingeben kann, um einen einfachen Notizzettel zu basteln.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lukx.de/blog/2009/12/opensocial-google-gadgets-api-teil-1-grundlagen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>nVidia ION und Debian Lenny</title>
		<link>http://www.lukx.de/blog/2009/08/nvidia-ion-und-debian-lenny/</link>
		<comments>http://www.lukx.de/blog/2009/08/nvidia-ion-und-debian-lenny/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 19:14:14 +0000</pubDate>
		<dc:creator>Lukx</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[asrock]]></category>
		<category><![CDATA[betriebssystem]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[driver]]></category>
		<category><![CDATA[grafik]]></category>
		<category><![CDATA[graphic]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[Ion]]></category>
		<category><![CDATA[Lenny]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Nvidia]]></category>
		<category><![CDATA[treiber]]></category>

		<guid isPermaLink="false">http://www.lukx.de/?p=21</guid>
		<description><![CDATA[This article describes how to install nvidia drivers on Debian Lenny. Drop a comment if you would like me to translate this into english, too! So. Mein ASROCK ION 330 ist ja seit nunmehr 4 Tagen da. Nachdem ich am Dienstagabend Debian Lenny draufgespielt habe, gab es nun heute endlich die Grafiktreiber für den ION-Chipsatz [...]]]></description>
			<content:encoded><![CDATA[<p><em>This article describes how to install nvidia drivers on Debian Lenny. Drop a comment if you would like me to translate this into english, too!</em></p>
<p>So. Mein <a href="http://www.asrock.com/nettop/overview.asp?Model=ION%20330">ASROCK ION 330</a> ist ja seit nunmehr 4 Tagen da. Nachdem ich am Dienstagabend Debian Lenny draufgespielt habe, gab es nun heute endlich die Grafiktreiber für den ION-Chipsatz installiert. Damit ihr nicht ähnlich wie ich ahnungslos und ohne Ansatz dasteht, gibt&#8217;s hier die Schritte, die mich zum Erfolg geführt haben:<br />
<span id="more-21"></span></p>
<h2>0. Vorneweg</h2>
<p>Vorweg sei gesagt, dass ich die Infos hauptsächlich aus den folgenden Quellen habe:</p>
<p>1.) http://desiato.tinyplanet.ca/~lsorense/debian/debian-nvidia-dri-howto.html<br />
2.) http://wiki.debian.org/NvidiaGraphicsDrivers<br />
3.) http://www.debianhelp.co.uk/nvidia.htm</p>
<p>Im Folgenden gibt&#8217;s also nur eine zusammengewürfelte Anleitung, die bei mir zum Erfolg geführt hat.<br/><br />
Edit vom 08.08.2009: Außerdem hat mich der Systemadministrator meines Vertrauens darauf hingewiesen, dass die Benutzung von proprietären Treibern den Linux-Kernel beeinflussen kann (und in diesem Fall auch tut) und es somit zu späteren Zeitpunkten schwierig machen kann, dein System zu debuggen oder schlichtweg das Ding zu installieren. Unter (Quelle 2) ist beschrieben, wie man die Treiberinstallation rückgängig macht.</p>
<h2>0,5. Achja: Das NVIDIA-Install-Tool</h2>
<p>Solltet Ihr euch die Treiber von nvidia.com heruntergeladen haben, vergesst sie. Sie bestehen in einer Datei, dessen Name mit &#8220;NVIDIA&#8221; anfängt und mit &#8220;.run&#8221; aufhört. Diese Datei macht viel Müll und führt sowieso zu nix. Sollte das trotzdem schon irgendwas bei euch gemacht haben, seid so gut und entfernt es wie unter (<a href="http://desiato.tinyplanet.ca/~lsorense/debian/debian-nvidia-dri-howto.html" target="_blank">Quelle 1</a>) beschrieben.</p>
<h2>1. Die aptitude-Quellserverliste anpassen</h2>
<p>Normalerweise kennt das Debian Installationsprogramm &#8220;apt&#8221; (oder aptitude) nach einer Standard Lenny-Installation keine Quellen, die Unfreie Software halten (z.B. Closed-Source). Das müssen wir jetzt ändern.</p>
<ol>
<li>Öffne die Datei <em>/etc/apt/sources.list</em> (als root, versteht sich)</li>
<li>Schau nach, ob du die Wörter &#8220;non-free&#8221; UND &#8220;contrib&#8221; in einer der zahlreichen Zeilen erhaschen kannst</li>
<li>Wenn Nicht: Füge folgende zwei Zeilen ein:
<pre><code> deb  ftp://download.xs4all.nl/pub/mirror/debian/ stable main non-free contrib
 deb-src ftp://download.xs4all.nl/pub/mirror/debian/ stable main non-free contrib</code></pre>
<p>Speichere und schließe die Datei</li>
<li>Sag apt(-itude), dass es seine neuen Listen holen soll:
<pre><code># aptitude update
</code></pre>
</li>
</ol>
<h2>2. Die relevanten Dateien herunterladen</h2>
<p>Der Nvidia-Treiber läuft nur mit einem 2.4 oder 2.6-Kernel. Mit</p>
<pre><code># uname -a</code></pre>
<p>findest du heraus, ob du den auch hast.</p>
<p>Jetzt laden wir die Pakete, die wir so brauchen, herunter:</p>
<pre><code># aptitude install nvidia-kernel-common module-assistant</code></pre>
<p>Da wir ja einen Debian-Kernel verwenden, brauchen wir nun noch folgenden Befehl: (Für Leute mit eigenen Kernels: Ihr habt doch eh mehr Ahnung als ich <img src='http://www.lukx.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> )</p>
<pre><code># m-a -i prepare</code></pre>
<h2>3. Das Kernelmodul kompilieren und installieren</h2>
<p>Geht mit den folgenden zwei Befehlen:</p>
<pre><code># m-a a-i -i -t -f nvidia-kernel
# depmod -a</code></pre>
<h2>4. Die eigentliche Installation</h2>
<p>Danach installieren wir noch ein paar benötigte Pakete:</p>
<pre><code># apt-get install nvidia-glx nvidia-glx-dev xserver-xorg</code></pre>
<h2>5. Den XServer konfigurieren</h2>
<p>Da ich eine frische Installation von Debian Lenny hatte, war meine <em>/etc/X11/xorg.conf</em> noch leer. Daher konnte ich bedenkenlos die gleich folgenden Schritte ausführen. Sollte Eure xorg.conf nicht leer sein, schaut doch bitte <a href="http://wiki.debian.org/NvidiaGraphicsDrivers#config-manual" target="_blank">hier.</a></p>
<p>Für alle anderen gibt&#8217;s was Einfacheres, was laut (Quelle2) aber aus irgendeinem Grund nicht empfohlen wird. Anyway, bei mir hat diese Methode wunderbar geklappt:</p>
<p>Dazu brauchen wir das nvidia xorg-configuration tool:</p>
<pre><code># aptitude install nvidia-xconfig
# nvidia-xconfig</code></pre>
<p>Dieser Befehl wird eine grundlegende xorg.conf-Datei anlegen, die man anschließend bearbeiten kann &#8211; wenn man will.<br />
Nachdem ich herausgefunden habe, dass in der neuen xorg.conf die Zeile</p>
<pre><code>Driver "nvidia"</code></pre>
<p>schon vorhanden ist, habe ich festgestellt, dass ich die xorg.conf nicht mehr bearbeiten will. Aber: Jeder, wie er mag.</p>
<h2>6. Den XServer neu starten</h2>
<p>Gut, gut. Nachdem wir soweit sind, müssen wir den XServer neu starten. Das habe ich gemacht mit:</p>
<pre><code># /etc/init.d/gdm stop</code></pre>
<p>, gewartet, dann</p>
<pre><code># /etc/init.d/gdm start</code></pre>
<p>Wenn alles getan hat, sollte beim Start des XServers ein NVidia-Logo erscheinen. Dann: Bier öffnen, freuen.</p>
<p>Wenn nicht, kommt ihr zurück auf die Konsole&#8230; Doof. Dann die xorg.conf manuell zurücksetzen (entweder wieder komplett leer machen, oder aber euer Backup zurückspielen). Woran lag&#8217;s? Keine Ahnung! Sorry.</p>
<p>Einen letzten Test, ob die Harwarebeschleunigung tut, machen wir wie folgt:</p>
<pre><code># glxinfo |grep rendering</code></pre>
<p>Viel Erfolg!<br />
Lasst mir gerne einen Kommentar da, ob&#8217;s geklappt hat.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lukx.de/blog/2009/08/nvidia-ion-und-debian-lenny/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Microsoft stellt unixoides Betriebssystem vor</title>
		<link>http://www.lukx.de/blog/2009/05/microsoft-stellt-unixoides-betriebssystem-vor/</link>
		<comments>http://www.lukx.de/blog/2009/05/microsoft-stellt-unixoides-betriebssystem-vor/#comments</comments>
		<pubDate>Wed, 27 May 2009 09:32:23 +0000</pubDate>
		<dc:creator>Lukx</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[betriebssystem]]></category>
		<category><![CDATA[garnix]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[satire]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.lukx.de/?p=13</guid>
		<description><![CDATA[Steve Ballmer, CEO bei Microsoft, stellte heute das neue Microsoft-Betriebssystem garNIX vor. Es basiert auf einem UNIX-Kernel und ist in weiten teilen Open-Source. Screenshots gibt es nach einem Klick auf &#8220;continued&#8221; Der Geschäftsführer von Microsoft, Steve Ballmer, stellte heute das neue Betriebssystem Microsoft garNIX vor. Es soll, im gegensatz zum ebenfalls kurz vor dem Release [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_14" class="wp-caption alignright" style="width: 160px"><a href="http://www.lukx.de/wp-content/uploads/2009/05/garnixlogo.gif"><img class="size-thumbnail wp-image-14" title="garnixlogo" src="http://www.lukx.de/wp-content/uploads/2009/05/garnixlogo-150x117.gif" alt="Logo des neuen Microsoft-OS garNIX" width="150" height="117" /></a><p class="wp-caption-text">Logo des neuen Microsoft-OS garNIX</p></div>
<p>Steve Ballmer, CEO bei Microsoft, stellte heute das neue Microsoft-Betriebssystem garNIX vor. Es basiert auf einem UNIX-Kernel und ist in weiten teilen Open-Source.</p>
<p>Screenshots gibt es nach einem Klick auf &#8220;continued&#8221;</p>
<p><span id="more-13"></span>Der Geschäftsführer von Microsoft, Steve Ballmer, stellte heute das neue Betriebssystem Microsoft garNIX vor. Es soll, im gegensatz zum ebenfalls kurz vor dem Release stehenden Windows 7, eine Zielgruppe ansprechen, die auf eine möglichst einfache Oberfläche angewiesen ist, wie z.B. Rentner und PC-Neulinge ohne Vorkenntnisse. Das System ist denkbar schlicht gehalten, soll aber im Funktionsumfang mit Microsofts Flop-OS Vista mithalten können. Ballmer verspricht 99,9%ige Stabilität. Selbst nach einem möglichen Absturz soll die Oberfläche ohne weiteres auf den Stand vor dem Problem zurückgesetzt werden. Neben dem Namen, dem Konzept und dem Logo des neuen Betriebssystems zeigte Ballmer der informationshungrigen Presseschar außerdem einige Screenshots, die die Simplizität des Systems unterstreichen:</p>
<div id="attachment_15" class="wp-caption alignnone" style="width: 310px"><a href="http://www.lukx.de/wp-content/uploads/2009/05/screenshot.jpg"><img class="size-medium wp-image-15" title="screenshot" src="http://www.lukx.de/wp-content/uploads/2009/05/screenshot-300x225.jpg" alt="Login-Bildschirm" width="300" height="225" /></a><p class="wp-caption-text">Login-Bildschirm</p></div>
<div id="attachment_15" class="wp-caption alignnone" style="width: 310px"><a href="http://www.lukx.de/wp-content/uploads/2009/05/screenshot.jpg"><img class="size-full wp-image-15" title="screenshot" src="http://www.lukx.de/wp-content/uploads/2009/05/screenshot.jpg" alt="Startmenü" width="300" height="225" /></a><p class="wp-caption-text">Startmenü</p></div>
<div id="attachment_15" class="wp-caption alignnone" style="width: 310px"><a href="http://www.lukx.de/wp-content/uploads/2009/05/screenshot.jpg"><img class="size-full wp-image-15" title="screenshot" src="http://www.lukx.de/wp-content/uploads/2009/05/screenshot.jpg" alt="Konfigurationsmenü und Dateiexplorer" width="300" height="225" /></a><p class="wp-caption-text">Konfigurationsmenü und Dateiexplorer</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.lukx.de/blog/2009/05/microsoft-stellt-unixoides-betriebssystem-vor/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

