<?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>ADI64 feat. n0stradamus &#187; do it yourself</title>
	<atom:link href="http://adrian.holfter.de/blog/tag/do-it-yourself/feed/" rel="self" type="application/rss+xml" />
	<link>http://adrian.holfter.de/blog</link>
	<description>Reiche Eltern für alle!</description>
	<lastBuildDate>Wed, 04 Jan 2012 22:47:27 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Reconnect Skript für Level One WBR-6600</title>
		<link>http://adrian.holfter.de/blog/2011/11/wbr6600-reconnect/</link>
		<comments>http://adrian.holfter.de/blog/2011/11/wbr6600-reconnect/#comments</comments>
		<pubDate>Fri, 11 Nov 2011 16:28:04 +0000</pubDate>
		<dc:creator>Markus</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[autoit]]></category>
		<category><![CDATA[do it yourself]]></category>
		<category><![CDATA[gpl]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[reconnect]]></category>
		<category><![CDATA[router]]></category>
		<category><![CDATA[wbr6600]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://adrian.holfter.de/blog/?p=672</guid>
		<description><![CDATA[Leider ist der Eintrag nur auf English verfügbar.]]></description>
			<content:encoded><![CDATA[<p>Leider ist der Eintrag nur auf <a href="http://adrian.holfter.de/blog/en/tag/do-it-yourself/feed/">English</a> verfügbar.</p>
]]></content:encoded>
			<wfw:commentRss>http://adrian.holfter.de/blog/2011/11/wbr6600-reconnect/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Virtual DJ mit foobar2000 kombinieren</title>
		<link>http://adrian.holfter.de/blog/2011/05/virtual-dj-mit-foobar2000-kombinieren/</link>
		<comments>http://adrian.holfter.de/blog/2011/05/virtual-dj-mit-foobar2000-kombinieren/#comments</comments>
		<pubDate>Tue, 10 May 2011 22:00:51 +0000</pubDate>
		<dc:creator>Markus</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[do it yourself]]></category>
		<category><![CDATA[fb2k]]></category>
		<category><![CDATA[flac]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[skin]]></category>
		<category><![CDATA[virtual dj]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[workaround]]></category>

		<guid isPermaLink="false">http://adrian.holfter.de/blog/?p=594</guid>
		<description><![CDATA[Leider ist der Eintrag nur auf English verfügbar.]]></description>
			<content:encoded><![CDATA[<p>Leider ist der Eintrag nur auf <a href="http://adrian.holfter.de/blog/en/tag/do-it-yourself/feed/">English</a> verfügbar.</p>
]]></content:encoded>
			<wfw:commentRss>http://adrian.holfter.de/blog/2011/05/virtual-dj-mit-foobar2000-kombinieren/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Binärbaum zeichnen</title>
		<link>http://adrian.holfter.de/blog/2011/04/binarbaum-zeichnen/</link>
		<comments>http://adrian.holfter.de/blog/2011/04/binarbaum-zeichnen/#comments</comments>
		<pubDate>Wed, 13 Apr 2011 14:52:04 +0000</pubDate>
		<dc:creator>n0stradamus</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[do it yourself]]></category>
		<category><![CDATA[n0stradamus]]></category>

		<guid isPermaLink="false">http://adrian.holfter.de/blog/?p=465</guid>
		<description><![CDATA[In diesem Artikel möchte ich ein Verfahren erklären, der einem die links abgebildete Datenstruktur ähnlich wie bei einem Aufruf des Befehls pstree ausgiebt]]></description>
			<content:encoded><![CDATA[<p>Im Rahmen dieses Artikels möchte ich ein Verfahren erklären,<img class="alignright" src="http://www.coder-wiki.de/uploads/Algorithmen/vollstaendiger-binaerbaum.png" alt="" width="143" height="100" /> das einem die rechts abgebildete Datenstruktur bereitstellt, sodass eine Ausgabe ähnlich der von <em>pstree -A</em> wäre.</p>
<p>Das fertige Ergebnis sollte folgendermaßen aussehen (In Anlehnung an den rechts dargestellten Baum &#8211; die Nummerierung erfolgt von links nach rechts):</p>
<pre>[Wurzel] + [Blatt 1, Ebene 1] + [Blatt 1, Ebene 2] + [Blatt 1, Ebene 3]
         |                    |                    ` [Blatt 2, Ebene 3]
         |                    ` [Blatt 2, Ebene 1] + [Blatt 3, Ebene 3]
         |                                         ` [Blatt 4, Ebene 3]
         `[Blatt 2, Ebene 1] + [Blatt 3, Ebene 2] + [Blatt 5, Ebene 3]
                             |                    ` [Blatt 2, Ebene 3]
                              ` [Blatt 2, Ebene 1] + [Blatt 3, Ebene 3]
                                                    ` [Blatt 4, Ebene 3]</pre>
<p><span id="more-465"></span></p>
<p>Wir zeichnen also bei jeder Verzweigung ein Plus, dann den Namen des Blattes und immer so weiter, bis ein Blatt erreicht ist, dass sich nicht mehr verzweigt. Dann wird eine neue Zeile begonnen und so lange unter jedes Plus ein &#8220;|&#8221; geschrieben, bis man wieder auf dem Level angelangt ist, zu dem das Blatt gehört. Soweit so gut, ist ja nicht so komplex.</p>
<p>Die Probleme fingen bei mir an, als ich diese Idee in Code umsetzen musste: Ich hatte eine Liste mit Objektinstanzen, aus denen ein Baum generiert werden sollte.</p>
<p>Jedes Objekt hatte drei für die Ausgabe relevante Attribute:</p>
<pre>Objekt* child1; <span style="color: #339966;">//Der Pointer auf das erste Blatt dieser Objektinstanz</span>
Objekt* child2; <span style="color: #339966;">//Der Pointer auf das zweite Blatt dieser Objektinstanz</span>
string name; <span style="color: #339966;">// Der Name dieser Objektinstanz
//Die Pointer beziehen sich jeweils auf andere, in der Liste vorhandene Instanzen.</span></pre>
<p>Also hatte ich folgende fixe Idee: Ich baue in das Objekt eine Funktion ein, die mir den String zusammenbastelt und sich, um die Verschachtelung darzustellen, wieder selbst aufruft. Damit muss ich nicht festhalten, welche Information von welchem Blatt nun ausgegeben werden soll. Fassen wir diese Idee in Pseudo-Pseudocode zusammen:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># Die Funktion erhält eine Liste, in der jeder Index eine Zeile symbolisiert</span>
<span style="color: #808080; font-style: italic;"># Zeile 1 also Index 0 usw...</span>
<span style="color: #ff7700;font-weight:bold;">def</span> generate_tree <span style="color: black;">&#40;</span>list_of_strings<span style="color: black;">&#41;</span>:
 <span style="color: #808080; font-style: italic;"># An die aktuelle Zeile den Namen unseres Blattes dranhängen</span>
 list_of_strings.<span style="color: black;">back</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span> name <span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Wenn unser Objekt ein Kind hat, dann müssen wir ein </span>
<span style="color: #808080; font-style: italic;"># Plus dranhängen und die Rekursion anstoßen.</span>
<span style="color: #808080; font-style: italic;"># Die Unterscheidung ob &quot;+&quot; oder &quot;-&quot; ist nicht notwendig, </span>
<span style="color: #808080; font-style: italic;"># sieht aber am Ende schicker aus:</span>
 <span style="color: #ff7700;font-weight:bold;">if</span> has_child1:
  <span style="color: #ff7700;font-weight:bold;">if</span> has_child2:
   list_of_strings.<span style="color: black;">back</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span> <span style="color: #483d8b;">&quot;+&quot;</span> <span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">else</span>:
   list_of_strings.<span style="color: black;">back</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;-&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;"># Hiermit starten wir die Rekursion</span>
  <span style="color: #808080; font-style: italic;"># Das Folgende soll einen Memberaufruf symbolisieren :)</span>
  child1.<span style="color: black;">generate_tree</span><span style="color: black;">&#40;</span> list_of_strings <span style="color: black;">&#41;</span>
&nbsp;
 <span style="color: #ff7700;font-weight:bold;">if</span> has_child2: <span style="color: #808080; font-style: italic;"># Ein Objekt kann ja bis zu zwei Kinder haben</span>
  buffer = <span style="color: #483d8b;">&quot;&quot;</span> <span style="color: #808080; font-style: italic;">#Einen Buffer anlegen</span>
  <span style="color: #808080; font-style: italic;"># Die Position des letzten Plusses rausfinden</span>
  p = list_of_strings.<span style="color: black;">back</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">find_last_of</span><span style="color: black;">&#40;</span> <span style="color: #483d8b;">&quot;+&quot;</span> <span style="color: black;">&#41;</span> 
  <span style="color: #808080; font-style: italic;"># Die Position des letzten Strichs rausfinden</span>
  k = list_of_strings.<span style="color: black;">back</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">find_last_of</span><span style="color: black;">&#40;</span> <span style="color: #483d8b;">&quot;|&quot;</span> <span style="color: black;">&#41;</span> 
&nbsp;
  <span style="color: #ff7700;font-weight:bold;">if</span> p <span style="color: #66cc66;">&lt;</span> k: <span style="color: #808080; font-style: italic;">#Den höheren Wert der beiden müssen wir nehmen</span>
   p = k
&nbsp;
<span style="color: #808080; font-style: italic;"># Von 0 bis p in Einerschritten durchgehen</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> i=<span style="color: #ff4500;">0</span> | i <span style="color: #66cc66;">&lt;</span>= p | i++
   <span style="color: #ff7700;font-weight:bold;">if</span> i <span style="color: #66cc66;">&lt;</span> p:
    <span style="color: #ff7700;font-weight:bold;">if</span> list_of_strings.<span style="color: black;">back</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span> == <span style="color: #483d8b;">&quot;+&quot;</span> <span style="color: #ff7700;font-weight:bold;">or</span> list_of_strings.<span style="color: black;">back</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span> == <span style="color: #483d8b;">&quot;|&quot;</span>:
     buffer.<span style="color: black;">append</span><span style="color: black;">&#40;</span> <span style="color: #483d8b;">&quot;|&quot;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
     buffer.<span style="color: black;">append</span><span style="color: black;">&#40;</span> <span style="color: #483d8b;">&quot; &quot;</span> <span style="color: black;">&#41;</span>
   <span style="color: #ff7700;font-weight:bold;">else</span> <span style="color: #ff7700;font-weight:bold;">if</span> i == p:
    buffer.<span style="color: black;">append</span><span style="color: black;">&#40;</span> <span style="color: #483d8b;">&quot;`&quot;</span> <span style="color: black;">&#41;</span>
&nbsp;
  list_of_strings.<span style="color: black;">append</span><span style="color: black;">&#40;</span> buffer <span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;"># Wieder eine Rekursion starten</span>
  <span style="color: #808080; font-style: italic;"># Das ist auch ein Memberaufruf</span>
  child2.<span style="color: black;">generate_tree</span><span style="color: black;">&#40;</span> list_of_strings <span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;"># ENDE der Funktion</span></pre></td></tr></table></div>

<p>So&#8230;diese Zeilen verlangen ein wenig nach Erklärung:<br />
Zeile 1: Wir hängen den Namen des Blattes an das letzte Element in der Liste dran. Es ist egal ob die aktuelle Instanz jetzt Wurzel ist oder nicht. Wichtig ist nur, dass die übergebene Liste nicht leer ist. Dafür muss beim Aufruf der Funktion beim Wurzelelement gesorgt sein.</p>
<p>Zeile 11-15: Hier wird nur unterschieden, ob die aktuelle Instanz ein oder zwei Blätter hat und dementsprechend das Verbindungszeichen gewählt</p>
<p>Zeile 19/20: Hier wird die Funktion <em>generate_tree</em> bei dem ersten Kind aufgerufen, mit Übergabe der auch von dieser Funktion verwendeten Liste. Dadurch ist gewährleistet, dass alle ersten Kinder des jeweils vorhergehenden Blatts in einer Zeile stehen.</p>
<p>Zeile 21: Nun ist die Funktion für das erste Kind durchgelaufen, wenn es ein zweites Kind gibt, wird es nun etwas schwieriger, einen String zusammenzubauen.</p>
<p>Zeile 22-26: Es wird ein Puffer angelegt (er wird am Ende die neue Zeile enthalten, die wir zusammengebaut haben), der Index des letzten Plusses und der Index des letzten senkrechten Striches herausgefunden. Zur Erinnerung: Striche sollten die Verzweigung über mehrere Zeilen hinweg kenntlich machen. Plusse sollten zeigen, dass dieses Blatt mehr als ein Kind hat.</p>
<p>Zeile 28-Ende: Die Zuweisung in Zeile 29 macht nur Sinn, wenn man sich die for-Schleife danach anschaut. Wir gehen jeden einzelnen Index der letzten Zeile in der Liste bis <em>p</em> durch. <em>p</em> ist der Index des letzten Plusses/letzten Striches, je nachdem welcher Index höher ist. Solange <em>i &lt; p </em> gilt, wird unter jeden Strich/jedes Plus ein weiterer Strich gehängt (indem man dieses Zeichen an den Puffer hängt). Haben wir <em>p</em> erreicht, so wird ein &#8220;`&#8221; an den Puffer gehängt, weil jetzt endlich der Name des zweiten Kindes kommen kann.<br />
Dazu hängen wir den Buffer an die Liste dran (er symbolisiert ja eine neue Zeile) und rufen <em>generate_tree</em> bei dem zweiten Kind auf, mit unserer Liste als Parameter.</p>
<p style="text-align: center;">&#8212;&#8211;</p>
<p style="text-align: left;">Eine Implementierung dieses Algorithmus in C++ könnte folgendermaßen aussehen: <a title="Beispiel-Implementierung" href="http://adrian.holfter.de/blog/wp-content/uploads/2011/04/objekt_de.cpp">*klick*</a></p>
<p>Die Funktion funktioniert allerdings nur unter zwei Bedingungen:</p>
<ul>
<li>Verwendung eines Monospace-Fonts bei der Ausgabe</li>
<li>Die übergebene Liste ist beim Aufruf der Funktion beim Wurzelelement NICHT leer. Sie muss mindestens einen leeren String enthalten.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://adrian.holfter.de/blog/2011/04/binarbaum-zeichnen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kopfhörer selbst reparieren</title>
		<link>http://adrian.holfter.de/blog/2011/02/kopfhorer-selbst-reparieren/</link>
		<comments>http://adrian.holfter.de/blog/2011/02/kopfhorer-selbst-reparieren/#comments</comments>
		<pubDate>Thu, 03 Feb 2011 15:51:14 +0000</pubDate>
		<dc:creator>Markus</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[do it yourself]]></category>
		<category><![CDATA[fix]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[kopfhörer]]></category>
		<category><![CDATA[löten]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[reparieren]]></category>

		<guid isPermaLink="false">http://adrian.holfter.de/blog/?p=387</guid>
		<description><![CDATA[Ich hatte mir auf Amazon einen 30€ Kopfhörer bestellt. Ärgerlich, dass dieser nach ungefähr einem Monat schon nicht mehr richtig funktionierte, doch wie der Titel dieses Artikels vermuten lässt, war es kein großes Problem diesen wieder zu reparieren. Genauer gesagt ging der Stecker nicht, das lies sich dadurch feststellen, dass durch drehen, bzw. leichtes Herausziehen [...]]]></description>
			<content:encoded><![CDATA[<p>Ich hatte mir auf Amazon einen 30€ Kopfhörer bestellt. Ärgerlich, dass dieser nach ungefähr einem Monat schon nicht mehr richtig funktionierte, doch wie der Titel dieses Artikels vermuten lässt, war es kein großes Problem diesen wieder zu reparieren.</p>
<p>Genauer gesagt ging der Stecker nicht, das lies sich dadurch feststellen, dass durch drehen, bzw. leichtes Herausziehen die Qualität des Audiosignals deutlich geschwankt hatte oder überhaupt nicht mehr hörbar war.</p>
<p>Falls jemand ein ähnliches Problem hat, will ich hier kurz erklären, wie man dieses lösen kann.</p>
<p><strong>Benötigt:</strong></p>
<p>- Kopfhörer mit kaputtem Stecker</p>
<p>- alter Kopfhörer, bei dem der Stecker noch geht (der Rest darf ruhig hinüber sein) mit einem ähnlichaussehenden Leiter</p>
<p>- Lötkolben</p>
<p>- Schrumpfschlauch (Tape tut es auch, sieht aber nicht so schön aus)</p>
<p>- Abisolierzange/Schere</p>
<p>- Feuerzeug</p>
<p>- Tesafilm</p>
<p><strong>Vorgehensweise:</strong></p>
<p>- Beide Kopfhörer am Leiter so abschneiden, dass die gewünschte Länge erreicht wird + etwa 2 cm auf jeder seite zum verlöten</p>
<p>- die Leiterenden von den Stücken, die verwendet werden, abisolieren mit einer Abisolierzange (oder mit einer Schere ganz leicht einschneiden und die Isolierung herunterziehen)</p>
<p>- jetzt sollten bei beiden 3 Leiter in verschiedenen Farben sichtbar sein, falls nicht, anderen Stecker verwenden wenn noch welche vorhanden sind und auch abisolieren</p>
<p>- einen Schrumpfschlauch auf ca 3 cm zuschneiden und über einen der beiden Leiter weg von dem isolierten Bereich ziehen, damit er später verwendet werden kann</p>
<p>- die drei Leiter jeweils in verschiedene Richtungen biegen und vorsichtig mit einem Feuerzeug den Lack für ca. 1,5 cm wegbrennen</p>
<p>- beide kupferfarbenen (Masse) Leiter zusammendrehen</p>
<p>- die übrigen Leiter stehen für rechts bzw. links. Welcher welcher ist muss jetzt ausprobiert werden (zwei zusammendrehen, Kopfhörer an Player anstecken, hören wo rechts und links ist z.B. indem man die Balance auf dem Player in eine Richtung schiebt)</p>
<p>- die Leiter sollten jetzt richtig zusammengedreht (tipp: drehsinn beibehalten!) sein, noch immer in 3 verschiedene Richtungen senkrecht zu dem jetzt verbundenen Leiter wegstehen und Musik sollte angeschlossen und in gewohnter, guter Qualität hörbar sein</p>
<p>-  jetzt werden diese drei verdrehten Leiter festgelötet, wobei man zur überprüfung die Musik ruhig weiterlaufen lassen kann</p>
<p>- die drei werden alle in eine Richtung (z.B. in die des Steckers) gebogen und mit Tesafilm so übereinander geklebt, dass sie jeweils komplett voneinander isoliert sind.</p>
<p>- Falls man den Schrumpfschlauch verwendet hat, wird dieser nun über die Verbindungsstelle geschoben, so dass diese vollständig abgedeckt ist</p>
<p>- Der Schrumpfschlauch wird mit dem Feuerzeug erhitzt, damit er sich zusammenzieht und die Verbindungsstelle z.B. vor Regen schützt</p>
<p>&#8230;und das wärs auch schon. Viel Spaß mit dem reparierten Kopfhörer <img src='http://adrian.holfter.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>PS: 135° Stecker halten nach meiner Erfahrung am besten.</p>
]]></content:encoded>
			<wfw:commentRss>http://adrian.holfter.de/blog/2011/02/kopfhorer-selbst-reparieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Seagate Dockstar: USB-Stick schrotten vermeiden</title>
		<link>http://adrian.holfter.de/blog/2010/10/seagate-dockstar-usb-stick-schrotten-vermeiden/</link>
		<comments>http://adrian.holfter.de/blog/2010/10/seagate-dockstar-usb-stick-schrotten-vermeiden/#comments</comments>
		<pubDate>Fri, 15 Oct 2010 17:21:29 +0000</pubDate>
		<dc:creator>ADI64</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Archlinux]]></category>
		<category><![CDATA[do it yourself]]></category>
		<category><![CDATA[Dockstar]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[USB]]></category>

		<guid isPermaLink="false">http://adrian.holfter.de/blog/?p=340</guid>
		<description><![CDATA[Ich hatte ebenfalls eine Plugbox (Archlinux für ARM-Prozessoren) -Installation auf einer Seagate Dockstar, wie im Artikel von n0stradamus hier auch gut beschrieben ist, am Laufen. Für 20€ so ein Powerhouse ist einfach saugeil Mein System lief auf einem 1GB USB-Stick und lief eigentlich ziemlich super. Lief. Ja. Das ist der Knackpunkt: Mein USB-Stick ist ziemlich [...]]]></description>
			<content:encoded><![CDATA[<p>Ich hatte ebenfalls eine Plugbox (Archlinux für ARM-Prozessoren) -Installation auf einer Seagate Dockstar, wie im <a href="http://adrian.holfter.de/blog/2010/09/archlinux-auf-der-seagate-dockstar/">Artikel von n0stradamus hier</a> auch gut beschrieben ist, am Laufen. Für 20€ so ein Powerhouse ist einfach saugeil <img src='http://adrian.holfter.de/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Mein System lief auf einem 1GB USB-Stick und lief eigentlich ziemlich super. Lief. Ja. Das ist der Knackpunkt: Mein USB-Stick ist ziemlich tot.</p>
<p><span id="more-340"></span>Das äußert sich darin, dass plötzlich irgendwelche Befehle nicht mehr tun, ich kryptische Errors um den Kopf geworfen bekomme und das System nicht mehr bootet, weil das ext2-fs so stark beschädigt ist, dass es nicht durch den routinemäßigen Check beim boot repariert werden kann, sondern manuell per e2fsck gefixt werden muss (von einem anderen pc aus).</p>
<p>Die Ursache dafür liegt darin, dass die in USB-Sticks und SD-Karten verbauten Flash-Chips zwar praktisch unendlich viele Lesevorgänge, aber nur ca. 10.000 &#8211; 100.000 Schreibzyklen pro Sektor verkraften. Das ist normalerweise absolut kein Problem, wenn man einfach nur &#8220;Daten&#8221; auf diesen Sticks zwischenspeichert. Außerdem versuchen die Hersteller meist, die Schreibvorgänge auf mehrere Sektoren zu verteilen, um ein Überschreiben von immergleichen Sektoren zu vermeiden. Letzteres kann aber natürlich nicht funktionieren, wenn der Stick quasi voll ist.</p>
<p>Wenn man aber ein Betriebssystem auf dem Stick betreibt, können diese Zyklen relativ schnell erreicht sein, vor allem durch Logfiles, Lockfiles und temporäre Daten. Auf diese Weise hat sich wie eingangs schon erwähnt mein (zugegeben ziemlich billiger und schon länger gebrauchter) USB-Stick verabschiedet.</p>
<p>Da viele Teile dermaßen beschädigt waren, dass das Reparieren verdammt aufwändig geworden wäre, habe ich das System von Neuem hochgezogen. Dabei habe ich mir die Frage gestellt: Wie kann ich vermeiden, dass das System wieder meinen Stick screwed? Als erstes kam mir die Idee, einfach das rootfs read-only zu mounten. Das hat aber zur Folge, sämtliche Schreiboperationen im RAM zu cachen. Da die Dockstar nur 128MB RAM hat, schied diese Möglichkeit aus. Als zweites kam mir die Idee, die ich jetzt auch umgesetzt habe:</p>
<h2>Flüchtige Daten in einer Ramdisk halten</h2>
<p>Das heißt, ich mounte mir einen Teil des spärlich vorhandenen RAMs als Datenträger und mappe ihn als Ersatz für die Verzeichnisse</p>
<ul>
<li>/var/log (Logfiles)</li>
<li>/var/lock (Sperr-Files)</li>
<li>/var/run (Daemon-PIDs)</li>
<li>/var/tmp (Temporäre Dateien)</li>
<li>/tmp (Temporäre Dateien).</li>
</ul>
<p>Dadurch fange ich fast alle Schreibzugriffe ab, welche im Dauerbetrieb eben anfallen. Änderungen an Configfiles etc. werden aber immernoch sofort auf den Stick geschrieben. Falls das System sich aufhängt, abstürzt oder ähnliche Scherze passieren, ist der &#8220;zusätzliche&#8221; Datenverlust also gering (nur die neueren Logfiles). Trotzdem: <strong>Hier werden einige Dateien nur im RAM vorgehalten. Wenn das System crasht oder die Daten vorm Ausschalten nicht von der Ramdisk auf den Stick gesichert werden, sind sie weg!</strong></p>
<p>Bevor ich mit der Anleitung beginne, sei hier die Seite<em> <a href="http://famvdploeg.com/blog/2008/03/putting-var-in-ram/" target="_blank">cat brain.stuff &gt; wordpress</a> </em>als Quelle genannt, da fast alle Informationen von dort stammen. Ich habe es lediglich zu Arch Linux / Plugbox Linux &#8220;geportet&#8221; und an meine Bedürfnisse angepasst.</p>
<h3>Anlegen der Verzeichnisse</h3>
<blockquote><p>mkdir /var/log-bak</p>
<p>mkdir /var/lock-bak</p>
<p>mkdir /var/run-bak</p>
<p>mkdir /var/tmp-bak</p>
<p>mkdir /tmp-bak</p>
<p>mkdir /run-bak</p>
<p>mkdir /mnt/ramdisk</p></blockquote>
<h3>Den Daemon anlegen</h3>
<p>Die Datei <em>/etc/rc.d/ramdisk</em> erstellen und folgendes hineinpasten:</p>
<blockquote><p>#!/bin/bash</p>
<p>. /etc/rc.conf<br />
. /etc/rc.d/functions</p>
<p>case &#8220;$1&#8243; in<br />
start)<br />
stat_busy &#8220;Copying files to ramdisk&#8221;</p>
<p>rm -Rf {/var/log-bak,/var/lock-bak,/var/run-bak,/var/tmp-bak,/tmp-bak,/run-bak}</p>
<p>mount &#8211;move /var/log /var/log-bak<br />
mount &#8211;move /var/lock /var/lock-bak<br />
mount &#8211;move /var/run /var/run-bak<br />
mount &#8211;move /var/tmp /var/tmp-bak<br />
mount &#8211;move /tmp /tmp-bak<br />
mount &#8211;move /run /run-bak</p>
<p>mkdir /mnt/ramdisk/var<br />
mkdir /mnt/ramdisk/var/log<br />
mkdir /mnt/ramdisk/var/lock<br />
mkdir /mnt/ramdisk/var/run<br />
mkdir /mnt/ramdisk/var/tmp<br />
mkdir /mnt/ramdisk/tmp<br />
mkdir /mnt/ramdisk/run<br />
mkdir /mnt/ramdisk/run/lock<br />
chmod 1777 /mnt/ramdisk/tmp<br />
chmod 1777 /mnt/ramdisk/var/lock<br />
chmod 1777 /mnt/ramdisk/var/tmp<br />
chmod 1777 /mnt/ramdisk/run</p>
<p>mount &#8211;bind /mnt/ramdisk/var/log /var/log<br />
mount &#8211;bind /mnt/ramdisk/var/lock /var/lock<br />
mount &#8211;bind /mnt/ramdisk/var/run /var/run<br />
mount &#8211;bind /mnt/ramdisk/var/tmp /var/tmp<br />
mount &#8211;bind /mnt/ramdisk/tmp /tmp<br />
mount &#8211;bind /mnt/ramdisk/run /run</p>
<p>cp -a -v /var/log-bak/* /var/log/ &gt;&gt; /var/log/ramdisk_sync.log<br />
cp -a -v /var/lock-bak/* /var/lock/ &gt;&gt; /var/log/ramdisk_sync.log<br />
cp -a -v /var/run-bak/* /var/run/ &gt;&gt; /var/log/ramdisk_sync.log<br />
cp -a -v /var/tmp-bak/* /var/tmp/ &gt;&gt; /var/log/ramdisk_sync.log<br />
cp -a -v /tmp-bak/* /tmp/ &gt;&gt; /var/log/ramdisk_sync.log<br />
cp -a -v /run-bak/* /run/ &gt;&gt; /var/log/ramdisk_sync.log</p>
<p>echo [`date +"%Y-%m-%d %H:%M"`] Ramdisk synced from HD &gt;&gt; /var/log/ramdisk_sync.log<br />
if [ $? -gt 0 ]; then<br />
stat_fail<br />
else<br />
add_daemon ramdisk<br />
stat_done<br />
fi<br />
;;<br />
stop)<br />
stat_busy &#8220;Switching off ramdisk, direct hdd write&#8221;<br />
rsync -av &#8211;delete /var/log/ /var/log-bak/<br />
rsync -av &#8211;delete /var/lock/ /var/lock-bak/<br />
rsync -av &#8211;delete /var/run/ /var/run-bak/<br />
rsync -av &#8211;delete /var/tmp/ /var/tmp-bak/<br />
rsync -av &#8211;delete /tmp/ /tmp-bak/<br />
rsync -av &#8211;delete /run/ /run-bak/</p>
<p># Unmount ramdisk bind<br />
umount /mnt/ramdisk/var/log<br />
umount /mnt/ramdisk/var/lock<br />
umount /mnt/ramdisk/var/run<br />
umount /mnt/ramdisk/var/tmp<br />
umount /mnt/ramdisk/tmp<br />
umount /mnt/ramdisk/run</p>
<p># Unmount move<br />
umount /var/log-bak<br />
umount /var/lock-bak<br />
umount /var/run-bak<br />
umount /var/tmp-bak<br />
umount /tmp-bak<br />
umount /run-bak</p>
<p># Deleting directories<br />
rm -Rf /mnt/ramdisk/*</p>
<p>echo [`date +"%Y-%m-%d %H:%M"`] Ramdisk synced to HD &gt;&gt; /var/log/ramdisk_sync.log<br />
if [ $? -gt 0 ]; then<br />
stat_fail<br />
else<br />
rm_daemon ramdisk<br />
stat_done<br />
fi<br />
;;<br />
sync)<br />
echo &#8220;Syncing log and lock files to harddisk&#8221;<br />
rsync -av &#8211;delete /var/log/ /var/log-bak/<br />
rsync -av &#8211;delete /var/lock/ /var/lock-bak/<br />
rsync -av &#8211;delete /var/run/ /var/run-bak/<br />
rsync -av &#8211;delete /var/tmp/ /var/tmp-bak/<br />
rsync -av &#8211;delete /tmp/ /tmp-bak/<br />
rsync -av &#8211;delete /run/ /run-bak/</p>
<p>echo [`date +"%Y-%m-%d %H:%M"`] Ramdisk synced to HD &gt;&gt; /var/log/ramdisk_sync.log<br />
;;</p>
<p>restart)<br />
$0 stop<br />
$0 start<br />
;;</p>
<p>*)<br />
echo &#8220;usage: $0 {start|stop|sync}&#8221;<br />
esac<br />
exit 0</p></blockquote>
<h3>Die /etc/fstab anpassen</h3>
<p>Dort eine Zeile hinzufügen à la</p>
<blockquote><p>tmpfs                   /mnt/ramdisk    tmpfs   size=64m        0       0</p></blockquote>
<p>Ich benutze hier bewusst tmpfs und nicht ramfs, da tmpfs bei akutem Ram-Mangel auf swap ausweicht, ramfs dies aber nicht tut. Weiterhin limitiere ich die Größe für die Ramdisk auf 64MB. Die Ramdisk wächst aber dynamisch, belegt also nur Platz, welchen sie auch braucht. Die 64MB sind nur ein grob geschätzter Maximalwert.</p>
<h3>/etc/rc.conf anpassen</h3>
<p>Hier sollte der Daemon als erster gestartet werden, damit so wenige Applikationen wie möglich den (sehr) kurzen Ausfall der oben genannten Verzeichnisse verkraften müssen. Euer DAEMONS-Array könnte also so aussehen:</p>
<blockquote><p>DAEMONS=(<strong>ramdisk </strong>syslog-ng network openntpd netfs crond sshd)</p></blockquote>
<h3>Logrotate anpassen</h3>
<p>Ein Punkt, der sich erst nach einiger Benutzung als wichtig herausgestellt hat: Die Logfiles können sehr groß werden und damit den RAM füllen. Um das zu verhindern, sollten die Logs in kurzen Zeitabständen rotiert werden.</p>
<p>Dazu passen wir die /etc/logrotate.conf an. Meine sieht so aus:</p>
<blockquote><p>daily</p>
<p>rotate 3</p>
<p>size 16M</p>
<p>create</p>
<p>compress</p>
<p>tabooext + .pacorig .pacnew .pacsave</p>
<p>include /etc/logrotate.d</p>
<p>/var/log/wtmp {</p>
<p>weekly</p>
<p>create 0664 root root</p>
<p>rotate 1</p>
<p>}</p></blockquote>
<h3>Abschließende Worte</h3>
<p>Soweit, so gut. Beim nächsten Neustart sollte euer System also nun den größten Teil der Schreiboperationen im RAM vorhalten. Ganz eilige können auch einfach den Daemon starten, es sollte auch so funktionieren. Was passiert, wenn ein Prozess genau dann der Meinung ist, ein Logfile schreiben zu müssen, wenn der Daemon gerade Verzeichnisse herumschiebt, kann ich absolut nicht vorhersagen.</p>
<p>Wenn ihr Verbesserungsvorschläge, Tipps, Kritik oder sonstigen Senf zum Zugeben habt, immer her damit.</p>
]]></content:encoded>
			<wfw:commentRss>http://adrian.holfter.de/blog/2010/10/seagate-dockstar-usb-stick-schrotten-vermeiden/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ArchLinux auf der Seagate DockStar</title>
		<link>http://adrian.holfter.de/blog/2010/09/archlinux-auf-der-seagate-dockstar/</link>
		<comments>http://adrian.holfter.de/blog/2010/09/archlinux-auf-der-seagate-dockstar/#comments</comments>
		<pubDate>Tue, 07 Sep 2010 17:02:33 +0000</pubDate>
		<dc:creator>n0stradamus</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Archlinux]]></category>
		<category><![CDATA[do it yourself]]></category>
		<category><![CDATA[Dockstar]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Plugbox]]></category>

		<guid isPermaLink="false">http://adrian.holfter.de/blog/?p=312</guid>
		<description><![CDATA[Wer sich letztens eine dieser extrem günstigen Dockingstationen (~20€) gekauft hat, bekommt dafür ordentlich Dampf &#8211; geknechtet von BusyBox und einem nach bestimmter Nutzungsdauer kostenpflichtigen Dienst, nämlich Pogoplug. Hardware: - Marvell 88F6281 SoC mit 1,2 GHz Sheeva CPU - 128MB DDR2 - 256MB NAND-Flash - 3x USB 2.0 Ports - 1x Mini-USB für Seagate Go [...]]]></description>
			<content:encoded><![CDATA[<p>Wer sich letztens eine dieser extrem günstigen Dockingstationen (~20€) gekauft hat, bekommt dafür ordentlich Dampf &#8211; geknechtet von BusyBox und einem nach bestimmter Nutzungsdauer kostenpflichtigen Dienst, nämlich <a href="http://www.pogoplug.com/home-en.html?" target="_blank">Pogoplug</a>.</p>
<p><img class="alignleft size-medium wp-image-336" title="Seagate-FreeAgent-DockStar-Network-Adapter-front-back" src="http://adrian.holfter.de/blog/wp-content/uploads/2010/09/Seagate-FreeAgent-DockStar-Network-Adapter-front-back-284x300.jpg" alt="" width="204" height="216" />Hardware:</p>
<p>- Marvell 88F6281 SoC mit 1,2 GHz Sheeva CPU<br />
- 128MB DDR2<br />
- 256MB NAND-Flash<br />
- 3x USB 2.0 Ports<br />
- 1x Mini-USB für Seagate Go Festplatten<br />
- 100/1000 MBit Ethernet</p>
<p>Wer sich nicht mit den durch den Pogoplug-Dienst gegebenen Einstellungen/Einschränkungen zufriedengeben möchte, kann aber auch mit ein paar Tricks ein vollständig funktionstüchtiges PlugBoxLinux(eine auf Arch basierende Distro) an den Start bringen <img src='http://adrian.holfter.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><span id="more-312"></span>Bevor es losgeht, möchte ich auf die Gefahr hinweisen, dass man mit manchen dieser Schritte das Gerät bricken, also unnutzbar machen kann. Alles geschieht auf eigene Verantwortung.</p>
<p style="text-align: center;">&#8212;&#8212;</p>
<p>Aber no risk, no fun, also los gehts:</p>
<p>1. )Seagate Dockstar ans Netzwerk anschließen, aber darauf achten dass sie <em><strong><span style="color: #ff0000;">keinen</span></strong></em> Zugriff auf das Internet erhält.(Adi64 und ich haben einfach einen kleinen Switch genommen) Noch ist nämlich ein Service aktiv, der Updates installiert. Unter anderem eines, das ssh deaktiviert und das root-Passwort ändert&#8230;</p>
<p>2.)Die IP des Gerätes herausfinden.<br />
Bei uns hat es gereicht, die letzten beiden Byte der MAC-Addresse(steht unten drauf) zu kennen.<br />
Angenommen diese beiden Bytes wären AB(=171) und CD(=205), dann ist die IP <strong><em> </em></strong></p>
<pre style="padding-left: 60px;">169.254.171.205</pre>
<p>Wenn das bei euch nicht so sein sollte, kommt ihr nicht darum, die Dockstar per nmap zu suchen:</p>
<pre style="padding-left: 60px;">nmap -sP 169.254.0.0/16</pre>
<p>3.)Per ssh einlogggen:<em> </em></p>
<pre style="padding-left: 60px;">ssh root@169.254.171.205
root@169.254.171.205's password: stxadmin #ist für alle gleich <img src='http://adrian.holfter.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </pre>
<p>4.)Den Pogoplug-Updateservice abschießen und aus dem Startup rausnehmen: <em><strong> </strong></em></p>
<pre style="padding-left: 60px;">killall hbwd
mount -o remount,rw / #root als writeable remounten
vi /etc/init.d/rcS
#Jetzt die Zeile mit "/etc/init.d/hbmgr.sh start" auskommentieren
mount -o remount,ro /
#Jetzt kann man das Gerät theoretisch gefahrlos ans Netz anschließen</pre>
<p>5.)Backup, Backup, Backup. USB-Stick anschließen und danach die Daten sicher verwahren:</p>
<pre style="text-align: left; padding-left: 60px;">cd /tmp
mkdir usb
mount /dev/sda1 /tmp/usb
wget <a title="http://plugapps.com/os/pogoplug/uboot/nanddump" rel="nofollow" href="http://plugapps.com/os/pogoplug/uboot/nanddump">http://plugapps.com/os/pogoplug/uboot/nanddump</a>
chmod +x nanddump
./nanddump -nf usb/mtd0 /dev/mtd0
./nanddump -nf usb/mtd1 /dev/mtd1
./nanddump -nf usb/mtd2 /dev/mtd2
umount /dev/sda1</pre>
<p>6.)Das U-Boot, den Bootloader, installieren. Das ist an sich der gefährlichste Teil, weil ein Teil der Flash-Speichers bearbeitet wird. Ein Neustart danach ist nicht notwendig, es gibt ja noch nichts Besseres wo man reinbooten könnte <img src='http://adrian.holfter.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<pre style="padding-left: 60px;">cd /tmp
wget <a title="http://plugapps.com/os/pogoplug/uboot/install_uboot_mtd0.sh" rel="nofollow" href="http://plugapps.com/os/pogoplug/uboot/install_uboot_mtd0.sh">http://plugapps.com/os/pogoplug/uboot/install_uboot_mtd0.sh</a>
chmod +x install_uboot_mtd0.sh
./install_uboot_mtd0.sh</pre>
<p>7.)Einen USB-Stick(1GB sollte drin sein) formatieren, mit einer mindestens 512MB großen ext2-Partition. Das Formatieren muss nicht unbedingt auf dem DockStar erfolgen.</p>
<p>8.)PlugBox Linux herunterladen, auf dem USB-Stick speichern:</p>
<pre style="padding-left: 60px;">#cd auf den USB-Stick
wget <a title="http://plugapps.com/os/1.1/Plugbox-Linux-1.1-rootfs.tar.gz" rel="nofollow" href="http://plugapps.com/os/1.1/Plugbox-Linux-1.1-rootfs.tar.gz">http://plugapps.com/os/1.1/Plugbox-Linux-1.1-rootfs.tar.gz</a></pre>
<p>9.)Das heruntergeladene Archiv auf dem USB-Stick extrahieren, danach das Archiv löschen. Dies sollte auf der DockStar erfolgen, sonst drohen Berechtigungsprobleme (Danke an GerhardSchr!)</p>
<pre style="padding-left: 60px;">tar -xzvf Plugbox-Linux-1.1-rootfs.tar.gz # Dauert ein bisschen auf der Plugbox, ~15min
rm Plugbox-Linux-1.1-rootfs.tar.gz</pre>
<p>10.)Den USB-Stick einstecken, falls nicht schon geschehen und die Box neustarten. Auf das Beste hoffen ;D</p>
<pre style="padding-left: 60px;">/sbin/reboot</pre>
<p style="text-align: left;">11.)Nach dem Neustart ist die alte IP natürlich nicht mehr gültig. Die Box bezieht sie über DHCP, sofern ein entsprechender Router/Server vorhanden ist. Bewaffnet mit der MAC könnt ihr ja mal im Listing der auf dem Router angemeldeten Geräte nachschauen. <a href="http://wiki.archlinux.org/index.php/Using_SSH_Keys" target="_blank">Keys</a> und <a href="http://www.dyndns.com/" target="_blank">DynDNS</a> werden Vielnutzer von ssh bestimmt kennen und schätzen. Wenn nicht &#8211; es ist definitiv einen Versuch wert.</p>
<p style="text-align: center;">&#8212;&#8212;</p>
<p style="text-align: left;">Weiterführendes findet ihr <a href="http://www.plugapps.com/index.php5?title=PlugApps:Pogoplug_Setboot" target="_blank">hier</a>. Debian-Fans finden <a href="http://jeff.doozan.com/debian/" target="_blank">hier</a> etwas &#8211; hat bei Adi64 und mir leider nicht funktioniert.</p>
<p style="text-align: left;">Wer Gentoo ausprobieren möchte, wird <a href="http://ahsoftware.de/dockstar/" target="_blank">hier</a> fündig.</p>
<p style="text-align: left;">Diejenigen, die etwas mit ihrer LED tun möchten, werden <a href="http://www.plugapps.com/index.php5?title=DockStar_LED" target="_blank">hier</a> glücklich.</p>
<p style="text-align: left;">Beispiel: Mit folgenden 3 Befehlen blinkt die LED bei jeder ssh-Aktion auf der Box orange:</p>
<pre>modprobe xt_LED #Treiber laden
iptables -A INPUT -p tcp --dport 22 -j LED --led-trigger-id web --led-delay 100
echo netfilter-web &gt; /sys/class/leds/dockstar\:orange\:misc/trigger</pre>
<p style="text-align: left;">
]]></content:encoded>
			<wfw:commentRss>http://adrian.holfter.de/blog/2010/09/archlinux-auf-der-seagate-dockstar/feed/</wfw:commentRss>
		<slash:comments>33</slash:comments>
		</item>
		<item>
		<title>Bootsplash einrichten</title>
		<link>http://adrian.holfter.de/blog/2010/06/bootsplash-einrichten/</link>
		<comments>http://adrian.holfter.de/blog/2010/06/bootsplash-einrichten/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 14:07:09 +0000</pubDate>
		<dc:creator>n0stradamus</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Archlinux]]></category>
		<category><![CDATA[do it yourself]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[fbsplash]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[n0stradamus]]></category>

		<guid isPermaLink="false">http://adrian.holfter.de/blog/?p=237</guid>
		<description><![CDATA[Nach meinem Wechsel von Ubuntu zu Arch habe ich den Startvorgang etwas aufpeppen wollen und versucht, einen Splash beim Boot anzeigen zu lassen. Zuerst einmal hat man die Wahl zwischen splashy und fbsplash. Ich habe mich für fbsplash entschieden und werde es in diesem Artikel behandeln. fbsplash findet man im AUR und im Wiki eine [...]]]></description>
			<content:encoded><![CDATA[<p>Nach meinem Wechsel von Ubuntu zu Arch habe ich den Startvorgang etwas aufpeppen wollen und versucht, einen Splash beim Boot anzeigen zu lassen.</p>
<p>Zuerst einmal hat man die Wahl zwischen splashy und fbsplash. Ich habe mich für fbsplash entschieden und werde es in diesem Artikel behandeln.</p>
<p>fbsplash findet man im <a href="http://aur.archlinux.org/packages.php?ID=13541" target="_blank">AUR</a> und im <a href="http://wiki.archlinux.org/index.php/Fbsplash">Wiki</a> eine sehr gute Einführung dazu. Ich bin den Leitfaden mehrere Male durchgegangen und immer wieder auf die gleiche Problematik gestoßen:</p>
<ul>
<li>Beim Hochfahren bekomme ich eine Fehlermeldung: &#8216;fbsplash was unable to start&#8230;theme not found&#8217;</li>
<li>Beim Herunterfahren funktioniert der Splash</li>
</ul>
<p>Abhilfe lässt sich mit folgender kleinen Änderung an den Kernelargumenten schaffen:<span id="more-237"></span></p>
<pre>logo.nologo quiet console=tty1 vga=<span style="color: #ff0000;">792</span> splash=silent,fadein,
fadeout,theme:&lt;theme-name&gt;
</pre>
<p>Den oben rot markierten Framebuffer-Wert gilt es nun mit dem gewünschten (und vom  Theme unterstützten!) Auflösungswert zu ersetzen, damit der Framebuffer auf den Wert gesetzt ist für den das Theme in /etc/conf.d/splash konfiguriert wurde &#8211; sonst startet fbsplash einfach nicht und es gibt die bekannte Fehlermeldung. Über diesen gesuchten Wert gibt uns folgender Befehl Aufschluss:</p>
<pre># hwinfo --framebuffer
</pre>
<p style="padding-left: 30px;"><a href="http://aur.archlinux.org/packages.php?ID=14977"><em>hwinfo im AUR</em></a></p>
<p>In meinem Fall sähe die geänderte Argumentzeile folgendermaßen aus:</p>
<pre>logo.nologo quiet console=tty1 vga=0x0324 splash=silent,fadein,
fadeout,theme:archax
</pre>
<p>Natürlich kann man die 0&#215;0324 auch in 804 konvertieren und hinter vga= schreiben, das ist aber reine Geschmackssache.</p>
<p>Ich vermute, dass die Startschwierigkeiten entweder mit meiner x86_64-Version von Arch zusammenhängen oder mit meiner Hardware:</p>
<blockquote><p>AMD Phenom II X4 955 BE</p>
<p>4GB OCZ DDR3-1600</p>
<p>ATI Radeon HD 4870 Vapor-X 2GB von Sapphire</p></blockquote>
<p>Im Wiki ist nämlich auch ein Wikipedia-Artikel mit den Framebuffer-Codes verlinkt, die für 1280&#215;1024 funktionieren sollen &#8211; bei mir tun sie es _nicht_: <a href="http://en.wikipedia.org/wiki/VESA_BIOS_Extensions#Linux_video_mode_numbers">*klick*</a></p>
<p>Nachdem fbsplash nun bei mir startete, flackerte es kurz nach seinem Start und wurde nach links verschoben &#8211; irgenwdie unschön. Die einzige Lösung die ich dafür finden konnte, war folgende Änderung an /etc/mkinitcpio.conf vorzunehmen und damit den Start von fbsplash <em>hinter</em> die Änderung der Bildschirmauflösung durch den Kernel zu legen:</p>
<blockquote><p>HOOKS=&#8221;base udev <span style="color: #ff0000;">fbsplash</span> autodetect pata scsi sata filesystems&#8221;</p></blockquote>
<p>ändern zu</p>
<blockquote><p>HOOKS=&#8221;base udev autodetect pata scsi sata filesystems<span style="color: #ff0000;"> fbsplash</span>&#8220;</p></blockquote>
<p>Es funktioniert, aber man sieht eben mehr von der Konsole und weniger vom Splash.</p>
<p>Für jegliche Lösungsvorschläge bin ich dankbar!</p>
]]></content:encoded>
			<wfw:commentRss>http://adrian.holfter.de/blog/2010/06/bootsplash-einrichten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qwt Libraries installieren</title>
		<link>http://adrian.holfter.de/blog/2010/06/qwt-libraries-installieren/</link>
		<comments>http://adrian.holfter.de/blog/2010/06/qwt-libraries-installieren/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 16:17:07 +0000</pubDate>
		<dc:creator>n0stradamus</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[do it yourself]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[n0stradamus]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[workaround]]></category>

		<guid isPermaLink="false">http://adrian.holfter.de/blog/?p=213</guid>
		<description><![CDATA[Wer schon einmal versucht hat, Graphen in Qt zeichnen zu lassen, hat mit Sicherheit auf das Qwt-Framework zurückgegriffen. Leider lassen sich die Libs nicht so einfach in den Qt-Creator einbauen wie andere Standardlibs, zumindest war das bei mir der Fall. Für alle, die an einem nicht so wirklich richtig funktionieren Paketmanager gescheitert sind, ist hier [...]]]></description>
			<content:encoded><![CDATA[<p>Wer schon einmal versucht hat, Graphen in Qt zeichnen zu lassen, hat mit Sicherheit auf das Qwt-Framework zurückgegriffen. Leider lassen sich die Libs nicht so einfach in den Qt-Creator einbauen wie andere Standardlibs, zumindest war das bei mir der Fall.</p>
<p>Für alle, die an einem nicht so wirklich richtig funktionieren Paketmanager gescheitert sind, ist hier der Leitfaden:<span id="more-213"></span></p>
<p>1.  Qwt Libraries runterladen und entpacken in Verzeichnis <span style="color: #ff0000;">X</span>:</p>
<blockquote><p>http://www.qwt.sourceforge.net</p>
<p>tar -xzf foo.tar.gz</p></blockquote>
<p>2. Dann folgende Konsolenschritte:</p>
<blockquote><p>cd &#8216;<span style="color: #ff0000;">X</span>&#8216; <span style="color: #008000;">//Pfad in dem sich das extrahierte Qwt findet</span></p>
<p>qmake</p>
<p>sudo make</p>
<p>sudo make install</p></blockquote>
<p>3. Damit sei es getan, könnte man meinen, doch ich musste die qwt-Libraries noch vermerken und zwar in /usr/local/lib/libc.conf</p>
<blockquote><p>/usr/local/qwt-Name/lib</p>
<p><span style="color: #008000;">/*Name war in meinem Fall qwt-5.2.0*/</span></p></blockquote>
<p>4. Und zum Schluss:</p>
<blockquote><p>sudo ldconfig</p></blockquote>
<p>Teilt mir bitte Fehler mit, ich habe die Methode bisher nur ein paar Mal verwendet.</p>
]]></content:encoded>
			<wfw:commentRss>http://adrian.holfter.de/blog/2010/06/qwt-libraries-installieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neuer Header</title>
		<link>http://adrian.holfter.de/blog/2009/07/neuer-header/</link>
		<comments>http://adrian.holfter.de/blog/2009/07/neuer-header/#comments</comments>
		<pubDate>Sun, 26 Jul 2009 18:52:28 +0000</pubDate>
		<dc:creator>ADI64</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[do it yourself]]></category>
		<category><![CDATA[frisch]]></category>
		<category><![CDATA[header]]></category>
		<category><![CDATA[photoshop]]></category>

		<guid isPermaLink="false">http://adrian.holfter.de/blog/?p=91</guid>
		<description><![CDATA[Wie euch vielleicht aufgefallen ist, hab ich einen neuen Header gebastelt. Das Theme, das ich auf dem Blog verwende, ist generell sehr beliebt und daher wird es auch dementsprechend oft benutzt. Da musste ein eigener Touch ran und der Header ist das Feature, das einen Blog im Endeffekt von anderen distanziert. Bastelanleitung: Man nehme das [...]]]></description>
			<content:encoded><![CDATA[<p>Wie euch vielleicht aufgefallen ist, hab ich einen neuen Header gebastelt.</p>
<p>Das Theme, das ich auf dem Blog verwende, ist generell sehr beliebt und daher wird es auch dementsprechend oft benutzt. Da musste ein eigener Touch ran und der Header ist das Feature, das einen Blog im Endeffekt von anderen distanziert.</p>
<p>Bastelanleitung:</p>
<p>Man nehme das <a title="AMD Athlon 64 Logo" href="http://de.wikipedia.org/w/index.php?title=Datei:AMD_Athlon64_Badge.svg&amp;filetimestamp=20070321193700" target="_blank">AMD Athlon 64-Logo</a> und lässt es von einem <a title="Thoughty's Blog" href="http://thoughtyblog.wordpress.com/" target="_blank">Freund</a> in Inkscape nachzeichnen &#8211; Fertig ist die 64 und man hat keine Urheberrechte verletzt.</p>
<p>Als Hintergrund ist fast alles erlaubt, ich habe <a title="DeviantArt - Showtime 2" href="http://venom339.deviantart.com/art/Showtime-2-121897385" target="_blank"><em>Showtime 2</em></a> von <a title="DeviantArt - *Venom339" href="http://venom339.deviantart.com/" target="_blank"><em>*Venom339</em></a> genommen.</p>
<p>Dann noch mit der Schriftart <a title="DaFont - Infinite Justice" href="http://www.dafont.com/infinite-justice.font?text=Adi" target="_blank">Infinite Justice</a> das <em>Adi</em> vor die 64 geknallt, Konturen, Schatten, runde Ecken etc. dazu und voilà!</p>
<p>Danke an Alle, deren Arbeit ich verwenden durfte!</p>
]]></content:encoded>
			<wfw:commentRss>http://adrian.holfter.de/blog/2009/07/neuer-header/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CD / DVD Images in Linux mounten</title>
		<link>http://adrian.holfter.de/blog/2009/06/cd-dvd-images-in-linux-mounten/</link>
		<comments>http://adrian.holfter.de/blog/2009/06/cd-dvd-images-in-linux-mounten/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 19:03:33 +0000</pubDate>
		<dc:creator>ADI64</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[do it yourself]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[virtual]]></category>

		<guid isPermaLink="false">http://adihp.ad.funpic.de/wordpress/?p=48</guid>
		<description><![CDATA[Artikel dazu gibts zwar sicher wie Sand am Meer, aber hier nochmal eine kleine Zusammenfassung meinerseits. Unter anderem auch damit ich mir den Kram nicht immer selbst zusammengooglen muss Die Liste wird wahrscheinlich ständig erweitert, also mal öfters reinschauen .iso: mount -t iso9660 -o ro,loop image.iso /media/virtualcd .mdf (Media Descriptor Format, Alcohol 120%), .img,  .ccd [...]]]></description>
			<content:encoded><![CDATA[<p>Artikel dazu gibts zwar sicher wie Sand am Meer, aber hier nochmal eine kleine Zusammenfassung meinerseits. Unter anderem auch damit ich mir den Kram nicht immer selbst zusammengooglen muss <img src='http://adrian.holfter.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Die Liste wird wahrscheinlich ständig erweitert, also mal öfters reinschauen <img src='http://adrian.holfter.de/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>.iso</strong>:</p>
<blockquote><p>mount -t iso9660 -o ro,loop image.iso /media/virtualcd</p></blockquote>
<p><strong>.mdf</strong> (Media Descriptor Format, Alcohol 120%), <strong>.img</strong>,  <strong>.ccd</strong> (Clone CD) und viele andere Formate:</p>
<blockquote><p>Benutze <a title="AcetoneIso Project" href="http://www.acetoneteam.org/" target="_blank">AcetoneIso</a>, um die Images in .iso zu konvertieren und mit oben genannten Befehl zu mounten.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://adrian.holfter.de/blog/2009/06/cd-dvd-images-in-linux-mounten/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

