<?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>blog.mirabilit.de &#187; mirabilit</title>
	<atom:link href="http://blog.mirabilit.de/author/mirabilit/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.mirabilit.de</link>
	<description></description>
	<lastBuildDate>Wed, 28 Sep 2011 07:43:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Datei- und MySQL-Recovery nach Servercrash</title>
		<link>http://blog.mirabilit.de/2011/07/datei-und-mysql-recovery-nach-servercrash/</link>
		<comments>http://blog.mirabilit.de/2011/07/datei-und-mysql-recovery-nach-servercrash/#comments</comments>
		<pubDate>Sun, 24 Jul 2011 13:42:34 +0000</pubDate>
		<dc:creator>mirabilit</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[recovery]]></category>

		<guid isPermaLink="false">http://blog.mirabilit.de/?p=101</guid>
		<description><![CDATA[Wenn das letzte Backup schon deutlich zu alt kommt für den entsprechenden Server die ideale Zeit zum kaputt gehen. Vorzugsweise durch einen Plattencrash oder ähnlichen Spaß, so dass sich das Linux des Servers nur noch im Recovery Modus starten lässt. Services hochfahren oder das längst fällige Backup anzustarten sind keine Optionen mehr. Was tun? Ganz [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn das letzte Backup schon deutlich zu alt kommt für den entsprechenden Server die ideale Zeit zum kaputt gehen. Vorzugsweise durch einen Plattencrash oder ähnlichen Spaß, so dass sich das Linux des Servers nur noch im Recovery Modus starten lässt. Services hochfahren oder das längst fällige Backup anzustarten sind keine Optionen mehr. Was tun?</p>
<p>Ganz pauschal und einfach lässt sich das natürlich nicht beantworten. Alles wird man z.B. bei einem Plattencrash nicht wieder bekommen, aber vielleicht genug, um den Server wieder aufsetzen zu können. Dafür gibt es natürlich viele Möglichkeiten. <a title="dd_rescue im Forensics Wiki" href="http://www.forensicswiki.org/wiki/Dd_rescue" target="_blank">dd_rescue</a> zum Beispiel. <a title="dd_rescue bei DebianAdmin.com" href="http://www.debianadmin.com/recover-data-from-a-dead-hard-drive-using-ddrescue.html" target="_blank">Hier </a>gibt es eine Anleitung für Debian basierte Systeme.</p>
<p>Eine etwas simplere (und vielleicht auch naivere) Herangehensweise die oft auch zum Ziel führt versuche ich hier kurz zu beschreiben. Es wird sicher nicht alles wiederhergestellt werden können, ich übernehme keine Garantie dafür, dass überhaupt etwas wiederhergestellt wird. Aber ich denke, dass es je nach Situation einen Versuch wert sein kann.</p>
<p>Auch im Rescue System lassen sich die beschädigten Platten evtl. noch mounten. Wenn das klappt versucht man erstmal selektiv alle wichtigen Dateien zu sichern. Natürlich nicht einfach mit einem <code>cp</code> in ein anderes Verzeichnis auf der kaputten Platte, sondern am besten per <code>rsync</code> und <code>ssh</code> auf einen anderen Rechner:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">rsync <span style="color: #660033;">-av</span> <span style="color: #000000; font-weight: bold;">/</span>mnt<span style="color: #000000; font-weight: bold;">/</span>pfad user<span style="color: #000000; font-weight: bold;">@</span>meinNeuerServer:<span style="color: #000000; font-weight: bold;">/</span>sicherungspfad</pre></div></div>

<p>Damit lassen sich z.B. die Dateien aus <code>/var/www/meineSeite</code> oder <code>/var/www/meinBlog</code> sichern (für den <code>rsync</code> Aufruf dem Pfad natürlich ein <code>/mnt</code> voranstellen). Mit etwas Glück bekommt man so den Teil seiner Seite, der nicht in einer Datenbank liegt schnell wieder. Evtl. einfach die Dateien aus dem neusten Update drüber bügeln und dieser Teil der Seite ist schnell wieder hergestellt. Ohne die Daten aus der Datenbank ist das natürlich aber noch nicht viel Wert, sondern erspart höchstens etwas Arbeit, denn <a title="Drupal CMS" href="http://drupal.org" target="_blank">drupal </a>oder einen <a title="Wordpress" href="http://wordpress.org" target="_blank">WordPress</a> Blog hat man auch von Hand schnell wieder aufgesetzt.</p>
<p>Also, wie bekomme ich die Daten aus meiner MySQL Datenbank wieder, wenn ich mysql nicht mehr starten kann? Eine Antwort habe ich u.a. <a title="MySQL Recovery bei stackoverflow.com" href="http://stackoverflow.com/questions/879176/how-to-recover-mysql-db-from-myd-myi-frm-files" target="_blank">hier</a> gefunden. Die Dateien einer MySQL Datenbank liegen im Verzeichnis <code>/var/lib/mysql/&lt;db_name&gt;</code>. Wenn auf dem neuen Server schon mysql installiert ist, kann man direkt wieder ein <code>rsync</code> Kommando absetzen:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">rsync <span style="color: #660033;">-av</span> <span style="color: #000000; font-weight: bold;">/</span>mnt<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>mysql<span style="color: #000000; font-weight: bold;">/&amp;</span>lt;db_name<span style="color: #000000; font-weight: bold;">&amp;</span>gt; user<span style="color: #000000; font-weight: bold;">@</span>meinServer:<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>mysql<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>Mit etwas Glück wird vieles oder alles kopiert. Kaputte Sektoren auf der Platte bedeuten ja nicht unweigerlich, dass die gesamte Platte nicht mehr gelesen werden kann.</p>
<p>Auf dem neuen Server müssen noch ein paar kleine Schritte getan werden, bevor man testen kann, ob es wirklich funktioniert hat:</p>
<p>1. Die Besitzer der Datenbank Dateien anpassen:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">chown</span> <span style="color: #660033;">-R</span> mysql:mysql <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>mysql<span style="color: #000000; font-weight: bold;">/&amp;</span>lt;dbname<span style="color: #000000; font-weight: bold;">&amp;</span>gt;</pre></div></div>

<p>2. Mit der Datenbank verbinden und die Tabellen einzeln checken und ggf. reparieren und den alten Datenbank Benutzer wieder anlegen:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">mysql <span style="color: #660033;">-u</span> user <span style="color: #660033;">-p</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">USE</span> &amp;lt;db_name&amp;gt;;
&nbsp;
<span style="color: #993333; font-weight: bold;">SHOW</span> <span style="color: #993333; font-weight: bold;">TABLES</span>;</pre></div></div>

<p>Für jede Tabelle in der Liste check table ausführen:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CHECK</span> <span style="color: #993333; font-weight: bold;">TABLE</span> &amp;lt;tabellenname&amp;gt;;</pre></div></div>

<p>Hiervon bekommt man entweder OK oder please run repair table `&lt;tabellenname&gt;` als Antwort. Im zweiten Fall führt man das auch aus:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">repair <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">`&amp;lt;tabellenname&amp;gt;`</span>;</pre></div></div>

<p>Am Schluss noch den alten Benutzer wieder anlegen, bevor man den Browser auf den neuen Server loslässt und schaut, ob die Seite wieder läuft:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">GRANT</span> <span style="color: #993333; font-weight: bold;">ALL</span> privileges <span style="color: #993333; font-weight: bold;">ON</span> &amp;lt;tabellenname&amp;gt;<span style="color: #66cc66;">.*</span> <span style="color: #993333; font-weight: bold;">TO</span> <span style="color: #ff0000;">'benutzer'</span>@<span style="color: #ff0000;">'localhost'</span> <span style="color: #993333; font-weight: bold;">IDENTIFIED</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #ff0000;">'tollesPasswort'</span> <span style="color: #993333; font-weight: bold;">WITH</span> <span style="color: #993333; font-weight: bold;">GRANT</span> <span style="color: #993333; font-weight: bold;">OPTION</span>;</pre></div></div>

<p>Mit etwas Glück funktioniert die Seite danach wieder wie gewohnt auf dem neuen Server. Wenn das alles nichts geholfen hat bleibt der Versuch mit dd_rescue oder eben man packt das letzte (wenn auch evtl. alte) Backup auf den neuen Server und kann zumindest für einige der Inhalte den google Cache bemühen.</p>
 <img src="http://blog.mirabilit.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=101" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.mirabilit.de/2011/07/datei-und-mysql-recovery-nach-servercrash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby Versionen und Gemsets mit rvm verwalten</title>
		<link>http://blog.mirabilit.de/2011/04/ruby-versionen-und-gemsets-mit-rvm-verwalten/</link>
		<comments>http://blog.mirabilit.de/2011/04/ruby-versionen-und-gemsets-mit-rvm-verwalten/#comments</comments>
		<pubDate>Mon, 11 Apr 2011 17:09:54 +0000</pubDate>
		<dc:creator>mirabilit</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rubygems]]></category>

		<guid isPermaLink="false">http://blog.mirabilit.de/?p=89</guid>
		<description><![CDATA[Eine tolle Sache habe ich gefunden, während ich eigentlich etwas ganz anderes gesucht habe. Mit rvm lassen sich verschiedene Ruby Versionen und für jede Version unterschiedliche Gemsets verwalten und das einfach und unkompliziert. Die Installation ist einfach und schnell gemacht. Wenn man sich eigentlich nicht viel macht und nur ein paar einfache Kommandos wissen möchte, [...]]]></description>
			<content:encoded><![CDATA[<p>Eine tolle Sache habe ich gefunden, während ich eigentlich etwas ganz anderes gesucht habe. Mit <a href="https://rvm.beginrescueend.com/" target="_blank">rvm</a> lassen sich verschiedene Ruby Versionen und für jede Version unterschiedliche Gemsets verwalten und das einfach und unkompliziert. Die <a href="https://rvm.beginrescueend.com/rvm/install/" target="_blank">Installation</a> ist einfach und schnell gemacht.</p>
<p>Wenn man sich eigentlich nicht viel macht und nur ein paar einfache Kommandos wissen möchte, um zwischen seinen Gemsets und Ruby-Versionen zu wechseln kann man sich entweder durch die Doku auf der rvm Seite lesen oder sich <a href="http://stackoverflow.com/questions/3709313/how-to-manage-multiple-gemsets-and-ruby-versions-with-rvm" target="_blank">diesen Artikel</a> bei stackoverflow anschauen, der eine prima Übersicht zum schnellen und unkomplizierten Einstieg bietet. rvm kann noch mehr als das dort Beschriebene, aber schon alleine das fand ich so toll, dass ich erst viel später auf den Rest gestoßen bin.</p>
<p>Sollte es notwendig sein mich damit ausführlicher zu beschäftigen, werde ich natürlich davon berichten. Bis jetzt war es für mich genug für Spree, Radiant und ein paar andere Sachen, die ich ausprobiert habe ein eigenes Gemset zu haben und die empfohlene Ruby Version verwenden zu können. Und das mit nicht mehr als zwei kleinen Kommandos.</p>
<p>Wäre toll, wenn es sowas auch für andere Sprachen gäbe, z.B. um Python und Django in verschiedenen Versionen zur Verfügung zu haben ohne zu viel zu basteln. Mal sehen, was es da gibt&#8230;</p>
 <img src="http://blog.mirabilit.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=89" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.mirabilit.de/2011/04/ruby-versionen-und-gemsets-mit-rvm-verwalten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kommando an screen session senden</title>
		<link>http://blog.mirabilit.de/2011/03/kommando-an-screen-session-senden/</link>
		<comments>http://blog.mirabilit.de/2011/03/kommando-an-screen-session-senden/#comments</comments>
		<pubDate>Thu, 10 Mar 2011 14:04:59 +0000</pubDate>
		<dc:creator>mirabilit</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[kommandozeile]]></category>
		<category><![CDATA[screen]]></category>

		<guid isPermaLink="false">http://blog.mirabilit.de/?p=76</guid>
		<description><![CDATA[Eigentlich wollte ich mir nur schnell ein Perl-Skript schreiben, das mir auf einem Linux Rechner mehrere Skripte startet und zwar jedes in seinem eigenen Screen. Das Perl-Skript war auch nicht das Problem, mit screen hatte ich da schon mehr zu kämpfen. Aber ich war erfolgreich, hier kurz meine Erkenntnisse und Ergebnisse. Der Einfachheit halber verwendet [...]]]></description>
			<content:encoded><![CDATA[<p>Eigentlich wollte ich mir nur schnell ein Perl-Skript schreiben, das mir auf einem Linux Rechner mehrere Skripte startet und zwar jedes in seinem eigenen <a title="GNU Screen" href="http://www.gnu.org/software/screen/" target="_blank">Screen</a>. Das Perl-Skript war auch nicht das Problem, mit <code>screen</code> hatte ich da schon mehr zu kämpfen.</p>
<p>Aber ich war erfolgreich, hier kurz meine Erkenntnisse und Ergebnisse. Der Einfachheit halber verwendet ich den Befehl <code>top</code>, da man bei <code>top</code> sehr gut die Aktivität sieht und es sich nicht sofort wieder beendet. Meine Tests mit <code>ls</code> waren genau deshalb wenig hilfreich. Zuerst habe ich die man-page überfolgen und ein wenig im Netz gesucht und dann eine Weile zumprobiert. Die erste Idee, alles in einem einzigen Aufruf zu machen hat mich nach einigen missglückten Versuchen hierhin gebracht:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">screen</span> <span style="color: #660033;">-d</span> <span style="color: #660033;">-m</span> <span style="color: #660033;">-S</span> <span style="color: #7a0874; font-weight: bold;">test</span> top</pre></div></div>

<p><code>test</code> ist hier der Name meines Screens und <code>top</code> wie gesagt der Befehl, den ich ausführen möchte. Das klappt soweit ganz gut, mit <code>screen -r test</code> kann ich mich mit dem screen verbinden und sehe das laufende top. Der Nachteil dabei ist, dass sich der <code>screen</code> wieder beendet, wenn ich <code>top</code> mit <code>q</code> beende. Das mag in vielen Fällen nicht schlimm sein, ich wollte den <code>screen</code> aber hinterher behalten, da ich ja eigentlich mehr machen wollte als nur <code>top</code>. Also der nächste Versuch, dieses Mal in zwei Schritten:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">screen</span> <span style="color: #660033;">-d</span> <span style="color: #660033;">-m</span> <span style="color: #660033;">-S</span> <span style="color: #7a0874; font-weight: bold;">test</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">screen</span> <span style="color: #660033;">-S</span> <span style="color: #7a0874; font-weight: bold;">test</span> <span style="color: #660033;">-X</span> stuff top</pre></div></div>

<p>Was mache ich hier? Der erste Befehl erstellt einen screen mit Namen test an den ich mich mit <code>screen -r test</code> verbinden könnte. Das war einfach, im zweiten Befehl steckt etwas mehr drin und es muss auch noch etwas mehr dazu.</p>
<p><code>screen -S test -X stuff top</code> versucht <code>top</code> an den screen <code>test</code> zu schicken und auszuführen. <code>stuff</code> übernimmt sozusagen das Einfügen des Befehls. Das funktioniert allerdings nur, wenn ich mich vorher schon von Hand mit dem screen verbunden habe, also verbinden, detachen und dann das zweite Kommando ausführen. Wenn ich mich jetzt wieder an den screen attache, sehe ich <code>top</code> im Prompt stehen und könnte es mit Return starten.</p>
<p>Also habe ich zwei Probleme:</p>
<ol>
<li>Das attachen und detachen von Hand muss wegfallen, das kann ich in meinem Skript natürlich nicht brauchen.</li>
<li>Ich will das Kommando nicht nur im Prompt stehen haben, es soll auch ausgeführt werden.</li>
</ol>
<p>Die Lösung dafür sieht folgendermaßen aus:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">screen</span> <span style="color: #660033;">-S</span> <span style="color: #7a0874; font-weight: bold;">test</span> <span style="color: #660033;">-X</span> <span style="color: #660033;">-p0</span> stuff <span style="color: #ff0000;">&quot;top <span style="color: #007800;">$(echo -ne '\r')</span>&quot;</span></pre></div></div>

<p>Problem 1 löse ich mit <code>-p0</code>, das sagt dem <code>screen</code> Kommando, dass ich meinen Befehl an das Window 0 im screen schicken will. Problem 2 löst der etwas kryptisch aussehende Ausdruck am Ende, der im Prinzip ein Return an den Befehl anhängt, dass er auch gleich ausgeführt wird. Wenn ich jetzt in den screen reinschaue sehe ich ein laufendes <code>top</code>. Problem gelöst, damit läuft mein Perl-Skript ganz prima, einfach nur die Kommandos zusammenbasteln und jedes an seinen eigenen Screen senden.</p>
 <img src="http://blog.mirabilit.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=76" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.mirabilit.de/2011/03/kommando-an-screen-session-senden/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perl und XML:LibXML</title>
		<link>http://blog.mirabilit.de/2011/02/perl-und-xmllibxml/</link>
		<comments>http://blog.mirabilit.de/2011/02/perl-und-xmllibxml/#comments</comments>
		<pubDate>Tue, 01 Feb 2011 14:37:04 +0000</pubDate>
		<dc:creator>mirabilit</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[libxml]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://blog.mirabilit.de/?p=61</guid>
		<description><![CDATA[Hallo mal wieder, ist ja schon eine Weile her, dass sich hier was sichtbares getan hat. Ein paar Notizen zur Verwendung von Perls XML:LibXML möchte ich hier mal veröffentlichen, damit sie mir nicht mehr verloren gehen. Schon etwas älter, aber trotzdem nützlich ist die LibXML Quick Reference Card von Andrew Ford. Und hier noch ein [...]]]></description>
			<content:encoded><![CDATA[<p>Hallo mal wieder, ist ja schon eine Weile her, dass sich hier was sichtbares getan hat.</p>
<p>Ein paar Notizen zur Verwendung von Perls <a title="XML:LibXML" href="http://search.cpan.org/~pajas/XML-LibXML/" target="_blank">XML:LibXML</a> möchte ich hier mal veröffentlichen, damit sie mir nicht mehr verloren gehen. Schon etwas älter, aber trotzdem nützlich ist die LibXML <a title="LibXML Quick Reference Card" href="http://refcards.com/docs/forda/perl-xml-libxml/perl-xml-libxml-refcard-a4.pdf" target="_blank">Quick Reference Card</a> von Andrew Ford.</p>
<p>Und hier noch ein paar Code-Schnipsel mit kurzen Erklärungen dazu.</p>
<h3>Ein kleiner Test vorweg</h3>
<p>Zuerst ein Test, ob alles richtig eingerichtet ist:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> XML<span style="color: #339933;">::</span><span style="color: #006600;">LibXML</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$parser</span> <span style="color: #339933;">=</span> XML<span style="color: #339933;">::</span><span style="color: #006600;">LibXML</span><span style="color: #339933;">-</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span>new<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$xmlfile</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;./test.xml&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$dom</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$parser</span><span style="color: #339933;">-</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span>parse_file<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$xmlfile</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066;">print</span> <span style="color: #0000ff;">$dom</span><span style="color: #339933;">-</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span>toString<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Das sollte wieder das eingelesene xml-File ausgeben. Damit lässt sich schnell testen, ob alles richtig geladen wird und richtig eingelesen ist.</p>
<h3>Beispiel mit einem xml-File</h3>
<p>Ein Ausschnitt aus dem xml-File hilft vielleicht zu verstehen, wonach ich hier suche.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Component</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Server&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;InstType</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;install&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Command</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;win32&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            $INSTPATH\install.exe
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Command<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Command</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;linux&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            $INSTPATH/install
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Command<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/InstType<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;InstType</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;update&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Command</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;linux&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            $INSTPATH/update
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Command<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Command</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;win32&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            $INSTPATH\update.exe
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Command<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/InstType<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Component<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Für verschiedene Komponenten sind je nach Installationstyp Kommandos im xml-File hinterlegt. Jetzt möchte ich in meinem Perl-Skript mit Hilfe von LibXML das Ganze parsen:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> XML<span style="color: #339933;">::</span><span style="color: #006600;">LibXML</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$parser</span> <span style="color: #339933;">=</span> XML<span style="color: #339933;">::</span><span style="color: #006600;">LibXML</span><span style="color: #339933;">-</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span>new<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$xmlfile</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;./components.xml&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$dom</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$parser</span><span style="color: #339933;">-</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span>parse_file<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$xmlfile</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #0000ff;">@cmd_list</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$xpath</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'/scenarios/scenario[@name='</span><span style="color: #339933;">.</span><span style="color: #ff0000;">&quot;'&quot;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">$SCENARIO</span><span style="color: #339933;">.</span><span style="color: #ff0000;">&quot;'&quot;</span><span style="color: #339933;">.</span><span style="color: #ff0000;">']/installation'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$scen_node</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$scen_dom</span><span style="color: #339933;">-</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span>findnodes<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$xpath</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$cfg_xpath</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'/Component[@name='</span><span style="color: #339933;">.</span><span style="color: #ff0000;">&quot;'&quot;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">$scen_node</span><span style="color: #339933;">-</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span>findvalue<span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">'./component'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #ff0000;">&quot;'&quot;</span><span style="color: #339933;">.</span><span style="color: #ff0000;">']/InstType[@name='</span><span style="color: #339933;">.</span><span style="color: #ff0000;">&quot;'&quot;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">$scen_node</span><span style="color: #339933;">-</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span>findvalue<span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">'./type'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #ff0000;">&quot;'&quot;</span><span style="color: #339933;">.</span><span style="color: #ff0000;">']/Command[@name='</span><span style="color: #339933;">.</span><span style="color: #ff0000;">&quot;'&quot;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">$os</span><span style="color: #339933;">.</span><span style="color: #ff0000;">&quot;'&quot;</span><span style="color: #339933;">.</span><span style="color: #ff0000;">']'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$cmd</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$cfg_dom</span><span style="color: #339933;">-</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span>findnodes<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$cfg_xpath</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">push</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">@cmd_list</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span> <span style="color: #ff0000;">'type'</span> <span style="color: #339933;">=</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span> <span style="color: #0000ff;">$scen_node</span><span style="color: #339933;">-</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span>findvalue<span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">'./type'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'component'</span> <span style="color: #339933;">=</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span> <span style="color: #0000ff;">$scen_node</span><span style="color: #339933;">-</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span>findvalue<span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">'./component'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'cmd'</span> <span style="color: #339933;">=</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span> <span style="color: #0000ff;">$cmd</span><span style="color: #339933;">-</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span>textContent<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Um das foreach bin ich nicht rumgekommen, selbst wenn ich weiß, dass ich immer nur einen Treffer habe. Man bekommt eben ein Ergebnis vom Typ Nodelist und nicht vom Typ Node.</p>
<h3>Validieren gegen ein dtd-File</h3>
<p>Ein xml-File gegen ein dtd-File validieren. Gefunden habe ich das <a title="Perl Blog" href="http://reneeb-perlblog.blogspot.com/2009/11/einfaches-skript-um-xml-gegen-dtd-zu.html" target="_blank">hier</a>, vielen Dank dafür.</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">sub</span> validate_xml_file<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$xml_file</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$dtd_file</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$xml_file</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">/(.+)\.xml/</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #ff0000;">&quot;$1.dtd&quot;</span> <span style="color: #339933;">:</span> <span style="color: #000066;">undef</span><span style="color: #339933;">;;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$val</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">-</span>e <span style="color: #0000ff;">$dtd_file</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$dtd</span> <span style="color: #339933;">=</span> XML<span style="color: #339933;">::</span><span style="color: #006600;">LibXML</span><span style="color: #339933;">::</span><span style="color: #006600;">Dtd</span><span style="color: #339933;">-</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span>new<span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$dtd_file</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$xml</span> <span style="color: #339933;">=</span> XML<span style="color: #339933;">::</span><span style="color: #006600;">LibXML</span><span style="color: #339933;">-</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span>new<span style="color: #339933;">;</span>
        <span style="color: #0000ff;">$xml</span><span style="color: #339933;">-</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span>keep_blanks<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$tree</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$xml</span><span style="color: #339933;">-</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span>parse_file<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$xml_file</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #0000ff;">$val</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$tree</span><span style="color: #339933;">-</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span>validate<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$dtd</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066;">return</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$val</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h3>Links</h3>
<p>Noch ein paar Links zu Seiten, die ich mal kurz überflogen habe und die so aussahen, als sollte ich das mal genauer lesen:</p>
<ul>
<li><a title="XML for Perl Developers" href="http://www.ibm.com/developerworks/xml/library/x-xmlperl1.html" target="_blank">XML for Perl Developlers</a> von IBM, <a title="XML for Perl Developers" href="http://www.ibm.com/developerworks/xml/library/x-xmlperl2.html" target="_blank">Teil 2</a> und <a title="XML for Perl Developers" href="http://www.ibm.com/developerworks/xml/library/x-xmlperl3.html" target="_blank">Teil 3</a> nicht vergessen</li>
<li><a title="Perl Monks" href="http://www.perlmonks.org/index.pl?node_id=490846" target="_blank">Stepping up from XML:Simple to XML:LibXML</a></li>
<li>Und die <a title="XML:LibXML FAQ" href="http://perl-xml.sourceforge.net/faq/" target="_blank">FAQ</a> auf Sourceforge</li>
</ul>
<p>Über Hilfe wie man das alles evtl. etwas eleganter machen kann und Links zu verständlichen Tutorials oder Beispielen würde ich mich freuen.</p>
 <img src="http://blog.mirabilit.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=61" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.mirabilit.de/2011/02/perl-und-xmllibxml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress Benutzer richtig authentifizieren</title>
		<link>http://blog.mirabilit.de/2010/12/wordpress-benutzer-richtig-authentifizieren/</link>
		<comments>http://blog.mirabilit.de/2010/12/wordpress-benutzer-richtig-authentifizieren/#comments</comments>
		<pubDate>Thu, 30 Dec 2010 00:43:46 +0000</pubDate>
		<dc:creator>mirabilit</dc:creator>
				<category><![CDATA[CMS]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.mirabilit.de/?p=58</guid>
		<description><![CDATA[Wie verhindere ich das anmelden von Spam-Benutzern und sonstigen Benutzern, die durch automatische Skripte angemeldet werden? Habe in letzter Zeit mal ein paar Plugins getestet, die mir das erleichtern sollten, allerdings ohne großen Erfolg. Jetzt habe ich erstmal die Benutzeranmeldung deaktiviert, alle dahingehenden Plugins auch und die Benutzerliste geleert, um mich erstmal richtig in das [...]]]></description>
			<content:encoded><![CDATA[<p>Wie verhindere ich das anmelden von Spam-Benutzern und sonstigen Benutzern, die durch automatische Skripte angemeldet werden?</p>
<p>Habe in letzter Zeit mal ein paar Plugins getestet, die mir das erleichtern sollten, allerdings ohne großen Erfolg. Jetzt habe ich erstmal die Benutzeranmeldung deaktiviert, alle dahingehenden Plugins auch und die Benutzerliste geleert, um mich erstmal richtig in das Thema einzulesen und nicht einfach weiter zu probieren. Sollte ich wider erwarten jemanden rausgeworfen haben, der sich hier von Hand angemeldet hat, tut es mir leid. Bald werde ich wieder die Anmeldung aktivieren und dann auch wieder ein paar Artikel schreiben, damit es sich auch lohnt, sich hier anzumelden.</p>
<p>Ansonsten wünsche ich allen einen guten Start ins Jahr 2011 und bis bald.</p>
 <img src="http://blog.mirabilit.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=58" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.mirabilit.de/2010/12/wordpress-benutzer-richtig-authentifizieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notizen zu git</title>
		<link>http://blog.mirabilit.de/2010/09/notizen-zu-git/</link>
		<comments>http://blog.mirabilit.de/2010/09/notizen-zu-git/#comments</comments>
		<pubDate>Wed, 08 Sep 2010 12:01:51 +0000</pubDate>
		<dc:creator>mirabilit</dc:creator>
				<category><![CDATA[Notizen]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://blog.mirabilit.de/?p=39</guid>
		<description><![CDATA[Auf dem Server in /home/git/repositories/ ein Verzeichnis, bspw. neuesprojekt, anlegen darin eine dummy.txt anlegen git init git add * git commit -a -m "initial" dann im parent Verzeichnis git-clone --bare neuesprojekt neuesprojekt.git und zum Abschluss chown -R git:git neuesprojekt* lokal ins parent Verzeichnis in dem ich mein Projektverzeichnis erstellen möchte wechseln dort: git clone git@meinserver.net:repositories/neuesprojekt [...]]]></description>
			<content:encoded><![CDATA[<h3>Auf dem Server</h3>
<ul>
<li>in <code>/home/git/repositories/</code> ein Verzeichnis, bspw. <code>neuesprojekt</code>, anlegen</li>
<li>darin eine <code>dummy.txt</code> anlegen</li>
<li><code>git init</code></li>
<li><code>git add *</code></li>
<li><code>git commit -a -m "initial"</code></li>
<li>dann im parent Verzeichnis <code>git-clone --bare neuesprojekt neuesprojekt.git</code></li>
<li>und zum Abschluss <code>chown -R git:git neuesprojekt*</code></li>
</ul>
<h3>lokal</h3>
<ul>
<li>ins parent Verzeichnis in dem ich mein Projektverzeichnis erstellen möchte wechseln</li>
<li>dort: <code>git clone git@meinserver.net:repositories/neuesprojekt</code></li>
<li>dann loslegen und Dateien reinpacken</li>
<li>dann <code>git add *&lt;*code&gt; und <code>git commit -a -m "beschreibung"</code></code></li>
<li>zum Abschluss <code>git push</code></li>
</ul>
<h3>Anmerkung</h3>
<p>Ein Server ist natürlich bei git nicht zwingend notwendig, ist ja verteiltes System, aber ich wollte trotzdem einen haben. Das ist wahrscheinlich nicht vollständig und funktioniert unter Umständen nur auf meinem Server, bei dem ich inzwischen vergessen habe, was da alles konfiguriert und installiert wurde. git sollte aber sowohl auf dem Server als auch lokal vorhanden sein, das ist schonmal ein guter Anfang.</p>
<p>Ich werde versuchen das bei Gelegenheit mal etwas ausführlicher zu beschreiben. Spätestens, wenn ein neuer Linux-Server aufgesetzt werden muss.</p>
<h3>Linksammlung</h3>
<p>Ein paar Links, die ich noch ungelesen in meinen Bookmarks hatte und nicht verlieren wollte:</p>
<ul>
<li><a title="railsgit Screencast" href="http://jointheconversation.org/railsgit/" target="_blank">Git und Rails Screencast</a></li>
<li><a title="GitX" href="http://gitx.frim.nl/" target="_blank">GitX</a>, ein Mac OS X GUI für git</li>
<li><a title="git und github howto" href="http://b.lesseverything.com/2008/3/25/got-git-howto-git-and-github" target="_blank">git und github Howto</a></li>
<li><a title="git bei wikipedia" href="http://de.wikipedia.org/wiki/Git" target="_blank">git bei  wikipedia</a>, da gibts evtl. aktuellere Links</li>
<li><a title="git on Mac OS" href="http://shaun.boyblack.co.za/blog/2009/03/14/getting-started-with-git-on-mac-os-x/" target="_blank">Getting started with git on mac os</a></li>
<li><a title="getting started with git" href="http://www.alistapart.com/articles/get-started-with-git/" target="_blank">getting started with git</a></li>
<li><a title="git cheat-sheet" href="http://thinkvitamin.com/code/starting-with-git-cheat-sheet/" target="_blank">Starting with git cheat-sheet</a></li>
<li><a title="branching mit grb" href="http://thinkvitamin.com/code/git-pro-tip-let-grb-handle-remote-branches-for-you/">git branches mit grb</a></li>
<li><a title="progit" href="http://progit.org/">Freies eBook progit</a></li>
</ul>
<p>Aber da gibt&#8217;s sicherlich noch viel mehr&#8230;</p>
 <img src="http://blog.mirabilit.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=39" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.mirabilit.de/2010/09/notizen-zu-git/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grundlegende vi-Befehle</title>
		<link>http://blog.mirabilit.de/2010/08/grundlegende-vi-befehle/</link>
		<comments>http://blog.mirabilit.de/2010/08/grundlegende-vi-befehle/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 12:52:00 +0000</pubDate>
		<dc:creator>mirabilit</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Editor]]></category>
		<category><![CDATA[vi]]></category>

		<guid isPermaLink="false">http://blog.mirabilit.de/?p=22</guid>
		<description><![CDATA[Durch den Text bewegen Ein Zeichen vor bzw. zurück: Pfeiltaste rechts oder Space bzw. Pfeiltaste links oder Backspace n Zeichen vor bzw. zurück: n, Pfeiltaste rechts oder n, Space bzw. n, Pfeiltaste links oder n, Backspace Ein Wort vor bzw zurück: w bzw. b Zum Zeilenanfang bzw -ende: ^ bzw. $ Zeile hoch bzw runter: [...]]]></description>
			<content:encoded><![CDATA[<h3>Durch den Text bewegen</h3>
<ul>
<li>Ein Zeichen vor bzw. zurück: <code>Pfeiltaste rechts</code> oder <code>Space</code> bzw. <code>Pfeiltaste links</code> oder <code>Backspace</code></li>
<li>n Zeichen vor bzw. zurück: <code>n, Pfeiltaste rechts</code> oder <code>n, Space</code> bzw. <code>n, Pfeiltaste links</code> oder <code>n, Backspace</code></li>
<li>Ein Wort vor bzw zurück: <code>w</code> bzw. <code>b</code></li>
<li>Zum Zeilenanfang bzw -ende: <code>^</code> bzw. <code>$</code></li>
<li>Zeile hoch bzw runter: <code>Pfeiltaste hoch</code> oder <code>-</code> bzw. <code>Pfeiltaste runter</code> oder <code>+</code> oder <code>Return</code></li>
<li>Eine Seite weiter bzw zurück: <code>ctrl-f</code> oder <code>Page down</code> bzw. <code>ctrl-b</code> oder <code>Page up</code></li>
<li>zur n-ten Zeile gehen: <code>n, shift-g</code> (Ende des Files nur <code>shift-g</code>)</li>
</ul>
<h3>Bearbeiten des Textes</h3>
<h4>Text einfügen</h4>
<ul>
<li>Text an aktueller Position einfügen: <code>i</code></li>
<li>Text am Anfang der aktuellen Zeile einfügen: <code>shift-i</code></li>
<li>Text nach der aktuellen Position einfügen: <code>a</code></li>
<li>Text am Ende der Zeile einfügen: <code>shift-a</code></li>
<li>Neue Zeile unterhalb der aktuellen Zeile einfügen: <code>o</code></li>
<li>Neue Zeile oberhalb der aktuellen Zeile einfügen: <code>shift-o</code></li>
</ul>
<h4>Text ersetzen</h4>
<ul>
<li>Text ersetzen von der aktuellen Position bis zum Ende des Wortes: <code>cw</code></li>
<li>Aktuelles Zeichen ersetzen: <code>cI</code> oder <code>cl</code></li>
<li>Ersetzen von der aktuellen Position bis zum Ende der Zeile: <code>c$</code></li>
<li>Die ganze Zeile ersetzen: <code>cc</code></li>
<li>In den Überschreiben-Modus wechseln: <code>shift-r</code></li>
</ul>
<h4>Löschen und kopieren</h4>
<ul>
<li>Aktuelles Zeichen löschen: <code>dl</code> oder <code>x</code></li>
<li>Löschen bis zum Ende des Wortes: <code>dw</code></li>
<li>Löschen bis zum Ende der Zeile: <code>d$</code></li>
<li>Löschen der ganzen Zeile: <code>dd</code></li>
<li>Löschen bis zum nächsten Vorkommen von &lt;suchmuster&gt;: <code>d/suchmuster</code></li>
<li>Zeilenvorschub löschen und die nächste Zeile mit einem Leerzeichen dazwischen anfügen: <code>shift-j</code></li>
<li>Kopieren geht analog zum Löschen, das eigentlich ein Ausschneiden ist, mit <code>y</code> statt <code>d</code></li>
<li>Einfügen des Gelöschten bzw Kopierten an der aktuellen Position: <code>shift-p</code></li>
<li>Einfügen des Gelöschten bzw Kopierten hinter der aktuellen Position: <code>p</code></li>
<li>Einfügen bzw Löschen rückgängig machen: <code>u</code></li>
</ul>
<h3>Suchen, finden und ersetzen</h3>
<ul>
<li>vorwärts suchen ab der Cursor-Position: <code>/&lt;Suchbegriff&gt;</code></li>
<li>rückwärts suchen  ab der Cursor-Position: <code>?&lt;Suchbegriff&gt;</code></li>
<li><code>n</code> bzw. <code>shift-n</code> springt zum nächsten bzw. vorigen Suchbegriff in Suchrichtung</li>
<li>Suchen und ersetzen zwischen Zeile n und m: <code>:n,m s/suchmuster/ersetze/g</code>. Ohne das <code>g</code> wird nur der erste Treffer pro Zeile ersetzt</li>
<li><code>:1,$</code> für das ganze File und nur <code>:</code> für die aktuelle Zeile</li>
</ul>
<h3>Allgemeine Befehle</h3>
<ul>
<li>Für Mehrfachausführungen einfach die Anzahl vor dem Befehl angeben</li>
<li>Den letzten Befehl wiederholen: <code>.</code></li>
<li>Zeilennummerierung einschalten: <code>:set nu</code></li>
</ul>
<h3>Datei-Befehle</h3>
<ul>
<li>Text aus einer anderen Datei an der aktuellen Position einfügen: <code>:r &lt;dateiname&gt;</code></li>
<li>Nächste Datei laden, wenn mehrere beim vi-Aufruf übergeben wurden: <code>:n</code></li>
<li>Shell öffnen und Kommando ausführen: <code>:! &lt;Kommando&gt;</code></li>
<li>Speichern der Datei: <code>:w</code></li>
<li>Speichern der Datei unter anderem Namen: <code>:w &lt;anderer Name&gt;</code></li>
<li>Beenden des vi: <code>:q</code></li>
<li>Beenden und die Änderungen verwerfen: <code>:q!</code></li>
<li>Speichern und beenden: <code>:wq</code></li>
</ul>
<h3>Links</h3>
<ul>
<li><a title="Customizing vi" href="http://www.ibm.com/developerworks/aix/library/au-customize_vi/index.html" target="_blank">Customizing vi and vim</a> bei IBM developerWorks. Am Ende des Artikels sind noch weitere Links zu finden</li>
<li>Im <a title="vi im ubuntuusers wiki" href="http://wiki.ubuntuusers.de/Vim" target="_blank">wiki der ubuntuusers</a> findet sich natürlich auch ein Abschnitt über den vi</li>
<li><a title="vim with Janus" href="http://thinkvitamin.com/code/take-on-vim-with-janus/" target="_blank">Janus für vim</a> bei think vitamin</li>
<li><a title="syntax highlighting in vim" href="http://olex.openlogic.com/wazi/2011/create-your-own-syntax-highlighting-in-vim/" target="_blank">Eigenes Syntax highlighting in vim</a></li>
</ul>
 <img src="http://blog.mirabilit.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=22" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.mirabilit.de/2010/08/grundlegende-vi-befehle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ausgabe von print in Python umleiten</title>
		<link>http://blog.mirabilit.de/2010/08/ausgabe-von-print-in-python-umleiten/</link>
		<comments>http://blog.mirabilit.de/2010/08/ausgabe-von-print-in-python-umleiten/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 12:40:57 +0000</pubDate>
		<dc:creator>mirabilit</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.mirabilit.de/?p=4</guid>
		<description><![CDATA[Für ein kleines Python-Skript habe ich nach einer einfachen Möglichkeit gesucht Statusmeldungen sowohl in eine Datei als auch auf die Konsole auszugeben. Hier bin ich auf eine nette Lösung gestoßen, die ich noch mit einem Parameter versehen habe, falls nur eine Ausgabe in eine Logdatei gewünscht ist: class Logger&#40; object &#41;: def __init__&#40; self, name, [...]]]></description>
			<content:encoded><![CDATA[<p>Für ein kleines Python-Skript habe ich nach einer einfachen Möglichkeit gesucht Statusmeldungen sowohl in eine Datei als auch auf die Konsole auszugeben. <a href="http://stackoverflow.com/questions/616645/how-do-i-duplicate-sys-stdout-to-a-log-file-in-python">Hier</a> bin ich auf eine nette Lösung gestoßen, die ich noch mit einem Parameter versehen habe, falls nur eine Ausgabe in eine Logdatei gewünscht ist:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Logger<span style="color: black;">&#40;</span> <span style="color: #008000;">object</span> <span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span> <span style="color: #008000;">self</span>, name, silent <span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">silent</span> = silent
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">silent</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">terminal</span> = <span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">log</span> = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span> name, <span style="color: #483d8b;">&quot;a&quot;</span> <span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__del__</span><span style="color: black;">&#40;</span> <span style="color: #008000;">self</span> <span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">silent</span>:
            <span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span> = <span style="color: #008000;">self</span>.<span style="color: black;">terminal</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">log</span>.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> write<span style="color: black;">&#40;</span> <span style="color: #008000;">self</span>, message <span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">self</span>.<span style="color: black;">silent</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">terminal</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span> message <span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">log</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span> message <span style="color: black;">&#41;</span></pre></div></div>

<p>Zusammen mit einer Funktion für einen Zeitstempel im Dateinamen</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> TimeStamp<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    stamp=<span style="color: #dc143c;">time</span>.<span style="color: black;">strftime</span><span style="color: black;">&#40;</span> <span style="color: #483d8b;">&quot;%Y-%m-%d_%H.%M.%S&quot;</span>, <span style="color: #dc143c;">time</span>.<span style="color: black;">localtime</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span><span style="color: black;">&#40;</span> stamp <span style="color: black;">&#41;</span></pre></div></div>

<p>kann man dann die Ausgabe von print mit der Zeile</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span> = Logger<span style="color: black;">&#40;</span> <span style="color: #483d8b;">&quot;logfile_%s.log&quot;</span> <span style="color: #66cc66;">%</span> TimeStamp<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #008000;">False</span> <span style="color: black;">&#41;</span></pre></div></div>

<p>umleiten. Bei der Uhrzeit im Zeitstempel habe ich Punkte statt der üblichen Doppelpunkte verwendet, da ich die Doppelpunkte in Dateinamen vermeiden wollte.</p>
 <img src="http://blog.mirabilit.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=4" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.mirabilit.de/2010/08/ausgabe-von-print-in-python-umleiten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Relaunch</title>
		<link>http://blog.mirabilit.de/2010/08/relaunch/</link>
		<comments>http://blog.mirabilit.de/2010/08/relaunch/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 09:15:15 +0000</pubDate>
		<dc:creator>mirabilit</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://blog.mirabilit.de/?p=13</guid>
		<description><![CDATA[Wieder einmal habe ich mich entschlossen meinen vernachlässigten Blog neu aufzusetzen. Im Unterschied zu den letzten Versuchen werde ich dieses Mal über Themen schreiben, die mir in meinem normalen Tagesablauf begegnen, also momentan hauptsächlich Python, Ruby und Ruby on Rails, vielleicht etwas C/C++ und OpenSource Software für das Internet wie z.B. WordPress oder das Radiant [...]]]></description>
			<content:encoded><![CDATA[<p>Wieder einmal habe ich mich entschlossen meinen vernachlässigten Blog neu aufzusetzen. Im Unterschied zu den letzten Versuchen werde ich dieses Mal über Themen schreiben, die mir in meinem normalen Tagesablauf begegnen, also momentan hauptsächlich Python, Ruby und Ruby on Rails, vielleicht etwas C/C++ und OpenSource Software für das Internet wie z.B. WordPress oder das Radiant CMS. Ein paar Webschnipsel und Links, die ich für mitteilenswert halte, werden sicherlich auch dazu kommen. Alles weitere werde ich dann sehen.</p>
<p>Das alles soll für mich ein wenig als Notizblock dienen, weshalb hier wohl viel gepostet werden wird, das es auch wo anders im Netz zu finden gibt. Ich hoffe trotzdem, dass es ein paar interessierte Leser hierher verschlägt, denen meine Notizen weiter helfen oder noch besser, die andere, vielleicht bessere Vorschläge in den Kommentaren machen.</p>
<p>Auf Kommentare, Anregungen und konstruktive Kritik freue ich mich und ich werde versuchen anständig und zeitnah darauf zu reagieren.</p>
<p>Jetzt aber genug des Vorgeplänkels, bald kommt mein erster richtiger Post</p>
 <img src="http://blog.mirabilit.de/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=13" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.mirabilit.de/2010/08/relaunch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

