<?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/"
	>

<channel>
	<title>Linux Techblog</title>
	<atom:link href="http://linux-techblog.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://linux-techblog.de</link>
	<description>Wir entdecken den Tux.</description>
	<pubDate>Wed, 22 Apr 2009 10:46:42 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Homeserver: Installation</title>
		<link>http://linux-techblog.de/2009/04/homeserver-installation/</link>
		<comments>http://linux-techblog.de/2009/04/homeserver-installation/#comments</comments>
		<pubDate>Sat, 11 Apr 2009 10:15:30 +0000</pubDate>
		<dc:creator>Frank</dc:creator>
		
		<category><![CDATA[Homeserver]]></category>

		<guid isPermaLink="false">http://linux-techblog.de/?p=75</guid>
		<description><![CDATA[Vergangene Woche sind die Teile endlich gekommen. Durch meine Nachtschicht hatte ich aber keine Lust zum schreiben - deshalb mit kleiner Verzögerung.
Diesem Artikel ist der Artikel &#8220;Homeserver: Planung der Komponenten&#8221; vorausgegangen.
Mein Eindruck von der Hardware war von vornherein positiv. Alles was solide verpackt, nichts wackelte. Keine Kratzer oder ähnliches. Der Zusammenbau ist für jeden der [...]]]></description>
			<content:encoded><![CDATA[<p>Vergangene Woche sind die Teile endlich gekommen. Durch meine Nachtschicht hatte ich aber keine Lust zum schreiben - deshalb mit kleiner Verzögerung.</p>
<p>Diesem Artikel ist der Artikel &#8220;<a href="http://linux-techblog.de/2009/03/homeserver-planung-der-komponenten/">Homeserver: Planung der Komponenten</a>&#8221; vorausgegangen.</p>
<p>Mein Eindruck von der Hardware war von vornherein positiv. Alles was solide verpackt, nichts wackelte. Keine Kratzer oder ähnliches. Der Zusammenbau ist für jeden der schon mal einen Rechner zusammen gebaut hat sicherlich logisch - wenn auch manchmal etwas kniffelig. Das ganze System ist eben wirklich sehr eng gestrickt.</p>
<p><span id="more-75"></span></p>
<p>Das Mainboard wird auf eine Platte montiert die T-Förmig auf dem Rückteil montiert ist. Diese kann im ganzen in einer Art Führungsschiene herausgezogen werden , was die Montage erheblich erleichtert. Unter dem Mainboard bleibt so platz für die vier Festplatten und die Spannungswandler. Das ganze ist schwer zu beschreiben - wenn man das Gehäuse gesehen hat aber eigentlich ganz logisch. Das Belüftungskonzept ist sehr durchdach - an der Rückseite des unteren Teils (mit den Festplatten) befinden sich zwei Lüfter die Luft an den festplatten vorbei über die Spannungswandler. Im oberen Teil werkelt in meinem Fall nur der CPU-Lüfter. Wenns hier zu heiß wird könnte aber auch noch ein Lüfter montiert werden.</p>
<p>In meinem Fall waren die Kabel allesamt bereits vormontiert. SD-Kartenleser und FrontUSB auch. Ich musste lediglich das Mainboard bestücken (Speicher und CF-Karte) und verschrauben. Unschön ist dass sich am Gehäuse zwei LEDs für die LAN Aktivität finden, auf dem Mainboard aber keine Pins dafür vorgesehen sind. Auch die Warning-LED ist ohne Funktion. Mich stört das nicht das ich das Gehäuse eh nie sehe - wer sich sowas aber als Prestigegerät in die Vitrine stellt könnte isch daran stören. Desweiteren passen die USB-Anschlüsse vom Cardreader und vom FrontUSB nicht auf das Mainboard da sich auf diesem lediglich Mini-USB Pinheader befinden (2mm) - das Gehäuse hat die normalen USB - Stecker. Ohne Adapter <em>(bei mir hieß der &#8220;<span class="kategorieschrift">Adapter Mini USB 2mm</span>&#8220;)</em> geht da nichts. Da ich mir den aber nun nicht gekauft habe (und das vorerst auch nicht plane) kann ich da von keinen Erfahrungen berichten - vermute aber dass das wohl problemlos funktionieren wird.</p>
<p>Für die folgenden Fotos habe ich das Mainboard montiert und angeschlossen. Später habe ich noch einige Kabel in den Unteren Teil des Gehäuses verbannt um die Durchlüftung im oberen Teil zu optimieren. Die Bilder entstanden aber vorher. Außerdem einige Bilder vom Mainboard selbst - vor allem auf der Rückseite sicher sehr interessant da man hier mal sieht wo CF-Karte und MiniPCI Karte Monitiert werden können.</p>

<a href='http://linux-techblog.de/2009/04/homeserver-installation/20090331-174236/' title='20090331-174236'><img src="http://linux-techblog.de/wp-content/uploads/2009/04/20090331-174236-150x150.jpg" width="150" height="150" class="attachment-thumbnail" alt="" /></a>
<a href='http://linux-techblog.de/2009/04/homeserver-installation/20090331-1743101/' title='20090331-1743101'><img src="http://linux-techblog.de/wp-content/uploads/2009/04/20090331-1743101-150x150.jpg" width="150" height="150" class="attachment-thumbnail" alt="" /></a>
<a href='http://linux-techblog.de/2009/04/homeserver-installation/20090331-184953/' title='20090331-184953'><img src="http://linux-techblog.de/wp-content/uploads/2009/04/20090331-184953-150x150.jpg" width="150" height="150" class="attachment-thumbnail" alt="" /></a>
<a href='http://linux-techblog.de/2009/04/homeserver-installation/20090331-185047/' title='20090331-185047'><img src="http://linux-techblog.de/wp-content/uploads/2009/04/20090331-185047-150x150.jpg" width="150" height="150" class="attachment-thumbnail" alt="" /></a>
<a href='http://linux-techblog.de/2009/04/homeserver-installation/20090331-185155/' title='20090331-185155'><img src="http://linux-techblog.de/wp-content/uploads/2009/04/20090331-185155-150x150.jpg" width="150" height="150" class="attachment-thumbnail" alt="" /></a>
<a href='http://linux-techblog.de/2009/04/homeserver-installation/20090331-185354/' title='20090331-185354'><img src="http://linux-techblog.de/wp-content/uploads/2009/04/20090331-185354-150x150.jpg" width="150" height="150" class="attachment-thumbnail" alt="" /></a>

<p style="text-align: center;">
<h3>Was mir negativ auffiel</h3>
<ul>
<li>Neben dem genannten Problem mit den USB Anschlüssen und den LEDs, die ich aber nicht so kritisch sehe da es für das eine eine Lösung gibt und mir das andere Egal ist ist mir Negativ aufgefallen dass weder zum Gehäuse noch zum Mainboad eine gedruckte Bedienungsanleitung geliefert wurden. Beim Mainboard wars auf der Treiber CD - von außen ist das aber nicht zu erkennen - beim Gehäuse lediglich aus dem Internet zu beziehen. Für Europäische Verhältnisse echt schwach.</li>
<li>Wenn man auf dem Board eine PCI-Express-Karte montieren möchte ist keine Aussparung auf der Rückseite vorgesehen um da vielleicht mal eine Kabel anschließen zu können.</li>
<li>Das Schloss ist einfach für den Allerwertesten und hätte getrost eingespart werden können.</li>
</ul>
<h3>Was mir positiv auffiel</h3>
<ul>
<li>Die Kabel zur Festplattenbackplane waren vorbildlich beschriftet, so dass eine Zuordnung zu den Ports auf dem Mainboard problemlos möglich war.</li>
<li>Die Verarbeitung wirkt durchweg solide.</li>
<li>Das System ist selbst in der Standardkonfiguration angenehm Leise.</li>
<li>Das Raumaufteilungskonzept ist gelungen das dazugehörige Lüftungskonzept auch</li>
</ul>
<h2>Betriebssystem</h2>
<p>Das System dann zu installieren stellte sich als schwieriger heraus als zunächst angenommen. Nach langem hinundher entschied ich mich für einen Ubuntu Server. Einfach weil der aktuelle Pakete liefert und ich so nicht in die Verlegenheit komme dass das neues Filesharing programm XYZ nicht laufen mag. Außerdem hab ich so immer was zum basteln - weil eben wahrscheinlich auch immer gerade irgendwas nicht funktioniert :o) (aber Spaß beiseite.).</p>
<p>Da sich der On Board CF-Slot und die IDE-Buchse einen IDE-&#8221;Kanal&#8221; teilen funktioniert nur das eine oder das andere, wobei die CF-Karte Vorrang hat. Bleibt also nur die Installation über USB-CDRom. Hier stand ich aber gleich vor dem nächsten Mysterium. Bei ubuntuusers im Wiki liest man dass für VIA Eden Prozessoren auf die Alternate CD zurückgegriffen werden soll. Diese Installation kommt aber offenbar nicht mit USB-CDRom Laufwerken klar. Die normale Serverinstallation hingegen lief. Wichtig ist also - wenn man eine CF-Karte nutzt braucht man wahrscheinlich ein USB-CDRom.</p>
<p>Der Rest der lief Problemlos. Das System schein an sich flot zu agieren. Die CF-Karte ist aber nicht die schnellste so dass man den Einruck hat das Schreiboperationen immer etwas träge sind. Des weiteren habe ich lm-sensors mit dem Distributionskernel nicht davon überzeigen können mir einige Temperaturwerte auszuliefern. Damit werde ich mich nochmal beschäftigen - vielleicht gibt&#8217;s also später nochmal was über den &#8220;c7temp&#8221; Kernelpatch zu lesen.</p>
<h2>Leistung</h2>
<p>Um die Leistung objektiv beurteilen zu können werde ich mich mal an ein paar Benchmarks wagen.  Dazu komme ich aber in einem späteren Artikel. Subjektiv ist es verhält es sich beim allgemeinen Arbeiten flott - Festplattenoperationen auf der CF-Karte scheinen aber sehr träge.</p>
]]></content:encoded>
			<wfw:commentRss>http://linux-techblog.de/2009/04/homeserver-installation/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Homeserver: Planung der Komponenten</title>
		<link>http://linux-techblog.de/2009/03/homeserver-planung-der-komponenten/</link>
		<comments>http://linux-techblog.de/2009/03/homeserver-planung-der-komponenten/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 17:01:39 +0000</pubDate>
		<dc:creator>Frank</dc:creator>
		
		<category><![CDATA[Homeserver]]></category>

		<guid isPermaLink="false">http://linux-techblog.de/?p=32</guid>
		<description><![CDATA[ 

(Fast) Jeder kennt das: man hat gemütlich am Laptop im Internet Musik gekauft und dann sitzt man im Arbeitszimmer und kann sie nicht anhören weil sie auf dem Laptop ist. Andersherum hat man ewig an einer Ausarbeitung gesessen und dann ist man bei einem Kumpel dem man das ganze vorführen möchte und kein Weg [...]]]></description>
			<content:encoded><![CDATA[<p><!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves /> <w:TrackFormatting /> <w:HyphenationZone>21</w:HyphenationZone> <w:PunctuationKerning /> <w:ValidateAgainstSchemas /> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF /> <w:LidThemeOther>DE</w:LidThemeOther> <w:LidThemeAsian>X-NONE</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables /> <w:SnapToGridInCell /> <w:WrapTextWithPunct /> <w:UseAsianBreakRules /> <w:DontGrowAutofit /> <w:SplitPgBreakAndParaMark /> <w:DontVertAlignCellWithSp /> <w:DontBreakConstrainedForcedTables /> <w:DontVertAlignInTxbx /> <w:Word11KerningPairs /> <w:CachedColBalance /> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val="&#45;-" /> <m:smallFrac m:val="off" /> <m:dispDef /> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"   DefSemiHidden="true" DefQFormat="false" DefPriority="99"   LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Normal" /> <w:LsdException Locked="false" Priority="9" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="heading 1" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8" /> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9" /> <w:LsdException Locked="false" Priority="39" Name="toc 1" /> <w:LsdException Locked="false" Priority="39" Name="toc 2" /> <w:LsdException Locked="false" Priority="39" Name="toc 3" /> <w:LsdException Locked="false" Priority="39" Name="toc 4" /> <w:LsdException Locked="false" Priority="39" Name="toc 5" /> <w:LsdException Locked="false" Priority="39" Name="toc 6" /> <w:LsdException Locked="false" Priority="39" Name="toc 7" /> <w:LsdException Locked="false" Priority="39" Name="toc 8" /> <w:LsdException Locked="false" Priority="39" Name="toc 9" /> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption" /> <w:LsdException Locked="false" Priority="10" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Title" /> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font" /> <w:LsdException Locked="false" Priority="11" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtitle" /> <w:LsdException Locked="false" Priority="22" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Strong" /> <w:LsdException Locked="false" Priority="20" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Emphasis" /> <w:LsdException Locked="false" Priority="59" SemiHidden="false"    UnhideWhenUsed="false" Name="Table Grid" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text" /> <w:LsdException Locked="false" Priority="1" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="No Spacing" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 1" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 1" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 1" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 1" /> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision" /> <w:LsdException Locked="false" Priority="34" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="List Paragraph" /> <w:LsdException Locked="false" Priority="29" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Quote" /> <w:LsdException Locked="false" Priority="30" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Quote" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 1" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 1" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 1" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 1" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 1" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 2" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 2" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 2" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 2" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 2" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 2" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 2" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 2" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 2" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 3" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 3" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 3" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 3" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 3" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 3" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 3" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 3" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 3" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 4" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 4" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 4" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 4" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 4" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 4" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 4" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 4" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 4" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 5" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 5" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 5" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 5" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 5" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 5" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 5" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 5" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 5" /> <w:LsdException Locked="false" Priority="60" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Shading Accent 6" /> <w:LsdException Locked="false" Priority="61" SemiHidden="false"    UnhideWhenUsed="false" Name="Light List Accent 6" /> <w:LsdException Locked="false" Priority="62" SemiHidden="false"    UnhideWhenUsed="false" Name="Light Grid Accent 6" /> <w:LsdException Locked="false" Priority="63" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6" /> <w:LsdException Locked="false" Priority="64" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6" /> <w:LsdException Locked="false" Priority="65" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 1 Accent 6" /> <w:LsdException Locked="false" Priority="66" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium List 2 Accent 6" /> <w:LsdException Locked="false" Priority="67" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6" /> <w:LsdException Locked="false" Priority="68" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6" /> <w:LsdException Locked="false" Priority="69" SemiHidden="false"    UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6" /> <w:LsdException Locked="false" Priority="70" SemiHidden="false"    UnhideWhenUsed="false" Name="Dark List Accent 6" /> <w:LsdException Locked="false" Priority="71" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Shading Accent 6" /> <w:LsdException Locked="false" Priority="72" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful List Accent 6" /> <w:LsdException Locked="false" Priority="73" SemiHidden="false"    UnhideWhenUsed="false" Name="Colorful Grid Accent 6" /> <w:LsdException Locked="false" Priority="19" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis" /> <w:LsdException Locked="false" Priority="21" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis" /> <w:LsdException Locked="false" Priority="31" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference" /> <w:LsdException Locked="false" Priority="32" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Intense Reference" /> <w:LsdException Locked="false" Priority="33" SemiHidden="false"    UnhideWhenUsed="false" QFormat="true" Name="Book Title" /> <w:LsdException Locked="false" Priority="37" Name="Bibliography" /> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--> <!--[if gte mso 10]><br />
<mce:style><!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:"Normale Tabelle"; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:"Calibri","sans-serif"; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:"Times New Roman"; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:"Times New Roman"; 	mso-bidi-theme-font:minor-bidi;} --></p>
<p><!--[endif]--></p>
<p class="MsoNormal">(Fast) Jeder kennt das: man hat gemütlich am Laptop im Internet Musik gekauft und dann sitzt man im Arbeitszimmer und kann sie nicht anhören weil sie auf dem Laptop ist. Andersherum hat man ewig an einer Ausarbeitung gesessen und dann ist man bei einem Kumpel dem man das ganze vorführen möchte und kein Weg führt an die Dateien. Doch noch viel schlimmer: Das Notebook steckt zum laden an der Dose während man gerade noch am arbeiten ist, .. der Blitz schlägt ein und das Notebook samt Festplatte ist hinüber.</p>
<p class="MsoNormal">Gegen all solche Sachen ist ein Kraut gewachsen - die zentrale Datenhaltung. Musik, Videos, Dokumente, all das wird einfach Zentral auf einem dedizierten System abgelegt. Moderne Netzwerke ermöglichen es von quasi jedem Punkt auf dieser Erde auf die Daten zuzugreifen. Um das Backup kümmern sich entsprechende Automatismen. Zur Sicherheit liegen alle Daten nicht nur Verschlüsselt auf dem Server sondern werden per RAID auch auf eine zweite Platte gespiegelt.</p>
<p class="MsoNormal">Doch solche Dienste bieten auch noch mehr Wert. Filesharingprogramme können sich damit beschäftigen, Dateien herunter und herauf zu laden, während man des Nachts schläft. Drucker können über einen Printserver geteilt werden. Webcams können softwaregesteurt ausgewertet werden und schicken E-Mails wenn was vorfällt. Aber was erzähl ich hier - wer in diesem Blog liest, ist sich der Möglichkeiten eines solchen Homeservers wahrscheinlich längst bewusst oder hat gar schon einen.</p>
<p class="MsoNormal">Die Anwendungsmöglichkeiten sind jedenfalls schier unendlich. Ohne auf jede einzelnen Möglichkeit weiter einzugehen, möchte ich hier vorstellen wie ein solches System aufgebaut sein könnte.</p>
<p class="MsoNormal"><span id="more-32"></span></p>
<h2 class="MsoNormal">Anforderungen</h2>
<p>Was für Anforderungen gibt es an die Hardware?</p>
<ul>
<li>Der Prozessor muss in der Lage sein eine vernünftige Festplattenverschlüsselung zu stemmen ohne die Schreibgeschwindigkeiten auf Schneckentempo einzuschrumpfen</li>
<li>Es muss genügend Arbeitsspeicher am Start sein um auch &#8220;Moderne&#8221; Filesharingprogramme zum laufen zu bekommen</li>
<li>Dem Speicherplatz sollten zumindest auf Logischer ebene keine Grenzen gesetzt werden; Das bedeutet dass es Möglich sein sollte, nachträglich noch zusätzliche Platten einzubauen oder zumindest die vorhandenen Platten gegen größere zu tauschen ohne die ganzen Daten erst auslagern zu müssen</li>
<li>Die Stromkostenabrechnung sollte nicht zum erblinden oder zu nervlichen Störungen führen</li>
</ul>
<h2>Und wie lösen wir das Problemchen?</h2>
<p>Nein nicht mit einem Wölkchen (Schleichwerbung) sondern eben mit passender Hardware. Um genau zu sein mit Hardware die in der Lage ist aus möglichst wenig Strom möglichst viel Leistung heraus zu holen. Dabei haben sich bekannte (Prozessor-)Hersteller schon Gedanken gemacht und in Form von Mobile- und Embeddedprozessoren ihre bestehenden Prozessortechnologien auf besonders niedrigen Stromverbrauch getrimmt. Im Mobilprozessormarkt werden hierbei meist die normalen Desktop CPUs genutzt deren Leistung dann gesenkt wird. Für den Embedded Bereich werden meist eigene Prozessoren entwickelt die dann aber für Desktop Anwendungen meist untauglich sind.  In diesem Fall sind die Embeddedprozessoren also deutlich näher am Anwendungsfeld. Bekanntester Vertreter ist hier  <a href="http://de.wikipedia.org/wiki/Intel_Atom" target="_blank">Intels &#8220;Atom&#8221; Prozessor</a>. Aber Auch <a href="http://de.wikipedia.org/wiki/AMD_Geode" target="_blank">AMDs Geode Reihe</a> ist den meisten ein Begriff - weniger bekant ist dagegen vermutlich <a href="http://de.viatech.com/de/products/mainboards/" target="_blank">VIAs Prossoren Serie</a>. Hierbei handelt es sich quasi immer um Prozessoren die fest auf einem Mainboard verlötet sind. Bei den ersten beiden stamen diese Mainboards nicht zwangsweise vom Hersteller selbst - bei VIA dagegen schon.</p>
<h3>Prozessor und Mainboard</h3>
<p>Doch von vorn. AMDs Prozessoren sind schlecht entwickelt. Der Hersteller scheint sich nicht weiter um diese Reihe zu kümmern und konzentriert sich lieber darauf seine Desktop- und Mobilprozessoren auf einen vernünftigen stand zu bringen. Bei der Entscheidung zwischen Intel und VIA habe ich <a href="http://enthusiast.hardocp.com/article.html?art=MTUzNSwxLCxoZW50aHVzaWFzdA==" target="_blank">einen spannenden Vergleich</a> gefunden bei dem die beiden Leistungsstärksten Embeddedprozessoren der beiden Hersteller miteinender Verglichen werden. Es handelt sich um Intels Atom 330 Prozessor mit 1,6 GHz auf einem <a href="http://www.intel.com/Products/Desktop/Motherboards/D945GCLF/D945GCLF-overview.htm" target="_blank">D945GCLF</a> und um einen VIA C7 Prozessor mit 1.8GHz auf einem <a href="http://www.via.com.tw/en/products/mainboards/motherboards.jsp?motherboard_id=550" target="_blank">EPIA-SN18000G.</a> Der Test lohnt auf jedenfall gelesen zu werden. Er hat mich dazu bewogen mich für die VIA CPU zu entscheiden und zwar auf genau dem dort genutzten Board.</p>
<p>Dieses hat aber auch noch weitere Features die mit dem (zumindest mit dem originalen) Intel Board gar nicht so ohne weiteres möglich wären. Es bietet zum beispiel einen Compact Flash Slot den ich später nutzen werde um das Betriebssystem auf stromsparende Weise auf einer Simplen CF-Karte abzulegen. Zudem bietet es 4 SATA Schnittstellen - das könnte später wenn es um die Erweiterbarkeit geht noch sehr praktisch sein. Es kann 4 GB Arbeitsspeicher aufnehmen und das absolute Killerfeature - es hat einen PCI Express Slot und einen Mini PCI Slot!!</p>
<p>VIA selbst stellt hier den absolut interessanten <a href="http://linux-techblog.de/wp-content/uploads/2009/03/og_epia-sn_110.pdf">VIA EPIA SN180000G Operating Guide</a> (PDF) zur Verfügung den ich von meinen Händler per E-Mail bekam.</p>
<p class="MsoNormal"><a href="http://linux-techblog.de/wp-content/uploads/2009/03/og_epia-sn_110.pdf"><br />
</a></p>
<h3 class="MsoNormal">Gehäuse</h3>
<p class="MsoNormal">Eigentlich war ich auf der Suche nach einem <a href="http://de.wikipedia.org/wiki/Industrie-PC">IPC</a>-Tauglichen Wallmount Gehäuse für MiniITX Systeme. Da ich aber offenbar der einzige bin der sowas sucht musste ich leider feststellen dass es sowas wohl nicht gibt. Während meiner Recherchen bin ich aber über ein anderes interessantes Gehäuse gestoßen. Das <a href="http://www.chenbro.com/corporatesite/products_detail.php?serno=100">Chenbro ES34069</a> bietet 4 Festplattenslots die sogar bequem Hotswapable von außen erreichbar sind (leider unterstützt das Mainboard das vermutlich nicht, aber es erleichtert die Wartung sicher trotzdem ungemein). Wenn man den Beiträgen in diversen Foren trauen darf handelt es sich hierbei wohl um eine Art Revolution im Homeservermarkt. Jedenfalls wurde es bereits mehrfach getestet und für Gut befunden (<a href="http://www.wegotserved.co.uk/2008/03/29/hands-on-chenbro-es34069-home-server-chassis/">1</a>, <a href="http://www.logicsupply.com/blog/2008/03/27/the-chenbro-es34069-case-review-part-1/">2</a> und <a href="http://www.logicsupply.com/blog/2008/11/05/the-chenbro-es34069-case-review-part-2-the-perfect-mainboard/">3</a>, und <a href="http://blogs.sun.com/kjt/entry/home_server_hardware_build">4</a> dienten mir als Informationsquelle). Das schönste ist eigentlich dass eine Netzteil schon mit dabei ist (120 Watt oder 180 Watt), wodurch der recht hohe Preis wenigstens ansatzweise gerechtfertigt wird. Leider ist das Gehäuse in keinster Weise gegen Staub, wie er bei meinem nicht näher beschriebenen Installationsort zu erwarten ist, geschützt. Hier muss ich also noch etwas Handarbeit anlegen.</p>
<p class="MsoNormal">Hier wieder sehr schön anzusehen - das <a href="http://linux-techblog.de/wp-content/uploads/2009/03/es340-manual_a2.pdf">Chenbro ES34069 User Manual</a>. Viele Informationen für alle Informations- und Rezensionversklavten wie mich.</p>
<h3 class="MsoNormal">Kalkulation</h3>
<p class="MsoNormal">Billig wirds vermutlich nicht, &#8230; hier eine Preisübersicht. Zusammengestellt bei Amazon (die CF Karte) und einem örtlichen Händler (der Rest). Die Installationsmaterialien beziehe ich aus meinen Vorräten und in Bezug auf die IPC-Tauglichkeiten aus dem Baumarkt.</p>
<pre class="MsoNormal"><span class="ahaupt"><strong>251.68 Euro</strong> </span><em>(<span class="kategorieschrift">VIA EPIA SN18000G</span>)</em> Mainboard</pre>
<pre class="MsoNormal"><strong>045,18 Euro</strong> <em>(2 mal Kingston 2048MB KVR533D2N4)</em> Arbeitsspeicher</pre>
<pre class="MsoNormal"><span class="ahaupt"><strong>198,90 Euro</strong> </span><em>(Chenbro ES34069 120 Watt)</em> Gehäuse</pre>
<pre class="MsoNormal"><strong>028,34 Euro</strong> <em>(Kingston CFCard 16GB)</em> Compact Flash Karte</pre>
<pre class="MsoNormal"><strong>010,00 Euro</strong> Installationsmaterial
----------------------------------------------------------------
<strong>534,10 Euro</strong>
===========</pre>
<p class="MsoNormal">Für etwas mehr als 530 Euro bekommt man heutzutage also das Grundsystem für ein NAS welches leistungstechnisch absolut auf dem Stand ist und wohl noch die nächsten 5 Jahre treu seinen Dienst leisten kann. Ich finde den Preis OK. Nochmal etwa 400 Euro kann man aber rechnen wenn man das Gerät auch ordentlich ausstatten will. Ich übernehme 2 terrabyte große Festplatten aus meinem alten Homeserver, so dass ich die hier mal außen vor lasse.</p>
<p class="MsoNormal">
<h2 class="MsoNormal">Wies weiter geht, &#8230;</h2>
<p>Die Komponenten sind nun bestellt und ich warte gespannt auf Lieferung. Wies weiter geht lest ihr im Artikel <a href="http://linux-techblog.de/2009/04/homeserver-installation/">&#8220;Homeserver: Installation&#8221;</a> wo ich zunächst den zusammenbau und die Installation der Systeme beschreibe.</p>
<p class="MsoNormal"><a href="http://linux-techblog.de/wp-content/uploads/2009/03/og_epia-sn_110.pdf"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://linux-techblog.de/2009/03/homeserver-planung-der-komponenten/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MySQL Query-Statistik Script</title>
		<link>http://linux-techblog.de/2009/01/mysql-query-statistik-script/</link>
		<comments>http://linux-techblog.de/2009/01/mysql-query-statistik-script/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 13:03:41 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
		
		<category><![CDATA[Allgemein]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Programmierung]]></category>

		<category><![CDATA[Tricks & Kniffe]]></category>

		<guid isPermaLink="false">http://linux-techblog.de/?p=22</guid>
		<description><![CDATA[Da ich bis jetzt beim kurzweiligen suchen bei Google nichts gefunden habe was die Sache für mich übernimmt, habe ich mal ein Perl-Script zusammen geschustert, welche verschiedene Query-Statistiken von MySQL, je nach Bedarf, ausgibt.
Ich muss dazu sagen, dass dieses Script eigentlich dafür gedacht war, die Ausgabe via SNMP abzufassen und dann in Cacti darzustellen. Leider [...]]]></description>
			<content:encoded><![CDATA[<p>Da ich bis jetzt beim kurzweiligen suchen bei Google nichts gefunden habe was die Sache für mich übernimmt, habe ich mal ein Perl-Script zusammen geschustert, welche verschiedene Query-Statistiken von MySQL, je nach Bedarf, ausgibt.</p>
<p>Ich muss dazu sagen, dass dieses Script eigentlich dafür gedacht war, die Ausgabe via SNMP abzufassen und dann in Cacti darzustellen. Leider ist es dazu nicht gekommen.</p>
<p>Das Script macht sich aber auch zur &#8220;Just-in-Time&#8221; Kontrolle der Query-Quantität ganz gut oder um die Ausgabe mit einen kleinen Shell-Script-Wrapper in ein RRD zu schreiben und dann als Graph darzustellen.</p>
<p>In etwa würde das auf einer Linux-Shell dann so aussehen:</p>
<p><strong>[root@server bin]# watch -n10 &#8220;./mysql_query_stat.pl -u root -p password -h mysqlserver -n 10 -SQUID;&#8221;</strong></p>
<p><strong>Every 10,0s: ./mysql_query_stat.pl -u root -p password -h </strong><strong>mysqlserver </strong><strong> -n 10 -SQUID;</strong></p>
<p><strong>QPSnow:      471<br />
QPSall:        731<br />
Selects/s:    381<br />
Inserts/s:    16<br />
Updates/s:   9<br />
Deletes/s:   7</strong></p>
<p>Dieser Befehl erzeugt die Ausgabe der jetzigen Query-Quantität aller 10 Sekunden. Für ander Optionen (wie z.B. die gut zu parsende One-Liner Ausgabe) könnt Ihr euch das Script ja mal anschauen.</p>
<p>Für Fragen, Anregungen, Bug-Reports oder Feature-Wünsche wäre ich dankbar.</p>
<p>Das Script gibts natürlich <a title="mysql_query_stat.pl" href="http://linux-techblog.de/wp-content/uploads/2009/01/mysql_query_stat.txt" target="_self">hier</a>.</p>
<p>MfG Maddin</p>
]]></content:encoded>
			<wfw:commentRss>http://linux-techblog.de/2009/01/mysql-query-statistik-script/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Bootzeit verkürzen mit Hilfe von Bootchart und readahead</title>
		<link>http://linux-techblog.de/2008/12/bootzeit-verkurzen-mit-hilfe-von-bootchart-und-readahead/</link>
		<comments>http://linux-techblog.de/2008/12/bootzeit-verkurzen-mit-hilfe-von-bootchart-und-readahead/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 11:14:59 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Tricks & Kniffe]]></category>

		<guid isPermaLink="false">http://linux-techblog.de/?p=21</guid>
		<description><![CDATA[Wer kennt das nicht:

Rechner einschalten
im Bootmenü das OS auswählen
das OS, in meinem Fall Linux (Ubtuntu 8.04 LTS), starten
Kaffee holen / auf Toilette gehen / Glotze anschalten und auf den Login warten

Da es mich aber mittlerweile etwas genervt hat, das die Boot-Zeit meines Systems mittlerweile bei knapp 1 Minute und 10 Sekunden liegt, was bei Bereitschaftsdiensten [...]]]></description>
			<content:encoded><![CDATA[<p>Wer kennt das nicht:</p>
<ul>
<li>Rechner einschalten</li>
<li>im Bootmenü das OS auswählen</li>
<li>das OS, in meinem Fall Linux (Ubtuntu 8.04 LTS), starten</li>
<li>Kaffee holen / auf Toilette gehen / Glotze anschalten und auf den Login warten</li>
</ul>
<p>Da es mich aber mittlerweile etwas genervt hat, das die Boot-Zeit meines Systems mittlerweile bei knapp 1 Minute und 10 Sekunden liegt, was bei Bereitschaftsdiensten Nachts um 4 ganz schön lange sein kann, habe ich mich mal nach einem Visualisierungstool für den Linux-Boot-Prozess umgesehen.</p>
<p><span id="more-21"></span></p>
<p>Nach ein paar googlern bin ich dann auf <a title="bootchart" href="http://www.bootchart.org" target="_blank">bootchart</a> gestoßen. Dieses Tool ermöglicht es Grafiken des Boot-Prozesses anzufertigen, in dem ausgewiesen wird, wann und zu welcher Zeit, welcher Prozess mit wieviel IO- und CPU-Last zu Gange ist.</p>
<p>Nach dem installieren und dem neuerstellen des initramfs (geschieht bei rpm&#8217;s und deb&#8217;s automatisch) kann man das System zum ersten Test rebooten. Nach erfolgreicher Tat solltet Ihr unter <em>/var/bootchart/bootchart-$date-x.png</em> eine Grafik haben in der Ihr die Reihendfolge und Zeiten ablesen könnt. Das ganze sieht dann ungefähr <a title="Debian Bootchart" href="http://www.bootchart.org/images/bootchart.debian.mcrae.0.png" target="_blank">so aus</a>.</p>
<p>Nach dem abschalten (bei mir via <strong>update-rc.d -f $initscript remove</strong>) der für mich nicht benötigten Dienste (cupsys - hab kein Drucker, bluetooth - kann manuel gestartet werden wenn benötigt, vmware - manueller start, openvpn - manueller start etc. pp.) veringerte sich die Bootzeit auf etwa 44 Sekunden.</p>
<p>Immerin knapp 25 Sekunden schneller als vorher. Abder da geht noch mehr. Nachdem ich dann wieder den Bootchart analysierte, fiel mir ein Init-Script Names readahead auf. Wieder kurz gegoogelt und siehe da, readahead wird als eines der ersten Scripte im runlevel S (also bei jedem Start) aufgerufen und liest Dateien (binaries, configs, libs etc. pp.) aus einer Datei (<em>/etc/readahead/boot</em>) ein, sodass diese sich im Filesystem-Cache aka RAM befinden. Der Vorteil dieser Methode ist, dass Linux auf diese schon einmal eingelesenen Daten, ein paar 1000 mal schneller zugreifen kann (etwa 100 ns) als von der Festplatte (etwa 5 ms).</p>
<p>Um readahead an die eigenen Boot-Bedürfnisse optimal anzupassen, kann man nach dem einbinden des Init-Scripts (bei Ubuntu Standard) beim reboot auf der Kernel-Kommandozeile (booten, Grub Auswahlmenü <strong>e</strong> drücken, kernel Zeile auswählen, wieder <strong>e</strong> drücken) das Schlüsselwort <strong>profile</strong> hinzufügen. Hat man dies getan drückt man <strong>b</strong> und der Boot-Vorgang beginnt. Hat alles geklappt kommt nach etwa 5 Sekunden eine Auschrift ähnlich &#8220;<em>Readahead starts profiling boot process&#8230;</em>&#8220;. Nach dem booten sollte es dann unter <em>/etc/readahead/boot</em> eine aktuelle Version der Konfiguration für readahead geben. Dies sollte man nach jedem Kernel-Update wiederholen, da dann ja wieder andere Treiber usw. geladen werden.</p>
<p>Nach diesem Prozedere habe ich es geschaft meine Boot-Zeit von etwa 1 Minute und 10 Sekunden auf etwa 33 Sekunden hearab zu setzen. Meiner Meinung nach ein ganz schöner Unterschied.</p>
<p>Jetzt seid Ihr dran. Vorher-Nacher vergleiche erwünscht.</p>
<p>MfG<br />
Maddin</p>
]]></content:encoded>
			<wfw:commentRss>http://linux-techblog.de/2008/12/bootzeit-verkurzen-mit-hilfe-von-bootchart-und-readahead/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ICP/Adaptec - NRPE/Nagios-Plugin - check_aacraid</title>
		<link>http://linux-techblog.de/2008/09/icpadaptec-nrpenagios-plugin-check_aacraid/</link>
		<comments>http://linux-techblog.de/2008/09/icpadaptec-nrpenagios-plugin-check_aacraid/#comments</comments>
		<pubDate>Mon, 22 Sep 2008 21:53:18 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
		
		<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://linux-techblog.de/?p=20</guid>
		<description><![CDATA[Kommische Überschrift, oder?
Nein - wer Adaptec/ICP RAID-Controller im produktiven Einsatz hat, wird das Problem kennen. Entweder man überlässt die Überwachung des RAID-Verbundes und des Controllers dem Zufall oder man installiert sich eine 50 MB große Java-Umgebung, um dann via X-Fowarding eine Speicherfressende Java-Console zu beäugen.
Und da Adaptec auch das aaccli (IMHO Adaptec Command Line Interface) [...]]]></description>
			<content:encoded><![CDATA[<p>Kommische Überschrift, oder?</p>
<p>Nein - wer <a title="Adaptec" href="http://www.adaptec.com/de-DE" target="_blank">Adaptec</a>/<a title="ICP" href="http://www.icp-vortex.com" target="_blank">ICP</a> RAID-Controller im produktiven Einsatz hat, wird das Problem kennen. Entweder man überlässt die Überwachung des RAID-Verbundes und des Controllers dem Zufall oder man installiert sich eine 50 MB große Java-Umgebung, um dann via X-Fowarding eine Speicherfressende Java-Console zu beäugen.</p>
<p>Und da Adaptec auch das aaccli (IMHO <strong>A</strong>d<strong>a</strong>pte<strong>c C</strong>ommand<strong> L</strong>ine <strong>I</strong>nterface) nicht mehr für 64-bit System weiterentwickelt (für dieses CLI gab es ebenfalls einen Perl-Wrapper) es aber dafür <strong>arcconf</strong> (keine Ahnung was das bedeuten soll) gibt, habe ich dafür mal einen kleinen Perl-Wrapper gebaut der die Ausgaben parsed und je nach Stati die gewünschten Nagios Exit-Codes zurück gibt.</p>
<p>Interessierte finden das Script <a title="Nagios Exchange" href="http://www.nagiosexchange.org/cgi-bin/page.cgi?g=Detailed%2F2738.html;d=1" target="_blank">hier</a>.</p>
<p>Über Kritiken, Anregungen oder Verbesserungsvorschläge würde ich mich wie immer freuen.</p>
<p>MfG</p>
<p>Maddin</p>
]]></content:encoded>
			<wfw:commentRss>http://linux-techblog.de/2008/09/icpadaptec-nrpenagios-plugin-check_aacraid/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Filterauswertung für SpamAssassin</title>
		<link>http://linux-techblog.de/2008/07/filterauswertung-fur-spamassassin/</link>
		<comments>http://linux-techblog.de/2008/07/filterauswertung-fur-spamassassin/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 11:02:56 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Programmierung]]></category>

		<category><![CDATA[Tricks & Kniffe]]></category>

		<guid isPermaLink="false">http://linux-techblog.de/?p=19</guid>
		<description><![CDATA[Viele von Euch oder zumindest diejenigen die ein funktionierendes Mailsystem ihr eigen nennen, werden um die Nutzung einer AntiSpam Software nicht herumkommen. Die wahrscheinlich bekannteste ist SpamAssassin. Da ich jedoch in diesem Artikel weder auf die Installation noch Beschreibung von SpamAssassin eingehen möchte, kann ich für interessierte Leser den Wiki-Artikel empfehlen.
Worauf ich zu sprechen kommen [...]]]></description>
			<content:encoded><![CDATA[<p>Viele von Euch oder zumindest diejenigen die ein funktionierendes Mailsystem ihr eigen nennen, werden um die Nutzung einer AntiSpam Software nicht herumkommen. Die wahrscheinlich bekannteste ist <a title="SpamAssassin Homepage" href="http://spamassassin.apache.org/" target="_blank">SpamAssassin</a>. Da ich jedoch in diesem Artikel weder auf die Installation noch Beschreibung von SpamAssassin eingehen möchte, kann ich für interessierte Leser den <a title="Wikipedia Artikel über SpamAssassin" href="http://de.wikipedia.org/wiki/SpamAssassin" target="_blank">Wiki-Artikel</a> empfehlen.</p>
<p>Worauf ich zu sprechen kommen möchte, ist ein Script Namens <a title="sa-stats" href="http://0wned.it/scripts/" target="_blank">sa-stats.pl</a>. Dieses Perl Script, implementiert von <a title="David Ramsden" href="http://0wned.it/about.php" target="_blank">David Ramsden</a>, wertet SpamAssassin-Einträge aus Maillogfiles aus und gibt diese, aufgesplittet nach Spam und Ham, in <a title="Sample Output" href="http://0wned.it/scripts/sa-stats/sa-stats.output.txt" target="_blank">tabellarischer Form</a> aus. Dies ist z.B. sinnvoll um zu sehen welcher der User oder welche Domain prozentuall den meisten Spam erhält.</p>
<p>Da es unsere Mail-Admin&#8217;s aber auch interessiert, welche Filter dazu führen dass eine Mail als Spam deklariert wird,  wurde ich beauftragt eine kleine Erweiterung des Scripts zu schreiben, welche die Quantität und den prozentualen Anteil der Filter augibt. Kurz gesagt eine Auswertung der von SpamAssassin vernwendeten Filter.</p>
<p>Interessierte finden das Script <a title="sa-stats.pl pimped by Maddin" href="http://linux-techblog.de/wp-content/uploads/2008/07/sa-stats.txt" target="_blank">hier</a>. Über Kritik, Lob, Anregungen oder sonstige Kommentare würde ich mich freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://linux-techblog.de/2008/07/filterauswertung-fur-spamassassin/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SSH, denn sicher ist sicher</title>
		<link>http://linux-techblog.de/2008/07/ssh-denn-sicher-ist-sicher/</link>
		<comments>http://linux-techblog.de/2008/07/ssh-denn-sicher-ist-sicher/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 08:31:47 +0000</pubDate>
		<dc:creator>Frank</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Sicherheit]]></category>

		<category><![CDATA[Tricks & Kniffe]]></category>

		<guid isPermaLink="false">http://linux-techblog.de/?p=11</guid>
		<description><![CDATA[SSH (Secure Shell) ist sowohl ein Protokoll als auch eine Reihe Von Anwendungen um dieses zu nutzen. Es wird genutzt um eine Verschlüsselte Verbindung zu entfernten Rechnern aufzubauen. Diese Verbindung kann dann quasi beliebige Daten transportieren, wird aber zumeist dafür benutzt eine Remotekonsole zu steuern oder Dateien zu übertragen (Secure Copy, SCP genannt). Das Protokoll [...]]]></description>
			<content:encoded><![CDATA[<p>SSH (Secure Shell) ist sowohl ein Protokoll als auch eine Reihe Von Anwendungen um dieses zu nutzen. Es wird genutzt um eine Verschlüsselte Verbindung zu entfernten Rechnern aufzubauen. Diese Verbindung kann dann quasi beliebige Daten transportieren, wird aber zumeist dafür benutzt eine Remotekonsole zu steuern oder Dateien zu übertragen (Secure Copy, SCP genannt). Das Protokoll ist auf OSI Schicht 7 angesiedelt und kommuniziert Standardmäßig (nach den Vorgaben der <a href="http://de.wikipedia.org/wiki/Internet_Assigned_Numbers_Authority">IANA</a>) über Port 22.</p>
<p>Obwohl SSH an sich schon sehr Sicher ist, kommt es doch gelegentlich zu erfolgreichen Angriffen die es dem Angreifer dann natürlich unter Umständen ermöglichen Root-Rechte zu erlangen. Häufigste Ursache für den erfolgreichen Angriff sind in der Praxis meist schwache Passwörter und falsch konfigurierte SSH Daemons. Aus diesem Grund möchte ich hier darauf eingehen wie man den SSH Zugriff gegen diese beiden Faktoren härten kann.</p>
<p><span id="more-11"></span></p>
<h3>Welcher Daemon ist der richtige?</h3>
<p><a href="http://linux-techblog.de/wp-content/uploads/2008/06/openssh1.png"><img class="alignright size-thumbnail wp-image-13" style="float: right;" title="openssh" src="http://linux-techblog.de/wp-content/uploads/2008/06/openssh1-150x150.png" alt="" width="150" height="150" /></a></p>
<p>Hier könnte man sich nun sicher schön streiten, jedoch ist OpenSSH nach angaben von openssh.org mit über 80% der meist Vertretene SSH-Daemon überhaupt, weshalb ich hier nur auf diesen eingehen Möchte. Zudem wird er von allen wichtigen Linux Distributionen schon in Paketform mitgeliefert und selbst unter Mac OS X läuft dieser Seit version 10.1. OpenSSH unterstützt beide Protokollversionen und liegt derzeit in Version 5.0 (vom 03. April 2008) vor. Die Sammlung von kleinen Tools umfasst neben dem eigentlichen Serverprogramm <em>sshd </em>auch die Clientprogramme <em>ssh</em>, <em>scp</em> und <em>sftp </em>zur verfügung. Dazu gesellen sich dann noch die Werkzeuge <em>ssh-add</em>, <em>ssh-agent</em>, <em>ssh-keysign</em>, <em>ssh-keyscan</em>, <em>ssh-keygen</em> und <em>sftp-server</em>. Die anderen Daemons sind aber sicher auch nicht schlecht.</p>
<h3>1. Stufe: Protokollversion</h3>
<p>Sicherheitshalber sollte heutzutage nur noch die SSH-Protokoll Version 2 genutzt werden. Die Version 1 ist durch die Verwendung des recht schwachen CRC-32 (Cyclic Redundancy Check mit 32 Bit) anfällig für einen Man in the Middle Angriff in dem gefälschte Pakete in die Verbindung eingeschleußt werden können. Der Patch der dies erkennen sollte (SSH CRC32 attack detection) lässt sich aber zu einem Speicherüberlauf überreden der es erlaub die Authentifizierung zu umgehen. Die Protokollversion 2 festzulegen ist ganz einfach in dem man zunächst in der SSH-Konfiguration (<em>/etc/ssh/sshd_config</em>) darauf achtet das hinter <em>Protocol </em>außschließlich eine 2 steht und anschließend den SSH-Daemon neu startet.</p>
<p style="padding-left: 30px;"><code>/etc/init.d/ssh restart</code></p>
<p>Dies kann Problemlos auch aus einer SSH-Session heraus geschehen - bestehende Verbindungen werden bei dem Neustart nicht abgebrochen.</p>
<h3>2. Stufe: Publickey Authentifizierung</h3>
<p>Unter bestimmten Umständern kann es unheimlich praktisch sein beim Administrieren verteilter Rechner Zeit zu sparen in dem man sich beim SSH oder SCP Login nicht mit einem Passwort authentifizieren bzw. sich nur ein Passwort für alle Systeme merken muss. Als Beispiel seien hier Verbindungen verschiedener Clusternodes untereinander, Virtueller Maschinen vom Virtualisierungsserver aus oder innerhalb des Heimnetzwerkes genannt.</p>
<p>Hierzu wird ganz einfach ein Schlüsselpaar erstellt welches welches aus einem Privaten und einem Öffentlichen Schlüssel besteht. Der Private Schlüssel wird dabei im Benutzerprofil gespeichert, der Öffentliche Schlüssel wird auf dem Zielsystem hinterlegt. Beim Verbindungsaufbau wird nun vom Server ein Zufälliger Text erstellt und mit dem Öffentlichen Schlüssel verschlüsselt. Dieser verschlüsselte Text wird dann an den Client gesendet welcher den Text mit seinem Privaten Schlüssel entschlüsseln kann. Diesen entschlüsselten Text sendet er an den Server zurück wodurch er bestätigt dass er im Besitz des Privaten Schlüssels ist. Wenn der empfangene Text mit dem Ursprungstext übereinstimmt ist sicher gestellt das der Client auch wirklich Vertrauenswürdig ist.</p>
<p>In der Praxis funktioniert das natürlich alles von selbst. Hierbei wird zunächst mit <em>ssh-keygen</em> ein Schlüsselpärchen erstellt. Dabei wird mit <em>-t </em>der Schlüsseltyp übergeben.</p>
<p style="padding-left: 30px;"><code>ssh-keygen  -t rsa</code></p>
<p>Dabei wird man zunächst nach dem identity file gefragt (standard mäßig ist das &lt;homedir&gt;/.ssh/id_dsa) in dem später der private schlüssel gespeichert wird. Dann bekommt man die Gelegenheit ein Passwort für den schüssel einzugeben. Je nach Anwendungsgebiet ist das schwer zu empfehlen. Man tauscht ja nur das Passwort gegen eine &#8220;Datei&#8221; - dabei würde die Sicherheit natürlich nur geringfügig erhöht. Deswegen wird hier ein passwort fetsgelegt welches dann zur benutzung des Schlüssels gebraucht wird. Nach der wiederhohlten Passworteingabe wird der Fingerprint des öffentlichen Schlüssels ausgegeben - dieser braucht hier aber nicht weiter zu interessieren.</p>
<p>Neben dem Identiy file legt ssh-keygen auch noch eine gleichnamige .pub Datei an in der sich der zugehörige Öffentliche Schlüssel befindet. Der inhalt dieser Datei muss nun auf dem Zielrechner als Autorisierter Schlüssel eingetragen werden. Dazu wird einfach der Inhalt der Datei auf dem Zielsystem in die &lt;homedir&gt;/.ssh/authorized_keys Datei eingefügt.  Der letzte Schritt ist nun in der SSH-Konfiguration (<em>/etc/ssh/sshd_config</em>) die entsprechenden Optionen zu aktiveren. Im wesentlichen sind das:</p>
<p style="padding-left: 30px;"><code><br />
PubkeyAuthentication yes<br />
AuthorizedKeysFile      %h/.ssh/authorized_keys<br />
</code></p>
<p>Selbsterklärend eigentlich wird zunächst diese Authentifizierungsmethode freigegeben und anschließend festgelegt in welcher Datei der Öffentliche Schlüssel zu suchen ist. Nach einem neustart des SSH-Daemons sollte das ganze funktionieren.</p>
<h3>3. Stufe: Logfileauswertung</h3>
<p>Ein wenig Paranoid mag dieser Weg erscheinen, doch auch wenn man bereits die Publicey Authentifizierung nutzt kann ein Bruteforceangriff natürlich nicht ausgeschlossen werden. Die Chancen hier tatsächlich noch einen Treffer zu landen tendieren stark gegen Null, doch ist dies eine sehr effektive Angriffsmethode um den Angreifer auch von anderen gefährdeten Diensten fern zu halten. Jeder Anmeldeversuch wird in eine Logdatei geschrieben und protokoliert. Hier ist es also eigentlich sehr leicht einen Bruteforceangriff zu erkennen. Natürlich schaut aber niemenad ständig in diese Logfiles und wenn man mal einen blick dafür findet ist es eventuell schon zu spät. Selbst wenn der Angreifer nach einer weile entnervt aufgeben sollte könnte er eventuell versuchen den FTP oder Webserver zu kompromitieren - hier kann man also geschickt vorgreifen.</p>
<p>Wichtig zu nennen sind hier zwei Programme: <strong>swatch</strong>, welches alle Möglichen Logfiles überwachen und mit Hilfe regulärer Ausdrücke auswerten kann und <strong>denyhosts</strong> (<a href="http://denyhosts.sourceforge.net/">http://denyhosts.sourceforge.net/</a>), welches speziell auf das auswerten fehlgeschlagener SSH Verbindungen ausgerichtet ist. Beide Dienste schreiben die IP-Adresse des Angreifers in die <em>/etc/hosts.deny</em>. Zweit genannter mag zwar &#8220;weniger können&#8221;, erfüllt seinen job dafür aber zuverlässiger, da die Verarbeitung der Logfiles hier ständig durch die Authoren gepflegt wird - aus diesem Grund entscheide ich mich für denyhosts.</p>
<p>Distributionsabhängig ist denyhosts bereits ab Werk als Paket verfügbar. In meinem Besipiel nutze ich Debian, es ist allerings auch nicht wirklich schwer es aus den Quellen zu installieren. Es ist lediglich von Python v2.3 oder höher abhängig.</p>
<p style="padding-left: 30px;"><code>aptitude install denyhosts</code></p>
<p>Unter Debian ist die Installation wie immer sehr leicht. Das Distributionseigene Paket ist im Prinzip bereits in einem Funktionsfähigen Zustand. Trotzdem sollte man sich bestimmte Parameter der <em>/etc/denyhosts.conf</em> anschauen. In den meisten Distributionspaketen ist die Standarkonfigurationsdatei sehr gut Dokumentiert. Unter <em>/usr/share/denyhosts/denyhosts.cfg-dist</em> sollte sich andernfalls aber ein gut Dokumentiertes Beispiel finden.</p>
<ul>
<li><strong><span style="color: #000000;">SECURE_LOG</span></strong>: Aus dieser Datei liest denyhosts die Fehlgeschlagenen Loginversuche ab</li>
<li><strong>HOSTS_DENY</strong>: In diese Datei werden die Erkannten IP-Adressen geschrieben</li>
<li><strong>BLOCK_SERVICE</strong>: Dieser Dienst wird als zu blockierender Dienst angegeben. Standardmäßig steht hier sshd, dies sollte auf jedenfall durch &#8220;ALL&#8221; erstezt werden, damit auch andere Dienste wie der Webserver keine Verbindungen mehr von diesem Host annehmen</li>
<li><strong>DENY_THRESHOLD_INVALID</strong>: Die Anzahl an Fehlversuchen die ein Host starten darf bis er gesperrt wird</li>
<li><strong>SMTP_*</strong> und <strong>ADMIN_EMAIL</strong>: Diese Optionen erlauben es sich über gesperrte Host per E-Mail informieren zu lassen.</li>
</ul>
<p>Zum Abschluss muss der Dienst nach den Anpassungen noch neu gestartet werden.<br />
<code><br />
</code></p>
<p style="padding-left: 30px;"><code>sh /etc/init.d/denyhosts restart</code></p>
<p>Um sicher zu stellen das auch wirklich alles Funktioniert sollte man sich von einem anderen Host einfach versuchen einige Male hintereinander &#8220;falsch&#8221; anzumelden. Nach einigen Versuchen sollte die IP-Adresse in der <em>hosts.deny</em> auftauchen <em>(und es sollte keine Verbindung mehr möglich sein)</em>, wo man sie beim selbsttest natürlich einfach wieder entfernen kann. Falls man das nicht manuel tuen möchte kann <em>denyhosts </em>auch so konfiguriert werden dass die Adressen selbstständig freigegeben werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://linux-techblog.de/2008/07/ssh-denn-sicher-ist-sicher/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Umleitung zu https vor basic authentication</title>
		<link>http://linux-techblog.de/2008/07/umleitung-zu-https-ssl-vor-basic-authentication/</link>
		<comments>http://linux-techblog.de/2008/07/umleitung-zu-https-ssl-vor-basic-authentication/#comments</comments>
		<pubDate>Wed, 09 Jul 2008 15:02:04 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
		
		<category><![CDATA[Sicherheit]]></category>

		<category><![CDATA[Tricks & Kniffe]]></category>

		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://linux-techblog.de/?p=15</guid>
		<description><![CDATA[Um euch das stundenlange suchen, Apache doku lesen und rumprobieren zu ersparen, werde ich euch hier verraten wie man vor der HTTP-Authentifizierung zu HTTPS wechselt.
Das eigentliche Problem der Basic-Authentication ist, dass diese Passwörter und Nutzernamen im Klartext übertragen werden. Leider ist das ja nicht immer gewollt und unter umständen sehr unsicher.
So hier nun zur Konfiguration. [...]]]></description>
			<content:encoded><![CDATA[<p>Um euch das stundenlange suchen, Apache doku lesen und rumprobieren zu ersparen, werde ich euch hier verraten wie man vor der HTTP-Authentifizierung zu HTTPS wechselt.</p>
<p>Das eigentliche Problem der Basic-Authentication ist, dass diese Passwörter und Nutzernamen im Klartext übertragen werden. Leider ist das ja nicht immer gewollt und unter umständen sehr unsicher.</p>
<p>So hier nun zur Konfiguration. Am einfachsten klappt es in dem Ihr, im zu schützenden Verzeichnis, eine .htaccess Datei anlegt und folgenden Inhalt hinzufügt:</p>
<pre style="padding-left: 30px;">AuthUserFile /var/www/domain.tld/secret/.htpasswd</pre>
<pre style="padding-left: 30px;">AuthType Basic</pre>
<pre style="padding-left: 30px;">AuthName "Secret Site"</pre>
<pre style="padding-left: 30px;">require valid-user</pre>
<pre style="padding-left: 30px;">SSLrequireSSL</pre>
<pre style="padding-left: 30px;">ErrorDocument 403 /redirect.php</pre>
<p>Die ersten 4 Einträge sollten klar sein. Mit SSLrequireSSL erzwingt man denn Zugriff via HTTPS. Wird die Domain nur mit HTTP aufgerufen, antwortet der Apache mit einem 403 Fehler. Dies fangen wir mit dem Eintrag ErrorDocument 403 /redirect.php ab. In diesem steht nur:</p>
<pre style="padding-left: 30px;">&lt;?php</pre>
<pre style="padding-left: 30px;">header('Location: https://www.domain.tld/secret/');</pre>
<pre style="padding-left: 30px;">?&gt;</pre>
<p>So leiten wir alle normalen HTTP anfragen direkt auf HTTPS um. Danach erfolgt die Basic Authentication. Und schon wird die Authentifizierung nur noch über HTTPS abgewickelt.</p>
<p>Tolle Sache <img src='http://linux-techblog.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://linux-techblog.de/2008/07/umleitung-zu-https-ssl-vor-basic-authentication/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Design und Content perfekt getrennt mit XSLT und PHP-SimpleXML</title>
		<link>http://linux-techblog.de/2008/07/design-und-content-perfekt-getrennt-mit-xslt-und-php-simplexml/</link>
		<comments>http://linux-techblog.de/2008/07/design-und-content-perfekt-getrennt-mit-xslt-und-php-simplexml/#comments</comments>
		<pubDate>Mon, 07 Jul 2008 06:44:48 +0000</pubDate>
		<dc:creator>Frank</dc:creator>
		
		<category><![CDATA[Programmierung]]></category>

		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://linux-techblog.de/?p=9</guid>
		<description><![CDATA[1
XSLT (Extensible Stylesheet Language Transformation) ist eine noch recht junge Sprache die aus DSSSL 120hervorgegangen ist. Sie übersetzt einfache XML-Inhalte nach den in der XSLT-Datei festgelegten Regeln in eine Andere Sprache - zumeist HTML. Dazu wird ein sogenannter XSLT Prozessor genutzt der das XML entweder Serverseitig Transformiert und so schon HTML an den Client ausliefert [...]]]></description>
			<content:encoded><![CDATA[<p><span style="border: 1px solid black; padding: 0px 3px; z-index: 500; position: absolute; top: 0pt; left: 0pt; display: none; font-family: sans-serif; font-size: xx-small;">1</span></p>
<p>XSLT (Extensible Stylesheet Language Transformation) ist eine noch recht junge Sprache die aus <a href="http://de.wikipedia.org/wiki/Document_Style_Semantics_and_Specification_Language">DSSSL <span style="border: 1px solid grey; padding: 0px 3px; float: none; margin-left: 2px; z-index: 500; display: none; font-family: sans-serif; font-size: xx-small;">120</span></a>hervorgegangen ist. Sie übersetzt einfache XML-Inhalte nach den in der XSLT-Datei festgelegten Regeln in eine Andere Sprache - zumeist HTML. Dazu wird ein sogenannter XSLT Prozessor genutzt der das XML entweder Serverseitig Transformiert und so schon HTML an den Client ausliefert oder der Browser übernimmt diesen Part und übersetzt lokal. Nähere Information bietet hier wie immer die <a href="http://de.wikipedia.org/wiki/XSL_Transformation">Wikipedia<span style="border: 1px solid grey; padding: 0px 3px; float: none; margin-left: 2px; z-index: 500; display: none; font-family: sans-serif; font-size: xx-small;">121</span></a>. Ich zeige hier in erster Linie den Weg über den Browser auf da die Kompatibilität inzwischen in meinen Augen ausreichend ist (IE ab Version 6, Mozilla ab Version 1.0.2).</p>
<p>PHP-SimpleXML ist eine Reihe von Funktionen die PHP anbietet um im XML Dateien aus Objekten zu erzeugen oder Objekte aus XML-Dateien zu erstellen. Dazu bedient sie sich einer DOM Struktur. SimpleXML ist ein Bestandteil von PHP der Version 5 und wird Standardmäßig mitinstalliert. Die meisten Provider bieten diese Funtionen auch an. Weitere Infos bietet hier <a href="http://de2.php.net/manual/en/book.simplexml.php">PHP.net<span style="border: 1px solid grey; padding: 0px 3px; float: none; margin-left: 2px; z-index: 500; display: none; font-family: sans-serif; font-size: xx-small;">122</span></a> selbst.</p>
<p>Was wir hier nun probieren wollen ist mit PHP-SimpleXML XML Dateien zu erzeugen die dann mit XSLT Dargestellt werden. Erfahrungen mit PHP, HTML, CSS und XML an sich sind dabei vorausgesetzt. Ziel ist es eine Nutzerliste wie sie zum Beispiel in einem Forum zu sehen wäre anzuzeigen. Die Möglichkeiten sind natürlich unendlich ;o) .</p>
<p><span id="more-9"></span></p>
<h3>XML erzeugen mit PHP-SimpleXML</h3>
<p>Zunächst wird ein neues SimpleXML Objekt erzeugt.</p>
<pre style="padding-left: 30px;">$xmlstr =  "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;";
$xmlstr .= "&lt;?xml-stylesheet type=\"text/xsl\" href=\"nutzerliste.xsl\"?&gt;";
$xmlstr .= "&lt;NUTZERLISTE&gt;";
$xmlstr .= "&lt;/NUTZERLISTE&gt;";
$xml = new SimpleXMLElement($xmlstr);</pre>
<p>Dies geschieht mit <em>new SimpleXMLElement </em>dem ein fertiger XML-String übergeben wird. In diesem Fall ist das die Standard XML-Definition, gefolgt von der Angabe des XSLT-Skripts und der Definition eines Elements. Nun werden einige Nutzer angelegt. Dazu würde man sich im Normalfall wahrscheinlich eine Datenbankanfrage bedienen - da dies aber nur ein Beispiel ist zeihe ich hier folgendes Array heran:</p>
<pre style="padding-left: 30px;">$nutzerarray = array();</pre>
<pre style="padding-left: 30px;">$nutzerarray[0] = array('name' =&gt; 'Ralf', 'wohnort' =&gt; 'Dortmund', 'geburtstag' =&gt; '25.09.1962');
$nutzerarray[1] = array('name' =&gt; 'Stefan', 'wohnort' =&gt; 'Berlin', 'geburtstag' =&gt; '06.06.1981');
$nutzerarray[2] = array('name' =&gt; 'Georg', 'wohnort' =&gt; 'Pirna', 'geburtstag' =&gt; '13.06.1951');
$nutzerarray[3] = array('name' =&gt; 'Maik', 'wohnort' =&gt; 'Dresden', 'geburtstag' =&gt; '15.04.1969');</pre>
<p>Jetzt wir das Array mit einer passenden Schleife durchlaufen um mit Hilfe der  von SimpleXML gegebenen Funktionen um dazu jeweils ein Element im in der Nutzerliste zu erzeugen. Dazu nutze ich in erster Linie die PHP-Funktion <em>addChild </em>mit der zunächst an meine Haupt-XML-Klasseninstanz einen neuen Zweig angehängt wird. Als Ergebnis daraus erhalte ich eine neue Klasseninstanz im Objekt <em>$nutzerobject </em>welche mir nun erlaubt diesen neuen Zweig zu verändern. Dabei werden wiederum <em>addChild </em>Funktionen genutzt um den eigentlichen Inhalt einzufügen. Natürlich könnte man hier auch mit Attributen des Zweigs arbeiten - dies würde diese Anleitung aber unnötig kompliziert machen.</p>
<pre style="padding-left: 30px;">foreach($nutzerarray as $nutzer)</pre>
<pre style="padding-left: 30px;">    {</pre>
<pre style="padding-left: 90px;">$nutzerobject = $xml-&gt;addChild("NUTZER");
$nutzerobject-&gt;addChild("NAME", $nutzer[name]);
$nutzerobject-&gt;addChild("WOHNORT", $nutzer[wohnort]);
$nutzerobject-&gt;addChild("GEBURTSTAG", $nutzer[geburtstag]);</pre>
<pre style="padding-left: 60px;">}</pre>
<p>Wenn das XML-File nun ausgegeben wird finden wir eine Wohlgeformte XML Struktur, die aber mangels XSLT noch nicht sehr Anschaulich aussieht (Grün). Wichtig ist - da wir den XML-Baum ja dynamisch mit einer PHP Datei erzeugen eine passende Headerinformation mitzusenden die dem Browser verrät das es sich hierbei nicht um eine einfaches Textfile sondern um XML Inhalte handelt.</p>
<pre style="padding-left: 30px;">header('Content-Type: text/xml');
echo $xml-&gt;asXML();</pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;?xml-stylesheet type="text/xsl" href="nutzerliste.xsl"?&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">&lt;NUTZERLISTE&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">    &lt;NUTZER&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">        &lt;NAME&gt;Ralf&lt;/NAME&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">        &lt;WOHNORT&gt;Dortmund&lt;/WOHNORT&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">        &lt;GEBURTSTAG&gt;25.09.1962&lt;/GEBURTSTAG&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">    &lt;/NUTZER&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">    &lt;NUTZER&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">        &lt;NAME&gt;Stefan&lt;/NAME&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">        &lt;WOHNORT&gt;Berlin&lt;/WOHNORT&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">        &lt;GEBURTSTAG&gt;06.06.1981&lt;/GEBURTSTAG&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">    &lt;/NUTZER&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">    &lt;NUTZER&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">        &lt;NAME&gt;Georg&lt;/NAME&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">        &lt;WOHNORT&gt;Pirna&lt;/WOHNORT&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">        &lt;GEBURTSTAG&gt;13.06.1951&lt;/GEBURTSTAG&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">    &lt;/NUTZER&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">    &lt;NUTZER&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">        &lt;NAME&gt;Maik&lt;/NAME&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">        &lt;WOHNORT&gt;Dresden&lt;/WOHNORT&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">        &lt;GEBURTSTAG&gt;15.04.1969&lt;/GEBURTSTAG&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">    &lt;/NUTZER&gt;</span></pre>
<pre style="padding-left: 60px;"><span style="color: #008000;">&lt;/NUTZERLISTE&gt;

</span></pre>
<p>Dies ist der erzeugte XML-Code der in der Browserausgabe natürlich noch nicht so umwerfend aussieht. Im unterschied zu normalen Inhalten haben wir bis zu diesem Zeitpunkt aber noch kein Stückchen HTML gebraucht. und mussten uns darüber auch keine sorgen machen wie das ganze später mal aussieht. Für andere Programme ist es dank XML ein leichtes darauf zuzugreifen.</p>
<h3>Aus XML werde HTML</h3>
<p>Um dies nun Optisch anschaulicher zu machen wird sich des XSLT bedient um eine Sinnvolle Ausgabe zu erzeugen. Wie bereits in der XML-Stylesheet Definition festgelegt wurde benötigen wir dazu die Datei <em>nutzerliste.xsl</em>. Zunächst der nötige Kopfteil:</p>
<pre style="padding-left: 30px;">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;
&lt;xsl:output method="html" /&gt;</pre>
<p>Wie gewohnt wird also zunächst die XML-Version und das Encoding bestimmt. Für XSL muss der Namespace und die &#8220;Ausgabesprache&#8221; HTML festgelegt werden.</p>
<pre style="padding-left: 30px;">&lt;xsl:template match="/NUTZERLISTE"&gt;</pre>
<p>Jetzt geht es schon mit den XSL-Befehlen los. <em>NUTZERLISTE </em>wird als Hauptzweig festgelegt. Dies verhält sich wie ein Filter. Die in diesem Zweig festgelegten Regeln werden nur angewandt wenn der Hauptzweig <em>NUTZERLISTE </em>heißt. Um nun aber zum HTML zu kommen kann in diesem Bereich Ganz normal mir allen HTML Elementen gearbeitet werden.</p>
<pre style="padding-left: 30px;">&lt;html&gt;
&lt;body&gt;

&lt;table&gt;</pre>
<p>Natürlich muss dabei auch eine normale HTML Deklaration erfolgen. In diesem Fall lege ich im Header nichts fest - es wäre hier aber gut möglich auch ein CSS-Stylesheet anzugeben um das Design noch ein wenig dynamischer zu gestalten.</p>
<pre style="padding-left: 30px;">&lt;xsl:for-each select="NUTZER"&gt;</pre>
<pre style="padding-left: 30px;">&lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Name:&lt;/strong&gt;&lt;/td&gt;         &lt;td&gt;&lt;xsl:value-of select="NAME" /&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Wohnort:&lt;/strong&gt;&lt;/td&gt;      &lt;td&gt;&lt;xsl:value-of select="WOHNORT" /&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Geburtstag:&lt;/strong&gt;&lt;/td&gt;   &lt;td&gt;&lt;xsl:value-of select="GEBURTSTAG" /&gt;&lt;/td&gt;
&lt;/tr&gt;</pre>
<pre style="padding-left: 30px;">&lt;/xsl:for-each&gt;</pre>
<p>XSL Stellt ganz normale Schleifen zur Verfügung wie sie bei anderen Programmiersprachen auch bekannt sind. In diesem Fall wird mit <em>xsl:for-each</em> für jenen Nutzer Zweig der eingeschlossene Code ausgeführt. Dabei wird eine Tabellenzeile erstellt die mit Hilfe von <em>xsl:value-of </em>mit Werten gefüllt wird. Eine logische Angelegenheit eigentlich.</p>
<pre style="padding-left: 30px;">&lt;/table&gt;
&lt;/body&gt;</pre>
<pre style="padding-left: 30px;">&lt;/html&gt;</pre>
<pre style="padding-left: 30px;">&lt;/xsl:template&gt;

&lt;/xsl:stylesheet&gt;</pre>
<p>Die vielen geöffneten tags müssen natürlich noch geschlossen werden. Ein abschließender Aufruf der zuvor erzeugten PHP-Datei ist vom Browser gemäß den Festgelegten Regeln formatiert Der Zurück gelieferte Quelltext ist noch immer reinstes XML und vollkommen unabhängig vom Design. Die wichtigsten Werkzeuge um beispielsweise ein Templatingsystem für einen Blog zu implementieren hätten wir so im Prinzip schon in der Hand. Doch das ist noch nicht alles - XSL ist noch viel mächtiger.</p>
<h3>Grenzenlos mit XSL</h3>
<p>XSL kann die zurück gelieferten XML Inhalte nicht einfach nur wiedergeben sondern auch sinnvoll auswerten. Dies kann zum einen Sinnvoll sein im bestimmte Designelemente eben nur anzuzeigen wenn sie Tatsächlich einen Einhalt haben (Leerer Warenkorb?), um Abstufungen zu bieten (Fortschrittsbalken) oder gar um Fremdquellen auszuwerten.</p>
<p>Nachfolgend eine Angepasste Version der Zählschleife von oben:</p>
<pre style="padding-left: 30px;">Insgesamt &lt;xsl:value-of select="count(NUTZER)"/&gt; Einträge</pre>
<pre style="padding-left: 30px;">&lt;table&gt;</pre>
<pre style="padding-left: 60px;">&lt;xsl:for-each select="NUTZER"&gt;</pre>
<pre style="padding-left: 90px;">&lt;xsl:if test="starts-with(WOHNORT, 'D')"&gt;</pre>
<pre style="padding-left: 120px;">&lt;tr&gt;</pre>
<pre style="padding-left: 150px;">&lt;td&gt;&lt;strong&gt;Name:&lt;/strong&gt;&lt;/td&gt;         &lt;td&gt;&lt;xsl:value-of select="NAME" /&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Wohnort:&lt;/strong&gt;&lt;/td&gt;      &lt;td&gt;&lt;xsl:value-of select="WOHNORT" /&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Geburtstag:&lt;/strong&gt;&lt;/td&gt;   &lt;td&gt;&lt;xsl:value-of select="GEBURTSTAG" /&gt;&lt;/td&gt;</pre>
<pre style="padding-left: 120px;">&lt;/tr&gt;</pre>
<pre style="padding-left: 90px;">&lt;/xsl:if&gt;</pre>
<pre style="padding-left: 60px;">&lt;/xsl:for-each&gt;</pre>
<pre style="padding-left: 30px;">&lt;/table&gt;</pre>
<p>Hier ist zunächst eine spezielles <em>value-of</em> dazu gekommen was mit <em>count()</em> Ausgibt wie viele Nutzer wir denn insgesamt haben. Zudem wurde in der <em>for-each</em> Schleife Ein <em>xsl:if</em> hinzugefügt. Diesem wird eine Bedingung mitgegeben und falls diese Wahr ist werden die darin liegenden Regeln ausgeführt. In diesem Fall muss der Wohnort mit &#8216;D&#8217; beginnen.</p>
<p>Die Ausgabe ist jetzt zunächst eine Angabe wie viele Einträge sich im Array befinden und dann wie bereits vorher die Nutzer - nur das diesmal nur die beiden Einträge bei denen der Wohnort mit &#8216;D&#8217; anfängt angezeigt werden.</p>
<pre style="padding-left: 30px;">&lt;xsl:for-each select="NUTZER"&gt;
&lt;xsl:sort select="WOHNORT"/&gt;</pre>
<pre style="padding-left: 60px;">&lt;tr&gt;</pre>
<pre style="padding-left: 90px;">&lt;td&gt;&lt;strong&gt;Name:&lt;/strong&gt;&lt;/td&gt;         &lt;td&gt;&lt;xsl:value-of select="NAME" /&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Wohnort:&lt;/strong&gt;&lt;/td&gt;      &lt;td&gt;&lt;xsl:value-of select="WOHNORT" /&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Geburtstag:&lt;/strong&gt;&lt;/td&gt;   &lt;td&gt;&lt;xsl:value-of select="GEBURTSTAG" /&gt;&lt;/td&gt;</pre>
<pre style="padding-left: 60px;">&lt;/tr&gt;</pre>
<pre style="padding-left: 30px;">&lt;/xsl:for-each&gt;</pre>
<p>Eine weitere Praktische Funktion ist das Sortieren - <em>xsl:sort </em>ist ein Kindelement der <em>for-each</em> Schleife und Bestimmt dessen Sortierung - in diesem Fall wird nach dem Wohnort in Alphabetischer Reihenfolge Sortiert - möglich wäre hier aber auch mit <em>order=&#8221;descending&#8221;</em> zum Beispiel eine umgekehrte Sortierung und Ähnliches. Der Befehl kann auch mehrfach hintereinander eingesetzt werden falls sich zum Beispiel ein Ortsname doppelt und dann nach Name sortiert werden soll.</p>
<h3>Mehr, mehr, mehr!</h3>
<p>&#8230; gibt es zum Beispiel auf <a href="http://data2type.de/">data2type.de<span style="border: 1px solid grey; padding: 0px 3px; float: none; margin-left: 2px; z-index: 500; display: none; font-family: sans-serif; font-size: xx-small;">123</span></a> und auf <a href="http://www.xml-xslt.de">xml-xslt.de<span style="border: 1px solid grey; padding: 0px 3px; float: none; margin-left: 2px; z-index: 500; display: none; font-family: sans-serif; font-size: xx-small;">124</span></a>. Hier gibt es ein <a href="http://data2type.de/index.php/xml-xslt-xslfo/xslt-einfuehrung">XSLT-Tutorial<span style="border: 1px solid grey; padding: 0px 3px; float: none; margin-left: 2px; z-index: 500; display: none; font-family: sans-serif; font-size: xx-small;">125</span></a> sowie eine Befehlsreferenz (von <a href="http://data2type.de/index.php/xml-xslt-xslfo/xslt-referenz">data2type.de<span style="border: 1px solid grey; padding: 0px 3px; float: none; margin-left: 2px; z-index: 500; display: none; font-family: sans-serif; font-size: xx-small;">126</span></a> sowie etwas umfassender von <a href="http://www.xml-xslt.de/index.php?xsltreferenz">xml-xslt.de<span style="border: 1px solid grey; padding: 0px 3px; float: none; margin-left: 2px; z-index: 500; display: none; font-family: sans-serif; font-size: xx-small;">127</span></a>). Des weiteren gibt es ein schönes Buch von <span><span style="line-height: 1.2em;"><span class="ln2">Doug Tidwell</span></span></span> welches man zum &#8220;auf den Geschmack kommen&#8221; auch <a href="http://www.google.com/books?id=wdzVeIt5QXEC&amp;printsec=frontcover">Online einsehen<span style="border: 1px solid grey; padding: 0px 3px; float: none; margin-left: 2px; z-index: 500; display: none; font-family: sans-serif; font-size: xx-small;">128</span></a> kann. Dies waren im großen und ganzen auch meine Hauptquellen für diesen Artikel. Ansonsten sind Informationen hierzu eher weitläufig gestreut - besonders im Bezug auf Test-Funktionen. Aber im Allgemeinen findet man dank Google schon was man sucht.</p>
<p><strong>Weitere interessante Links:</strong></p>
<ul>
<li><a href="http://de.selfhtml.org/xml/darstellung/index.htm">http://de.selfhtml.org/xml/darstellung/index.htm<span style="border: 1px solid grey; padding: 0px 3px; float: none; margin-left: 2px; z-index: 500; display: none; font-family: sans-serif; font-size: xx-small;">129</span></a></li>
<li> <a href="http://www.usegroup.de/software/xmltutorial/index.html"> http://www.usegroup.de/software/xmltutorial/index.html</a></li>
</ul>
<p><strong>Dateien aus diesem Beispiel:</strong></p>
<ul>
<li><a href="http://linux-techblog.de/wp-content/uploads/2008/06/xslt_phpsimplexml.tgz">xslt_phpsimplexml.tgz</a></li>
</ul>
<p>XSLT bietet eine der wenigen Möglichkeiten Design und Content in PHP wirklich vollkommen von einander zu trennen. Im PHP-Code muss sich kein Stück HTML-Code befinden. Wenn nun noch alle Eingabewerte vernünftig gefiltert werden steht der sicheren Programmierung nichts mehr im Wege. Auf jeden Fall ein Thema mit dem sich jeder ambitionierte Webdesigner mal näher beschäftigen sollte.</p>
]]></content:encoded>
			<wfw:commentRss>http://linux-techblog.de/2008/07/design-und-content-perfekt-getrennt-mit-xslt-und-php-simplexml/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Zeilen ausschneiden mit sed oder perl / cut out lines with sed or perl</title>
		<link>http://linux-techblog.de/2008/07/zeilen-ausschneiden-mit-sed-cut-out-lines-with-sed/</link>
		<comments>http://linux-techblog.de/2008/07/zeilen-ausschneiden-mit-sed-cut-out-lines-with-sed/#comments</comments>
		<pubDate>Sat, 05 Jul 2008 11:52:28 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Tricks & Kniffe]]></category>

		<guid isPermaLink="false">http://linux-techblog.de/?p=14</guid>
		<description><![CDATA[Wer kennt das nicht, man hat einen riesigen sql dump und möchte nur eine Tabelle daraus haben um diese erneut anzulegen. Aber der sql dump ist 2 GB gross und zum suchen in less oder vim hat man keine lust.
Hier kommt die Lösung, auf dieses Problem:
sed -n '/^CREATE TABLE foobar/,/^)\;/p' dump.sql
Wie einfach doch die Welt [...]]]></description>
			<content:encoded><![CDATA[<p>Wer kennt das nicht, man hat einen riesigen sql dump und möchte nur eine Tabelle daraus haben um diese erneut anzulegen. Aber der sql dump ist 2 GB gross und zum suchen in less oder vim hat man keine lust.</p>
<p>Hier kommt die Lösung, auf dieses Problem:</p>
<pre style="padding-left: 30px;">sed -n '/^CREATE TABLE foobar/,/^)\;/p' dump.sql</pre>
<p>Wie einfach doch die Welt sein kann. Dieser Einzeiler eignet sich natürlich hervorragend um auch andere Daten aus Texten heraus zu schneiden.</p>
<p><strong>[UPDATE]</strong></p>
<p>Natürlich geht das auch wunderschön mit Perl:</p>
<pre style="padding-left: 30px;">cat test.txt | perl -ni -e 'print if m/^ANFANG/..m/^ENDE/;'</pre>
]]></content:encoded>
			<wfw:commentRss>http://linux-techblog.de/2008/07/zeilen-ausschneiden-mit-sed-cut-out-lines-with-sed/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
