<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>de.credativ-Blog: Kategorie Tipp</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/" />
    <link rel="self" type="application/atom+xml" href="http://blog.credativ.com/de/atom.xml" />
    <id>tag:blog.credativ.com,2010-03-05:/de//1</id>
    <updated>2010-08-31T11:49:36Z</updated>
    <subtitle>All about Linux and Open Source</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.34-en</generator>

<entry>
    <title>PostgreSQL Optimizer Bits: Auto Explain</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/08/postgresql-optimizer-bits-auto-explain.html" />
    <id>tag:blog.credativ.com,2010:/de//1.189</id>

    <published>2010-08-31T09:34:21Z</published>
    <updated>2010-08-31T11:49:36Z</updated>

    <summary> In dieser Folge stellen wir im Rahmen der &quot;Optimizer Bits&quot; das Modul auto_explain vor, das seit PostgreSQL Version 8.4 Bestandteil des contrib-Zweiges ist. Das Modul ermöglicht das Protokollieren von Abfrageplänen im PostgreSQL-Log und so eine bessere Analyse von Abfrageproblemen...</summary>
    <author>
        <name>Bernd Helmle</name>
        
    </author>
    
        <category term="Open Source" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PostgreSQL" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tipp" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="credativ" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="postgresql" label="PostgreSQL" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<p><img alt="postgreslogo.png" src="/de/static/postgreslogo.png" width="97" height="100" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /><br />
<em>In dieser Folge stellen wir im Rahmen der "Optimizer Bits" das Modul auto_explain vor, das seit PostgreSQL Version 8.4 Bestandteil des contrib-Zweiges ist. Das Modul ermöglicht das Protokollieren von Abfrageplänen im PostgreSQL-Log und so eine bessere Analyse von Abfrageproblemen während der Laufzeit.</em></p>

<h3>Problemstellung</h3>

<p>Für viele Datenbank-Entwickler und -Administratoren stellt sich täglich das Problem, problematische Abfragen zu finden, zu analysieren und effizienter zu gestalten. Hauptproblem dieser Aufgabe ist das Identifizieren solcher Abfragen. Erstes Mittel ist der Logparameter <br />
</p>
<pre class='brush: text'>log_min_duration_statement = '30s'</pre><p></p>

<p>In diesem Falle werden alle Abfragen, die länger als 30 Sekunden dauern, in das Log der PostgreSQL-Datenbank geschrieben. Der Administrator hat dann die Möglichkeit, diese Abfrage aus dem Logfile zu ermitteln oder aber über weitere Tools wie bspw. <a href="http://pgfouine.projects.postgresql.org/">pgfouine</a> zu analysieren. Allerdings kann es unter Umständen passieren, dass bei der späteren Analyse andere Pläne entstehen, die es schwer machen, das tatsächliche Problem zu spezifizieren. Solche Abhängigkeiten machen es dem Entwickler schwer, das tatsächliche Problem genau einzugrenzen. </p>

<h3>Das Modul auto_explain</h3>

<p>Seit PostgreSQL 8.4 gibt es das contrib-Modul <em>auto_explain</em>, dass die Ausgabe von Abfrageplänen während der Testphase von Abfragen gestattet. Beispielsweise lassen sich damit Läufe von umfangreichen Batchjobs protokollieren, die Pläne später analysieren und entsprechende Optimierungen an den entsprechenden Abfragen vornehmen. <em>auto_explain</em> kann permanent oder nur zur Fehlersuche in die Datenbank geladen werden.</p>

<p>Zunächst müssen die contrib-Module von PostgreSQL 8.4 oder höher installiert sein. Dies ist von Distribution zu Distribution unterschiedlich, in der Regel sollte man nach einen Paket postgresql-contrib Ausschau halten. Wenn man PostgreSQL selbst aus den Tarballs baut, wechselt man in der Verzeichnis des entpackten Quelltextes und von dort aus in das entsprechende contrib-Verzeichnis (die folgenden Schritte erfordern in der Regel Rootrechte auf dem System):<br />
</p>
<pre class='brush: plain'>
$ cd &lt;QUELLTEXT&gt;
$ cd contrib/auto_explain
</pre><p></p>

<p>Je nachdem. ob bereits PostgreSQL komplett gebaut wurde (in der Regel hat man dann ja noch alle benötigten Sourcen), kann man dann <em>auto_explain</em> zusätzlich bauen:<br />
</p>
<pre class='brush: plain'>
$ make install
</pre><p></p>

<p>Sollte der Quelltextbaum bereits bereinigt worden (make clean), aber eine komplette Installation zur Verfügung stehen, so kann man mit PGXS-Unterstützung, ohne den kompletten Quelltextbaum nochmals kompilieren zu müssen, das Modul wie folgt bauen:<br />
</p>
<pre class='brush: plain'>
$ USE_PGXS=1 make install
</pre><p></p>

<p>Dies erfordert jedoch mindestens die Präsenz des Tools <em>pg_config</em> im Pfad der aktuellen Umgebung.<br />
Ist alles installiert, so kann das Modul direkt in eine Datenbankverbindung geladen werden. Dies ist nur als Superuser möglich, wie in diesem Beispiel über eine lokale Verbindung:<br />
</p>
<pre class='brush: sql'>
$ psql -U &lt;superuser&gt; &lt;dbname&gt;
#= LOAD 'auto_explain';
LOAD
</pre><p></p>

<p>Ist das Modul erfolgreich geladen worden, so steht es nur in dieser Datenbankverbindung zur Verfügung und kann auch nur von dort aus verwendet werden. Interessant ist dies, um nur Abfragen aus speziellen Verbindungen heraus zu protokollieren. Mit der folgenden SQL-Abfrage können die nun hinzugekommenen Konfigurationsparameter für <em>auto_explain</em> abgefragt werden:<br />
</p>
<pre class='brush: sql'>
#= SELECT name, setting FROM pg_settings WHERE name LIKE 'auto_explain%';
</pre><p></p>

<p>Dies sollte folgende Liste liefern:<br />
</p>
<pre class='brush: plain'>
                 name                   | setting 
------------------------------------+---------
 auto_explain.log_analyze           | off
 auto_explain.log_buffers           | off
 auto_explain.log_format            | text
 auto_explain.log_min_duration      | -1
 auto_explain.log_nested_statements | off
 auto_explain.log_verbose           | off
(6 rows)
</pre><p></p>

<p>Der wichtigste Parameter hier ist</p> <pre class='brush: plain'>auto_explain.log_min_duration</pre><p> Dieser aktiviert (Werte ab 0ms) oder deaktiviert (Wert -1) das Protokollieren von Abfrageplänen. Die weiteren Einstellungen sind im Einzelnen:</p>

<ul>
	<li><em>auto_explain.log_analyze = true|false</em>: Aktiviert oder deaktiviert das Loggen von EXPLAIN ANALYZE. Dies bedeutet das Timinginformationen <strong>aller</strong> Abfragen erfasst werden (auch diejenigen, die schneller ausgeführt werden als <em>auto_explain.log_min_duration</em>). Dies hat einen signifikanten Einfluss auf die Ausführungsgeschwindigkeit und sollte mit Bedacht gewählt werden.</li>
        <li><em>auto_explain.log_verbose = true|false</em>: Ausgabeformat mit zusätzlichen Informationen für EXPLAIN.</li>
        <li><em>auto_explain.log_nested_statements = true|on</em>: Hiermit werden auch Ausführungspläne von Statements innerhalb von Funktionen mitprotokolliert. So ist es nun auch möglich, die Pläne von SQL-Abfragen, die bspw. aus pl/pgsql-Prozeduren heraus ausgeführt werden, genauer zu untersuchen.</li>

</ul>

<p>Mit PostgreSQL 9.0 kommen zwei weitere Konfigurationsmöglichkeiten hinzu:</p>

<ul>
	<li><em>auto_explain.log_format = 'text'|'xml'|'json'|'yaml'</em>: Ermöglicht die Ausgabe der Abfragepläne im XML, JSON, oder YAML Format. <em>text</em> entspricht dem Standardformat.</li>
        <li><em>auto_explain.log_buffers = true|false</em>: Aktiviert oder deaktiviert die Ausgabe von Bufferinformationen in der Ausgabe des Planes. Dies enthält u.a. Informationen über Bufferhits (Treffer im Shared Buffer Pool). Voraussetzung hierfür ist das gleichzeitige Aktivieren des Parameters <em>log_analyze</em>.</li>
</ul>

<h3>Anwendungsbeispiel</h3>

<p>Im folgenden betrachten wir ein wegen der Übersichtlichkeit ein stark vereinfachtes Anwendungsbeispiel. In einer Datenbank gibt es seit kurzem ein Geschwindigkeitsproblem mit einer Funktion, die plötzlich stark variierende Ausführungszeiten aufweist. Die Funktion wird vielfältig eingesetzt, da sie bestimmte ID-Nummern einem Datum zuordnet. Die Definition dieser Funktion sei wie folgt:<br />
</p>
<pre class='brush: sql'>
CREATE OR REPLACE FUNCTION get_test_datum_ids(p_datum timestamp) 
RETURNS SETOF integer 
STABLE 
LANGUAGE plpgsql
AS 
$$ 
DECLARE 
   v_id int; 
BEGIN 
   FOR v_id IN SELECT * FROM test WHERE datum &lt; p_datum 
   LOOP 
      RETURN 
         NEXT v_id; 
   END LOOP; 

   RETURN; 
END; 
$$;
</pre><p></p>

<p>Geübte PostgreSQL-Anwender werden schnell bemerken, dass diese Funktion deutlich effizienter implementiert werden kann, für dieses Beispiel jedoch ist eine derartige Implementierung gut geeignet. Der Administrator kann nun über <em>log_min_duration_statement</em> langsame Funktionsaufrufe zwar protokollieren, muss jedoch um dem Geschwindigkeitsproblem auf den Grund zu gehen, u.U. auf das System übertragen oder von Hand ausführen. Bei näherer Betrachtungsweise entsteht dann der Verdacht, dass die Schleife und die dort enthaltene Abfrage suboptimal sein könnte. Üblicherweise wird dann die Abfrage mit EXPLAIN geprüft:<br />
</p>
<pre class='brush: sql'>
#= \timing on
#= EXPLAIN ANALYZE SELECT id FROM test WHERE datum &lt; '01.02.2008'::timestamp;
                                                       QUERY PLAN                                                        
-------------------------------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on test  (cost=4.50..16.90 rows=32 width=4) (actual time=0.039..0.054 rows=31 loops=1)
   Recheck Cond: (datum &lt; '2008-02-01 00:00:00'::timestamp without time zone)
   -&gt;  Bitmap Index Scan on test_datum_idx  (cost=0.00..4.49 rows=32 width=0) (actual time=0.025..0.025 rows=31 loops=1)
         Index Cond: (datum &lt; '2008-02-01 00:00:00'::timestamp without time zone)
 Total runtime: 0.114 ms
(5 rows)
</pre><p></p>

<p>Insofern nichts Verdächtiges, die Abfrage nutzt einen vorhandenen Index auf dem Feld <em>datum</em>. Mit <em>auto_explain</em> können wir nun jedoch ebenfalls direkt die Pläne aus dem Funktionskörper heraus prüfen:<br />
</p>
<pre class='brush: sql'>
#= SET auto_explain.log_analyze TO on;
SET
#= SET auto_explain.log_nested_statements TO on;
SET
#= SET auto_explain.log_min_duration TO '0ms';
SET
#= SELECT get_test_datum_ids('01.02.2008'::timestamp);
</pre><p></p>

<p>Durch das Setzen von <em>auto_explain.log_analyze TO on</em> wird die Funktion tatsächlich ausgeführt und alle Timingparameter erfasst. Nach dem Ausführen sollten sich folgende Zeilen auf STDOUT, im Logfile oder <em>syslog</em> finden, je nach dem was für ein <em>log_destination</em> verwendet wird:<br />
</p>
<pre class='brush: plain'>
LOG:  duration: 0.616 ms  plan:
	Query Text: SELECT * FROM test WHERE datum &lt; p_datum
	Seq Scan on test  (cost=0.00..25.70 rows=365 width=12) (actual time=0.424..0.597 rows=31 loops=1)
	  Filter: (datum &lt; $1)
ZUSAMMENHANG:  PL/pgSQL function &quot;get_test_datum_ids&quot; line 1 at FOR über SELECT-Zeilen
</pre><p></p>

<p>Dieser Plan sieht schon deutlich anders aus. Zwar ist die Ausführungsgeschwindigkeit aufgrund der in diesem Beispiel recht kleinen Datenmengen noch überschaubar, jedoch kann man sich jetzt schon vorstellen, dass bei einer größeren Datenmenge dieser Plan schnell ineffizient werden kann. Doch warum wird an dieser Stelle ein anderer Plan verwendet?</p>

<p>Des Rätsels Lösung liegt an der parametrisierten Form dieser Abfrage, die in der FOR-Schleife verwendet wird. Der Optimizer kann nur einen generischen Plan für diese Art der <strong>WHERE</strong>-Bedingung erzeugen. Da der Offset für den Bereich innerhalb der Bedingung nicht zur Planungszeit zur Verfügung steht, muss der Optimizer den Plan auf einem möglichst allgemeingültigen Kostenmodell berechnen, der effizient für jeden Wert in der <strong>WHERE</strong>-Bedingung ist.</p>

<h3>Konfiguration über postgresql.conf</h3>

<p><em>auto_explain</em> lässt sich auch global über die postgresql.conf konfigurieren. Möchte man als DBA beispielsweise das Modul auf jeden Fall für jede Datenbankverbindung laden, so benötigt man einen entsprechend konfigurierten Parameter <em>shared_preload_libraries</em> in der postgresql.conf (diese befindet sich in der Regel im Datenbankverzeichnis ihrer PostgreSQL-Installation, kann aber bei einigen Distributionen abweichen):<br />
</p>
<pre class='brush: plain'>
## globales Aktivieren von auto_explain
shared_preload_libraries = 'auto_explain'
</pre><p></p>

<p>Dies lädt das Modul bereits beim Start für jede Datenbankverbindung. Da PostgreSQL noch nicht die Konfigurationsparameter beim Laden der Konfigurationsdatei kennt, muss dies noch zusätzlich über den Parameter <em>custom_variable_classes</em> dem Server bekannt gemacht werden:<br />
</p>
<pre class='brush: plain'>
custom_variable_classes = 'auto_explain'
</pre><p></p>

<p>Nun kann in der Datei <em>postgresql.conf</em> der Parameter global konfiguriert werden, wie an folgendem Listing beispielhaft gezeigt:<br />
</p>
<pre class='brush: plain'>
auto_explain.log_min_duration = '30s'
auto_explain.log_format = 'xml'
</pre><p></p>

<h3>Zusammenfassung</h3>

<p><em>auto_explain</em> ist ein nützliches Tool, um Geschwindigkeitsproblemen innerhalb der Datenbank anhand der EXPLAIN-Ausgaben auf den Grund zu gehen. Als wertvoll stellt sich die Möglichkeit heraus, eingebettete Abfragen innerhalb von SQL- oder PL/pgsql-Prozeduren mitprotokollieren zu können, um so auch die Abfragen im entsprechenden Kontext auf Fehler oder unterschiedliche Pläne hin untersuchen zu können.  <br />
<em>auto_explain</em> eignet sich jedoch nicht, um dauerhaft auf produktiven Datenbankmaschinen eingeschaltet zu sein, hierfür ist der zusätzliche Aufwand für das Ausschreiben der Pläne zu groß. Insofern sollte auf jeden Fall Gebrauch von <em>auto_explain.log_min_duration</em> gemacht werden, so dass wirklich nur sehr problematische Abfragen bei Überschreiten einer bestimmten Zeitschwelle protokolliert werden. Auch sollte dann auf produktiven Maschinen auf jeden Fall <em>auto_explain.log_analyze</em> deaktiviert sein, da dies auch Abfragen, die noch unterhalb der Zeitschwelle von <em>auto_explain.log_min_duration</em> liegen, negativ beeinflusst.</p>]]>
        
    </content>
</entry>

<entry>
    <title>[Tipp] SSH-Jumphosts konfigurieren</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/04/tipp-ssh-jumphosts-konfigurieren.html" />
    <id>tag:blog.credativ.com,2010:/de//1.158</id>

    <published>2010-04-29T11:09:36Z</published>
    <updated>2010-04-29T11:24:38Z</updated>

    <summary> Beim Administrieren von Systemen kommt es häufig zu der Situtaion, dass eine SSH-Verbindung auf Host B nur über den SSH-Umweg via Host A möglich ist: client -&gt; ssh A -&gt; ssh B Um diesen Zweier-Schritt zu verkürzen, kann ein...</summary>
    <author>
        <name>Roland Wolters</name>
        <uri>http://www.credativ.de</uri>
    </author>
    
        <category term="Linux" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Open Source" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Security" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tipp" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="credativ" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<p><img alt="tux.jpg" src="/de/static/tux.jpg" width="86" height="102" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /><br />
Beim Administrieren von Systemen kommt es häufig zu der Situtaion, dass eine SSH-Verbindung auf Host B nur über den SSH-Umweg via Host A möglich ist:<br />
client -> ssh A -> ssh B</p>

<p>Um diesen Zweier-Schritt zu verkürzen, kann ein Eintrag in der <tt>~/.ssh/config</tt> den Host A als Jumphost markieren, damit dieser Schritt zukünftig automatisch erfolgt:</p>
<pre class='brush: text'>
Host Bdirekt
Hostname $IP_von_B
User rwo 
ProxyCommand ssh root@A.intern.lan nc %h %p
</pre><p><br />
In der ersten Zeile wird ein Alias definiert - dieser kann beliebig sein, ein Bezug zu B ist aber sicherlich nicht falsch. Die zweite Zeile definiert den Hostname von B - bei Bedarf und je nach Netzwerk ist hier die IP sinnvoller als der Hostname! Die Option ProxyCommand definiert dann die eigentliche Jump-Funktion - hier also den Zugriff via ssh auf A und die Weiterleitung der Daten mittels nc.</p>

<p>Sind nun auch SSH-Keys überall ausreichend verteilt, gibt es auch keine Abfragen mehr. Ein simples <tt>ssh Bdirekt</tt> führt dann direkt auf den Host B.</p>

<p>Alle Tipps dieses Blogs werden auch als  <a href="/de/tipp/">Kategorie Tipp</a> mit eigenem Feed angeboten -  und solltet ihr gerade nach <a href="http://www.credativ.de/open-source-support-center/unser-support-angebot/">Support für Linux</a> suchen, seid ihr bei uns immer richtig.</p>]]>
        
    </content>
</entry>

<entry>
    <title>[Tipp] Bilder automatisch richtig drehen mit exiftran</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/03/tipp-bilder-automatisch-richtig-drehen-mit-exiftran.html" />
    <id>tag:blog.credativ.com,2010:/de//1.140</id>

    <published>2010-03-12T12:30:08Z</published>
    <updated>2010-03-12T12:36:24Z</updated>

    <summary>Heutige Digitalkameras speichern zusätzlich zu den Bild-Daten noch weitere Meta-Daten im Exif-Standard - unter Anderem, wie die Kamera gedreht war, als das Bild aufgenommen wurde. Bild-Anzeige-Programme nutzen diese Informationen aber nur teilweise - einige drehen die Bilder in der Anzeige...</summary>
    <author>
        <name>Roland Wolters</name>
        <uri>http://www.credativ.de</uri>
    </author>
    
        <category term="Debian" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Linux" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Open Source" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tipp" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<p><img alt="bash.png" src="/de/static/bash.png" width="90" height="72" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" />Heutige Digitalkameras speichern zusätzlich zu den Bild-Daten noch weitere Meta-Daten im <a href="http://de.wikipedia.org/wiki/Exchangeable_Image_File_Format">Exif</a>-Standard - unter Anderem, wie die Kamera gedreht war, als das Bild aufgenommen wurde. Bild-Anzeige-Programme nutzen diese Informationen aber nur teilweise - einige drehen die Bilder in der Anzeige korrekt, andere nicht, so dass das Verhalten inkonsistent und für den Nutzer nicht vorhersehbar ist.</p>

<p>Dem Problem kann mit dem Programm <a href="http://linux.bytesex.org/fbida/">exiftran</a> begegnet werden: es dreht alle Bilder eines Verzeichnisses korrekt und löscht danach die entsprechende Exif-Information. Und es kann wirklich einfach für Massenverarbeitung genutzt werden:<br />
</p>
<pre class='brush: plain'>
# apt-get install exiftran
$ find -print0 | xargs -0 exifautotran
</pre><p></p>

<p>Bei anderen Distributionen heißt das Paket eventuell anders, Fedora z.B. liefert es als <tt>fbida</tt> aus.</p>]]>
        
    </content>
</entry>

<entry>
    <title>[Tipp] Favoriten in rekonq anpassen</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/03/tipp-favoriten-in-rekonq-anpassen.html" />
    <id>tag:platon.credativ.com,2010:/de//1.41</id>

    <published>2010-03-01T17:09:14Z</published>
    <updated>2010-03-05T11:42:31Z</updated>

    <summary>Ich schaue mir derzeit den Browser rekonq an, ein auf WebKit basierender KDE-Browser, der von Einigen als der zukünftige neue Standardbrowser für KDE gehandelt wird. Ob es dazu kommt oder nicht, sei dahin gestellt, der Browser lässt sich in der...</summary>
    <author>
        <name>Roland Wolters</name>
        <uri>http://www.credativ.de</uri>
    </author>
    
        <category term="KDE" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Open Source" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tipp" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<img alt="tux.jpg" src="/de/static/tux.jpg" width="86" height="102" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" />Ich schaue mir derzeit den Browser <a href="http://rekonq.sourceforge.net/">rekonq</a> an, ein auf WebKit basierender KDE-Browser, der von Einigen als der zukünftige neue Standardbrowser für KDE gehandelt wird. Ob es dazu kommt oder nicht, sei dahin gestellt, der Browser lässt sich in der derzeitigen <a href="http://adjamblog.wordpress.com/2010/02/11/rekonq-0-4-beta/">Version 0.4 Beta</a> aber schon recht gut nutzen: Kwallet-Integration, Addblock, Plugin-Support, etc.
<br />
<br />
Problematisch ist aber im derzeitigen git-checkout der Umgang mit den Favoriten auf der <a href="about:favorites">about:favorites</a>-Seite: diese können zwar gelöscht, aber nicht ohne weitere neu erstellt werden. Die Favoriten können aber auch mit einem Eintrag in der Datei <tt>$HOME/.kde/share/config/rekonqrc</tt> definiert werden: der Abschnitt "NewTabPage" definiert diese. Dabei werden sowohl die URLs wie auch die Kommentare unter den Vorschauen mit Kommata getrennt:
<pre class='brush: plain'>
[NewTabPage]
previewNames=http://www.heise.de,http://www.spiegel.de,http://www.tagesschau.de,,,,,
previewUrls=heise.de,spiegel.de,tagesschau.de,,,,,</pre>

An solchen Stellen zeigt sich, dass rekonq immer noch diverse Probleme hat, und noch reifen muss. Er hat aber zur Zeit eine Menge Potential, sich einen festen Platz in KDE zu erarbeiten.]]>
        
    </content>
</entry>

<entry>
    <title>[Tipp] .htaccess-Beispiel</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/02/tipp-htaccess-beispiel.html" />
    <id>tag:platon.credativ.com,2010:/de//1.30</id>

    <published>2010-02-24T16:03:40Z</published>
    <updated>2010-06-08T10:33:30Z</updated>

    <summary>Einer der schnellsten und einfachsten Wege, den Zugriff auf einen Pfad eines Webservers auf bestimmte Nutzer zu begrenzen ist der Einsatz einer .htaccess-Datei. Diese wird im zu begrenzenden Pfad hinterlegt, und beschreibt, welche Beschränkungen gelten. Ein simples Beispiel für die...</summary>
    <author>
        <name>Roland Wolters</name>
        <uri>http://www.credativ.de</uri>
    </author>
    
        <category term="Open Source" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Security" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tipp" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<img alt="bash.png" src="/de/static/bash.png" width="90" height="72" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" />Einer der schnellsten und einfachsten Wege, den Zugriff auf einen Pfad eines Webservers auf bestimmte Nutzer zu begrenzen ist der Einsatz einer <tt>.htaccess</tt>-Datei. Diese wird im zu begrenzenden Pfad hinterlegt, und beschreibt, welche Beschränkungen gelten. Ein simples Beispiel für die Begrenzung des Zugriffs auf alle Nutzer, die in einer entsprechenden htpasswd-Datei definiert sind, ist:
<pre class='brush: plain'>
AuthType Digest
AuthName &quot;SecretDir&quot;
AuthUserFile /etc/apache2/passwords/secretdir.htpasswd
Require valid-user
</pre>

Die <tt>.htpasswd</tt>-Datei enthält die Nutzernamen und Passwörter - und sollte daher außerhalb des Webverzeichnisses stehen!

<pre class='brush: plain'>
htdigest -c /etc/apache2/passwords/secretdir.htpasswd SecretDir someuser
</pre>

Wichtig ist, dass im <tt>Directory</tt>-Abschnitt der Verzeichnis-Konfiguration (z.B. unter <tt>/etc/apache2/sites-enabled</tt>) die Option <tt>AllowOverride AuthConfig</tt> gesetzt ist. Da in diesem Beispiel auch die wenigstens etwas sichere Authentifizierungs-Methode Digest verwendet wird, muss das Modul <tt>mod_auth_digest</tt> außerdem geladen sein.
<br />
<br />
Weitere Informationen, tiefer gehende Konfigurationen und weitere Anpassungen finden sich im Artikel <a href="http://httpd.apache.org/docs/2.2/howto/auth.html">Authentication, Authorization and Access Control</a> der Apache-Dokumentation.]]>
        
    </content>
</entry>

<entry>
    <title>[Tipp] 256 Farben aktivieren in vim</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/02/tipp-256-farben-aktivieren-in-vim.html" />
    <id>tag:platon.credativ.com,2010:/de//1.25</id>

    <published>2010-02-16T11:23:13Z</published>
    <updated>2010-03-12T09:18:32Z</updated>

    <summary>Einer der vielen Vorteile von vim ist die Möglichkeit der Syntax-Hervorhebung: verschiedene Wörter und Zeichen werden in einem Text je nach Bedeutung in unterschiedlichen Farben angezeigt.Je mehr Farben zur Verfügung stehen, desto besser - in vielen Fällen zeigt vim aber...</summary>
    <author>
        <name>Roland Wolters</name>
        <uri>http://www.credativ.de</uri>
    </author>
    
        <category term="Open Source" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tipp" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<p><img alt="bash.png" src="/de/static/bash.png" width="90" height="72" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" />Einer der vielen Vorteile von vim ist die Möglichkeit der Syntax-Hervorhebung: verschiedene Wörter und Zeichen werden in einem Text je nach Bedeutung in unterschiedlichen Farben angezeigt.Je mehr Farben zur Verfügung stehen, desto besser - in vielen Fällen zeigt vim aber nur 8 oder 16 unterschiedliche Farben an. Dies kann mit einem Eintrag in der <tt>~/.vimrc</tt> schnell gelöst werden:<br />
</p>
<pre class='brush: plain'>
if &amp;term!=&quot;linux&quot;
  set t_Co=256            &quot; vim nutzt 256 Farben
  colorscheme desert256   &quot; ein passendes Farbschema
endif
</pre><p><br />
Der erste Befehl sorg dafür, dass vim zukünftig mit entsprechend vielen Farben umgehen kann, der zweite lädt auch gleich noch ein entsprechend tiefgehendes Farb-Schema, <a href="http://www.vim.org/scripts/script.php?script_id=1243">desert256</a> - das muss dafür aber vorher schon nach <tt>~/.vim/colors/</tt> kopiert werden! Die If-Abfrage stellt sicher, dass in ttys die Konfiguration nicht geladen wird, da diese meist nur 8 Farben unterstützen.</p>

<p>Übrigens: einen Überblick über alle möglichen Vim-Colorschemes für diverse Programmiersprachen findet sich auf der Webseite des Projekts <a href="http://code.google.com/p/vimcolorschemetest/">vimcolorschemetest</a>.</p>]]>
        
    </content>
</entry>

<entry>
    <title>[Tipp] Auto-Redirect von http auf https</title>
    <link rel="alternate" type="text/html" href="http://blog.credativ.com/de/2010/02/tipp-auto-redirect-von-http-auf-https.html" />
    <id>tag:platon.credativ.com,2010:/de//1.16</id>

    <published>2010-02-08T16:50:47Z</published>
    <updated>2010-03-05T10:44:54Z</updated>

    <summary>Ab und an ist es notwendig, einen Apache aufzusetzen, bei dem der gesamte http-Verkehr nach https umgeleitet wird. Dies ist auf ungefähr 1.376 verschiedene Art- und Weisen möglich, eine davon ist: RewriteEngine on RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI} Mit...</summary>
    <author>
        <name>Roland Wolters</name>
        <uri>http://www.credativ.de</uri>
    </author>
    
        <category term="Linux" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Open Source" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tipp" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="de" xml:base="http://blog.credativ.com/de/">
        <![CDATA[<img alt="bash.png" src="/de/static/bash.png" width="90" height="72" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" />Ab und an ist es notwendig, einen Apache aufzusetzen, bei dem der gesamte http-Verkehr nach https umgeleitet wird. Dies ist auf ungefähr 1.376 verschiedene Art- und Weisen möglich, eine davon ist:
<pre class='brush: plain'>
RewriteEngine on
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*) https://%{HTTP_HOST}%{REQUEST_URI}
</pre>
Mit diesen Zeilen in der Konfiguration des VirtualHosts oder sogar in der globalen Apache-Konfiguration werden alle Anfragen entsprechend umgeschrieben.Aber: diese Zeilen sind für simple, einfache Installationen gedacht. Komplexere Setups und tiefer gehende Konfigurationen können damit schnell aus dem Tritt gebracht werden.]]>
        
    </content>
</entry>

</feed>

