<?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>/home/antu &#187; Anleitungen</title>
	<atom:link href="http://www.antusblog.de/category/anleitungen/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.antusblog.de</link>
	<description>Linux, Programmierung und andere Dinge die mich interessieren</description>
	<lastBuildDate>Mon, 26 Oct 2009 06:00:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Festplatten überwachen mit SMART</title>
		<link>http://www.antusblog.de/2009/02/11/festplatten-uberwachen-mit-smart/</link>
		<comments>http://www.antusblog.de/2009/02/11/festplatten-uberwachen-mit-smart/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 22:17:14 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[Anleitungen]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Anleitung]]></category>
		<category><![CDATA[Datensicherheit]]></category>
		<category><![CDATA[Festplatten]]></category>
		<category><![CDATA[GSmartControl]]></category>
		<category><![CDATA[SMART]]></category>
		<category><![CDATA[smartmontools]]></category>

		<guid isPermaLink="false">http://antusblog.de/?p=389</guid>
		<description><![CDATA[Wenn eine Festplatte ausfällt ist das immer sehr ärgerlich, auch wenn man regelmäßig Sicherheitskopien anfertigt. Denn diese sind meist nicht mehr ganz aktuell und selbst wenn, die Festplatte muss ausgewechselt, das Betriebssystem neu eingespielt und Sicherungskopien müssen wieder zurück kopiert werden. Solche Ausfälle haben meist die Angewohnheit in unpassenden Momenten zu passieren, z.B. wenn die [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn eine Festplatte ausfällt ist das immer sehr ärgerlich, auch wenn man regelmäßig Sicherheitskopien anfertigt. Denn diese sind meist nicht mehr ganz aktuell und selbst wenn, die Festplatte muss ausgewechselt, das Betriebssystem neu eingespielt und Sicherungskopien müssen wieder zurück kopiert werden. Solche Ausfälle haben meist die Angewohnheit in unpassenden Momenten zu passieren, z.B. wenn die letzte Sicherung schon einige Wochen alt ist oder man wichtige Arbeiten erledigen muss.</p>
<p>Dieses Problem haben auch die Festplattenhersteller erkannt, und das schon vor etlichen Jahren. Und aus diesem Grund wurde S.M.A.R.T ins Leben gerufen, ein System das die mechanischen und elektrischen Eigenschaften von Festplatten überwacht und den Benutzer vor einem bevorstehenden Defekt warnen kann. Auch wenn SMART nicht alle Ausfälle vorhersehen kann, lohnt es sich die SMART-Werte der Festplatten im Auge zu behalten.</p>
<p>In diesem Artikel erkläre ich wie man mit den <code>smartmontools</code> bzw. dem Programm <code>smartctl</code> die SMART-Werte von Festplatten auslesen und auswerten kann.<br />
<span id="more-389"></span></p>
<h2>SMART</h2>
<p>SMART überwacht ungefähr 30 verschiedene Eigenschaften der Festplatte wie zum Beispiel die Temperatur, die Anzahl fehlerhafter Blöcke, oder die Anzahl von Lese-, bzw. Schreibfehlern. Welche Eigenschaften letztendlich überwacht werden hängt vom Hersteller und dem Modell der Festplatten ab. Informationen über die Bedeutung der einzelnen Parameter finden sich <a href="http://de.wikipedia.org/wiki/Self-Monitoring,_Analysis_and_Reporting_Technology#.C3.9Cbliche_Parameter" target="_blank">in der Wikipedia</a>.</p>
<p>Zu jedem Parameter gibt es einen Ausgangswert wie beispielweise 20°C für die Temperatur. Dieser Wert wird zusätzlich noch auf einer Skala von 0-100 bzw. 200 oder 255 dargestellt. Wenn der Ausgangswert schlechter wird weil z.B. die Temperatur der Festplatte steigt oder weil Fehler auftreten dann sinkt der Wert auf der Skala. Wenn sich die Eigenschaften der Festplatte wieder verbessern z.B. weil die Temperatur wieder sinkt, dann steigt der Wert auf der Skala auch wieder, zusätzlich zum aktuellen Wert wird allerdings auch der schlechteste jemals gemessene Wert gespeichert. Die Parameter werden in zwei Kategorien eingeteilt, solche die auf ein hohes Alter der Festplatte und solche die auf einen bevorstehenden Defekt hinweisen. Jeder Parameter hat einen bestimmten Grenzwert, wird dieser unterschritten ist der Zustand der Festplatte problematisch bzw. sie ist defekt.</p>
<p>Die meisten dieser Parameter werden im laufenden Betrieb aktualisiert (online test), einige können jedoch nur durch sogenannte Offline-Tests bestimmt werden, da dabei kurzfristig die Lese-/Schreibgeschwindigkeit beeinträchtigt wird.</p>
<p>Außerdem ist es möglich diverse Selbsttests auszuführen mit denen sich noch weitere Fehler/Probleme feststellen lassen können.</p>
<p>Wie gut SMART vor dem Ausfall von Festplatten warnen kann hat Google in einer Studie mit über 100 000 Festplatten untersucht. Das Ergebnis: 64% aller ausgefallenen Festplatten hatten vor dem Ausfall auffällige SMART-Werte. 4 SMART-Parameter stellten sich als ganz besonders wichtig heraus: Scan Errors, Reallocation Counts, Offline Reallocation und Probational Count. Hier gibt es die Google-Studie: <a href="http://labs.google.com/papers/disk_failures.html" target="_blank">Failure Trends in a Large Disk Drive Population</a>.</p>
<h2>Installation von smartctl</h2>
<p>Die meisten Distributionen bieten ein Paket für smartmontools an, ist das nicht der Fall kann man es wie üblich per <code>./configure &amp;&amp; make &amp;&amp; make install</code> aus dem Quelltext kompilieren (das Quelltextpaket sowie eine englische Installationsanleitung finden sich auf der <a href="http://smartmontools.sourceforge.net/download.html#tarball" target="_blank">offiziellen Webseite von smartmontools</a>).</p>
<p>Gentoo: <code>emerge -av sys-apps/smartmontools</code><br />
Fedora: <code>yum install smartmontools</code><br />
openSUSE: <code>zypper in smartmontools</code><br />
Ubuntu und Derivate: <code>sudo apt-get install smartmontools</code><br />
Debian: <code>apt-get install smartmontools</code></p>
<h2>Benutzung</h2>
<p>In den smartmontools sind zwei Programme enthalten. Das eine Programm heißt <code>smartctl</code>, damit kann man die SMART-Parameter und Informationen von Festplatten auslesen sowie Einstellungen vornehmen und Selbsttests durchführen. Das andere Programm ist der Daemon (Hintergrundprozess/Dienst) <code>smartd</code> mit dem man Festplatten automatisch überwachen und sich im Falle eines Fehlers z.B. eine E-Mail schicken lassen kann. In dieser Anleitung erkläre ich allerdings nur die Bedienung von smartctl, mehr Informationen über smartd und dessen Einrichtung und Bedienung finden sich in der <a href="http://smartmontools.sourceforge.net/doc.html#man-pages" target="_blank">offiziellen Dokumentation (Englisch)</a>.</p>
<h3>Generelle Informationen über die Festplatte anzeigen</h3>
<p>Zuerst einmal kann man sich mit dem Befehl <code>smartctl -i &lt;Festplatte&gt;</code> ein paar Informationen wie den verfügbaren Speicherplatz, die verwendete Firmware, Seriennummer und Modell der Festplatte anzeigen lassen.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># smartctl -i /dev/sda
smartctl version 5.38 [x86_64-pc-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/
&nbsp;
=== START OF INFORMATION SECTION ===
Device Model:     SAMSUNG HD642JJ
Serial Number:    S1AFJ1BQ613828
Firmware Version: 1AA01112
User Capacity:    640.133.946.880 bytes
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   8
ATA Standard is:  ATA-8-ACS revision 3b
Local Time is:    Mon Feb  2 13:18:30 2009 CET
&nbsp;
==&gt;; WARNING: May need -F samsung or -F samsung2 enabled; see manual for details.
&nbsp;
SMART support is: Available - device has SMART capability.
SMART support is: Disabled
&nbsp;
SMART Disabled. Use option -s with argument 'on' to enable it.</pre></div></div>

<p><code>/dev/sda</code> steht für die erste über SCSI/SATA angeschlossene Festplatte, evtl. muss man diese Angabe anpassen je nachdem was für Festplatten man hat und welche man überprüfen möchte. <code>/dev/hd[a-z]</code> sind Festplatten die über IDE/PATA angeschlossen sind, <code>/dev/sd[a-z]</code> sind die Festplatten die über SATA/SCSI  angeschlossen sind.</p>
<p>Wenn anstatt der obigen Ausgabe nur die Meldung <code>Device does not support SMART</code> angezeigt wird kann es sein das <code>smartctl</code> die Festplattenart falsch erkannt hat. Festplatten die kein SMART unterstützen gibt es heutzutage eigentlich gar nicht mehr. Wenn dieser Fehler auftritt kann man mit der Option <code>-d &lt;Typ&gt;</code> nachhelfen, wobei Typ eins von folgenden sein kann: &#8220;ata&#8221;, &#8220;scsi&#8221;, &#8220;marvell&#8221;, &#8220;cciss,N&#8221;, &#8220;3ware,N&#8221;. Bei Desktop-Rechnern dürfte ata in den meisten Fällen richtig sein.</p>
<p>Für externe Festplatten gibt es noch &#8220;sat&#8221; und &#8220;usbcypress&#8221;. Es gibt eine <a href="http://smartmontools.wiki.sourceforge.net/overview_USB-Support" target="_blank">Liste von externen Festplatten</a> von denen bekannt ist das smartctl darauf zugreifen kann.</p>
<h3>SMART aktivieren</h3>
<p>Der obige Befehl zeigt auch an ob die Festplatte SMART überhaupt unterstützt und ob es aktiv/eingeschaltet (<code>SMART support is: Disabled</code>) ist. Ist SMART deaktiviert kann es mit folgendem Befehl aktiviert werden:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># smartctl -s on /dev/sda
smartctl version 5.38 [x86_64-pc-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/
&nbsp;
=== START OF ENABLE/DISABLE COMMANDS SECTION ===
SMART Enabled.</pre></div></div>

<h3>SMART-Informationen auslesen</h3>
<p>Um die SMART-Parameter der Festplatte anzuzeigen benutzt man den Befehl <code>smartctl -A &lt;Festplatte&gt;<br />
</code></p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># smartctl -A /dev/sda
smartctl version 5.38 [x86_64-pc-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/
&nbsp;
=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   100   100   051    Pre-fail  Always       -       61
  3 Spin_Up_Time            0x0007   087   087   011    Pre-fail  Always       -       4860
  4 Start_Stop_Count        0x0032   100   100   000    Old_age   Always       -       100
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000f   253   253   051    Pre-fail  Always       -       0
  8 Seek_Time_Performance   0x0025   100   100   015    Pre-fail  Offline      -       9967
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       2411
 10 Spin_Retry_Count        0x0033   100   100   051    Pre-fail  Always       -       0
 11 Calibration_Retry_Count 0x0012   100   100   000    Old_age   Always       -       0
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       100
 13 Read_Soft_Error_Rate    0x000e   100   100   000    Old_age   Always       -       61
183 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
184 Unknown_Attribute       0x0033   100   100   099    Pre-fail  Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       61
188 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0022   076   074   000    Old_age   Always       -       24 (Lifetime Min/Max 16/24)
194 Temperature_Celsius     0x0022   079   073   000    Old_age   Always       -       21 (Lifetime Min/Max 15/26)
195 Hardware_ECC_Recovered  0x001a   100   100   000    Old_age   Always       -       24789223
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       0
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   100   100   000    Old_age   Always       -       0
200 Multi_Zone_Error_Rate   0x000a   100   100   000    Old_age   Always       -       0
201 Soft_Read_Error_Rate    0x000a   100   100   000    Old_age   Always       -       0</pre></div></div>

<p>ATTRIBUTE_NAME ist der Name des angezeigten Parameters, z.B. Temperature_Celsius für die Temperatur des Datenträgers in °C. Der Ausgangswert wird in der Spalte RAW_VALUE angezeigt (bei der Temperatur: 24°C). VALUE zeigt den Skalenwert, TRESH den Grenzwert und WORST den schlechtesten je gemessenen Wert auf der Skala an. TYPE gibt an ob der Parameter einen bevorstehenden Ausfall anzeigt (Pre-fail) oder nur auf Abnutzung bzw. ein hohes Alter hinweist (Old-age). UPDATED gibt an ob der Parameter im laufenden Betrieb (Always) oder nur im Offline-Test aktualisiert wird. Mehr Informationen zum Offline-Test stehen unten bei Selbsttests.</p>
<p>WHEN_FAILED zeigt FAILING_NOW an wenn einer der Werte unter dem Grenzwert liegt, ist das nicht der Fall wird ein &#8211; angezeigt. Wenn einer der Werte in der Vergangenheit unter dem Grenzwert lag aber im Moment nicht wird In_the_Past angezeigt.</p>
<h3>Selbsteinschätzung der Festplatte</h3>
<p><code>smartctl -H &lt;Festplatte&gt;</code> befragt die Festplatte nach ihrem Zustand. Anhand der SMART-Parameter entscheidet die Festplatte dann ob alles in Ordnung ist oder nicht. Wenn alles in Ordnung ist wird PASSED ausgegeben, ansonsten wird FAILED angezeigt. Wenn FAILED angezeigt wird ist Festplatte bereits defekt oder wird wahrscheinlich innerhalb der nächsten 24 Stunden ausfallen. Ist das der Fall sollte man schnellstmöglich die darauf befindlichen Daten sichern und die Festplatte auswechseln.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># smartctl -H /dev/sda
&nbsp;
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED</pre></div></div>

<h3>SMART-Fähigkeiten der Festplatte</h3>
<p>Welche SMART-Befehle und Eigenschaften die Festplatte unterstützt kann man sich mit dem Befehl <code>smartctl -c &lt;Gerät&gt; </code> anzeigen lassen. Auch die Dauer der Selbsttests und ob die Festplatte Fehler mitloggt wird angezeigt.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># smartctl -c /dev/sda
&nbsp;
=== START OF READ SMART DATA SECTION ===
General SMART Values:
Offline data collection status:  (0x00) Offline data collection activity
                                        was never started.
                                        Auto Offline Data Collection: Disabled.
Self-test execution status:      (   0) The previous self-test routine completed
                                        without error or no self-test has ever
                                        been run.
Total time to complete Offline
data collection:                 (8164) seconds.
Offline data collection
capabilities:                    (0x7b) SMART execute Offline immediate.
                                        Auto Offline data collection on/off support.
                                        Suspend Offline collection upon new
                                        command.
                                        Offline surface scan supported.
                                        Self-test supported.
                                        Conveyance Self-test supported.
                                        Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
                                        power-saving mode.
                                        Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
                                        General Purpose Logging supported.
Short self-test routine
recommended polling time:        (   2) minutes.
Extended self-test routine
recommended polling time:        ( 137) minutes.
Conveyance self-test routine
recommended polling time:        (  15) minutes.
SCT capabilities:              (0x003f) SCT Status supported.
                                        SCT Feature Control supported.
                                        SCT Data Table supported.</pre></div></div>

<h3>Die Selbsttests</h3>
<p>Mittels <code>smartctl -t &lt;Test&gt; &lt;Festplatte&gt;</code> lassen sich einige Tests durchführen. Standardmäßig werden die Tests im Hintergrundmodus gestartet, dadurch beeinträchtigen sie den normalen Betrieb nicht. Mit dem Parameter -C lassen sich die Tests auch im Vordergrund starten, für die Dauer des Tests kann dann allerdings nicht auf die Festplatte zugegriffen werden. (<strong>Achtung</strong>: -C sollte nur bei Festplatten verwendet werden auf denen sich keine eingebundenen (gemounteten) Partitionen befinden!)</p>
<ul>
<li>Der <strong>Offline-Test</strong>. Eigentlich ist das gar kein Selbsttest sondern nur ein Prozess bei dem Daten gesammelt werden. Einige SMART-Parameter lassen sich nicht im laufenden Betrieb aktualisieren (siehe UPDATED-Spalte in der Übersicht), da bei der Überprüfung kurzfristig die Lese-/Schreibgeschwindigkeit beeinträchtigt wird. Einige Festplatten können Überprüfung automatisch alle 4 Stunden durchführen, mittels <code>smartctl -o on &lt;Festplatte&gt;</code> bzw. <code>smartctl -o off &lt;Festplatte&gt;</code> lässt sich das ein/ausschalten. Man kann den Offline-Test allerdings auch per <code>smartctl -t offline &lt;Festplatte&gt;</code> manuell starten.<br />
Wenn Fehler auftreten werden diese in das SMART-Logbuch der Festplatte geschrieben welches sich per <code>smartctl -l error &lt;Festplatte&gt;</code> anzeigen lässt. Der Fortschritt der Überprüfung lässt sich entweder mit <code>smartctl -c &lt;Festplatte&gt;</code> oder mit <code>smartctl -l selftest &lt;Festplatte&gt;</code> anzeigen, welcher der beiden Befehle den Fortschritt anzeigt variiert von Festplatte zu Festplatte.<br />
<strong>Hinweis</strong>: Nicht jede Festplatte kann den Fortschritt anzeigen, steht unter <em>Offline data collection capabilities</em> in den SMART-Fähigkeiten <em>Abort Offline collection upon new command </em>ist die Anzeige nicht möglich, da dabei der Offline-Test abgebrochen werden würde. Steht dort <em>Suspend</em> anstatt <em>Abort</em> ist es möglich den Fortschritt anzuzeigen.Die Fortschrittsanzeige sieht z.B. so aus:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Offline             Self-test routine in progress 90%      2556         -</pre></div></div>

<p><strong>Test_Description</strong> gibt dabei an welcher Test durchgeführt wird, <strong>Remaining</strong> gibt an wie viel Prozent des Tests noch nicht abgeschlossen sind, <strong>LifeTime</strong> gibt die Lebenszeit der Festplatte in Stunden an, <strong>LBA_of_first_error</strong> gibt im Falle eines Fehlers die Adresse von selbigem an.</li>
<li>Der <strong>kurze Selbsttest</strong> überprüft sowohl die mechanischen und elektrischen Fähigkeiten als auch die Lese-Eigenschaften der Festplatte. Er wird mit dem Befehl <code>smartctl -t short &lt;Festplatte&gt;</code> gestartet. Dieser Test dauert nur ein paar Minuten, der Fortschritt des Tests kann wie auch beim Offline-Test überwacht werden.</li>
<li>Während beim kurzen Selbsttest nur stichprobenweise die Platter der Festplatte auf ihre Lesbarkeit hin überprüft werden, führt der <strong>lange Selbsttest</strong> eine Komplettüberprüfung durch. Dieser Test dauert daher auch viel länger (meist einige Stunden.) Der Test wird per <code>smartctl -t long &lt;Festplatte&gt;</code> gestartet.</li>
<li>Nach einem Transport der Festplatte sollte der <strong>Conveyance-Test</strong> durchgeführt werden der die Festplatte auf Schäden untersucht die üblicherweise durch einen Transport hervorgerufen werden können. Er dauert wie der kurze Selbsttest nur einige Minuten und wird mittels <code>smartctl -t conveyance &lt;Festplatte&gt;</code> gestartet.</li>
<li>Außerdem ist es mit dem <strong>Selective-Test</strong> möglich nur einen bestimmten Bereich der Festplatte auf Fehler zu überprüfen. Dabei gibt man einen Bereich oder eine Startadresse und die Anzahl an darauffolgenden Blöcken die untersucht werden sollen an. Der Test wird per <code>smartctl -t select,&lt;Start&gt;-&lt;Ende&gt; &lt;Festplatte&gt;</code> bzw. <code>select,&lt;Start&gt;+&lt;Bereich&gt; &lt;Festplatte&gt;</code> gestartet.<br />
Der Befehl <code>smartctl -t select,570684206+20 /dev/sda</code> beispielsweise würde die Blöcke 570684206 bis einschließlich 570684225 der Festplatte <code>/dev/sda</code> auf Fehler überprüfen.Die Fortschrittsanzeige zeigt folgendes an:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># smartctl -l selftest /dev/sda
=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 0
Warning: ATA Specification requires self-test log structure revision number = 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Selective offline   Completed: read failure       90%      2610         570684206</pre></div></div>

<p>Der Test wurde abgebrochen da der Block 570684206 fehlerhaft ist bzw. nicht gelesen werden konnte.</li>
</ul>
<h4>Der Selbsttest bricht mit einer Fehlermeldung ab, die Festplatte schätzt sich selbst aber noch als intakt ein.</h4>
<p>Wenn die Festplatte einen Block nicht lesen kann oder das Fehlererkennungssystem (ECC) der Festplatte erkennt das ein Block beschädigt wurde, wird zu erst versucht die Daten an der Stelle mittels einer Prüfsumme wiederherzustellen, ist das nicht möglich wird der Block als fehlerhaft bzw. uncorrectable (UNC) markiert. Die Ursache für einen solchen fehlerhaften Block können zum Beispiel ein Stromausfall während des Schreibvorgangs oder eine Beschädigung der Plattenoberfläche an dieser Stelle sein.</p>
<p>Um das Problem eines unkorrigierbaren Blocks zu beheben benutzt man entweder ein entsprechendes Diagnose/Reparatur-Programm des Herstellers  oder man überschreibt den Block einfach noch einmal mit neuen Daten, die Daten die vorher in diesem Block gespeichert waren (512 Bytes) sind dann allerdings verloren. Wenn der Block dann immer noch nicht funktioniert ersetzt die Festplatte ihn automatisch durch einen Reserveblock.</p>
<p>Die Festplatte schätzt sich trotz des fehlerhaften Blocks noch als funktionsfähig ein, da abgesehen von dem fehlerhaften Block noch alle Parameter in Ordnung sind.</p>
<h3>Temperaturinformationen auslesen</h3>
<p>Mittels <code>smartctl -l scttemp &lt;Festplatte&gt;</code> ist es möglich noch mehr Informationen über die Temperatur der Festplatte anzuzeigen. Der Befehl zeigt z.B. die aktuelle Temperatur (im Beispiel 23°C), die maximal gemessene Temperatur seit dem Einschalten des Rechners (26°C) und die höchste jemals gemessene Temperatur (28°C) an. Außerdem werden die höchsten und niedrigsten vom Hersteller empfohlenen Betriebstemperaturen  (-4°C und 72°C) sowie die minimal/maximal zulässigen Betriebstemperaturen (-9°C und 77°C) angezeigt. Zusätzlich wird noch eine Tabelle ausgegeben welche darstellt wie sich die Temperatur in letzter Zeit verändert hat.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"> # smartctl -l scttemp /dev/sda
=== START OF READ SMART DATA SECTION ===
SCT Status Version:                  2
SCT Version (vendor specific):       256 (0x0100)
SCT Support Level:                   1
Device State:                        Active (0)
Current Temperature:                 23 Celsius
Power Cycle Max Temperature:         26 Celsius
Lifetime    Max Temperature:         28 Celsius
SCT Temperature History Version:     2
Temperature Sampling Period:         1 minute
Temperature Logging Interval:        1 minute
Min/Max recommended Temperature:     -4/72 Celsius
Min/Max Temperature Limit:           -9/77 Celsius
Temperature History Size (Index):    128 (43)
&nbsp;
Index    Estimated Time   Temperature Celsius
  44    2009-02-10 22:29    24  *****
 ...    ..( 70 skipped).    ..  *****
 115    2009-02-10 23:40    24  *****
 116    2009-02-10 23:41    23  ****
 ...    ..( 24 skipped).    ..  ****
[...]</pre></div></div>

<h3>Grafische Oberfläche: GSmartControl</h3>
<div style="float:right"><img class="alignright size-full wp-image-434" title="Das Hauptfenster von GSmartControl" src="http://antusblog.de/wp-content/uploads/2009/02/gsmartcontrol1.png" alt="Das Hauptfenster von GSmartControl" width="332" height="240" /></p>
<div><a href="http://antusblog.de/wp-content/uploads/2009/02/gsmartcontrol2.png"><img class="size-medium wp-image-437 alignright" title="Die Parameter von einer meiner Festplatten" src="http://antusblog.de/wp-content/uploads/2009/02/gsmartcontrol2-300x256.png" alt="Die Parameter von einer meiner Festplatten" width="332" height="240" /></a></div>
</div>
<p>GSmartControl ist eine grafische Benutzeroberfläche für smartctl. Die meisten Distributionen bieten das Programm über die Paketverwaltung an, ansonsten kann man es <a href="http://gsmartcontrol.berlios.de/home/index.php/en/Downloads" target="_blank">hier</a> herunterladen und wie üblich per <code>./configure &amp;&amp; make &amp;&amp; make install</code> selbst aus den Quellen kompilieren. Anschließend kann das Programm mit dem Befehl <code>gsmartcontrol</code> gestartet werden. Damit das Programm funktioniert werden aber in der Regel root-Rechte benötigt, entweder man startet gsmartcontrol in einer root-Konsole oder man benutzt kdesu/gnomesu/etc. oder das Skript <code>gsmartcontrol-root</code> um es mit Administratorrechten zu starten.</p>
<p style="text-align: left;">Die Bedienung von GSmartControl ist eigentlich relativ einfach. Im Hauptfenster werden alle Festplatten des Rechners angezeigt, um mehr Informationen über die SMART-Daten einer Festplatte anzeigen zu lassen doppelklickt man auf das entsprechende Symbol. Es öffnet sich ein Fenster mit mehreren Tabs in denen alle SMART-Informationen enthalten sind. Dort kann man auch die Ergebnisse von Selbsttests ansehen und selbige durchführen.</p>
<h3>Abschließendes</h3>
<p>Mit SMART lassen sich in vielen Fällen Defekte vorhersehen und somit Datenverluste und Ausfälle vermeiden. Dieser Artikel erklärt die wichtigsten Befehle von smartctl, das Programm kann aber noch ein bisschen mehr. Weitere Informationen über SMART und die smartmontools finden sich unter folgenden Adressen:</p>
<ul>
<li><a href="http://smartmontools.sourceforge.net/faq.html" target="_blank">Oft gestellte Fragen zu den smartmontools (Englisch)</a></li>
<li><a href="http://www.pro-linux.de/t_system/badblock.html" target="_blank">Ein Skript welches fehlerhafte Festplattensektoren neu zuweist</a></li>
<li><a href="http://de.wikipedia.org/wiki/Self-Monitoring,_Analysis_and_Reporting_Technology" target="_blank">Wikipedia-Artikel zu S.M.A.R.T.</a></li>
<li><a href="http://smartmontools.sourceforge.net/" target="_blank">Die offizielle Webseite von smartmontools (Englisch)</a></li>
<li><a href="http://gsmartcontrol.berlios.de/home/index.php/en/Home" target="_blank">Die offizielle Webseite von GSmartControl</a></li>
<li><a href="http://smartmontools.sourceforge.net/doc.html#man-pages" target="_blank">Handbücher zu smartctl, smartd und der smartd.conf (Englisch)</a></li>
<li><a href="http://labs.google.com/papers/disk_failures.html" target="_blank">Google-Studie: Failure Trends in a Large Disk Drive Population (Englisch)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2009/02/11/festplatten-uberwachen-mit-smart/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Root-Passwort vergessen?</title>
		<link>http://www.antusblog.de/2008/12/27/root-passwort-vergessen/</link>
		<comments>http://www.antusblog.de/2008/12/27/root-passwort-vergessen/#comments</comments>
		<pubDate>Sat, 27 Dec 2008 01:00:16 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[Anleitungen]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Passwort]]></category>
		<category><![CDATA[root]]></category>

		<guid isPermaLink="false">http://antusblog.de/?p=326</guid>
		<description><![CDATA[enn man das root-Passwort vergessen hat muss man nicht gleich das ganze System neu aufsetzen. Man kann das verlorene Passwort zwar nicht mehr herausfinden, aber es gibt ein paar Tricks mit denen man das Passwort in den meisten Fällen ändern kann. In dieser Anleitung werde ich 3 Methoden beschreiben, mit denen man relativ leicht und [...]]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_352" class="wp-caption alignright" style="width: 310px"><a href="http://antusblog.de/wp-content/uploads/2008/12/knoppix.png"><img class="size-medium wp-image-352" title="knoppix" src="http://antusblog.de/wp-content/uploads/2008/12/knoppix-300x225.png" alt="Das root-Passwort wurde mithilfe einer LiveCD (in diesem Fall KNOPPIX) geändert." width="300" height="225" /></a><p class="wp-caption-text">Das root-Passwort wurde mithilfe einer LiveCD (in diesem Fall KNOPPIX) geändert.</p></div>Wenn man das root-Passwort vergessen hat muss man nicht gleich das ganze System neu aufsetzen. Man kann das verlorene Passwort zwar nicht mehr herausfinden, aber es gibt ein paar Tricks mit denen man das Passwort in den meisten Fällen ändern kann. In dieser Anleitung werde ich 3 Methoden beschreiben, mit denen man relativ leicht und ohne besondere Linux-Kenntnisse das root-Passwort ändern kann ohne es zu kennen.</p>
<ul>
<li>Methode 1: In den Einzelbenutzermodus starten</li>
<li>Methode 2: In eine Konsole starten</li>
<li>Methode 3: Passwort mit einer LiveCD ändern</li>
</ul>
<p><span id="more-326"></span></p>
<p>Alle drei Methoden die ich hier beschreibe haben eins gemeinsam: Man muss den Gerätenamen (zum Beispiel /dev/hda2, /dev/sda4 o.Ä.) der Partition kennen auf der sich das Stammverzeichnis befindet (auch Root-Verzeichnis oder Wurzelverzeichnis genannt, es ist das Verzeichnis mit dem Pfad &#8220;/&#8221; gemeint.) Bei der Installation von Linux werden meistens 2-3 Partitionen angelegt, meistens hat man eine sehr kleine Boot-Partition, eine ebenfalls meist eher kleine Swap-Partition und eine Partition auf der das ganze System installiert wird und auf der die Daten liegen. Den Gerätenamen  letzterer muss man kennen. Wenn man diesen nicht kennt kann man diesen mit dem befehl df oder dem Befehl mount herausfinden, dazu öffnet man einfach eine Konsole und gibt mount oder df ein. Das funktioniert auch als normaler Benutzer, root-Rechte braucht man dazu nicht.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #c20cb9; font-weight: bold;">mount</span>
<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>hda1 on <span style="color: #000000; font-weight: bold;">/</span> <span style="color: #7a0874; font-weight: bold;">type</span> ext3 <span style="color: #7a0874; font-weight: bold;">&#40;</span>rw,<span style="color: #007800;">errors</span>=remount-ro<span style="color: #7a0874; font-weight: bold;">&#41;</span>
tmpfs on <span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>init<span style="color: #000000; font-weight: bold;">/</span>rw <span style="color: #7a0874; font-weight: bold;">type</span> tmpfs <span style="color: #7a0874; font-weight: bold;">&#40;</span>rw,nosuid,<span style="color: #007800;">mode</span>=0755<span style="color: #7a0874; font-weight: bold;">&#41;</span>
proc on <span style="color: #000000; font-weight: bold;">/</span>proc <span style="color: #7a0874; font-weight: bold;">type</span> proc <span style="color: #7a0874; font-weight: bold;">&#40;</span>rw,noexec,nosuid,nodev<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span>...<span style="color: #7a0874; font-weight: bold;">&#93;</span></pre></div></div>

<p>Hier sieht man das der Gerätename für <code>/</code> gleich <code>/dev/hda1</code> ist. Diesen muss man sich merken.(Hinweis: Der Gerätename fängt immer mit <code>/dev/</code> an)</p>
<p>Nun zum eigentlichen Teil dieser Anleitung.</p>
<h2>Methode 1: In den Einzelbenutzermodus starten</h2>
<p>Die einfachste Methode besteht darin einfach in den Einzelbenutzermodus zu starten indem man &#8220;single&#8221; an die Boot-Optionen anhängt. Manche Distributionen bieten das als &#8220;Recovery Mode&#8221; o.Ä. an, bei manchen Distributionen wird diese Methode allerdings nicht funktionieren weil vorher das root-Passwort verlangt wird, welches man ja nicht mehr weiß. Aber da es die einfachste Methode ist kann man es ja trotzdem einfach mal versuchen.</p>
<p>Wenn man den Rechner einschaltet wird meistens nach kurzer Zeit das Startmenü vom Bootloader angezeigt, wo man auswählen kann welches Betriebssystem man starten möchte oder ob man evtl. in einen Wartungsmodus starten will. Eventuell wird auch anstatt des Startmenüs sowas angezeigt:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">GRUB loading, please wait ...
&nbsp;
Press ESC to enter menu ...</pre></div></div>

<p>Durch drücken der Escape-Taste gelangt man dann zum Startbildschirm/Menü. In diesem Menü ist es möglich dem Betriebssystem noch einige Optionen beim Start mitzugeben.</p>
<p>Benutzer von <strong>LinuxMint</strong> haben es hier besonders leicht: Einfach den &#8220;recovery mode&#8221; starten und dort <em>drop to root shell prompt</em> auswählen (dann mit Schritt 3 weitermachen). Benutzer anderer Distributionen gehen wie folgt vor:</p>
<ol>
<li>Bei manchen Distributionen (z.B. openSUSE, LinuxMint) befindet sich unten eine Eingabezeile in der zusätzliche Boot-Optionen eingetragen werden können. Dort trägt man einfach <code>single</code> hinter den anderen Optionen ein und drückt dann die Eingabetaste um das System in den Einzelbenutzermodus zu starten.<br />
<img class="aligncenter size-full wp-image-343" title="bootoptionen" src="http://antusblog.de/wp-content/uploads/2008/12/bootoptionen.png" alt="bootoptionen" width="650" height="72" /><br />
Wenn man diese Eingabezeile nicht hat tut man folgendes:</p>
<ol>
<li>Den Eintrag auswählen den man normalerweise auch zum Starten benutzt.</li>
<li><strong>e</strong> drücken, und mit den Pfeiltasten zu der Zeile gehen die mit <em>»kernel«</em> anfängt.</li>
<li>Wieder <strong>e</strong> drücken, und am Ende der Zeile single hinzufügen.</li>
<li>Dann mit der Eingabetaste bestätigen und <strong>b</strong> drücken um das System zu starten.</li>
</ol>
<p>Nun wird Linux gestartet und man landet bei einer Eingabeaufforderung. Wenn Linux nun nach dem Passwort fragt wird diese Methode nicht funktionieren, denn das Passwort kennt man ja nicht mehr.<br />
<img class="aligncenter size-full wp-image-345" title="give-root-password-for-maintenance" src="http://antusblog.de/wp-content/uploads/2008/12/give-root-password-for-maintenance.png" alt="give-root-password-for-maintenance" width="365" height="32" />In dem Fall sollte man eine andere Methode versuchen. Ansonsten geht es weiter zu Schritt 2.</li>
<li>Wahrscheinlich ist das die Partition auf der sich das Stammverzeichnis / (auch Wurzelverzeichnis oder Root-Verzeichnis genannt) befindet noch als nur lesbar eingebunden. Es muss als les- und schreibbar eingebunden werden um das Passwort zu ändern.

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #660033;">-o</span> remount, rw <span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>Wenn das nicht funktioniert, muss man den Gerätenamen mit angeben.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #660033;">-o</span> remount, rw <span style="color: #000000; font-weight: bold;">&lt;</span>Gerätename<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

</li>
<li>Jetzt kann man mit dem <code>passwd</code>-Befehl ein neues Passwort setzen. Nicht wundern, das Passwort wird während der Eingabe nicht angezeigt, auch nicht durch Sternchen.</li>
<p><code>root@(none):/# passwd<br />
Enter new UNIX password:<br />
Retype new UNIX password:<br />
passwd: password updated successfully</code></p>
<p>Wenn nun <code>password updated successfully</code> da steht wurde erfolgreich ein neues Passwort festgelegt. Jetzt muss das Dateisystem wieder nur-lesbar eingebunden werden:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #660033;">-o</span> remount,ro <span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>Danach einfach den Rechner neu starten.</ol>
<h2>Methode 2: In eine Konsole starten</h2>
<p>Man kann den Kernel beim Start anweisen anstatt des normalen Init-Systems einfach eine Shell zu starten. Dort ist man dann automatisch als root eingeloggt, nach dem Passwort wird nicht gefragt.</p>
<p>Hier verfährt man eigentlich genau so wie bei Methode 1, nur mit dem Unterschied das man nicht single an die Boot-Optionen anhängt sondern <code>init=/bin/bash</code>. Ansonsten tut man genau das was in Methode 1 beschrieben wird.</p>
<p style="padding-left: 30px;">Achtung: Möglicherweise ist nicht die deutsche, sondern die US Tastenbelegung aktiviert. Um ein = zu bekommen muss man die ‘-Taste (zwischen ? und der Backspace/Löschen-Taste) drücken. Für ein / drückt man die &#8211; Taste. In Wirklichkeit gibt man also folgendes ein:  <code>init‘-bin-bash</code></p>
<h2>Methode 3: Passwort mit einer LiveCD ändern</h2>
<p>Wenn die anderen beiden Methoden nicht funktionieren kann man auch eine LiveCD (<a href="http://www.knoppix.org/" target="_blank">Knoppix</a>, <a href="http://damnsmalllinux.org/index_de.html" target="_blank">Damn Small Linux</a>, etc.) starten, mit <code>chroot</code> zum Rootverzeichnis des richtigen Systems zu wechseln und mit <code>passwd</code> das Passwort wechseln.</p>
<ol>
<li> ist öffnet man eine Konsole in der man sich erst einmal mit <code>su</code> root-Rechte beschafft. Dann wird ein Einbindepunkt für das Stammverzeichnis von Linux erstellt.

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">su</span>
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #000000; font-weight: bold;">/</span>mnt<span style="color: #000000; font-weight: bold;">/</span>linux</pre></div></div>

</li>
<li> Anschließend wird das Stammverzeichnis eingebunden und mittels <code>chroot</code> in das richtige Linux gewechselt, dort wird dann mit root-Rechten <code>passwd</code> ausgeführt um das Passwort zu ändern.

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #000000; font-weight: bold;">&lt;</span>Hier Gerätename einfügen<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>mnt<span style="color: #000000; font-weight: bold;">/</span>linux
<span style="color: #c20cb9; font-weight: bold;">chroot</span> <span style="color: #000000; font-weight: bold;">/</span>mnt<span style="color: #000000; font-weight: bold;">/</span>linux
<span style="color: #c20cb9; font-weight: bold;">passwd</span>
<span style="color: #000000; font-weight: bold;">&lt;</span>Neues Passwort eingeben<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #7a0874; font-weight: bold;">exit</span></pre></div></div>

<p>Jetzt muss der Rechner nur noch neu gestartet werden.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2008/12/27/root-passwort-vergessen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Bildschirm aufnehmen (Video) mit recordMyDesktop</title>
		<link>http://www.antusblog.de/2008/12/22/bildschirm-aufnehmen-video-mit-recordmydesktop/</link>
		<comments>http://www.antusblog.de/2008/12/22/bildschirm-aufnehmen-video-mit-recordmydesktop/#comments</comments>
		<pubDate>Mon, 22 Dec 2008 22:35:03 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[Anleitungen]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Bildschirm aufnehmen]]></category>
		<category><![CDATA[recordMyDesktop]]></category>
		<category><![CDATA[Tipp]]></category>

		<guid isPermaLink="false">http://antusblog.de/?p=300</guid>
		<description><![CDATA[Es gibt unzählige Dinge die ein Video besser ausdrückt als Bilder oder Texte. Seien es die neuen 3D-Effekte einiger Compiz-Erweiterungen oder Anleitungen zu irgendwelchen Programmen. Mit recordMyDesktop lassen sich relativ einfach solche Aufnahmen vom Bildschirm erstellen.

Von recordMyDesktop gibt es zwei Versionen, eine Variante für die Kommandozeile und zwei für die grafische Oberfläche (eine für GTK/Gnome [...]]]></description>
			<content:encoded><![CDATA[<p>Es gibt unzählige Dinge die ein Video besser ausdrückt als Bilder oder Texte. Seien es die neuen 3D-Effekte einiger Compiz-Erweiterungen oder Anleitungen zu irgendwelchen Programmen. Mit <a href="http://recordmydesktop.sourceforge.net/about.php" target="_blank">recordMyDesktop</a> lassen sich relativ einfach solche Aufnahmen vom Bildschirm erstellen.</p>
<p><span id="more-300"></span></p>
<p>Von recordMyDesktop gibt es zwei Versionen, eine Variante für die Kommandozeile und zwei für die grafische Oberfläche (eine für GTK/Gnome und eine für Qt/KDE). Vom Aufbau und der Bedienung her unterscheiden sich die beiden grafischen Varianten allerdings kaum.</p>
<h2>Benutzung:</h2>
<p><img class="aligncenter size-full wp-image-303" title="qt-recordMyDesktop" src="http://antusblog.de/wp-content/uploads/2008/12/qt_recordmydesktop.png" alt="qt-recordMyDesktop" width="612" height="337" />Das ist das Hauptfenster von recordMyDesktop. Links ist ein Vorschaubild, das den Bildschirm zeigt wie er im Moment aussieht (mit einer kleinen Verzögerung). Wenn man nur einen Bereich des Bildschirms aufnehmen möchte kann man diesen einfach in dem Vorschaubild auswählen. Gerade Benutzer mit älteren Rechnern sollten hiervon Gebrauch machen, denn um so kleiner der Bereich ist den das Programm aufzeichnet, um so weniger Rechenleistung/Speicher wird benötigt.</p>
<p>Die Schaltflächen am unteren Rand des Fensters sind eigentlich selbsterklärend. Mit <em>Select Window</em> kann festgelegt werden das nur ein bestimmtes Fenster aufgezeichnet werden soll. <em>Record</em> startet die Aufnahme und unter <em>Save As</em> kann man festlegen wo, unter welchem Namen und in welchem Format die Aufnahme gespeichert werden soll. <em>Quit</em> beendet das Programm.</p>
<p>Unten rechts im Infobereich befindet sich nun auch ein kleiner roter Kreis. Mit einem Klick auf diesen kann eine neue Aufnahme gestartet werden. Er verwandelt sich dann in ein blaues Rechteck, ein Klick darauf beendet die Aufnahme. Außerdem gibt es noch zwei sehr nützliche Tastaturkürzel: Strg+Alt+p pausiert die Aufnahme/nimmt weiter auf, und Strg+Alt+s beendet die Aufnahme.</p>
<p>Auf der rechten Seite befinden sich zwei Schieberegler mit denen die Bild- und Tonqualität beeinflusst werden kann. Wenn man das Häkchen neben <em>Sound Quality</em> entfernt wird kein Ton aufgezeichnet. Mit einem Klick auf <em>Advanced</em> gelangt man zu den Erweiterten Einstellungen.</p>
<h3>Erweiterte Einstellungen</h3>
<p>Hier kann man das Programm genau auf die eigenen Anforderungen abstimmen.<br />
<div id="attachment_306" class="wp-caption aligncenter" style="width: 564px"><img class="size-full wp-image-306" title="Advanced" src="http://antusblog.de/wp-content/uploads/2008/12/advanced1.png" alt="Erweiterte Einstellungen: Dateien und Leistungsmerkmale" width="554" height="546" /><p class="wp-caption-text">Erweiterte Einstellungen: Dateien und Leistungsmerkmale</p></div></p>
<p>Ein Häkchen bei <em>Overwrite Existing Files</em> bewirkt das Dateien beim Abspeichern überschrieben werden. Normalerweise wird einfach eine Zahl an den Dateinamen angehangen, wenn die Datei in die die Aufzeichnung abgespeichert werden soll bereits existiert. Wenn man seine Aufzeichnung z.B. als Aufzeichnung.ogg abspeichern möchte, die Datei aber bereits existiert, wird sie einfach als Aufzeichnung-1.ogg abgespeichert. <em>Working Directory</em> legt fest wo temporäre Daten abgespeichert werden sollen, die während der Aufnahme entstehen. Achtung: Hier können sich bei längeren Aufnahmen schnell mehrere Gigabytes an Daten ansammeln!</p>
<p>Mit <em>Frames per Second</em> wird festgelegt wie viele <a href="http://de.wikipedia.org/wiki/Bildwiederholfrequenz" target="_blank">Einzelbilder pro Sekunde</a> aufgenommen werden sollen. Ist dieser Wert zu niedrig wirkt die Aufnahme ruckelig, höhere Werte beanspruchen allerdings auch mehr Rechenleistung und Speicherplatz. <em>Encode On the Fly</em> bewirkt das das Video bereits während der Aufnahme kodiert also komprimiert und ins Zielformat gewandelt wird. Die Daten werden dann nicht erst zwischengespeichert, allerdings wird dabei sehr viel Rechenleistung benötigt. Mit <em>Zero Compression</em> lässt sich das Komprimieren der temporären Dateien abschalten, dadurch wird Rechenleistung auf Kosten von Speicherplatz eingespart. Um noch mehr Rechenleistung einzusparen kann <em>Quick Subsampling</em> aktiviert werden, dabei werden die Farbinformationen nicht mehr so oft abgetastet, was allerdings zu verschwommenen Farben führt. Wenn man 3D-Programme wie z.B. Spiele aufzeichnen will oder Compiz bzw. KDE 4 verwendet oder sonst irgendwie 3D-beschleunigte Programme laufen hat muss man <em>Full shots at every frame </em>aktivieren. Ansonsten sollte man diese Option nicht aktivieren da sie den Prozessor sehr stark belastet.</p>
<div id="attachment_309" class="wp-caption aligncenter" style="width: 564px"><img class="size-full wp-image-309" title="Erweiterte Einstellungen 2" src="http://antusblog.de/wp-content/uploads/2008/12/advanced2.png" alt="Ton und sonstige Einstellungen" width="554" height="546" /><p class="wp-caption-text">Ton und sonstige Einstellungen</p></div>
<p>Mit <em>Channels</em> kann man einstellen wie viele Audiokanäle die Aufzeichnung haben soll, wenn man ein Mikro als Aufnahmequelle verwendet reicht 1 Kanal. <em>Frequency</em> bestimmt die Abtastrate der Tonaufzeichnung, 22050 Hz reichen für Sprachaufnahmen vollkommen aus, wenn man allerdings auch Musik aufnehmen will sollte man hier lieber 44100 Hz einstellen. Will man ein bestimmtes Gerät für die Tonaufzeichnung verwenden kann man unter Device das ALSA-Gerät (bzw. OSS, aber das benutzt heutzutage eh keiner mehr. <img src='http://www.antusblog.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> ) eintragen das verwendet werden soll.</p>
<p>Alternativ man auch <a href="http://jackaudio.org/" target="_blank">JACK</a> benutzen, dazu macht man einfach ein Häkchen bei <em>Use Jack for audio capture</em>.</p>
<p>Zu den sonstigen Einstellungen. Unter <em>Display</em> kann man eintragen auf welchem &#8220;Bildschirm&#8221; eigentlich aufgezeichnet werden soll, das ist ganz nützlich wenn man z.B. mehrere X-Server laufen hat. Wichtig: $DISPLAY ist keine Shell-Variable sondern bedeutet einfach nur das der Standardbildschirm verwendet werden soll. Mouse Cursor bestimmt wie der Mauszeiger dargestellt wird. Hier gibt es 4 Möglichkeiten, bei <em>Normal</em> wird der Mauszeiger ganz normal angezeigt und nicht weiter verändert, <em>White</em> bzw. <em>Black</em> zeichnet anstatt des normalen Mauszeigers einen weissen/schwarzen Mauszeiger und mit <em>None</em> wird gar kein Mauszeiger angezeigt.</p>
<p>Eine sehr praktische Funktion ist <em>Follow Mouse</em>, dabei verfolgt der Aufnahmebereich sozusagen die Maus. So muss man nicht den ganzen Bildschirm aufnehmen, kann aber trotzdem alles was man macht in die Aufnahme bringen. Der Mauszeiger ist dabei immer in der Mitte der Aufnahme, außer man kommt an den Bildschirmrand. Aber Vorsicht: Wenn diese Option aktiviert ist wird automatisch auch <em>Full shots at every frame</em> aktiviert. Die <em><a href="http://en.wikipedia.org/wiki/MIT-SHM" target="_blank">MIT-Shm</a> extension</em> sollte immer aktiviert sein, eine Abschaltung dieser Option hat keine Vorteile, es wird nur viel mehr Rechenleistung benötigt. Wenn man das Häkchen bei <em>Include Windows Decorations</em> entfernt werden Titelleiste und Fensterrahmen nicht mit aufgenommen, wenn man den Aufnahmebereich mit der<em> Select Window</em> Schaltfläche begrenzt.</p>
<p>Mit <em>Tooltips</em> lassen sich die kleinen Kurzinfos in den Einstellungen die die Bedeutung der einzelnen Optionen erklärem wenn man mit der Maus über sie fährt an/abschalten. Ist Outline Capture Area On Screen aktiviert wird, wenn nur ein bestimmter Bereich aufgenommen werden soll, ein Rahmen um diesen Bereich gezeichnet, so sieht man immer was noch aufgenommen wird und was nicht. Reset Capture Area sorgt dafür das nach jeder Aufnahme wieder der ganze Bildschirm als Aaufnahmebereich eingestellt wird, will man hintereinander mehrere Aufnahmen desselben Bereichs erstellen kann man diese Option abschalten. Mit Extra-Options lassen sich noch weitere Optionen von der Kommandozeilenversion festlegen, welche es gibt steht in der Manpage.</p>
<h3>Auf der Kommandozeile&#8230;</h3>
<p>Das Programm lässt sich wie schon gesagt auch über die Kommandozeile benutzen. Wie das genau funktioniert steht in der Manpage (man recordmydesktop).</p>
<p>Hier ein kleines Beispiel:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">recordmydesktop <span style="color: #660033;">-fps</span> <span style="color: #000000;">20</span> <span style="color: #660033;">-o</span> test.ogv</pre></div></div>

<p>Startet eine Aufnahme vom ganzen Bildschirm mit 20 Bildern pro Sekunde, beenden kann man die Aufnahme mit Strg+C oder Strg+Alt+s. Die Aufnahme wird dann unter test.ogv gespeichert.</p>
<h3>Ausgabe umwandeln</h3>
<p>Man kann die Aufnahme auch noch mit mencoder in ein anderes Format umwandeln, um Platz zu sparen. Außerdem muss man sie umwandeln wenn man sie unter Windows ansehen will oder z.B. auf YouTube hochladen möchte.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mencoder <span style="color: #660033;">-idx</span> aufnahme.ogv <span style="color: #660033;">-ovc</span> lavc <span style="color: #660033;">-oac</span> mp3lame <span style="color: #660033;">-o</span> aufnahme.avi</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2008/12/22/bildschirm-aufnehmen-video-mit-recordmydesktop/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Pakete suchen mit eix</title>
		<link>http://www.antusblog.de/2008/12/20/pakete-suchen-mit-eix/</link>
		<comments>http://www.antusblog.de/2008/12/20/pakete-suchen-mit-eix/#comments</comments>
		<pubDate>Sat, 20 Dec 2008 13:12:34 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[Anleitungen]]></category>
		<category><![CDATA[Gentoo]]></category>
		<category><![CDATA[Anleitung]]></category>
		<category><![CDATA[eix]]></category>
		<category><![CDATA[emerge]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Paketverwaltung]]></category>

		<guid isPermaLink="false">http://antusblog.de/?p=234</guid>
		<description><![CDATA[Portage durchsuchen. Jeder der Gentoo schon etwas länger benutzt weiß das die Suche nach einem Paket ewig dauert. Kein Wunder, denn die Portage-Datenbank basiert auf Dateien und somit müssen bei jeder Suche unzählige Verzeichnisse und Dateien durchgegangen werden, und das dauert nunmal. Aber es gibt eine Alternative zu emerge --search, sie heißt eix und ist [...]]]></description>
			<content:encoded><![CDATA[<p>Portage durchsuchen. Jeder der Gentoo schon etwas länger benutzt weiß das die Suche nach einem Paket ewig dauert. Kein Wunder, denn die Portage-Datenbank basiert auf Dateien und somit müssen bei jeder Suche unzählige Verzeichnisse und Dateien durchgegangen werden, und das dauert nunmal. Aber es gibt eine Alternative zu <code>emerge --search</code>, sie heißt <a href="http://eix.sourceforge.net/">eix</a> und ist nicht nur schneller als Emerge sondern auch viel mächtiger. Eix basiert auf einem binären Cache, was die Suche stark beschleunigt. Außerdem zeigt eix weit mehr Informationen an und es ist möglich die Suche viel stärker einzugrenzen (Lizenz, Homepage, Kategorie, Use-Flags, &#8230;), nach regulären Ausdrücken zu suchen und vieles mehr.</p>
<p>Ein kleiner Geschwindigkeitsvergleich:<br />
<code>time emerge --search mozilla-firefox<br />
  real    <strong>0m16.174s</strong><br />
  user    0m1.420s<br />
  sys     0m0.256s<br />
time eix mozilla-firefox<br />
  real    <strong>0m0.292s</strong><br />
  user    0m0.024s<br />
  sys     0m0.004s</code><br />
<span id="more-234"></span></p>
<h2>Installation</h2>
<p>Eix zu installieren ist nicht besonders schwer, es gibt natürlich ein ebuild.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">emerge <span style="color: #660033;">-av</span> eix</pre></div></div>

<h2>Benutzung</h2>
<p>Zu erst einmal muss der binäre Cache angelegt werden, ohne den funktioniert eix natürlich nicht. Mit <code>update-eix</code> wird der Cache angelegt/aktualisiert. Nach jedem <code>emerge --sync</code> muss das wiederholt werden, damit der Cache auch auf dem neusten Stand ist. Wer sich etwas Tipparbeit ersparen möchte kann auch gleich den Befehl <code>eix-sync</code> benutzen, der führt erst ein <code>emerge --sync</code> und anschließend ein <code>update-eix</code> aus.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">eix-sync
 * Running emerge --sync
&nbsp;
[...]
&nbsp;
 * Copying old /var/cache/eix cache to /var/cache/eix.previous
 * Running update-eix
Reading Portage settings ..
Building database (/var/cache/eix) ..
&nbsp;
[...]
&nbsp;
Database contains 13135 packages in 152 categories.
Diffing databases (13142 - 13135 packages)
[*&gt;]  == dev-ruby/mkrf (~0.2.3 -&gt; 0.2.3): mkrf is a library for generating Rakefiles, primarily intended for building C extentions for Ruby.
[&lt;]   == x11-themes/gtk-theme-switch (1.0.1-r2 2.0.0_rc2-r2 -&gt; 2.0.0_rc2-r2): Application for easy change of GTK-Themes
      &lt;&lt; x11-themes/gtk-engines-begtk (1.0.1-r2): GTK+1 BeGTK Theme Engine
[N]   &gt;&gt; dev-python/xlwt (~0.7.0): Python library to create spreadsheet files compatible with Excel</pre></div></div>

<p>eix-sync zeigt einem auch gleich eine kleine Übersicht an, welche Pakete neu in Portage sind und welche entfernt oder verändert wurden. </p>
<p><strong>Aber wie sucht man jetzt?</strong><br />
Ganz einfach, per <code>eix &lt;Paket&gt;</code>. Das ist natürlich noch nicht alles, eix bietet unzählige Optionen, diese werden im folgenden erklärt.</p>
<h2>Pakete suchen</h2>
<p>Eix bietet unzählige Möglichkeiten die Parameter der Suche zu verändern. Mehrere Suchausdrücke können kombiniert werden, jeder Suchausdruck kann auf bestimmte Felder (Lizenz, Name, Beschreibung, etc.) beschränkt und es können diverse Bedingungen (installiert, nicht installiert, maskiert, stabil, etc.) festgelegt werden.</p>
<p>Man kann zwischen 4 verschiedene Suchalgorithmen wählen. Mit <code>-e</code> bzw. <code>--exact</code> sucht eix nur noch nach dem exakten Suchausdruck, <code>eix -e kde</code> findet also nur noch das Paket kde, nicht jedoch kde-utils. Wenn man sich nicht sicher ist wie ein Paket geschrieben wird, kann eix versuchen über die <a href="http://de.wikipedia.org/wiki/Levenshtein-Distanz">Levenshtein-Distanz</a> Pakete mit ähnlichem Namen zu finden, dazu wird die Option <code>-f &lt;N&gt;</code> verwendet, N gibt dabei die maximale Distanz an, also wie viele Buchstaben anders sein dürfen. Mit <code>-p</code> bzw. <code>--pattern</code> sucht eix nach einem bestimmten Muster, mehr Informationen darüber stehen in der Manpage von glob (<code>man 7 glob</code>), wichtig hierbei ist das man das Muster in einzelne Anführungszeichen setzt, also &#8216;Muster&#8217;, damit die Shell das Muster nicht interpretiert. Wem Muster nicht reichen und wer lieber mit regulären Ausdrücken arbeitet der kann auch die Option <code>-r</code> bzw. <code>--regex</code> verwenden.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">eix <span style="color: #660033;">-f</span> <span style="color: #000000;">2</span> amarock <span style="color: #666666; font-style: italic;"># Findet amarok, trotz des Rechtschreibfehlers</span>
eix <span style="color: #660033;">-p</span> <span style="color: #ff0000;">'??arok'</span> <span style="color: #666666; font-style: italic;"># Findet ebenfalls amarok, auch wenn man sich nicht mehr an die ersten beiden Buchstaben erinnert.</span>
eix <span style="color: #660033;">-r</span> <span style="color: #ff0000;">'^ama.*k$'</span> <span style="color: #666666; font-style: italic;"># Was fängt mit ama an und hört mit k auf? :-)</span></pre></div></div>

<p>Um mehrere Suchausdrücke zu kombinieren werden <code>-a</code> bzw. <code>--and</code> (und) und <code>-o</code> bzw. <code>--or</code> (oder) verwendet. Wenn mehrere Suchausdrücke angegeben werden, aber kein und/oder dazwischen steht wird automatisch abhängig von der Konfigurationsvariable DEFAULT_IS_OR entweder und oder oder eingesetzt. Die und/oder-Operatoren werden von links nach rechts ausgewertet, es ist nicht möglich die Ausdrücke in Klammern zu setzen o.Ä. Mit <code>--not</code> kann man einen Ausdruck negieren bzw. festlegen das der Ausdruck nicht zutreffen soll.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># Findet Pakete in deren Namen &quot;kde&quot; und &quot;utils&quot; vorkommt.</span>
eix kde <span style="color: #660033;">-a</span> utils
<span style="color: #666666; font-style: italic;"># Findet Pakete in deren Namen &quot;virtualbox&quot; aber nicht &quot;ose&quot; vorkommt.</span>
eix virtualbox <span style="color: #660033;">-a</span> <span style="color: #660033;">--not</span> ose</pre></div></div>

<p>Nun können diverse Bedingungen festgelegt werden die ein Paket erfüllen muss um bei der Suche beachtet zu werden. Hier die (meiner Meinung nach) wichtigsten Bedingungen.</p>
<table border="0">
<tbody>
<tr>
<th>Bedingung</th>
<th>Beschreibung</th>
</tr>
<tr>
<td><code>-I, --installed</code></td>
<td>Die Pakete müssen installiert sein. Wichtig: Hierbei werden nur Pakete beachtet die sich auch in der Portage-Datenbank befinden. Wenn ein installiertes Paket nicht mehr in Portage enthalten ist kennt eix es nicht.</td>
</tr>
<tr>
<td><code>-i, --multi-installed</code></td>
<td>Die Pakete müssen mehrmals (in verschiedenen Versionen) installiert sein.</td>
</tr>
<tr>
<td><code>-d, --dup-packages</code></td>
<td>Listet nur Pakete auf die sowohl im offiziellen Portage-Baum als auch in einem Overlay vorhanden sind.</td>
</tr>
<tr>
<td><code>-D, --dup-versions</code></td>
<td>Listet nur Pakete auf von denen eine Version sowohl im offiziellen Portage-Baum als auch in einem Overlay vorhanden ist. (Es muss sich um die gleiche Version handeln, also z.B. KDE 4.1 sowohl im offiziellen Portage-Baum als auch in einem Overlay.)</td>
</tr>
<tr>
<td><code>-1, --slotted</code></td>
<td>Die Pakete müssen in einem Slot installiert werden. Hierbei ist egal ob ein Paket nur einen Slot hat oder mehrere, solange das Paket in einem Slot installiert wird.</td>
</tr>
<tr>
<td><code>-2, --slots</code></td>
<td>Die Pakete müssen über mehrere Slots verfügen.</td>
</tr>
<tr>
<td><code>-u, --upgrade</code></td>
<td>Nur Pakete zulassen für die es eine bessere Version gibt. (Das muss nicht unbedingt eine höhere Version sein)</td>
</tr>
<tr>
<td><code>--stable</code></td>
<td>Nur Pakete von denen es eine stabile Version gibt.</td>
</tr>
<tr>
<td><code>--testing</code></td>
<td>Nur Pakete von denen es eine unstabile (testing) oder stabile Version gibt.</td>
</tr>
<tr>
<td><code>--non-masked</code></td>
<td>Nur Pakete von denen es eine nicht maskierte Version gibt.</td>
</tr>
<tr>
<td><code>-O, --overlay</code></td>
<td>Nur Pakete von denen sich eine Version in einem Overlay befindet.</td>
</tr>
<tr>
<td><code>--in-overlay &lt;Overlay&gt;</code></td>
<td>Nur Pakete die sich in einem bestimmten Overlay befinden.</td>
</tr>
<tr>
<td><code>--fetch</code></td>
<td>Nur Pakete deren Installationsdateien nicht automatisch heruntergeladen werden können. (fetch-restriction)</td>
</tr>
</tbody>
</table>
<p>Es ist auch möglich eix nur bestimmte Felder durchsuchen zu lassen, beispielsweise nur den Namen des Pakets oder nur die Beschreibung.</p>
<table border="0">
<tbody>
<tr>
<th>Feld</th>
<th>Beschreibung</th>
</tr>
<tr>
<td><code>-s, --name</code></td>
<td>Der Name des Pakets</td>
</tr>
<tr>
<td><code>-S, --description</code></td>
<td>Die Beschreibung des Pakets.</td>
</tr>
<tr>
<td><code>-C, --category</code></td>
<td>Die Kategorie des Pakets.</td>
</tr>
<tr>
<td><code>-A, --category-name</code></td>
<td>Die Kategorie und der Name des Pakets</td>
</tr>
<tr>
<td><code>-H, --homepage</code></td>
<td>Die Webseite des Pakets</td>
</tr>
<tr>
<td><code>-L, --license</code></td>
<td>Die Lizenz des Pakets</td>
</tr>
<tr>
<td><code>-P, --provide</code></td>
<td>Was das Paket bereitstellt, also z.B. virtual/cron</td>
</tr>
</tbody>
</table>
<h2>Die Ausgabe</h2>
<p>Die Ausgabe von eix lässt sich noch durch einige Zusatzoptionen beeinflussen. So kann beispielsweise mit <code>-c</code> (<code>--compact</code>) die Ausgabe auf eine Zeile pro Paket beschränkt werden, mittels <code>-v</code> bzw. <code>--verbose</code> hingegen werden alle verfügbaren Informationen angezeigt. Das sieht dann so aus:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">eix -ve gcc
* sys-devel/gcc
     Available versions:
        (2.95)  *2.95.3-r9 ~*2.95.3-r10
        (3.1)   *3.1.1-r2
        (3.2)   **3.2.2 *3.2.3-r4
        (3.3)   ~3.3.6-r1
        (3.4)   3.4.6-r2
        (4.0)   ~*4.0.4
        (4.1)   ~4.1.0-r1 4.1.2
        (4.2)   ~4.2.3 ~4.2.4
        (4.3)   **4.3.0 ~4.3.1 ~4.3.1-r1 ~4.3.2
        {altivec bootstrap boundschecking build d doc fixed-point fortran gcj gtk hardened ip28 ip32r10k java libffi mudflap multilib multislot n32 n64 nls nocxx nopie nossp objc objc++ objc-gc openmp static test vanilla}
     Installed versions:  Version: 4.1.2(4.1)
                          Date:    18:38:09 10/20/08
                          USE:     fortran gtk mudflap multilib nls -altivec -bootstrap -build -d -doc -gcj -hardened -ip28 -ip32r10k -libffi -multislot -n32 -n64 -nocxx -objc -objc++ -objc-gc -test -vanilla
                          Version: 4.2.4(4.2)
                          Date:    16:33:30 10/17/08
                          USE:     fortran gtk mudflap multilib nls openmp -altivec -bootstrap -build -doc -gcj -hardened -ip28 -ip32r10k -libffi -multislot -n32 -n64 -nocxx -objc-objc++ -objc-gc -test -vanilla
                          Version: 4.3.1-r1(4.3)
                          Date:    16:33:31 10/17/08
                          USE:     fortran mudflap multilib nls openmp -altivec -bootstrap -build -doc -gcj -gtk -hardened -ip28 -ip32r10k -libffi -multislot -n32 -n64 -nocxx -objc -objc++ -objc-gc -test -vanilla
     Best versions/slot:  3.4.6-r2 4.1.2
     Recommendation:      Downgrade
     Package sets:        system
     Homepage:            http://gcc.gnu.org/
     Description:         The GNU Compiler Collection. Includes C/C++, java compilers, pie+ssp extensions, Haj Ten Brugge runtime bounds checking
     License:             GPL-2 LGPL-2.1</pre></div></div>

<p>Es wird sogar angezeigt wann man eine bestimmte Version des Pakets installiert hat, und ob Portage eine Aktualisierung bzw. wie in diesem Fall ein Downgrade empfiehlt. </p>
<p>Diese kleine Anleitung deckt keinesfalls alles ab was eix kann. Wer noch mehr wissen möchte sollte die Manpage von eix lesen (<code>man 1 eix</code>).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2008/12/20/pakete-suchen-mit-eix/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Archive unter Linux</title>
		<link>http://www.antusblog.de/2008/12/14/archive-unter-linux/</link>
		<comments>http://www.antusblog.de/2008/12/14/archive-unter-linux/#comments</comments>
		<pubDate>Sun, 14 Dec 2008 12:56:05 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[Anleitungen]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Archive]]></category>
		<category><![CDATA[Kommandozeile]]></category>
		<category><![CDATA[rar]]></category>
		<category><![CDATA[tar]]></category>
		<category><![CDATA[tar.bz2]]></category>
		<category><![CDATA[tar.gz]]></category>
		<category><![CDATA[zip]]></category>

		<guid isPermaLink="false">http://antusblog.de/?p=227</guid>
		<description><![CDATA[Wenn man viele Dateien verschicken oder speichern will empfiehlt es sich sie in eine Datei zu packen und eventuell noch zu komprimieren. Es gibt mittlerweile ziemlich viele Archivformate, wie man die 3 meiner Meinung nach wichtigsten unter Linux verwendet werde ich in dieser kleinen Anleitung erklären.

RAR Archive &#8211; unrar
Mit dem Kommandozeilen-Programm unrar lassen sich rar-Archive [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn man viele Dateien verschicken oder speichern will empfiehlt es sich sie in eine Datei zu packen und eventuell noch zu komprimieren. Es gibt mittlerweile ziemlich viele Archivformate, wie man die 3 meiner Meinung nach wichtigsten unter Linux verwendet werde ich in dieser kleinen Anleitung erklären.</p>
<p><span id="more-227"></span></p>
<h2>RAR Archive &#8211; unrar</h2>
<p>Mit dem Kommandozeilen-Programm unrar lassen sich rar-Archive entpacken, das Erstellen von neuen Archiven bzw. hinzufügen von Dateien zu bestehenden Archiven ist leider nicht möglich.</p>
<h3>Installation</h3>
<p>Gentoo:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">emerge -av unrar</pre></div></div>

<p>Debian/Ubuntu:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">apt-get install unrar</pre></div></div>

<h3>Benutzung</h3>
<p>Das Programm ist recht einfach zu bedienen, ein Befehl sieht wie folgt aus:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">unrar &lt;Befehl&gt; &lt;Optionen&gt; &lt;Archiv&gt; &lt;Dateien&gt; &lt;Pfad&gt;</pre></div></div>

<p>Der Befehl gibt an was unrar genau mit dem Archiv anstellen soll, also entpacken, enthaltene Dateien auflisten und so weiter. Die Ausgabe bzw. das Ergebnis lässt sich durch diverse Optionen beeinflussen (Zum Beispiel: Bereits vorhandene Dateien immer überschreiben, dann fragt unrar nicht mehr bei jeder Datei nach). Außerdem kann man festlegen das nur bestimmte Dateien aus dem Archiv entpackt werden, und wohin das Archiv entpackt werden soll (Pfad).</p>
<p><strong>Dateien entpacken:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">unrar e archiv.rar</pre></div></div>

<p>oder, wenn man das Archiv in ein bestimmtes Verzeichnis entpacken will:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">unrar e archiv.rar <span style="color: #000000; font-weight: bold;">/</span>pfad<span style="color: #000000; font-weight: bold;">/</span>zum<span style="color: #000000; font-weight: bold;">/</span>zielverzeichnis<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>Um auch die Verzeichnisstruktur des Archivs mit zu entpacken wird der Befehl x anstatt dem Befehl e verwendet.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">unrar x archiv.rar</pre></div></div>

<p>Ist eine zu entpackende Datei bereits vorhanden fragt unrar nach ob sie überschrieben werden soll:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Textdatei.txt already exists. Overwrite it ?
[Y]es, [N]o, [A]ll, n[E]ver, [R]ename, [Q]uit</pre></div></div>

<p>Mit der Option y lässt sich das abschalten, dann überschreibt unrar die Dateien einfach.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">unrar e <span style="color: #660033;">-y</span> archiv.rar</pre></div></div>

<p>Mit unrar lassen sich auch <strong>passwortgeschützte Archive</strong> entpacken, liegt ein solches Archiv vor fragt unrar nach dem Passwort. Eine Besonderheit: Das Passwort wird bei der Eingabe nicht angezeigt, auch nicht mit Sternchen.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">unrar e passwortgeschuetzt.rar
  UNRAR 3.80 freeware      Copyright (c) 1993-2008 Alexander Roshal
  Extracting from passwortgeschuetzt.rar
  Enter password (will not be echoed) for Noch eine Textdatei.txt:</pre></div></div>

<p>Das Passwort kann auch direkt mit angegeben werden:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">unrar e <span style="color: #660033;">-ppasswort</span> passwortgeschuetzt.rar</pre></div></div>

<p>Hierbei muss man allerdings beachten das das Passwort dann natürlich auf dem Bildschirm angezeigt wird und auch (wenn nicht deaktiviert) in der <a href="index.php?p=198">Bash History</a> steht.</p>
<p><strong>Enthaltene Dateien auflisten:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">unrar l archiv.rar</pre></div></div>

<p>Hinweis: Das ist ein kleines L, kein I.<br />
Dieser Befehl zeigt eine Liste aller im Archiv enthaltenen Dateien an, das ist ziemlich praktisch wenn man nicht genau weiß was sich in einem Archiv befindet. Außerdem werden noch diverse Informationen über die Dateien angezeigt, unter anderem die Größe, wie stark sie komprimiert wurden etc.<br />
Will man nur die Dateinamen sehen kann man folgenden Befehl verwenden:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">unrar lb archiv.rar</pre></div></div>

<p>Ein kleiner Tipp: l, bzw. lb listet zwar alle Dateien im Archiv auf, zeigt aber die Verzeichnisstruktur nicht an, um sie auch anzuzeigen kann man v bzw. vb benutzen.</p>
<p><strong>Hilfe/Bedienungsanleitung anzeigen:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">unrar <span style="color: #660033;">--help</span></pre></div></div>

<h2>TAR, TAR.GZ, TAR.BZ2-Archive &#8211; tar</h2>
<p>tar ist das meist verwendete Archivformat unter Linux, das dazugehörige Programm &#8220;tar&#8221; wird eigentlich bei jeder Linux-Distri gleich bei der Installation mitinstalliert, es sollte also bereits vorhanden sein. Tar kommt von <strong>t</strong>ape <strong>ar</strong>chiver, denn früher wurden die Archive auf Bandlaufwerken gespeichert. Ein tar-Archiv hat die Endung .tar, üblicherweise wird es allerdings noch komprimiert um Speicherplatz zu sparen, dann ist die Dateiendung meist tar.gz (gzip) oder tar.bz2 (bzip2). Außerdem kann tar auch die Zugriffsrechte von Dateien speichern, sowie Informationen darüber welcher Gruppe/welchem Benutzer eine Datei gehört.</p>
<h3>Benutzung</h3>
<p><strong>Archiv erstellen:</strong><br />
Um ein unkomprimiertes Tar-Archiv zu erstellen wird folgender Befehl verwendet:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-cf</span> archiv.tar <span style="color: #000000; font-weight: bold;">&lt;</span>Dateien<span style="color: #000000; font-weight: bold;">/</span>Verzeichnisse<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>Wenn man das Archiv zusätzlich noch komprimieren möchte kann man zusätzlich noch die Option j für bzip2 oder z für gzip benutzen. Bei gzip geht die Komprimierung/Dekomprimierung schneller, bei bzip2 werden die Dateien kleiner. Die Option v zeigt einem die Dateien noch einmal an die in das Archiv gepackt werden. Mit p wird festgelegt das auch die Zugriffsrechte sowie Besitzer/Gruppe der Dateien mit gespeichert werden.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-cpzvf</span> archiv.tar.gz <span style="color: #000000; font-weight: bold;">&lt;</span>Dateien<span style="color: #000000; font-weight: bold;">/</span>Verzeichnisse<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-cpjvf</span> archiv.tar.bz2 <span style="color: #000000; font-weight: bold;">&lt;</span>Dateien<span style="color: #000000; font-weight: bold;">/</span>Verzeichnisse<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>Es ist auch möglich unkomprimierte tar-Archive nachträglich zu komprimieren. Das geht mit den Befehlen gzip/bzip2, bzw. gunzip/bunzip zum Dekomprimieren (ohne das Archiv zu entpacken).</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">gzip</span> archiv.tar
<span style="color: #c20cb9; font-weight: bold;">ls</span>
  archiv.tar.gz</pre></div></div>

<p>Außerdem kann man mit der Option r zu einem Archiv <strong>Dateien nachträglich hinzufügen</strong>, bzw. mit der Option d <strong>Dateien löschen</strong>. Aber: Ist die Datei bereits im Archiv enthalten wird sie trotzdem hinzugefügt! Beim entpacken wird dann zwar die neuere (bzw. zuletzt hinzugefügte) Datei entpackt, aber sie ist trotzdem mehrmals im Archiv vorhanden.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-rf</span> archiv.tar datei</pre></div></div>

<p>Wenn das Archiv komprimiert ist, wird eine Fehlermeldung ausgegeben, denn man muss das Archiv erst mit gunzip/bunzip dekomprimieren um es zu verändern.</p>
<p><strong>Archiv entpacken:</strong><br />
Zum Entpacken wird der Befehl x genutzt. Zusätzlich kann man noch mit -C <Verzeichnis> angeben in welches Verzeichnis die Dateien entpackt werden sollen. Die Option v zeigt wieder an welche Dateien entpackt werden. Außerdem kann man angeben das nur einzelne Dateien aus einem Archiv entpackt werden sollen, dazu gibt man diese einfach nach dem Archiv an.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># gzip-komprimiertes Archiv entpacken, entpackte Dateien anzeigen</span>
<span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xzvf</span> archiv.tar.gz
<span style="color: #666666; font-style: italic;"># bzip-komprimiertes Archiv nach /home/antu entpacken</span>
<span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xjf</span> archiv.tar.bz2 <span style="color: #660033;">-C</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>antu<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #666666; font-style: italic;"># Nur datei1 aus dem unkomprimierten Archiv archiv.tar entpacken.</span>
<span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xf</span> archiv.tar datei1</pre></div></div>

<p><strong>Enthaltene Dateien auflisten:</strong><br />
Oft ist es sinnvoll erst mal zu sehen was in einem Archiv drin ist, dazu gibt es folgenden Befehl:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-tf</span> archiv.tar</pre></div></div>

<p><strong>Hilfe anzeigen</strong><br />
Mit tar ist natürlich noch viel mehr möglich, hier hilft die Dokumentation weiter.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">man</span> <span style="color: #c20cb9; font-weight: bold;">tar</span>
info <span style="color: #c20cb9; font-weight: bold;">tar</span></pre></div></div>

<h2>ZIP-Archive &#8211; zip/unzip</h2>
<p>Zip-Archive werden hauptsächlich unter Windows verwendet, wenn man also Dateien mit Windows-Benutzern austauschen will empfiehlt sich dieses Format. Auch dieses Programm ist wahrscheinlich schon auf eurem System installiert. <img src='http://www.antusblog.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<h3>Benutzung</h3>
<p><strong>Archive erstellen:</strong><br />
Der Befehl mit dem man ein zip-Archiv erstellt lautet:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">zip</span> archiv.zip <span style="color: #000000; font-weight: bold;">&lt;</span>Dateien<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>Es ist kein Problem wenn archiv.zip bereits existiert, dann werden die Dateien dem Archiv hinzugefügt. Gibt man noch die Option -r an, werden auch Verzeichnisse durchsucht und die Dateien darin hinzugefügt. Achtung: Wenn man Platzhalter (*) benutzt muss man aufpassen, denn z.B. &#8220;.*&#8221; trifft auch auf .. zu, dadurch würde zip auch das Verzeichnis darüber mitzippen.</p>
<p><strong>Enthaltene Dateien auflisten:</strong><br />
Folgender Befehl listet alle im Archiv enthaltenen Dateien auf:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">unzip</span> <span style="color: #660033;">-l</span> archiv.zip
<span style="color: #666666; font-style: italic;"># Das ist ein kleines L</span></pre></div></div>

<p><strong>Archiv entpacken:</strong><br />
Mittels unzip können zip-Archive wieder entpackt werden. Mit dem Parameter d kann man angeben in welches Verzeichnis die Dateien entpackt werden sollen, falls sie nicht im aktuellen Verzeichnis landen sollen. Auch hier kann man wieder einzelne Dateien angeben, falls man nicht das ganze Archiv entpacken will.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">unzip</span> archiv.zip
<span style="color: #c20cb9; font-weight: bold;">unzip</span> archiv.zip <span style="color: #660033;">-d</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>antu<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #c20cb9; font-weight: bold;">unzip</span> archiv.zip datei1</pre></div></div>

<p>Um die <strong>Hilfe</strong> von zip/unzip <strong>anzuzeigen</strong> gibt man einfach folgendes ein:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">man</span> <span style="color: #c20cb9; font-weight: bold;">zip</span>
<span style="color: #c20cb9; font-weight: bold;">man</span> <span style="color: #c20cb9; font-weight: bold;">unzip</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2008/12/14/archive-unter-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ausführzeit von PHP-Skripten messen</title>
		<link>http://www.antusblog.de/2008/12/08/ausfuhrzeit-von-php-skripten-messen/</link>
		<comments>http://www.antusblog.de/2008/12/08/ausfuhrzeit-von-php-skripten-messen/#comments</comments>
		<pubDate>Mon, 08 Dec 2008 18:08:10 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[Anleitungen]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ausführzeit messen]]></category>
		<category><![CDATA[Tipp]]></category>

		<guid isPermaLink="false">http://antusblog.de/?p=214</guid>
		<description><![CDATA[Um herauszufinden wie lange die Ausführung eines PHP-Skriptes dauert oder wie effizient eine bestimmte Funktion arbeitet kann man die PHP Funktion microtime verwenden. Eigentlich ist die Funktion dazu gedacht den aktuellen Unix-Zeitstempel zu ermitteln. Um die Ausführzeit eines PHP-Skriptes bzw. einer bestimmten Funktion zu messen speichert man einfach die aktuelle Zeit, führt das entsprechende Skript [...]]]></description>
			<content:encoded><![CDATA[<p>Um herauszufinden wie lange die Ausführung eines PHP-Skriptes dauert oder wie effizient eine bestimmte Funktion arbeitet kann man die PHP Funktion <a href="http://php.net/microtime" target="_blank">microtime</a> verwenden. Eigentlich ist die Funktion dazu gedacht den aktuellen Unix-Zeitstempel zu ermitteln. Um die Ausführzeit eines PHP-Skriptes bzw. einer bestimmten Funktion zu messen speichert man einfach die aktuelle Zeit, führt das entsprechende Skript bzw. die Funktion aus, speichert wieder die Zeit und subtrahiert die erste gemessene Zeit dann von der zweiten. Mit round() kann man das Ergebnis dann noch runden, der zweite Parameter von round() bestimmt dabei wie viele Nachkommastellen angezeigt werden sollen.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$runtime_start</span> <span style="color: #339933;">=</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Hier euer Skript */</span>
&nbsp;
<span style="color: #000088;">$runtime_end</span> <span style="color: #339933;">=</span> <span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$runtime</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$runtime_end</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$runtime_start</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Generiert in &quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">round</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$runtime</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; Sekunden.&quot;</span><span style="color: #339933;">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2008/12/08/ausfuhrzeit-von-php-skripten-messen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Die Bash History</title>
		<link>http://www.antusblog.de/2008/12/07/bash-history/</link>
		<comments>http://www.antusblog.de/2008/12/07/bash-history/#comments</comments>
		<pubDate>Sun, 07 Dec 2008 11:56:49 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[Anleitungen]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[Kommandozeile]]></category>

		<guid isPermaLink="false">http://antusblog.de/?p=198</guid>
		<description><![CDATA[Die Bash verfügt über eine Art Erinnerungsvermögen: Sie merkt sich welche Befehle man bereits eingegeben hat. Wenn man einen langen Befehl nicht noch einmal eingeben will kann man sich einfach mit den Pfeiltasten durch die gespeicherten Befehle hangeln und den Befehl wieder ausführen. Aber das Erinnerungsvermögen der Bash kann noch mehr.

Mit history kann man sich [...]]]></description>
			<content:encoded><![CDATA[<p>Die Bash verfügt über eine Art Erinnerungsvermögen: Sie merkt sich welche Befehle man bereits eingegeben hat. Wenn man einen langen Befehl nicht noch einmal eingeben will kann man sich einfach mit den Pfeiltasten durch die gespeicherten Befehle hangeln und den Befehl wieder ausführen. Aber das Erinnerungsvermögen der Bash kann noch mehr.<br />
<span id="more-198"></span><br />
Mit <em>history</em> kann man sich eine Liste von allen Befehlen anzeigen lassen an die sich die Bash erinnern kann.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">history</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span>...<span style="color: #7a0874; font-weight: bold;">&#93;</span>
  <span style="color: #000000;">504</span>  <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>antu
  <span style="color: #000000;">505</span>  <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-la</span>
  <span style="color: #000000;">506</span>  htop
  <span style="color: #000000;">507</span>  <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>
  <span style="color: #000000;">508</span>  <span style="color: #7a0874; font-weight: bold;">history</span></pre></div></div>

<p>Dabei zählt die Bash immer mit wieviele Befehle sich bereits in der Datenbank befinden, in diesem Fall sind es 508. Praktisch: Gibt man jetzt !&lt;Zahl&gt; ein wird der Befehl mit der entsprechenden Zahl wieder ausgeführt.</p>
<p>Wenn man Strg+R drückt muss man nur noch den Anfang des Befehls eingeben, wenn er schon einmal eingegeben wurde vervollständigt die Bash ihn automatisch.</p>
<h2>Konfiguration</h2>
<p>Das Verhalten der Erinnerungsfunktion lässt sich entweder in der systemweiten, meist /etc/bashrc bzw. /etc/bash/bashrc, oder in der Konfigurationsdatei im Home-Verzeichnis (~/.bashrc, ~/.bash_profile) konfigurieren.</p>
<ul>
<li>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">shopt</span> <span style="color: #660033;">-s</span> histappend</pre></div></div>

<p>Mit shopt lassen sich diverse Einstellungen der Bash verändern. Histappend sorgt dafür das die eingegebenen Befehle beim Beenden der Bash an die Liste der eingegebenen Befehle angehangen werden, anstatt die Liste jedes mal zu überschreiben.</li>
<li>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">HISTSIZE</span>=<span style="color: #000000; font-weight: bold;">&lt;</span>Größe<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">HISTFILESIZE</span>=<span style="color: #000000; font-weight: bold;">&lt;</span>Größe<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

</li>
<p>Legt fest wie viele Befehle gespeichert werden sollen, standardmäßig ist meistens 500 eingestellt.</p>
<li>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">HISTIGNORE</span>=<span style="color: #ff0000;">'cd*:ls*'</span></pre></div></div>

<p>Mit HISTIGNORE lassen sich Befehle festlegen die nicht gespeichert werden sollen, die Befehle werden durch einen Doppelpunkt getrennt. Der Befehl hier im Beispiel sorgt dafür das alle Befehle die mit cd oder ls beginnen nicht gespeichert werden.</li>
<li>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">HISTCONTROL</span>=erasedups:ignorespace</pre></div></div>

<p>Eine durch Doppelpunkte getrennte Liste von Optionen zur Speicherung von Befehlen. Wenn ignorespace aktiviert ist werden alle eingegeben Zeilen die mit einem Leerzeichen beginnen nicht gespeichert, erasedups sorgt dafür das jeder Befehl nur einmal in der Bash-Erinnerung vorkommt. Mit ignoredups lässt sich festlegen das ein eingegebener Befehl nur einmal gespeichert wird, auch wenn er mehrmals hintereinander eingegeben wird. ignoreboth ist das selbe wie ignorespace + ignoredups.</li>
<li>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">HISTFILE</span>=<span style="color: #ff0000;">'~/.bash_history'</span></pre></div></div>

<p>Die eingegebenen Befehle werden standardmäßig in der ~/.bash_history gespeichert, wenn man sie woanders speichern will kann man das mit HISTFILE festlegen.</li>
<li>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">HISTTIMEFORMAT</span>=<span style="color: #ff0000;">'%d.%m.%Y %T '</span></pre></div></div>

<p>Wenn diese Variable gesetzt ist wird zu jedem eingegebenen Befehl auch die Uhrzeit gespeichert. Der Wert von HISTTIMEFORMAT wird verwendet um die Zeit zu formatieren, mehr Informationen dazu finden sich in der Manpage von strftime (man 3 strftime).</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">  <span style="color: #000000;">530</span>  07.12.2008 <span style="color: #000000;">13</span>:<span style="color: #000000;">22</span>:<span style="color: #000000;">18</span> <span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">HISTTIMEFORMAT</span>=<span style="color: #ff0000;">'%d.%m.%Y %T '</span>
  <span style="color: #000000;">531</span>  07.12.2008 <span style="color: #000000;">13</span>:<span style="color: #000000;">22</span>:<span style="color: #000000;">28</span> <span style="color: #7a0874; font-weight: bold;">history</span></pre></div></div>

</li>
</ul>
<h2>Befehle in Echtzeit speichern</h2>
<p>Die Bash speichert die eingegebenen Befehle erst wenn sie beendet wird, deswegen werden die Befehle anderer Bash-Sitzungen nicht angezeigt wenn man mehrere Bashs gleichzeitig laufen hat. Aber da gibt es einen kleinen Trick, denn man kann den Prompt so verändern das er die Erinnerung bei jeder neuen Eingabe speichert und neu einliest. Dazu werden die beiden Befehle history -a (Befehle in der History speichern) und history -r (History-Datei neu einlesen) verwendet.</p>
<p>Man muss die beiden Befehle einfach nur zum Bash Prompt hinzufügen.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PS1</span>=<span style="color: #007800;">$PS1</span><span style="color: #000000; font-weight: bold;">`</span><span style="color: #7a0874; font-weight: bold;">history</span> -a; <span style="color: #7a0874; font-weight: bold;">history</span> -r;<span style="color: #000000; font-weight: bold;">`</span></pre></div></div>

<p>Und schon wird die Erinnerungsfunktion der Bash in Echtzeit aktualisiert.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2008/12/07/bash-history/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux &#8211; Bash &#8220;pimpen&#8221;</title>
		<link>http://www.antusblog.de/2008/10/19/linux-bash-pimpen/</link>
		<comments>http://www.antusblog.de/2008/10/19/linux-bash-pimpen/#comments</comments>
		<pubDate>Sun, 19 Oct 2008 16:34:56 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[Anleitungen]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Bash]]></category>

		<guid isPermaLink="false">http://antu.bplaced.net/?p=45</guid>
		<description><![CDATA[Wenn man eine Konsole öffnet bekommt man meistens ein schwarzes Fenster präsentiert, in dem mit weißer Schrift steht: sh-3.1$ _
Nunja, ich fand das etwas langweilig, und hab mal geguckt wie man das ändern kann, wie das geht schreib ich hier. Viel Spaß beim verschönern eurer Bash.

Inhaltsverzeichnis
1. Bashprompt verändern
2. MOTD, Fortunes, Logos o.Ä. beim Start
3. Hintergrund [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn man eine Konsole öffnet bekommt man meistens ein schwarzes Fenster präsentiert, in dem mit weißer Schrift steht: sh-3.1$ _<br />
Nunja, ich fand das etwas langweilig, und hab mal geguckt wie man das ändern kann, wie das geht schreib ich hier. Viel Spaß beim verschönern eurer Bash.<br />
<span id="more-52"></span></p>
<h2>Inhaltsverzeichnis</h2>
<p>1. Bashprompt verändern<br />
2. MOTD, Fortunes, Logos o.Ä. beim Start<br />
3. Hintergrund ändern<br />
4. Standardfarben ändern<br />
5. Links/Quellen</p>
<h2>1. Bashprompt verändern</h2>
<p>Der Bash-Prompt ist die Eingabeaufforderung der Bash. Diese erscheint immer bevor du einen Befehl eingeben kannst. Ein einfaches &gt; oder $ bzw. # als Eingabeaufforderung ist etwas langweilig, man kann dort auch Usernamen, Hostnamen, Zeit etc. einfügen, außerdem kann man das ganze auch noch einfärben. Den Bashprompt kann man mit folgendem Befehl ändern:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PS1</span>=</pre></div></div>

<p>Um deinen neuen Bashprompt zu speichern, musst du ihn einfach ans Ende der Datei ~/.bashrc eintragen. Das sieht dann z.B. so aus:<br />
<em> ~/.bashrc</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># /etc/skel/.bashrc:</span>
<span style="color: #666666; font-style: italic;"># $Header: /var/cvsroot/gentoo-x86/app-shells/bash/files/dot-bashrc,v 1.3 2005/07/06 22:10:22 vapier Exp $</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># This file is sourced by all *interactive* bash shells on startup,</span>
<span style="color: #666666; font-style: italic;"># including some apparently interactive shells such as scp and rcp</span>
<span style="color: #666666; font-style: italic;"># that can't tolerate any output.</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#91;</span>gekürzt<span style="color: #7a0874; font-weight: bold;">&#93;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># uncomment the following to activate bash-completion:</span>
<span style="color: #666666; font-style: italic;">#[ -f /etc/profile.d/bash-completion ] &amp;amp;&amp;amp; source /etc/profile.d/bash-completion</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PS1</span>=<span style="color: #ff0000;">&quot;\[\033[1;36m\]<span style="color: #000099; font-weight: bold;">\t</span> \[\033[1;32m\]\h \[\033[1;34m\]\w <span style="color: #000099; font-weight: bold;">\$</span> \[\033[0m\]&quot;</span></pre></div></div>

<p>Ist dort schon ein Eintrag für den Bashprompt, kann man diesen einfach editieren, oder auskommentieren(einfach ein # vor die entsprechende Zeile setzen). Um nun den Prompt einzufärben und mit einigen Informationen zu versehen, benutzt man Escape und Colorcodes. Diese habe ich in den beiden folgenden Tabellen<br />
aufgeschrieben.</p>
<p>Am besten, man fängt mit der Dekoration und den Escape-Codes an, z.B. so:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PS1</span>=<span style="color: #ff0000;">'[\t] [\u@\h] \$ '</span></pre></div></div>

<p>Das sieht dann so aus: [21:20:03] [antu@itchy] $</p>
<p>Dann färbt man das ganze ein:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PS1</span>=<span style="color: #ff0000;">'[\[\033[34m\]\t\[\033[0m\]] [\[\033[35m\]\u@\h\[\033[0m\]] \$ '</span></pre></div></div>

<p>Das sieht dann so aus: [<span style="color: #3f3151;">21:20:03</span>] [<span style="color: #17365d;">antu@itchy</span>] $</p>
<p>Wenn dir der Bashprompt gefällt, trage ihn einfach in die .bashrc in deinem Homeverzeichnis ein, und ab sofort benutzt die Bash diesen Prompt.</p>
<p><strong>Wichtig:</strong> Um die Farbcodes kommt immer noch ein \[&lt;farbcode&gt;\]. Dadurch weiss die Bash das die Farbcodes keinen Text ausgeben sondern nur die Farbe ändern. Wenn man diese Zeichen weglässt, kann es zu Anzeigefehlern kommen. In der Tabelle habe ich die \[ und \] schon hinzugefügt.</p>
<pre><strong>Escape-Code</strong>    <strong>Beschreibung</strong>                 <strong>Beispiel</strong>
\u             Username                     antu
\h             Hostname                     itchy
\t             Zeit                         20:22:18
\d             Datum                        Sat Mar 25
\n             Zeilenumbruch                Einfach mal Enter drücken
\j             Anzahl der z.Z.              0, 1, 2, 4, 5, denkt euch ne Zahl aus.
               verwalteten Prozesse
\s             Name der Shell               bash
\v             Die Version der Bash         3.1
\w             Das aktuelle Verzeichnis    /usr/portage
\W             Akt. Verzeichnis, ohne Pfad portage
\$             Als root: # Als User: $     $
\\             ein \                       \
\[ und \]      Alles was dazwischen steht wird nicht ausgegeben. Farbcodes gehören
               zwischen diese Zeichen, sonst kommt es zu Anzeigefehlern.
               Escape-Codes gehören <strong>nicht</strong> dazwischen.</pre>
<p>(Das sind nur die wichtigsten Escape-Codes, eine komplette Liste findet ihr in der Manpage der Bash(man bash))</p>
<pre><strong>Farbcode</strong>        <strong>Farbe</strong>
\[\033[30m\]    Schwarz
\[\033[1;30m\]  Dunkelgrau
\[\033[31m\]    Rot
\[\033[1;31m\]  Hellrot
\[\033[32m\]    Grün
\[\033[1;32m\]  Hellgrün
\[\033[33m\]    Braun
\[\033[1;33m\]  Gelb
\[\033[34m\]    Blau
\[\033[1;34m\]  Hellblau
\[\033[35m\]    Dunkellila
\[\033[1;35m\]  Helllila
\[\033[36m\]    Dunkeltürkis
\[\033[1;36m\]  Türkis
\[\033[37m\]    Hellgrau
\[\033[1;37m\]  Weiss

<strong>Farbcode</strong>        <strong>Hintergrundfarbe</strong>
\[\033[XXm\]    Keine Hintergrundfarbe
\[\033[40;XXm\] Schwarzer Hintergrund
\[\033[41;XXm\] Roter Hintergrund
\[\033[42;XXm\] Grüner Hintergrund
\[\033[43;XXm\] Hellbrauner Hintergrund
\[\033[44;XXm\] Blauer Hintergrund
\[\033[45;XXm\] Lila Hintergrund
\[\033[46;XXm\] Türkis Hintergrund
\[\033[47;XXm\] Hellgrau Hintergrund</pre>
<p><strong>Hinweis</strong>: Ich habe ein kleines Skript gebastelt, es zeigt euch alle Farben und die dazugehörigen Colorcodes an. Startet es einfach per &#8220;sh &lt;pfad/zum/skript.sh&gt;.</p>
<p>Hier ist das Skript: <a href='http://antusblog.de/wp-content/uploads/2008/10/colors.sh'>colors.sh</a></p>
<p>Es gibt übrigens auch noch PS2, das erscheint wenn ein Befehl über mehrere Zeilen geht, normalerweise ist das ein &#8216;&gt;&#8217;. Dann gibt es noch PS3 und PS4, diese werden jedoch nur selten gebraucht, eine Beschreibung für die beiden findet ihr in der Manpage der Bash. Übrigens: manche Farbcodes(die hellen Farben) sind in manchen Terminals fett gedruckt, in der KDE Konsole kann man das in den Farbeinstellungen(siehe 4.) einstellen.</p>
<p>Außerdem habe ich noch ein paar Beispiele erstellt. Die könnt ihr gerne benutzen:</p>
<p><a href="http://antusblog.de/wp-content/uploads/2008/11/howto-bash-pimpen-1.png"><img class="aligncenter size-full wp-image-132" title="howto-bash-pimpen-1" src="http://antusblog.de/wp-content/uploads/2008/11/howto-bash-pimpen-1.png" alt="" width="500" height="290" /></a></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Prompt <span style="color: #000000;">1</span>: <span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PS1</span>=<span style="color: #ff0000;">&quot;\[\033[31m\]<span style="color: #000099; font-weight: bold;">\t</span>\[\033[0m\] \[\033[1;31m\](\[\033[0m\]\u@\h\[\033[1;31m\])\[\033[0m\] \[\033[1;31m\](\[\033[0m\]\w\[\033[1;31m\])\[\033[0m\] \[\033[31m\]<span style="color: #000099; font-weight: bold;">\$</span>\[\033[0m\] &quot;</span>
Prompt <span style="color: #000000;">2</span>: <span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PS1</span>=<span style="color: #ff0000;">&quot;\[\033[1;33m\][\[\033[1;32m\]\u\[\033[1;33m\]|\[\033[1;32m\]\W\[\033[1;33m\]] \[\033[0;32m\]<span style="color: #000099; font-weight: bold;">\$</span>\[\033[0m\] &quot;</span>
Prompt <span style="color: #000000;">3</span>: <span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PS1</span>=<span style="color: #ff0000;">&quot;\[\033[1;34m\](\[\033[1;31m\]<span style="color: #000099; font-weight: bold;">\t</span>\[\033[1;34m\]|\[\033[1;33m\]\u\[\033[1;34m\]) (\[\033[0m\]\w\[\033[1;34m\]) <span style="color: #000099; font-weight: bold;">\$</span> \[\033[0m\]&quot;</span>
Prompt <span style="color: #000000;">4</span>: <span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PS1</span>=<span style="color: #ff0000;">&quot;[\u@\h:\W]<span style="color: #000099; font-weight: bold;">\$</span> &quot;</span>
Prompt <span style="color: #000000;">5</span>: <span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PS1</span>=<span style="color: #ff0000;">&quot;\[\033[1;34m\](\[\033[1;36m\]\d\[\033[1;34m\],\[\033[1;36m\] <span style="color: #000099; font-weight: bold;">\t</span>\[\033[1;34m\])\[\033[1;35m\]--\[\033[1;34m\](\[\033[1;36m\]\u@\h\[\033[1;34m\])\[\033[1;35m\]--\[\033[1;34m\](\[\033[1;36m\]\j jobs\[\033[1;34m\])\[\033[1;35m\]--\[\033[1;34m\](\[\033[1;35m\]\w\[\033[1;34m\])<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\$</span> \[\033[1;37m\]&quot;</span>
Prompt <span style="color: #000000;">6</span>: <span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PS1</span>=<span style="color: #ff0000;">&quot;\[\033[0;31m\][\[\033[1;30m\]<span style="color: #000099; font-weight: bold;">\t</span>\[\033[0;31m\]] \[\033[0;31m\][\[\033[0;33m\]\u\[\033[0;31m\]] \[\033[0;31m\][\[\033[1;37m\]\w\[\033[0;31m\]] \[\033[33m\]<span style="color: #000099; font-weight: bold;">\$</span> \[\033[0m\]&quot;</span>
Prompt <span style="color: #000000;">7</span>: <span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PS1</span>=<span style="color: #ff0000;">&quot;\[\033[1;34m\]{\[\033[1;32m\]<span style="color: #000099; font-weight: bold;">\t</span>\[\033[1;34m\]}-\[\033[1;34m\]{\[\033[1;32m\]\u\[\033[1;34m\]}-\[\033[1;34m\]{\[\033[1;36m\]\W\[\033[1;34m\]}-\[\033[1;36m\]&amp;gt; \[\033[0m\]&quot;</span></pre></div></div>

<p><a href="http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/c816.html" target="_blank">Hier</a> findet ihr noch einige weitere Beispiele von möglichen Bashprompts, manche davon sind sehr aufwendig. <a href="http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/c679.html" target="_blank">Hier</a> finden sich auch noch einige Tipps, wie man Uptime, Batteriestatus etc. in den Bashprompt einbauen kann.</p>
<h2>2. MOTD, Fortunes, Logos o.Ä. beim Start</h2>
<p>Wenn man eine Konsole öffnet wird man sofort mit einem Bashprompt begrüßt, wenn man möchte kann man davor noch irgendeinen Text ausgeben oder irgendwelche Programme ausführen. Man muss das einfach nur in die ~/.bashrc eintragen, alles was dort steht wird ausgeführt bevor der Bashprompt angezeigt wird. Beliebt ist es, beim Öffnen der Konsole ein zufälliges Zitat per fortune auszugeben. Dazu vielleicht noch ein kleines Logo o.Ä. Bei mir sieht das so aus:</p>
<p><em>Ausschnitt aus der ~/.bashrc</em></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-en</span> <span style="color: #ff0000;">&quot;\033[1;35m&quot;</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'                                  .'</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'    .vir.                          d$b'</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'  .d$$$$$$b.    .cd$$b.    .d$$b.   d$$$$$$$$$$$b  .d$$b.     .d$$b.'</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'  $$$$( )$$$b d$$$()$$$.   d$$$$$$$b Q$$$$$$$P$$$P.$$$$$$$b.  .$$$$$$$b.'</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'  Q$$$$$$$$$$B$$$$$$$$P&quot;  d$$$PQ$$$$b.   $$$$.   .$$$P´  `$$$ .$$$P´ `$$$'</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'    &quot;$$$$$$$P Q$$$$$$$b  d$$$P   Q$$$$b  $$$$b   $$$$b..d$$$ $$$$b..d$$$'</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'   d$$$$$$P&quot;   &quot;$$$$$$$$ Q$$$    Q$$$$  $$$$$   `Q$$$$$$$P  `Q$$$$$$$P'</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'  $$$$$$$P      `&quot;&quot;&quot;&quot;&quot;   &quot;&quot;       &quot;&quot;   Q$$$P    &quot;Q$$$P&quot;    &quot;Q$$$P&quot;'</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'  `Q$$P&quot;                            &quot;&quot;&quot;'</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;\033[1;34m&quot;</span>
fortune bofh-excuses chalkboard <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{print &quot;            &quot; $0 }'</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-en</span> <span style="color: #ff0000;">&quot;\033[0m&quot;</span></pre></div></div>

<p>Und als Bild:</p>
<p><a href="http://antusblog.de/wp-content/uploads/2008/11/howto-bash-pimpen-2.png"><img class="aligncenter size-full wp-image-133" title="howto-bash-pimpen-2" src="http://antusblog.de/wp-content/uploads/2008/11/howto-bash-pimpen-2.png" alt="" width="500" height="278" /></a></p>
<p><strong>Hinweis:</strong> awk &#8216;{print &#8220;            &#8221; $0 }&#8217; sorgt dafür das die Ausgabe von fortune etwas nach rechts verschoben wird. Diesen Tipp habe ich von LLyric aus dem ##linux Channel auf dem FreeNode IRC-Netzwerk.</p>
<p><strong>Tipp von onkelchen aus dem gulli:Board:</strong> Man kann solche Schriftzüge wie z.B. mein Gentoo mit dem Programm <a href="http://www.figlet.org/" target="_blank">figlet</a> erstellen. Figlet hat eine große Auswahl an verschiedenen &#8220;großen Schriftarten&#8221;.</p>
<p>Hier könnt ihr eurer Fantasie freien Lauf lassen, per echo irgendwelche Grüße ausgeben, per fortune Zitate anzeigen, Mails checken, irgendwelche Ascii-Bilder&#8230;</p>
<h2>3. Hintergrund ändern</h2>
<p>Ein schwarzer Hintergrund ist etwas Langweilig. Warum nicht Blau? Oder irgendein Hintergrundbild? Oder am Besten gleich ganz durchsichtig? Das ist natürlich nur in der grafischen Oberfläche möglich. Wenn du die KDE Konsole benutzt kannst du den Hintergrund unter <em>Settings-&gt;Configure Konsole-&gt;Schema-&gt;Background</em> ändern. Bei dem gnome-terminal kann man den Hintergrund unter <em>Edit-&gt;Current Profile-&gt;Effects-&gt;Background</em> ändern.</p>
<h2>4. Standardfarben ändern</h2>
<p>Du magst die Standardfarben nicht? Auch das ist kein Problem. Wenn du die KDE Konsole benutzt kannst du diese unter <em>Settings-&gt;Configure Konsole-&gt;Schema-&gt;Colors</em> ändern. Beim gnome-terminal kann man die Farben unter <em>Edit-&gt;Current Profile-&gt;Colors-&gt;Palette</em> ändern.</p>
<p>Meine Konsole mit veränderten Farben:</p>
<p><a href="http://antusblog.de/wp-content/uploads/2008/11/howto-bash-pimpen-3.png"><img class="aligncenter size-full wp-image-134" title="howto-bash-pimpen-3" src="http://antusblog.de/wp-content/uploads/2008/11/howto-bash-pimpen-3.png" alt="" width="500" height="278" /></a></p>
<h2>5. Links/Quellen</h2>
<p>man bash<br />
<a href="http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html" target="_blank">The Linux Documentation Project &#8211; Bash Prompt Howto</a></p>
<p>Das wars erstmal, auch wenn ich irgendwie das Gefühl hab, das ich was wichtiges vergessen hab.:)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2008/10/19/linux-bash-pimpen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP &#8211; Ein einfacher Besucherzähler mit IP-Sperre</title>
		<link>http://www.antusblog.de/2008/10/18/ein-einfacher-besucherzahler-mit-ip-sperre/</link>
		<comments>http://www.antusblog.de/2008/10/18/ein-einfacher-besucherzahler-mit-ip-sperre/#comments</comments>
		<pubDate>Sat, 18 Oct 2008 21:10:35 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[Anleitungen]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Anleitung]]></category>
		<category><![CDATA[Besucherzähler]]></category>

		<guid isPermaLink="false">http://antu.bplaced.net/?p=38</guid>
		<description><![CDATA[Auf vielen Blogs oder Homepages sieht man diese Besucherzähler, &#8220;Du bist der 12345. Besucher auf meiner Seite!&#8221;, &#8220;Diese Seite wurde heute schon 123 mal angesehen.&#8221;, etc. Die meisten dieser Zähler zeigen an wieviele Besucher die Seite seit Anfang der Zählung besucht haben, manche zeigen an wieviele Besucher gerade jetzt die Seite ansehen, andere zeigen sogar [...]]]></description>
			<content:encoded><![CDATA[<p>Auf vielen Blogs oder Homepages sieht man diese Besucherzähler, &#8220;Du bist der 12345. Besucher auf meiner Seite!&#8221;, &#8220;Diese Seite wurde heute schon 123 mal angesehen.&#8221;, etc. Die meisten dieser Zähler zeigen an wieviele Besucher die Seite seit Anfang der Zählung besucht haben, manche zeigen an wieviele Besucher gerade jetzt die Seite ansehen, andere zeigen sogar ganze Statistiken über tägliche, wöchentliche und monatliche Besucherzahlen an. In dieser Anleitung werde ich darauf eingehen wie man einen sehr simplen Besucherzähler programmieren kann. Grundkenntnisse in PHP und dem Umgang mit MySQL Datenbanken sind von Vorteil.</p>
<p><span id="more-42"></span></p>
<h2>Inhaltsverzeichnis</h2>
<p>1. Funktionsweise und Voraussetzungen<br />
2. Programmieren des Zählers<br />
2.1. Zum MySQL-Server verbinden<br />
2.2. Aktuellen Stand des Zählers auslesen<br />
2.3. Liste der gesperrten IPs aussortieren<br />
2.4. Abfragen ob der Besucher schon gezählt wurde<br />
2.5. Zähler erhöhen und Sperrung der IP<br />
2.6. Ausgabe des Zählerstandes<br />
3. Abschließendes</p>
<h2>1. Funktionsweise und Voraussetzungen</h2>
<p>Der in diesem Tutorial beschriebene Besucherzähler ist relativ simpel. Damit ein Besucher nicht mehrmals gezählt wird, wird seine IP gespeichert und vor dem Erhöhen des Zählers wird abgefragt ob diese IP schon gezählt wurde. Der genaue Ablauf sieht so aus: Zuerst wird eine Verbindung zur MySQL-Datenbank aufgenommen. Aus dieser wird dann der aktuelle Zählerstand ausgelesen. Dann werden die gesperrten IPs deren Besuch schon länger als einen bestimmten Zeitraum(z.B. 24 Stunden) zurückliegt aus der Datenbank gelöscht. Anschließend wird abgefragt ob die IP des aktuellen Besuchers gesperrt ist. Ist sie das nicht, wird der Zählerstand um 1 erhöht und die IP auf die Sperrliste gesetzt. Anschließend wird der aktuelle Zählerstand ausgegeben.</p>
<p>Es ist eine MySQL-Datenbank mit folgenden 2 Tabellen nötig:</p>
<p><em>Tabelle: Daten</em></p>
<pre><strong>Spalte</strong>	      <strong>Typ</strong>
bezeichnung   varchar (80)
wert	      int</pre>
<p>Diese Tabelle wird später nur einen einzigen Datensatz enthalten. In der ersten Spalte wird &#8220;zaehlerstand&#8221; stehen, und in der zweiten Spalte steht dann der Stand des Zählers.</p>
<p><em>Tabelle: Besucher</em></p>
<pre><strong>Spalte</strong>      <strong>Typ</strong>
ip	    varchar (15)
zeit	    datetime</pre>
<p>Diese Tabelle speichert die gesperrten IPs, mit jeder IP wird auch der Zeitpunkt des Besuchs gespeichert. Die Spalte IP ist vom Typ ein VARCHAR mit 15 Stellen, also kann diese Spalte maximal 15 Zeichen fassen. Mehr sind auch nicht nötig, da eine IP nie mehr als 15 Zeichen hat. Die zweite Spalte speichert den Zeitpunkt.</p>
<p>Diese beiden Tabellen lassen sich leicht per phpMyAdmin anlegen. Andernfalls kann auch folgender PHP-Code verwendet werden. (Vorher die 4 Werte von mysql_connect und mysql_select_db anpassen!)</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Server&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Benutzername&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Passwort&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">mysql_select_db</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Datenbank&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;CREATE TABLE `daten` (`bezeichnung` varchar (80) NOT NULL, `wert` int NOT NULL)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;INSERT INTO `daten` (`bezeichnung`, `wert`) VALUES ('zaehlerstand', 0)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;CREATE TABLE `besucher` (`ip` varchar (15) NOT NULL, `zeit` datetime NOT NULL)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Außerdem muss natürlich noch eine PHP-Datei angelegt werden, die den Code des Zählers enthält, z.B. zaehler.php.</p>
<h2>2. Programmieren des Zählers</h2>
<h3>2.1 Zum MySQL-Server verbinden</h3>
<p>Bevor mit der Datenbank gearbeitet werden kann, muss zuerst eine Verbindung mit der Datenbank aufgebaut werden. Hierzu werden mysql_connect und mysql_select_db verwendet.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/* Zum MySQL-Server verbinden */</span>
<span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Serveradresse&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Benutzername&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Passwort&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">mysql_select_db</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Name der Datenbank&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>mysql_connect öffnet mit den angegebenen Daten eine Verbindung zum MySQL-Server. Mit mysql_select_db wird die Datenbank festgelegt, an die später die Abfragen gerichtet werden.</p>
<h3>2.2 Aktuellen Stand des Zählers auslesen</h3>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/* Aktuellen Stand des Zaehlers auslesen */</span>
<span style="color: #000088;">$abfrage</span>  <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT `wert` FROM `daten` WHERE `bezeichnung` = 'zaehlerstand'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$ergebnis</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_fetch_assoc</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$abfrage</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$besucherGesamt</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ergebnis</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'wert'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></div></div>

<p>mysql_query schickt den in Anführungsstrichen angegebenen SQL-Befehl an die Datenbank. Das Ergebnis dieses Befehls wird in $abfrage gespeichert.<br />
&#8220;SELECT `wert` FROM `daten` WHERE `bezeichnung` = &#8216;zaehlerstand&#8217;&#8221; fragt den Wert in der Spalte wert von der Tabelle daten ab, wo die Bedingung das in der Spalte bezeichnung zaehlerstand steht, zutrifft. Wenn man jetzt mysql_fetch_assoc mit $abfrage als Parameter aufruft, wird ein Datensatz aus dem Ergebnis ausgelesen und in einem Array gespeichert. mysql_fetch_assoc muss hier nur einmal aufgerufen werden, da nur ein Datensatz erwartet wird(zaehlerstand). Der Vorteil von mysql_fetch_assoc gegenüber mysql_fetch_row ist, das der Name der abgefragten Spalte(n) als Bezeichner im Array verwendet werden. Also $ergebnis['wert'] und nicht $ergebnis[0]. Das macht den Code übersichtlicher.</p>
<h3>2.3 Liste der gesperrten IPs aussortieren</h3>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/* Gesperrte IPs loeschen, wenn der Besuch laenger als 1 Tag zurueck liegt. */</span>
<span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DELETE FROM `besucher` WHERE `zeit` &lt; (NOW() - INTERVAL 1 DAY)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>IPs deren Besuch schon länger als einen Tag zurückliegt, werden aus der Datenbank gelöscht. Auch das wird mit mysql_query und einem SQL-Befehl gemacht. &#8220;DELETE FROM `user` WHERE `zeit` &lt; (NOW() &#8211; INTERVAL 1 DAY)&#8221; löscht alle Datensätze aus der Tabelle besucher, bei denen in der Spalte zeit ein Wert steht, der kleiner als der aktuelle Zeitpunkt minus 1 Tag ist. Wenn also jetzt der 10/10/07 10:20 wäre, würde ein Datensatz mit dem Zeitpunkt 09/10/07 10:19 gelöscht werden, einer mit 09/10/07 10:21 nicht.</p>
<h3>2.4 Abfragen ob der Besucher schon gezählt wurde</h3>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/* Besucher schon gezaehlt? */</span>
<span style="color: #000088;">$besucherIp</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REMOTE_ADDR'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$abfrage</span>    <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT COUNT(*) FROM `besucher` WHERE `ip` = '<span style="color: #006699; font-weight: bold;">$besucherIp</span>'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$ergebnis</span>   <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_fetch_assoc</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$abfrage</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$besucherSG</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ergebnis</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'COUNT(*)'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Um das zu überprüfen wird zuerst einmal die IP des Besuchers benötigt. Diese ist in $_SERVER['REMOTE_ADDR'] gespeichert. $_SERVER ist eine superglobale Variable, d.h. sie ist überall im PHP-Skript verfügbar. Anschließend wird wieder ein SQL-Befehl an die Datenbank geschickt, &#8220;SELECT COUNT(*) FROM `besucher` WHERE `ip` = &#8216;$besucherIp&#8217;&#8221; zählt die Datensätze in der Tabelle besucher bei denen in der Spalte ip der Inhalt der Variable $besucherIp (die IP des Besuchers) steht. Jetzt wird wieder per mysql_fetch_assoc ein Datensatz aus dem Ergebnis ausgelesen. Wieviele Datensätze mit der IP des Besuchers gefunden wurden wird dann in $besucherSG gespeichert.</p>
<h3>2.5 Zähler erhöhen und Sperrung der IP</h3>
<p>Falls der Besucher noch nicht gezählt(und somit gesperrt) wurde, muss der Zähler erhöht und der Besucher gesperrt werden.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">/* Falls nicht, Zaehler um 1 erhoehen und IP sperren. */</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$besucherSG</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$besucherGesamt</span><span style="color: #339933;">++;</span>
<span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;INSERT INTO `besucher` (`ip`, `zeit`) VALUES ('<span style="color: #006699; font-weight: bold;">$besucherIp</span>', NOW())&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;UPDATE `daten` SET `wert` = <span style="color: #006699; font-weight: bold;">$besucherGesamt</span> WHERE `bezeichnung` = 'zaehlerstand'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Das Ausrufezeichen in der if-Bedingung bedeutet das die Bedingung nur erfüllt ist wenn das nach dem Ausrufezeichen FALSE (unwahr) ist. TRUE und FALSE lassen sich auch in Zahlen umrechnen, nämlich: FALSE = 0, TRUE = alles &gt;0. Ist $besucherSG also 0(FALSE) ist die Bedingung erfüllt, wegen dem Ausrufezeichen. Ist $besucherSG = 1 (TRUE) ist sie nicht erfüllt.<br />
Wenn der Besucher noch nicht gezählt wurde wird jetzt $besucherGesamt inkrementiert(um 1 erhöht). &#8220;INSERT INTO `besucher` (`ip`, `zeit`) VALUES (&#8217;$besucherIp&#8217;, NOW())&#8221; erstellt in der Tabelle besucher einen neuen Datensatz und schreibt in die Spalten ip und zeit die Werte $besucherIp und NOW() (das aktuelle Datum + Zeit). &#8220;UPDATE `daten` SET `wert` = $besucherGesamt WHERE `bezeichnung` = &#8216;zaehlerstand&#8217;&#8221; aktualisiert in der Tabelle daten den Inhalt der Spalte wert zu $besucherGesamt wenn in der Spalte bezeichnung die Zeichenkette zaehlerstand steht.</p>
<h3>2.6 Ausgabe des Zählerstandes</h3>
<p>Jetzt muss der Zählerstand nur noch ausgegeben werden. Dazu genügt folgender Code:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Besucher insgesamt: <span style="color: #006699; font-weight: bold;">$besucherGesamt</span>&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Sollte selbsterklärend sein.</p>
<h3>3.0 Abschließendes</h3>
<p>Der Besucherzähler kann jetzt per include(&#8221;zaehler.php&#8221;); in eine Webseite integriert werden. Es ist natürlich nur ein sehr simpler Besucherzähler, man kann ihn aber beliebig erweitern.<br />
Hier nochmal der gesamte PHP-Code:</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
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Zum MySQL-Server verbinden */</span>
<span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">mysql_select_db</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Aktuellen Stand des Zaehlers auslesen */</span>
<span style="color: #000088;">$abfrage</span>  <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT `wert` FROM `daten` WHERE `bezeichnung` = 'zaehlerstand'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$ergebnis</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_fetch_assoc</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$abfrage</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$besucherGesamt</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ergebnis</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'wert'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Gesperrte IPs loeschen, wenn der Besuch laenger als 1 Tag zurueck liegt. */</span>
<span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;DELETE FROM `besucher` WHERE `zeit` &lt; (NOW() - INTERVAL 1 DAY)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Ist die IP gesperrt? */</span>
<span style="color: #000088;">$besucherIp</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REMOTE_ADDR'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$abfrage</span>    <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT COUNT(*) FROM `besucher` WHERE `ip` = '<span style="color: #006699; font-weight: bold;">$besucherIp</span>'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$ergebnis</span>   <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_fetch_assoc</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$abfrage</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$besucherSG</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ergebnis</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'COUNT(*)'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Falls nicht, Zaehler um 1 erhoehen und IP sperren. */</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$besucherSG</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$besucherGesamt</span><span style="color: #339933;">++;</span>
<span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;INSERT INTO `besucher` (`ip`, `zeit`) VALUES ('<span style="color: #006699; font-weight: bold;">$besucherIp</span>', NOW())&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;UPDATE `daten` SET `wert` = <span style="color: #006699; font-weight: bold;">$besucherGesamt</span> WHERE `bezeichnung` = 'zaehlerstand'&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Ausgabe */</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Besucher insgesamt: <span style="color: #006699; font-weight: bold;">$besucherGesamt</span>
&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Der Code darf auch gerne so übernommen werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2008/10/18/ein-einfacher-besucherzahler-mit-ip-sperre/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Vorschaubilder erstellen</title>
		<link>http://www.antusblog.de/2008/10/13/php-vorschaubilder-erstellen/</link>
		<comments>http://www.antusblog.de/2008/10/13/php-vorschaubilder-erstellen/#comments</comments>
		<pubDate>Mon, 13 Oct 2008 19:03:59 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[Anleitungen]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Anleitung]]></category>
		<category><![CDATA[Vorschaubilder]]></category>

		<guid isPermaLink="false">http://antu.bplaced.net/?p=9</guid>
		<description><![CDATA[  
Ein Bild sagt mehr als tausend Worte. Aber viele Bilder verbrauchen viel Traffic, wäre es nicht besser wenn nur die Bilder übertragen werden müssen, die der Benutzer auch wirklich sehen will? Und würden kleine Vorschaubilder in Bildergalerien oder Foren nicht auch die Übersichtlichkeit erhöhen?
Ja. Und genau deshalb erzeugen die meisten Bildergalerien und Bilderhoster [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://antusblog.de/wp-content/uploads/2008/10/vorschaubild.png"><img class="size-full wp-image-10" title="Vorschaubild 1" src="http://antusblog.de/wp-content/uploads/2008/10/vorschaubild.png" alt="" width="120" height="85" /></a> <a href="http://antusblog.de/wp-content/uploads/2008/10/vorschaubild-2.png"><img class="size-full wp-image-11" title="Vorschaubild 2" src="http://antusblog.de/wp-content/uploads/2008/10/vorschaubild-2.png" alt="" width="120" height="80" /></a> <a href="http://antusblog.de/wp-content/uploads/2008/10/vorschaubild-3.png"><img class="size-full wp-image-12" title="Vorschaubild 3" src="http://antusblog.de/wp-content/uploads/2008/10/vorschaubild-3.png" alt="" width="120" height="80" /></a></p>
<p>Ein Bild sagt mehr als tausend Worte. Aber viele Bilder verbrauchen viel Traffic, wäre es nicht besser wenn nur die Bilder übertragen werden müssen, die der Benutzer auch wirklich sehen will? Und würden kleine Vorschaubilder in Bildergalerien oder Foren nicht auch die Übersichtlichkeit erhöhen?</p>
<p>Ja. Und genau deshalb erzeugen die meisten Bildergalerien und Bilderhoster diese kleinen Vorschaubilder, auch Thumbnails genannt. In dieser Anleitung möchte ich erklären wie man solche Vorschaubilder in PHP erstellen kann.</p>
<p><strong>Wichtig:</strong> Diese Anleitung setzt grundlegende Kenntnisse über PHP voraus. (Grundlagen, Bedingungen, Variablen, Funktionen)</p>
<p><span id="more-24"></span></p>
<h2>Funktionsweise</h2>
<p>Im Grunde ist das Ganze recht einfach. Das PHP-Skript öffnet das Originalbild und erstellt ein kleines Bild, welches z.B. nur 100&#215;100 Pixel groß ist. Dann wird das Originalbild auf die Größe des kleinen Vorschaubilds geschrumpft und in dieses eingefügt. Jetzt könnte man noch einen Rahmen um das Vorschaubild zeichnen. Oder einen kleinen schwarzen Balken mit Informationen über die Dateigröße oder die Auflösung des Originalbilds einfügen. In dieser Anleitung werde ich der Einfachheit halber nicht darauf eingehen wie man mittels HTML/PHP Bilder hochladen kann, sondern nur darauf wie man die Vorschaubilder erstellt.</p>
<h2>Informationen über das Bild ermitteln</h2>
<p>Gehen wir mal davon aus das das Originalbild bereits auf dem Server gespeichert ist. Zuerst einmal muss herausgefunden werden welche Auflösung das Originalbild hat, und um welches Bildformat (PNG, JPEG, GIF, &#8230;) es sich handelt. Hier bietet sich die Funktion <a href="http://de.php.net/manual/de/function.getimagesize.php" target="_blank">getimagesize(string $filename [, array &amp;$imageinfo])</a> an. Die Funktion ermittelt Breite, Höhe und mime-Typ des Bildes. Die Funktion kann noch einige weitere Informationen liefern, diese sind aber erstmal unwichtig.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$originalbild</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;bilder/bild.png&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$informationen</span> <span style="color: #339933;">=</span> <span style="color: #990000;">getimagesize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$original_dateiname</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$informationen</span> <span style="color: #339933;">==</span> <span style="color: #009900; font-weight: bold;">FALSE</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$informationen</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$informationen</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
throw <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Fehler beim Ermitteln der Bildauflösung!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$breite</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$informationen</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$hoehe</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$informationen</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$format</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$informationen</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'mime'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Wenn beim Ermitteln der Informationen ein Fehler auftritt gibt getimagesize() FALSE zurück. Wenn die Funktion nicht in der Lage ist die Auflösung des Bildes herauszufinden liefert sie als Breite und Höhe jeweils den Wert 0. Sollte einer dieser Fehler auftreten wird eine Fehlermeldung ausgegeben und die Ausführung des Skripts abgebrochen (throw new Exception(&#8230;)). Wenn kein Fehler aufgetreten ist werden Breite, Höhe und Bildformat in $breite, $hoehe und $format gespeichert.</p>
<p><strong>Was ist ein mime-Typ?</strong><br />
Multipurpose Internet Mail Extensions, kurz MIME ermöglicht es bei Übertragungen im Internet festzulegen welches Format die übertragenen Daten haben, z.B. Bilder, Filme, Text, etc.<br />
Mehr Informationen zu MIME finden sich bei <a href="http://de.wikipedia.org/wiki/Multipurpose_Internet_Mail_Extensions" target="_blank">Wikipedia</a>.</p>
<p><strong>Was hat es mit diesem throw new Exception(&#8230;) auf sich?</strong><br />
Exceptions, zu deutsch Ausnahmen, sind eine Möglichkeit der Fehlerbehandlung. Man umschließt den Quelltext einfach mit einem try { &lt;Quelltext } catch (Exception $e) { &lt;Fehlerbehandlung&gt; }. Wenn ein Fehler auftritt wirft man einfach eine Ausnahme mit throw new Exception(&#8221;Fehlermeldung&#8221;);, der Quelltext danach wird dann nicht mehr ausgeführt, PHP springt direkt zum catch-Block und führt die entsprechende Fehlerbehandlung aus.</p>
<p>Mehr Informationen zur Ausnahmebehandlung mit Exceptions finden sich im <a href="http://de.php.net/manual/de/language.exceptions.php" target="_blank">PHP Handbuch</a>.</p>
<h2>Originalbild öffnen</h2>
<p>Jetzt wo das Bildformat bekannt ist, kann das Bild auch geöffnet und damit gearbeitet werden, jedenfalls wenn das Dateiformat unterstützt wird. In einer switch-Bedingung werden nun die 4 häufigsten Bildformate abgefragt und die entsprechende Funktion sie zu öffnen aufgerufen. PHP unterstützt noch ein paar weitere Formate, diese 3 sind aber die am häufigsten verwendeten. Wenn das Bild ein anderes Format hat wird wieder die Ausführung des Skripts abgebrochen und eine Fehlermeldung ausgegeben.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$format</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">case</span> <span style="color: #0000ff;">&quot;image/gif&quot;</span><span style="color: #339933;">:</span> <span style="color: #000088;">$originalbild</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecreatefromgif</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$original_dateiname</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">case</span> <span style="color: #0000ff;">&quot;image/jpeg&quot;</span><span style="color: #339933;">:</span> <span style="color: #000088;">$originalbild</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecreatefromjpeg</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$original_dateiname</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">case</span> <span style="color: #0000ff;">&quot;image/png&quot;</span><span style="color: #339933;">:</span> <span style="color: #000088;">$originalbild</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecreatefrompng</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$original_dateiname</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">default</span><span style="color: #339933;">:</span> throw <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Bildformat nicht unterstützt!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h2>Verhältnis Höhe/Breite berechnen</h2>
<p>Damit das Bild beim verkleinern nicht gestreckt wird, muss nun das Verhältnis zwischen Höhe und Breite ausgerechnet werden, um die die Größe des Vorschaubilds entsprechend anzupassen. Erstmal werden Höhe und Breite auf je 100 Pixel festgelegt, diese Werte können natürlich höher/niedriger gesetzt werden, je nachdem wie groß das Vorschaubild sein soll. Dann wird das Verhältnis zwischen Höhe/Breite des Originalbilds berechnet in dem die Höhe durch die Breite respektive die Breite durch die Höhe geteilt wird. Wenn das Bild breiter als hoch ist ($breite_verhaeltnis &gt; $hoehe_verhaeltnis), wird die Höhe, ansonsten die Breite angepasst. Um die Höhe anzupassen wird die gewünschte Höhe des Vorschaubilds durch das Verhältnis der Breite zur Höhe geteilt. Anschließend wird das Ergebnis mithilfe der Funktion <a href="http://de.php.net/manual/de/function.ceil.php" target="_blank">ceil(float $value)</a> gerundet, da es keine halben Pixel gibt. <img src='http://www.antusblog.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Die Breite wird genau so berechnet, nur mit anderen Werten.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$vorschau_breite</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$vorschau_hoehe</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$breite_verhaeltnis</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$breite</span> <span style="color: #339933;">/</span> <span style="color: #000088;">$hoehe</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$hoehe_verhaeltnis</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$hoehe</span> <span style="color: #339933;">/</span> <span style="color: #000088;">$breite</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$breite_verhaeltnis</span> <span style="color: #339933;">&gt;</span> <span style="color: #000088;">$hoehe_verhaeltnis</span><span style="color: #009900;">&#41;</span>
<span style="color: #000088;">$vorschau_hoehe</span> <span style="color: #339933;">=</span> <span style="color: #990000;">ceil</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vorschau_hoehe</span> <span style="color: #339933;">/</span> <span style="color: #000088;">$breite_verhaeltnis</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">else</span>
<span style="color: #000088;">$vorschau_breite</span>  <span style="color: #339933;">=</span> <span style="color: #990000;">ceil</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vorschau_breite</span> <span style="color: #339933;">/</span> <span style="color: #000088;">$hoehe_verhaeltnis</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2>Vorschaubild erstellen und Rahmen zeichnen</h2>
<p>Jetzt kann das Vorschaubild erstellt werden, und zwar mit der Funktion <a href="http://de.php.net/manual/de/function.imagecreatetruecolor.php" target="_blank">imagecreatetruecolor(int $width, int $height)</a>. Warum imagecreatetruecolor und nicht imagecreate? Weil bei Bildern die mit imagecreate erzeugt wurden nur 256 Farben zur Verfügung stehen. Bei GIF-Bildern ist das egal, bei PNG, JPEG o.Ä. aber nicht. Wenn das Bild nicht erstellt werden konnte gibt imagecreatetruecolor FALSE zurück, in dem Fall wird wieder einfach eine Exception geworfen.</p>
<p>Um den Rahmen um das Vorschaubild zu zeichnen muss man erst die Farbe die man verwenden will bestimmen, dafür benutzt man die Funktion <a href="http://de.php.net/manual/de/function.imagecolorallocate.php" target="_blank">imagecolorallocate(resource $im, int $red, int $green, int $blue)</a>. Diese Funktion gibt einen Bezeichner zurück unter dem die Farbe aufrufbar ist. Zu den Parametern der Funktion ist zu sagen: Der erste Parameter ist das Bild für welches die Farbe bestimmt ist, in diesem Fall $vorschaubild, die anderen 3 Parameter bestimmen den Rot/Grün/Blau-Anteil der Farbe (0-255).</p>
<p>Der Rahmen wird letztendlich mit der Funktion zum Zeichnen von Rechtecken <a href="http://de.php.net/manual/de/function.imagerectangle.php" target="_blank">imagerectangle(resource $im, int $x1, int $y1, int $x2, $int y2, int $col)</a> gezeichnet. $im ist wieder das Bild in das gezeichnet werden soll, $x1 bzw. $y1 stellen die linke obere Koordinate, $x2 und $y2 die rechte untere Koordinate dar. Mit $col bestimmt man die Farbe des Rechtecks. Als Startkoordinate wird 0|0 verwendet, als Endkoordinate $vorschau_breite &#8211; 1|$vorschau_hoehe &#8211; 1. Minus 1 weil man in der Programmierung meistens bei 0 anfängt zu zählen und unser Bild sozusagen 0-99 Pixel breit und 0-99 Pixel hoch ist.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$vorschaubild</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecreatetruecolor</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vorschau_breite</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vorschau_hoehe</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$vorschaubild</span><span style="color: #009900;">&#41;</span> throw <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Fehler beim Erstellen des Vorschaubilds!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$rahmenfarbe</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecolorallocate</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vorschaubild</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">imagerectangle</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vorschaubild</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vorschau_breite</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vorschau_hoehe</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$rahmenfarbe</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2>Originalbild schrumpfen und ins Vorschaubild einfügen</h2>
<p>Nun muss das Originalbild so weit verkleinert werden damit es in das Vorschaubild reinpasst. Dazu gibt es die Funktionen <a href="http://de.php.net/manual/de/function.imagecopyresampled.php" target="_blank">imagecopyresampled(resource $dst_image, resource $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_w, int $dst_h, int $src_w, int $src_h)</a> und <a href="http://de.php.net/manual/de/function.imagecopyresized.php" target="_blank">imagecopyresized(resource $dst_im, resource $src_im, int $dstX, int $dstY, int $srcX, int $srcY, int $dstW, int $dst_H, int $src_W, int $src_H)</a>. Der erste Parameter legt fest in welches Bild das verkleinerte Bild geschrieben werden soll, der zweite bestimmt das Originalbild, die beiden nächsten parameter bestimmen die Startkoordinaten im Zielbild, die darauffolgenden beiden die Koordinaten im Originalbild. Darauf folgen noch jeweils Höhe und Breite von Original und Zielbild.</p>
<p>Hier ist zu beachten das die Startkoordinaten im Zielbild jeweils 1 sind, würde bei 0 angefangen werden zu zeichnen würde der Rahmen wieder &#8220;übermalt&#8221; werden. Im Originalbild wird natürlich alles von 0|0 bis $breite|$hoehe erfasst. Bei der Breite/Höhe des Vorschaubilds müssen 2 Pixel wegen dem Rahmen abgezogen werden (jeweils 1 Pixel oben/unten, und einer links/rechts).</p>
<p>Wenn beim verkleinern ein Fehler auftritt gibt die Funktion FALSE zurück.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">imagecopyresampled</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vorschaubild</span><span style="color: #339933;">,</span> <span style="color: #000088;">$originalbild</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vorschau_breite</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vorschau_hoehe</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span> <span style="color: #000088;">$breite</span><span style="color: #339933;">,</span> <span style="color: #000088;">$hoehe</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<div id="attachment_13" class="wp-caption alignleft" style="width: 130px"><a href="http://antusblog.de/wp-content/uploads/2008/10/resampled.png"><img class="size-medium wp-image-13" title="imagecopyresampled" src="http://antusblog.de/wp-content/uploads/2008/10/resampled.png" alt="Bild das mit imagecopyresampled verkleinert wurde" width="120" height="79" /></a><p class="wp-caption-text">Bild das mit imagecopyresampled verkleinert wurde</p></div>
<div id="attachment_14" class="wp-caption alignright" style="width: 130px"><a href="http://antusblog.de/wp-content/uploads/2008/10/resized.png"><img class="size-full wp-image-14" title="imagecopyresized" src="http://antusblog.de/wp-content/uploads/2008/10/resized.png" alt="Bild das mit imagecopyresized verkleinert wurde" width="120" height="79" /></a><p class="wp-caption-text">Bild das mit imagecopyresized verkleinert wurde</p></div>
<p>Die Funktion imagecopyresized arbeitet zwar schneller (ungefähr 400%) als imagecopyresampled, die Ergebnisse sehen aber auch bei weitem nicht so gut aus.</p>
<h2>Vorschaubild abspeichern</h2>
<p>Nun muss das Vorschaubild noch auf dem Server abgespeichert werden, denn bis jetzt befindet es sich ja nur im Speicher. Dafür können die Funktionen <a href="http://de2.php.net/manual/en/function.imagepng.php" target="_blank">imagepng</a>, <a href="http://de2.php.net/manual/en/function.imagegif.php" target="_blank">imagegif</a> oder <a href="http://de2.php.net/manual/en/function.imagejpeg.php" target="_blank">imagejpeg</a> verwendet werden. Es gibt natürlich auch noch andere Funktionen für andere Bildformate, die hier aufgezählten sind aber die gängigsten. Der erste Parameter der Funktion gibt immer das Bild an, das gespeichert werden soll, der zweite den Dateinamen/Pfad unter dem es gespeichert werden soll. Den Funktionen zum Abspeichern von JPEGs und PNGs kann man zusätzlich noch sagen welche Qualität das Zielbild haben soll, bzw. wie stark es komprimiert werden soll.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">imagepng</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vorschaubild</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;vorschaubild.png&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2>Optional: Kleiner Balken mit Informationen</h2>
<p>Das Vorschaubild ist jetzt fertig, aber wäre es nicht praktisch wenn im Vorschaubild angezeigt werden würde welche Dateigröße und welche Auflösung das Originalbild hat?</p>
<p>Zuerst muss die Dateigröße des Originalbildes  ermittelt werden, die Funktion <a href="http://de2.php.net/manual/en/function.filesize.php" target="_blank">filesize(string $filename)</a> macht das. Die zurückgegebene Dateigröße muss nun nur noch von Bytes in Kibibytes bzw. Mebibytes umgerechnet werden. Dazu teilen man die Dateigröße durch 1024. Wenn ein Bild aber größer als 1024 KiB ist, sollte man es in MiB umrechnen, im Vorschaubild ist ja nicht viel Platz zur Anzeige von Informationen. Also fragt man ab ob das Bild größer oder gleich 1 MiB ist, und wenn das der Fall ist, wird die Dateigröße nochmal durch 1024 geteilt.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$bildgroesse</span> <span style="color: #339933;">=</span> <span style="color: #990000;">filesize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$original_dateiname</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$bildgroesse</span> <span style="color: #339933;">/=</span> <span style="color: #cc66cc;">1024</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$bildgroesse</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">1024</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000088;">$bildgroesse</span> <span style="color: #339933;">/=</span> <span style="color: #cc66cc;">1024</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$bildgroesse_text</span> <span style="color: #339933;">=</span> <span style="color: #990000;">ceil</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$bildgroesse</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; MiB&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span>
<span style="color: #000088;">$bildgroesse_text</span> <span style="color: #339933;">=</span> <span style="color: #990000;">ceil</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$bildgroesse</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; KiB&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Die Auflösung des Originalbildes wurde ja schon am Anfang mittels getimagesize() ermittelt und in $hoehe und $breite abgespeichert.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$text</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">{$breite}</span>x<span style="color: #006699; font-weight: bold;">{$hoehe}</span> <span style="color: #006699; font-weight: bold;">$bildgroesse_text</span>&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>So lassen sich die Informationen recht kompakt darstellen.</p>
<p>Da die Informationen aber in den meisten Fällen immer noch zu lang für das Vorschaubild sind, muss die Größe des Vorschaubildes etwas angehoben werden, anstatt 100&#215;100 also besser 120&#215;120.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$vorschau_breite</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">120</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$vorschau_hoehe</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">120</span><span style="color: #339933;">;</span></pre></div></div>

<p>Da die Informationen das Bild ja nicht überdecken sollen muss das Vorschaubild etwas vergrößert werden:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$vorschaubild</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecreatetruecolor</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vorschau_breite</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vorschau_hoehe</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Um die Informationen mittig anzuzeigen muss erstmal die Länge des Textes berechnet werden, indem man die Anzahl der Buchstaben (+ Leerzeichen) mal die Anzahl vertikaler Pixel pro Buchstabe rechnet. Dann zieht man das Ergebnis von der Breite des Vorschaubildes ab und teilt das ganze durch 2.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$startposition</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$vorschau_breite</span> <span style="color: #339933;">-</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$text</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">7</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span></pre></div></div>

<p>Der Text braucht natürlich auch wieder eine Farbe, Rot/Grün/Blau auf 255 ergibt die Farbe Weiß:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$text_farbe</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecolorallocate</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vorschaubild</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Nun muss ein kleiner Balken unterhalb des Vorschaubildes gezeichnet werden, dazu wird die Funktion <a href="http://de2.php.net/manual/en/function.imagefilledrectangle.php" target="_blank">imagefilledrectangle</a> verwendet. Diese funktioniert wie imagerectangle, nur das diese Funktion das Rechteck auch ausmalt. Als Farbe wird die selbe Farbe wie für den Rahmen verwendet.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">imagefilledrectangle</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vorschaubild</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vorschau_hoehe</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vorschau_hoehe</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vorschau_breite</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$rahmenfarbe</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Jetzt können die Informationen endlich in den eben gezeichneten Balken geschrieben werden. Um Text in Bilder zu schreiben gibt es in PHP die Funktionen <a href="http://de2.php.net/manual/en/function.imagestring.php" target="_blank">imagestring</a> und <a href="http://de2.php.net/manual/en/function.imagettftext.php" target="_blank">imagettftext</a>, erstere kann zwar nur Bitmap-Schriftarten darstellen (imagettftext kann auch TrueType-Schriftarten verwenden), das reicht aber für diese Anleitung vollkommen aus. Der erste Parameter bestimmt wieder das Bild in das geschrieben werden soll, der zweite die Schriftart, wenn hier Zahlen zwischen 1 und 5 angegeben werden, wird eine Standardschriftart verwendet. Parameter 3 und 4 geben an an welcher Stelle begonnen werden soll zu schreiben, die anderen Beiden bestimmen den Text und die Schriftfarbe.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">imagestring</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vorschaubild</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span> <span style="color: #000088;">$startposition</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vorschau_hoehe</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$text</span><span style="color: #339933;">,</span> <span style="color: #000088;">$text_farbe</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Fertig! <img src='http://www.antusblog.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><strong>&#8220;{$breite}x{$hoehe}&#8221; Warum die geschweiften Klammern?</strong><br />
Ohne die geschleiften Klammern würde PHP denken es sind die Variablen $breite[b]x[/b] und $höhe gemeint, durch die geschweiften Klammern weiß PHP das die Variable nur $breite heißt. So lassen sich übrigens auch Arrays direkt in Strings einbinden: &#8220;{$array['index']}&#8221;</p>
<h2>Abschließendes</h2>
<p>Das wars? Ja, natürlich lässt sich das ganze noch verbessern und erweitern, z.B. kann man das ganze in eine Klasse packen, den Balken mit den Informationen transparent über das Bild legen und vieles mehr. Man kann noch Überprüfungen einbauen, z.B. kann man noch abfragen ob das Originalbild bereits kleiner ist als das Vorschaubild, in dem Fall macht es natürlich wenig Sinn es zu verkleinern. Aber das überlasse ich euch, lasst eurer Fantasie freien Lauf. <img src='http://www.antusblog.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Hier noch einmal der gesamte Quelltext:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$original_dateiname</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;original.png&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Aufloesung und Bildformat bestimmen */</span>
<span style="color: #000088;">$informationen</span> <span style="color: #339933;">=</span> <span style="color: #990000;">getimagesize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$original_dateiname</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Wenn das fehlschlägt -&gt; Fehler */</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$informationen</span> <span style="color: #339933;">==</span> <span style="color: #009900; font-weight: bold;">FALSE</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$informationen</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$informationen</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
throw <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Fehler beim Ermitteln der Bildauflösung!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$breite</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$informationen</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$hoehe</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$informationen</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$format</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$informationen</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'mime'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Originalbild oeffnen */</span>
<span style="color: #b1b100;">switch</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$format</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">case</span> <span style="color: #0000ff;">&quot;image/gif&quot;</span><span style="color: #339933;">:</span> <span style="color: #000088;">$originalbild</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecreatefromgif</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$original_dateiname</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">case</span> <span style="color: #0000ff;">&quot;image/jpeg&quot;</span><span style="color: #339933;">:</span> <span style="color: #000088;">$originalbild</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecreatefromjpeg</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$original_dateiname</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">case</span> <span style="color: #0000ff;">&quot;image/png&quot;</span><span style="color: #339933;">:</span> <span style="color: #000088;">$originalbild</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecreatefrompng</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$original_dateiname</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">default</span><span style="color: #339933;">:</span> throw <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Bildformat nicht unterstützt!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$vorschau_breite</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$vorschau_hoehe</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Breite/Hoehe Verhältnis berechnen und Groesse des Vorschaubildes entsprechend anpassen */</span>
<span style="color: #000088;">$breite_verhaeltnis</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$breite</span> <span style="color: #339933;">/</span> <span style="color: #000088;">$hoehe</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$hoehe_verhaeltnis</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$hoehe</span> <span style="color: #339933;">/</span> <span style="color: #000088;">$breite</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$breite_verhaeltnis</span> <span style="color: #339933;">&gt;</span> <span style="color: #000088;">$hoehe_verhaeltnis</span><span style="color: #009900;">&#41;</span>
<span style="color: #000088;">$vorschau_hoehe</span> <span style="color: #339933;">=</span> <span style="color: #990000;">ceil</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vorschau_hoehe</span> <span style="color: #339933;">/</span> <span style="color: #000088;">$breite_verhaeltnis</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">else</span>
<span style="color: #000088;">$vorschau_breite</span>  <span style="color: #339933;">=</span> <span style="color: #990000;">ceil</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vorschau_breite</span> <span style="color: #339933;">/</span> <span style="color: #000088;">$hoehe_verhaeltnis</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Vorschaubild erstellen */</span>
<span style="color: #000088;">$vorschaubild</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecreatetruecolor</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vorschau_breite</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vorschau_hoehe</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$vorschaubild</span><span style="color: #009900;">&#41;</span> throw <span style="color: #000000; font-weight: bold;">new</span> Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Fehler beim Erstellen des Vorschaubilds!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Rahmen zeichnen */</span>
<span style="color: #000088;">$rahmenfarbe</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecolorallocate</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vorschaubild</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">imagerectangle</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vorschaubild</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vorschau_breite</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vorschau_hoehe</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$rahmenfarbe</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Originalbild verkleinern und in das Vorschaubild einfuegen */</span>
<span style="color: #990000;">imagecopyresampled</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vorschaubild</span><span style="color: #339933;">,</span> <span style="color: #000088;">$originalbild</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vorschau_breite</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vorschau_hoehe</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span> <span style="color: #000088;">$breite</span><span style="color: #339933;">,</span> <span style="color: #000088;">$hoehe</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/* Vorschaubild abspeichern */</span>
<span style="color: #990000;">imagepng</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$vorschaubild</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;vorschaubild.png&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2008/10/13/php-vorschaubilder-erstellen/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
