<feed xml:base='/feed/atom.xml' xmlns='http://www.w3.org/2005/Atom'><id>http://groovy-skills.com/</id><title type='text'>Groovy Skills International</title><subtitle type='text'>Feature without Request</subtitle><updated>2013-05-07T09:24:14-03:00</updated><link href='/feed/atom.xml' rel='self'/><link href='http://groovy-skills.com/' rel='alternate'/><author><name>{&quot;name&quot;=&gt;&quot;Dice&quot;, &quot;email&quot;=&gt;&quot;d11@groovy-skills.com&quot;, &quot;github&quot;=&gt;&quot;GSI&quot;, &quot;twitter&quot;=&gt;&quot;GroovySkills&quot;, &quot;feedburner&quot;=&gt;&quot;feedname&quot;}</name></author><entry><id>/Anwendungstipps/2013/04/07/virtualbox-windows-7-aus-linux-auf-physische-platte-installieren</id><title type='text'>VirtualBox: Windows 7 aus Linux auf physische Platte installieren</title><summary type='text'>Im Normalfall installiert man Windows via Installations-DVD.
Hat man jedoch ein ISO-Abbild der Installations-DVD zur Verfügung, kann man mit Hilfe von VirtualBox eine direkte Installation auf eine neue Festplatte vornehmen und somit das Brennen eines entsprechenden Mediums vermeiden.
Virtuelle Maschi</summary><content type='html'>&lt;p&gt;Im Normalfall installiert man Windows via Installations-&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;DVD&lt;/span&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Hat man jedoch ein &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;ISO&lt;/span&gt;&lt;/span&gt;-Abbild der Installations-&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;DVD&lt;/span&gt;&lt;/span&gt; zur Verfügung, kann man mit Hilfe von &lt;b&gt;VirtualBox&lt;/b&gt; eine direkte Installation auf eine neue Festplatte vornehmen und somit das Brennen eines entsprechenden Mediums vermeiden.&lt;/p&gt;
&lt;h2&gt;Virtuelle Maschine erstellen&lt;/h2&gt;
&lt;p&gt;Zuerst legt man eine virtuelle Maschine an, welche die Anforderungen des Betriebssystems erfüllt.&lt;/p&gt;
&lt;p&gt;Dieser Schritt kann bequem über die grafische Oberfläche von &lt;b&gt;VirtualBox&lt;/b&gt; oder per Kommando &lt;a class=&apos;man&apos; href=&apos;http://manpages.ubuntu.com/VBoxManage.1&apos; title=&apos;Ubuntu-Manpage zu Kommando VBoxManage - x86 virtualization solution&apos;&gt;VBoxManage(1)&lt;/a&gt; erledigt werden.&lt;/p&gt;
&lt;p&gt;Auf eine detaillierte Erläuterung wird an dieser Stelle verzichtet, allerdings ist es wichtig, &lt;strong&gt;das &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;ISO&lt;/span&gt;&lt;/span&gt;-Abbild als CD/&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;DVD&lt;/span&gt;&lt;/span&gt; einzubinden.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Physische Festplatte verfügbar machen&lt;/h2&gt;
&lt;p&gt;Mit den folgenden Kommandos wird eine &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;VMDK&lt;/span&gt;&lt;/span&gt;-Datei für die physische Festplatte angelegt und an die entsprechende virtuelle Maschine gebunden.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;sh&quot;&gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;VM_NAME&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;Windows 7 Home Premium (64 bit)&amp;amp;#39;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;nv&quot;&amp;gt;VMDK&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;HOME&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt;/.VirtualBox/samsung_840_ssd.vmdk
&amp;lt;span class=&quot;c&quot;&amp;gt;# Die DISK_ID findet man beim Auflisten des Verzeichnisinhalts von /dev/disk/by-id/&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;nv&quot;&amp;gt;DISK_ID&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt;ata-Samsung_SSD_840_Series_S14GNEBCB66690P

&amp;lt;span class=&quot;c&quot;&amp;gt;# VMDK als Schnittstelle zu physischer Festplatte erstellen&amp;lt;/span&amp;gt;
VBoxManage internalcommands createrawvmdk -filename &amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;VMDK&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt; -rawdisk /dev/disk/by-id/&amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;DISK_ID&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;c&quot;&amp;gt;# VMDK an virtuelle Maschine binden&amp;lt;/span&amp;gt;
VBoxManage storageattach &amp;lt;span class=&quot;s2&quot;&amp;gt;&amp;amp;quot;${VM_NAME}&amp;amp;quot;&amp;lt;/span&amp;gt; --storagectl &amp;lt;span class=&quot;s2&quot;&amp;gt;&amp;amp;quot;SATA-Controller&amp;amp;quot;&amp;lt;/span&amp;gt; --port 0 --device 0 --type hdd --nonrotational on --medium &amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;VMDK&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class=&apos;man&apos; href=&apos;http://manpages.ubuntu.com/VBoxManage.1&apos; title=&apos;Ubuntu-Manpage zu Kommando VBoxManage - x86 virtualization solution&apos;&gt;VBoxManage(1)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Installation durchführen und System starten&lt;/h2&gt;
&lt;p&gt;Dem jeweiligen Betriebssystem entsprechend kann nun die Installation durchgeführt werden.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Danach sollte sich das System auch außerhalb von &lt;b&gt;VirtualBox&lt;/b&gt; direkt von der Festplatte starten lassen.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Blue-Screen beim Windows-Start?&lt;/h3&gt;
&lt;p&gt;Vor allem bei älteren Windows-Betriebssystemen schlägt der Start nach dem Tausch gewisser Hardware fehl.&lt;/p&gt;
&lt;p&gt;Da man beim direkten Systemstart das &lt;em&gt;virtualisierte&lt;/em&gt; Mainboard gegen das &lt;em&gt;physische&lt;/em&gt; tauscht, kann das Problem im Rahmen dieser Einrichtung auftauchen.&lt;/p&gt;
&lt;p&gt;Im &lt;a href=&quot;/Anwendungstipps/2009/09/02/windows-xp-nach-mainboard--oder-festplattentausch-lauffahig-machen&quot; class=&quot;nocb&quot; title=&quot;Artikel &amp;#39;Windows XP nach Mainboard- oder Plattentausch lauffähig machen&amp;#39;&quot;&gt;Artikel &amp;#8220;Windows XP nach Mainboard- oder Plattentausch lauffähig machen&amp;#8221;&lt;/a&gt; ist beschrieben wie man das Problem mit Hilfe der &lt;i&gt;Ultimate Boot CD for Windows (UBCD4Win)&lt;/i&gt; beheben kann.&lt;/p&gt;</content><updated>2013-04-07T00:00:00-03:00</updated><category term='Anwendungstipps'/><link href='http://groovy-skills.com/Anwendungstipps/2013/04/07/virtualbox-windows-7-aus-linux-auf-physische-platte-installieren' rel='alternate'/></entry><entry><id>/Jekyll/2013/03/29/entfernen-von-jekyll-bootstrap-spart-tausende-codezeilen-ein</id><title type='text'>Entfernen von Jekyll Bootstrap spart tausende Codezeilen ein</title><summary type='text'>Mit Jekyll Bootstrap gestaltet sich der Einstieg in Jekyll ein Wenig einfacher. Konfigurationsoptionen und Twitter Bootstrap ermöglichen das rasche Aufsetzen eines statischen Blogs.
Per _config.yml kann man die jeweiligen Webdienste für Diskussion, Besucherstatistik und der Gleichen auswählen. Auch d</summary><content type='html'>&lt;p&gt;Mit &lt;b&gt;Jekyll Bootstrap&lt;/b&gt; gestaltet sich der Einstieg in &lt;b&gt;Jekyll&lt;/b&gt; ein Wenig einfacher. Konfigurationsoptionen und &lt;i&gt;Twitter Bootstrap&lt;/i&gt; ermöglichen das rasche Aufsetzen eines statischen Blogs.&lt;/p&gt;
&lt;p&gt;Per &lt;code&gt;_config.yml&lt;/code&gt; kann man die jeweiligen Webdienste für Diskussion, Besucherstatistik und der Gleichen auswählen. Auch die Idee, verschiedene Themes zu unterstützen, wirkt auf den ersten Blick interessant.&lt;/p&gt;
&lt;p&gt;Bald merkt man jedoch, dass man sich immer weiter von der so attraktiven Jekyll-Grundidee entfernt: &lt;strong&gt;Vereinfachung&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Nachteile von Jekyll-Bootstrap&lt;/h2&gt;
&lt;p&gt;Fehler und Inkompatibilitäten sind durch den größeren Umfang &lt;strong&gt;schwerer zu analysieren&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Nach längeren Pausen ist eine gewisse &lt;strong&gt;Wiedereinarbeitungszeit&lt;/strong&gt; notwendig um Änderungen vorzunehmen zu können.&lt;/p&gt;
&lt;p&gt;Themepfade und zusätzliche &lt;i&gt;&amp;#8220;includes&amp;#8221;&lt;/i&gt; sind &lt;strong&gt;an mehreren Stellen&lt;/strong&gt; hinterlegt und verkomplizieren diverse Anpassungen.&lt;/p&gt;
&lt;h2&gt;Reduktion auf das Notwendige&lt;/h2&gt;
&lt;p&gt;Im Falle der Seitenstruktur von &lt;b&gt;groovy-skills.com&lt;/b&gt; waren einige Stunden notwendig um die Programmierung auf das Notwendige zu reduzieren. Dass sich die Investition lohnte, zeigen folgende Zahlen.&lt;/p&gt;
&lt;p&gt;Exklusive Git, aber inklusive Binärdateien (Bilder) beinhaltete die &lt;b&gt;Jekyll-Dateistruktur&lt;/b&gt; von &lt;i&gt;groovy-skills.com&lt;/i&gt; &lt;strong&gt;6.020 Zeilen&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Das Entfernen der unnötigen Daten von Twitter-Bootstrap reduzierte diese Zahl &lt;strong&gt;auf 5.141&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Nach der Reduzierung auf die tatsächlich benötigten Zeilen aus &lt;b&gt;Jekyll-Bootstrap&lt;/b&gt;, war der Umfang letztendlich &lt;strong&gt;auf 3.526 Zeilen geschrumpft&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Von der Zahl ohne Twitter Bootstrap ausgehend, konnten demnach 1.615 Zeilen eingespart werden.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Das entspricht einer Reduktion von rund 31 %.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Zeilen aller Dateien eines Verzeichnisses zählen&lt;/h3&gt;
&lt;p&gt;Zum Bilden der Summe der Zeilen wurde das folgendes Skript verwendet.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;sh&quot;&gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;sum&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt;0
&amp;lt;span class=&quot;nv&quot;&amp;gt;lines_counts&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;sb&quot;&amp;gt;`&amp;lt;/span&amp;gt;find ./ -type f -exec wc -l &amp;lt;span class=&quot;o&quot;&amp;gt;{}&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;se&quot;&amp;gt;\;&amp;lt;/span&amp;gt; | cut -d &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39; &amp;amp;#39;&amp;lt;/span&amp;gt; -f1&amp;lt;span class=&quot;sb&quot;&amp;gt;`&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;k&quot;&amp;gt;for &amp;lt;/span&amp;gt;line_count in &amp;lt;span class=&quot;nv&quot;&amp;gt;$lines_counts&amp;lt;/span&amp;gt;; &amp;lt;span class=&quot;k&quot;&amp;gt;do&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;k&quot;&amp;gt;  &amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;sum&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;sb&quot;&amp;gt;`&amp;lt;/span&amp;gt;expr &amp;lt;span class=&quot;nv&quot;&amp;gt;$sum&amp;lt;/span&amp;gt; + &amp;lt;span class=&quot;nv&quot;&amp;gt;$line_count&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;sb&quot;&amp;gt;`&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;k&quot;&amp;gt;done&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;nb&quot;&amp;gt;echo&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nv&quot;&amp;gt;$sum&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class=&apos;man&apos; href=&apos;http://manpages.ubuntu.com/find.1&apos; title=&apos;Ubuntu-Manpage zu Kommando find - search for files in a directory hierarchy&apos;&gt;find(1)&lt;/a&gt;, &lt;a class=&apos;man&apos; href=&apos;http://manpages.ubuntu.com/wc.1&apos; title=&apos;Ubuntu-Manpage zu Kommando wc - print newline, word, and byte counts for each file&apos;&gt;wc(1)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Alternativen zu Jekyll-Bootstrap&lt;/h2&gt;
&lt;p&gt;Aus genannten Gründen, raten wir zur Nutzung von &lt;a href=&quot;https://github.com/mojombo/jekyll&quot; title=&quot;Jekyll auf GitHub&quot;&gt;&lt;b&gt;Jekyll&lt;/b&gt;&lt;/a&gt; in seiner puren Form.&lt;/p&gt;
&lt;p&gt;Wer dennoch einen einfacheren Einstieg in das &lt;em&gt;Bloggen mit Jekyll&lt;/em&gt; sucht, kann auf &lt;a href=&quot;http://octopress.org/&quot; title=&quot;Offizielle Website des Octopress Jekyll-Frameworks&quot;&gt;&lt;b&gt;Octopress&lt;/b&gt;&lt;/a&gt; zurück greifen.&lt;/p&gt;
&lt;p&gt;Im Vergleich zu &lt;b&gt;Jekyll-Bootstrap&lt;/b&gt; bietet es eine etwas einfachere Seitenstruktur. Viele nützliche Plugins werden bereits standardmäßig mitgeliefert.&lt;/p&gt;</content><updated>2013-03-29T00:00:00-03:00</updated><category term='Jekyll'/><link href='http://groovy-skills.com/Jekyll/2013/03/29/entfernen-von-jekyll-bootstrap-spart-tausende-codezeilen-ein' rel='alternate'/></entry><entry><id>/FreeBSD/2012/11/05/dateien-aus-freenas-in-owncloud-plugins-jail-verfugbar-machen</id><title type='text'>Dateien aus FreeNAS in ownCloud Plugins Jail verfügbar machen</title><summary type='text'>Im Artikel eines anderen Blogs ergab sich die Frage, wie man innerhalb der ownCloud Plugins-Jail die Dateien aus dem FreeNAS-Hostsystem verfügbar machen könne.
Grundsätzlich bietet bereits das FreeNAS WebUI unter Services &gt; Plugins &gt; Management &gt; Mount Points &gt; Add Mount Point die Möglichkeit, Verzei</summary><content type='html'>&lt;p&gt;Im &lt;a href=&quot;http://www.kadder.de/2012/10/freenas-8-2-0-mit-owncloud-4-5&quot; title=&quot;Artikel &amp;#39;FreeNAS 8.2.0 mit ownCloud 4.5&amp;#39; auf kadder.de&quot;&gt;Artikel eines anderen Blogs&lt;/a&gt; ergab sich die Frage, wie man innerhalb der &lt;b&gt;ownCloud Plugins-Jail&lt;/b&gt; die Dateien aus dem &lt;b&gt;FreeNAS-Hostsystem&lt;/b&gt; verfügbar machen könne.&lt;/p&gt;
&lt;p&gt;Grundsätzlich bietet bereits das FreeNAS WebUI unter &lt;em&gt;Services &amp;gt; Plugins &amp;gt; Management &amp;gt; Mount Points &amp;gt; Add Mount Point&lt;/em&gt; die Möglichkeit, Verzeichnisse aus dem Hostsystem in die Jail einzuhängen.&lt;/p&gt;
&lt;p&gt;Über diesen Punkt hängt man den entsprechenden Pfad und in &lt;em&gt;ein Unterverzeichnis von &lt;strong&gt;files&lt;/strong&gt;&lt;/em&gt; ein. Beispiel:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;Source:&lt;/strong&gt; &lt;code&gt;/mnt/pfad/im/hostsytem/dateien&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Destination:&lt;/strong&gt; &lt;code&gt;/mnt/pfad/zu/jail/usr/local/www/owncloud-4.5/data/BENUTZERNAME/files/dateien&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;(Details sind im FreeNAS Wiki-Artikelabschnitt &lt;a href=&quot;http://doc.freenas.org/index.php/Plugins#Mount_Points&quot; title=&quot;FreeNAS Wiki-Artikel &amp;#39;Plugins&amp;#39;&quot;&gt;Mount Points&lt;/a&gt; erläutert.)&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Berechtigungen setzen&lt;/h2&gt;
&lt;p&gt;Selten wird der Benutzer &lt;strong&gt;www&lt;/strong&gt; auch &lt;em&gt;Besitzer&lt;/em&gt; der eingehängten Dateien sein. Um &lt;b&gt;ownCloud&lt;/b&gt; dennoch Zugriff zu gewähren, gibt es mehrere Ansätze.&lt;/p&gt;
&lt;p&gt;Unter Berücksichtigung diverser Überlegungen, wird der Folgende in vielen Fällen geeignet sein.&lt;/p&gt;
&lt;h3&gt;www-Benutzer der Jail zu berechtigtem Gruppenmitglied machen&lt;/h3&gt;
&lt;p&gt;Im der &lt;b&gt;Plugins-Jail&lt;/b&gt; muss sichergestellt werden, dass die &lt;strong&gt;Gruppe&lt;/strong&gt; zumindest Leserechte auf die betreffende Verzeichnisstruktur hat.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;csh&quot;&gt;&amp;lt;span class=&quot;c&quot;&amp;gt;# Zur besseren Nachvollziehbarkeit sollte owning_group im&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;c&quot;&amp;gt;# Folgenden auf den Gruppennamen laut Hostsystem gesetzt werden:&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;nb&quot;&amp;gt;set &amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;GROUPNAME_ACCORDING_TO_HOSTSYSTEM&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s2&quot;&amp;gt;&amp;amp;quot;users&amp;amp;quot;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;nb&quot;&amp;gt;set &amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;OWNCLOUD_USERNAME&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;dice&amp;amp;#39;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;nb&quot;&amp;gt;set &amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;DIR&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s2&quot;&amp;gt;&amp;amp;quot;/mnt/pfad/zu/jail/usr/local/www/owncloud-4.5/data/${OWNCLOUD_USERNAME}/files/dateien&amp;amp;quot;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;nb&quot;&amp;gt;set &amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;owning_gid&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;sb&quot;&amp;gt;`&amp;lt;/span&amp;gt;ls -dln &amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;DIR&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt; | awk &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;{ print $4 }&amp;amp;#39;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;sb&quot;&amp;gt;`&amp;lt;/span&amp;gt;

&amp;lt;span class=&quot;c&quot;&amp;gt;# Der Gruppe Leserechte gewähren&amp;lt;/span&amp;gt;
chmod -R g+rX &amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;DIR&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt;

&amp;lt;span class=&quot;c&quot;&amp;gt;# www-Benutzer in die Gruppe aufnehmen&amp;lt;/span&amp;gt;
pw groupadd &amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;GROUPNAME_ACCORDING_TO_HOSTSYSTEM&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt; -g &amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;owning_gid&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt; -M www

&amp;lt;span class=&quot;c&quot;&amp;gt;# Dienste neu starten&amp;lt;/span&amp;gt;
/usr/local/etc/rc.d/nginx restart
/usr/local/etc/rc.d/php-fpm restart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class=&apos;man&apos; href=&apos;http://www.freebsd.org/cgi/man.cgi?query=chmod&amp;amp;sektion=1&amp;amp;manpath=freebsd&apos; title=&apos;FreeBSD Manpage zu Kommando chmod -- change file modes&apos;&gt;chmod(1)&lt;/a&gt;, &lt;a class=&apos;man&apos; href=&apos;http://www.freebsd.org/cgi/man.cgi?query=pw&amp;amp;sektion=8&amp;amp;manpath=freebsd&apos; title=&apos;FreeBSD Manpage zu Systemverwaltungs-Kommando pw -- create, remove, modify &amp; display system users and groups&apos;&gt;pw(8)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So kann man den Benutzer &lt;strong&gt;www&lt;/strong&gt; in alle notwendigen Gruppen aufnehmen. Der Einfachheit halber ist es allerdings sinnvoll, deren Anzahl &lt;em&gt;so gering wie möglich&lt;/em&gt; zu halten.&lt;/p&gt;
&lt;h2&gt;Dateien neu einlesen&lt;/h2&gt;
&lt;p&gt;Da dieser Vorgang die &lt;b&gt;ownCloud&lt;/b&gt; Datenbank umgeht, sind auf diese Art und Weise verfügbar gemachte Dateien für &lt;b&gt;ownCloud&lt;/b&gt; grundsätzlich unsichtbar,&lt;/p&gt;
&lt;h3&gt;ownCloud scanFiles-Bookmarklet&lt;/h3&gt;
&lt;p&gt;Um sie einzulesen, &lt;em&gt;zieht&lt;/em&gt; man folgenden Link in die Browser-Lesezeichen, navigiert im &lt;b&gt;ownCloud WebUI&lt;/b&gt; zum Menüpunkt &lt;strong&gt;Dateien&lt;/strong&gt; und klickt dann auf das soeben erstellte Lesezeichen.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;javascript:(function(){scanFiles();})()&quot; title=&quot;ownCloud JavaScript Funktionsaufruf zum manuellen Starten eines Datei-Scans; WICHTIG: Dieser Link muss in den Browser-Lesezeichen abgelegt werden. Bei direktem Klick ist er effektlos!&quot;&gt;ownCloud Dateien neu einlesen&lt;/a&gt;;&lt;/p&gt;</content><updated>2012-11-05T00:00:00-02:00</updated><category term='FreeBSD'/><link href='http://groovy-skills.com/FreeBSD/2012/11/05/dateien-aus-freenas-in-owncloud-plugins-jail-verfugbar-machen' rel='alternate'/></entry><entry><id>/FreeBSD/2012/10/12/owncloud-45-in-freenas-plugins-jail-oder-freebsd-installieren</id><title type='text'>ownCloud 4.5 in FreeNAS Plugins-Jail oder FreeBSD installieren</title><summary type='text'>Der FreeNAS Wiki-Artikelabschnitt Installing the Plugins Jail erläutert die Installation der Plugins-Jail.
Verbindet man sich danach via SSH zur FreeNAS-Box, kann man mittels Befehl “jexec 1 tcsh” in die entsprechende Jail wechseln und die notwendige Installation vornehmen.Achtung: Die Ziffer variier</summary><content type='html'>&lt;p&gt;Der FreeNAS Wiki-Artikelabschnitt &lt;a href=&quot;http://doc.freenas.org/index.php/Plugins#Jail_Settings&quot; title=&quot;FreeNAS Wiki-Artikel &amp;#39;Plugins&amp;#39;&quot;&gt;Installing the Plugins Jail&lt;/a&gt; erläutert die Installation der Plugins-Jail.&lt;/p&gt;
&lt;p&gt;Verbindet man sich danach via &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt;&lt;/span&gt; zur FreeNAS-Box, kann man mittels Befehl &amp;#8220;&lt;code&gt;jexec 1 tcsh&lt;/code&gt;&amp;#8221; in die entsprechende Jail wechseln und die notwendige Installation vornehmen.&lt;br /&gt;
&lt;em&gt;Achtung: Die Ziffer variiert. Die korrekte kann man mit dem Befehl &amp;#8220;&lt;code&gt;jls&lt;/code&gt;&amp;#8221; herausfinden.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Der anschließende Installationsverlauf funktioniert gleich wie außerhalb einer FreeBSD-Jail und ist im Folgenden erläutert. Die Anleitung ist mit &lt;strong&gt;FreeNAS 8.2&lt;/strong&gt; getestet.&lt;/p&gt;
&lt;h2&gt;Warnung vor möglichem Datenverlust&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ein späteres Update der Plugins-Jail führt zum Verlust der hier beschriebenen Einrichtung und der darin befindlichen persönlichen ownCloud-Daten.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Um das zu verhindern, könnte eine gesonderte Jail &lt;em&gt;exklusiv&lt;/em&gt; für ownCloud eingerichtet werden.&lt;/p&gt;
&lt;p&gt;Die bessere Integration in die FreeNAS-Weboberfläche spricht allerdings &lt;em&gt;für&lt;/em&gt; die Nutzung der Plugins-Jail. Regelmäßige Datensicherungen in Kombination mit dieser Anleitung erleichtern das erneute Einrichten nach einem Update.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Diese Anmerkung bezieht sich ausschließlich auf &lt;strong&gt;Updates in der Plugins-Jail&lt;/strong&gt;. Updates des FreeNAS-Hauptsystems können wie gewohnt durchgeführt werden, da diese die Jails grundsätzlich unberührt lassen.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Ports-Tree aktualisieren und Konflikt-Pakete entfernen&lt;/h2&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;csh&quot;&gt;portsnap fetch extract
pkg_delete -f perl-5.12.4_3 pkg-config-0.25_1 pcre-8.21
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class=&apos;man&apos; href=&apos;http://www.freebsd.org/cgi/man.cgi?query=portsnap&amp;amp;sektion=8&amp;amp;manpath=freebsd&apos; title=&apos;FreeBSD Manpage zu Systemverwaltungs-Kommando portsnap -- fetch and extract compressed snapshots of the ports tree&apos;&gt;portsnap(8)&lt;/a&gt;, &lt;a class=&apos;man&apos; href=&apos;http://www.freebsd.org/cgi/man.cgi?query=pkg_delete&amp;amp;sektion=1&amp;amp;manpath=freebsd&apos; title=&apos;FreeBSD Manpage zu Kommando pkg_delete -- a utility for deleting previously installed software package distributions&apos;&gt;pkg_delete(1)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;ownCloud aus den Ports installieren&lt;/h2&gt;
&lt;p&gt;Beim Verfassen dieses Artikels ist 4.0.7 die aktuelle ownCloud-Version in den Ports.&lt;/p&gt;
&lt;p&gt;Obwohl letztendlich &lt;strong&gt;ownCloud 4.5.0&lt;/strong&gt; installiert werden soll, bringt die Installation aus den Ports zwei Vorteile: Einerseits werden dabei annähernd alle Paketabhängigkeiten konfiguriert und installiert. Zieht die Version aus den FreeBSD-Ports einst nach, erhält man zudem passende &lt;a href=&quot;http://www.freebsd.org/doc/de/books/handbook/security-portaudit.html&quot; title=&quot;FreeBSD-Handbuch: &amp;#39;15.12. Sicherheitsprobleme in Software Dritter überwachen&amp;#39;&quot;&gt;portaudit&lt;/a&gt; Berichte.&lt;/p&gt;
&lt;p&gt;Beim Konfigurieren des &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;&lt;/span&gt;-Ports in folgendem Schritt muss &lt;strong&gt;Build &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;FPM&lt;/span&gt;&lt;/span&gt; version&lt;/strong&gt; ausgewählt sein. &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CLI&lt;/span&gt;&lt;/span&gt; und &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CGI&lt;/span&gt;&lt;/span&gt; können abgewählt werden.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;csh&quot;&gt;&amp;lt;span class=&quot;nb&quot;&amp;gt;cd&amp;lt;/span&amp;gt; /usr/ports/www/owncloud
make config-recursive
make install clean
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;Zusätzliche Abhängigkeiten installieren&lt;/h2&gt;
&lt;p&gt;Sowohl &lt;em&gt;zlib&lt;/em&gt; als auch &lt;em&gt;iconv&lt;/em&gt; werden von ownCloud benötigt.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;csh&quot;&gt;&amp;lt;span class=&quot;nb&quot;&amp;gt;cd&amp;lt;/span&amp;gt; /usr/ports/archivers/php5-zlib &amp;amp;amp;&amp;amp;amp; make install clean
&amp;lt;span class=&quot;nb&quot;&amp;gt;cd&amp;lt;/span&amp;gt; /usr/ports/converters/php5-iconv &amp;amp;amp;&amp;amp;amp; make install clean
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;ownCloud 4.5.0 installieren&lt;/h2&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;csh&quot;&gt;&amp;lt;span class=&quot;nb&quot;&amp;gt;cd&amp;lt;/span&amp;gt; /usr/local/www/
fetch http://download.owncloud.org/releases/owncloud-4.5.0.tar.bz2
tar xjf owncloud-4.5.0.tar.bz2 -C /root/
mv /root/owncloud /usr/local/www/owncloud-4.5
chown -R www:www /usr/local/www/owncloud-4.5
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class=&apos;man&apos; href=&apos;http://www.freebsd.org/cgi/man.cgi?query=fetch&amp;amp;sektion=1&amp;amp;manpath=freebsd&apos; title=&apos;FreeBSD Manpage zu Kommando fetch -- retrieve a file by Uniform Resource Locator&apos;&gt;fetch(1)&lt;/a&gt;, &lt;a class=&apos;man&apos; href=&apos;http://www.freebsd.org/cgi/man.cgi?query=tar&amp;amp;sektion=1&amp;amp;manpath=freebsd&apos; title=&apos;FreeBSD Manpage zu Kommando tar -- manipulate tape archives&apos;&gt;tar(1)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;FPM&lt;/span&gt;&lt;/span&gt; auf Socket umstellen und Transfer-Limits erhöhen&lt;/h2&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;csh&quot;&gt;&amp;lt;span class=&quot;c&quot;&amp;gt;# PHP-FPM auf Socket umstellen&amp;lt;/span&amp;gt;
sed -i &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;&amp;amp;#39;&amp;lt;/span&amp;gt; -e &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;s/^listen =.*/listen = \/var\/run\/php-fpm.sock/g&amp;amp;#39;&amp;lt;/span&amp;gt; /usr/local/etc/php-fpm.conf

cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini

&amp;lt;span class=&quot;c&quot;&amp;gt;# Größere Uploads ermöglichen&amp;lt;/span&amp;gt;
sed -i &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;&amp;amp;#39;&amp;lt;/span&amp;gt; -e &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;s/^post_max_size =.*/post_max_size = 300M/g&amp;amp;#39;&amp;lt;/span&amp;gt; /usr/local/etc/php.ini
sed -i &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;&amp;amp;#39;&amp;lt;/span&amp;gt; -e &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;s/^upload_max_filesize =.*/upload_max_filesize = 200M/g&amp;amp;#39;&amp;lt;/span&amp;gt; /usr/local/etc/php.ini

&amp;lt;span class=&quot;c&quot;&amp;gt;# Größere Downloads für Client-Apps ermöglichen (siehe untenstehende Anmerkung)&amp;lt;/span&amp;gt;
sed -i &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;&amp;amp;#39;&amp;lt;/span&amp;gt; -e &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;s/^memory_limit =.*/memory_limit = 512M/g&amp;amp;#39;&amp;lt;/span&amp;gt; /usr/local/etc/php.ini
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class=&apos;man&apos; href=&apos;http://www.freebsd.org/cgi/man.cgi?query=sed&amp;amp;sektion=1&amp;amp;manpath=freebsd&apos; title=&apos;FreeBSD Manpage zu Kommando sed -- stream editor&apos;&gt;sed(1)&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Anmerkung zu memory_limit&lt;/h3&gt;
&lt;p&gt;Vor dem Herunterladen mittles &lt;b&gt;ownCloud&lt;/b&gt; Client-App (beispielsweise auf Android), wird die betreffende Datei zuerst gänzlich in den Hauptspeicher geladen. Ist die Datei &lt;em&gt;größer&lt;/em&gt; als das konfigurierte &lt;strong&gt;memory_limit&lt;/strong&gt;, schlägt der Download mit folgender Meldung fehl:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;PHP message: PHP Fatal error:  Allowed memory size of ${memory_limit} bytes exhausted&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;An Stelle von &lt;code&gt;${memory_limit}&lt;/code&gt; wird dabei der enstprechend konfigurierte Wert ausgegeben.&lt;br /&gt;
&lt;em&gt;Dieses Verhalten wurde zuletzt in &lt;strong&gt;ownCloud Version 4.5.1&lt;/strong&gt; verifiziert.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;nginx installieren&lt;/h2&gt;
&lt;p&gt;Beim Konfigurieren des nginx-Ports in folgendem Schritt muss &lt;strong&gt;Enable http_ssl module&lt;/strong&gt; ausgewählt sein.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;csh&quot;&gt;&amp;lt;span class=&quot;nb&quot;&amp;gt;cd&amp;lt;/span&amp;gt; /usr/ports/www/nginx &amp;amp;amp;&amp;amp;amp; make install clean
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SSL&lt;/span&gt;&lt;/span&gt; Zertifikat für nginx erzeugen&lt;/h2&gt;
&lt;p&gt;Eine rasche Methode hierfür ist im Beitrag &lt;a href=&quot;/FreeBSD/2012/09/15/ssl-zertifikat-erzeugen-und-direkt-in-die-nginx-conf-ubernehmen&quot; title=&quot;Beitrag &amp;#39;SSL Zertifikat erzeugen und direkt in die nginx.conf übernehmen&amp;#39;&quot;&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SSL&lt;/span&gt;&lt;/span&gt; Zertifikat erzeugen und direkt in die nginx.conf übernehmen&lt;/a&gt; erklärt.&lt;/p&gt;
&lt;h2&gt;nginx konfigurieren&lt;/h2&gt;
&lt;p&gt;Um sämtliche Funktionen von ownCloud nutzen zu können, müssen im &lt;strong&gt;server&lt;/strong&gt;-Abschnitt (&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTPS&lt;/span&gt;&lt;/span&gt;) der &lt;strong&gt;/usr/local/etc/nginx/nginx.conf&lt;/strong&gt; folgende Einträge gesetzt werden.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;nginx&quot;&gt;        &amp;lt;span class=&quot;k&quot;&amp;gt;root&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;/usr/local/www/owncloud-4.5&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
        &amp;lt;span class=&quot;k&quot;&amp;gt;client_max_body_size&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;mi&quot;&amp;gt;200m&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;

        &amp;lt;span class=&quot;k&quot;&amp;gt;location&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;/&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;p&quot;&amp;gt;{&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;index&amp;lt;/span&amp;gt;  &amp;lt;span class=&quot;s&quot;&amp;gt;index.html&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;index.htm&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;index.php&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;c1&quot;&amp;gt;# http://forum.owncloud.org/viewtopic.php?f=3&amp;amp;amp;t=2952&amp;amp;amp;p=7158#p7157&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;rewrite&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;^/.well-known/host-meta&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;/public.php?service=host-meta&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;last&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;rewrite&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;^/.well-known/carddav&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;/remote.php/carddav/&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;redirect&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;rewrite&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;^/.well-known/caldav&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;/remote.php/caldav/&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;redirect&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;rewrite&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;^/apps/calendar/caldav.php&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;/remote.php/caldav/&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;last&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;rewrite&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;^/apps/contacts/carddav.php&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;/remote.php/carddav/&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;last&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;rewrite&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;^/apps/([^/]*)/(.*\.(css|php))&amp;lt;/span&amp;gt;$ &amp;lt;span class=&quot;s&quot;&amp;gt;/index.php?app=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;$1&amp;amp;amp;getfile=$2&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;last&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;rewrite&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;^/remote/(.*)&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;/remote.php/&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;$1&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;last&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;

                &amp;lt;span class=&quot;kn&quot;&amp;gt;fastcgi_param&amp;lt;/span&amp;gt;   &amp;lt;span class=&quot;s&quot;&amp;gt;SCRIPT_FILENAME&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nv&quot;&amp;gt;$document_root$fastcgi_script_name&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;fastcgi_param&amp;lt;/span&amp;gt;   &amp;lt;span class=&quot;s&quot;&amp;gt;SCRIPT_NAME&amp;lt;/span&amp;gt;     &amp;lt;span class=&quot;nv&quot;&amp;gt;$fastcgi_script_name&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;fastcgi_param&amp;lt;/span&amp;gt;   &amp;lt;span class=&quot;s&quot;&amp;gt;PATH_INFO&amp;lt;/span&amp;gt;       &amp;lt;span class=&quot;nv&quot;&amp;gt;$fastcgi_path_info&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;

                &amp;lt;span class=&quot;kn&quot;&amp;gt;try_files&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nv&quot;&amp;gt;$uri&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nv&quot;&amp;gt;$uri/&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;@webdav&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
        &amp;lt;span class=&quot;p&quot;&amp;gt;}&amp;lt;/span&amp;gt;

        &amp;lt;span class=&quot;k&quot;&amp;gt;location&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;p&quot;&amp;gt;~&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;sr&quot;&amp;gt;\.php$&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;p&quot;&amp;gt;{&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;c1&quot;&amp;gt;# http://bugs.owncloud.org/thebuggenie/owncloud/issues/oc-902#comment_1_904_8388&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;c1&quot;&amp;gt;#fastcgi_split_path_info ^(.+\.php)(/.*)$;&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;include&amp;lt;/span&amp;gt;         &amp;lt;span class=&quot;s&quot;&amp;gt;fastcgi_params&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;fastcgi_pass&amp;lt;/span&amp;gt;    &amp;lt;span class=&quot;s&quot;&amp;gt;unix:/var/run/php-fpm.sock&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;fastcgi_index&amp;lt;/span&amp;gt;   &amp;lt;span class=&quot;s&quot;&amp;gt;index.php&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;

                &amp;lt;span class=&quot;kn&quot;&amp;gt;fastcgi_param&amp;lt;/span&amp;gt;   &amp;lt;span class=&quot;s&quot;&amp;gt;SCRIPT_FILENAME&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nv&quot;&amp;gt;$document_root$fastcgi_script_name&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;fastcgi_param&amp;lt;/span&amp;gt;   &amp;lt;span class=&quot;s&quot;&amp;gt;SCRIPT_NAME&amp;lt;/span&amp;gt;     &amp;lt;span class=&quot;nv&quot;&amp;gt;$fastcgi_script_name&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;fastcgi_param&amp;lt;/span&amp;gt;   &amp;lt;span class=&quot;s&quot;&amp;gt;PATH_INFO&amp;lt;/span&amp;gt;       &amp;lt;span class=&quot;nv&quot;&amp;gt;$fastcgi_path_info&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;

                &amp;lt;span class=&quot;kn&quot;&amp;gt;try_files&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nv&quot;&amp;gt;$uri&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;p&quot;&amp;gt;=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;mi&quot;&amp;gt;404&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
        &amp;lt;span class=&quot;p&quot;&amp;gt;}&amp;lt;/span&amp;gt;

        &amp;lt;span class=&quot;c1&quot;&amp;gt;# owncloud WebDAV&amp;lt;/span&amp;gt;
        &amp;lt;span class=&quot;k&quot;&amp;gt;location&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;@webdav&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;p&quot;&amp;gt;{&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;fastcgi_split_path_info&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;^(.+\.php)(/.*)&amp;lt;/span&amp;gt;$&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;fastcgi_pass&amp;lt;/span&amp;gt;    &amp;lt;span class=&quot;s&quot;&amp;gt;unix:/var/run/php-fpm.sock&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;

                &amp;lt;span class=&quot;kn&quot;&amp;gt;fastcgi_param&amp;lt;/span&amp;gt;   &amp;lt;span class=&quot;s&quot;&amp;gt;SCRIPT_FILENAME&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nv&quot;&amp;gt;$document_root$fastcgi_script_name&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;fastcgi_param&amp;lt;/span&amp;gt;   &amp;lt;span class=&quot;s&quot;&amp;gt;SCRIPT_NAME&amp;lt;/span&amp;gt;     &amp;lt;span class=&quot;nv&quot;&amp;gt;$fastcgi_script_name&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;fastcgi_param&amp;lt;/span&amp;gt;   &amp;lt;span class=&quot;s&quot;&amp;gt;PATH_INFO&amp;lt;/span&amp;gt;       &amp;lt;span class=&quot;nv&quot;&amp;gt;$fastcgi_path_info&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;

                &amp;lt;span class=&quot;kn&quot;&amp;gt;fastcgi_param&amp;lt;/span&amp;gt;   &amp;lt;span class=&quot;s&quot;&amp;gt;HTTPS&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;no&quot;&amp;gt;on&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
                &amp;lt;span class=&quot;kn&quot;&amp;gt;include&amp;lt;/span&amp;gt;         &amp;lt;span class=&quot;s&quot;&amp;gt;fastcgi_params&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;;&amp;lt;/span&amp;gt;
        &amp;lt;span class=&quot;p&quot;&amp;gt;}&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;nginx und &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;FPM&lt;/span&gt;&lt;/span&gt; dauerhaft aktivieren und starten&lt;/h2&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;csh&quot;&gt;&amp;lt;span class=&quot;nb&quot;&amp;gt;echo&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;nginx_enable=&amp;amp;quot;YES&amp;amp;quot;&amp;amp;#39;&amp;lt;/span&amp;gt; &amp;amp;gt;&amp;amp;gt; /etc/rc.conf
&amp;lt;span class=&quot;nb&quot;&amp;gt;echo&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;php_fpm_enable=&amp;amp;quot;YES&amp;amp;quot;&amp;amp;#39;&amp;lt;/span&amp;gt; &amp;amp;gt;&amp;amp;gt; /etc/rc.conf

/usr/local/etc/rc.d/php-fpm restart
/usr/local/etc/rc.d/nginx restart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class=&apos;man&apos; href=&apos;http://www.freebsd.org/cgi/man.cgi?query=echo&amp;amp;sektion=1&amp;amp;manpath=freebsd&apos; title=&apos;FreeBSD Manpage zu Kommando echo -- write arguments to the standard output&apos;&gt;echo(1)&lt;/a&gt;, &lt;a class=&apos;man&apos; href=&apos;http://www.freebsd.org/cgi/man.cgi?query=rc.conf&amp;amp;sektion=5&amp;amp;manpath=freebsd&apos; title=&apos;FreeBSD Manpage zu Dateiformat rc.conf -- system configuration information&apos;&gt;rc.conf(5)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Zur ownCloud-Weboberfläche verbinden&lt;/h2&gt;
&lt;p&gt;Nun kann man sich via Browser zur ownCloud-Installation verbinden und die Software in vollem Umfang nutzen.&lt;/p&gt;
&lt;p&gt;Die entsprechende IP-Adresse der Plugins-Jails kann man in der &lt;strong&gt;FreeNAS-Weboberfläche&lt;/strong&gt; unter &lt;em&gt;Services &amp;gt; Plugins &amp;gt; Management &amp;gt; Settings&lt;/em&gt; einsehen.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Tipp:&lt;/strong&gt; Ein &lt;a href=&quot;/FreeBSD/2012/11/05/dateien-aus-freenas-in-owncloud-plugins-jail-verfugbar-machen&quot; class=&quot;nocb&quot; title=&quot;Beitrag &amp;#39;Dateien aus FreeNAS in ownCloud Plugins Jail verfügbar machen&amp;#39;&quot;&gt;weiterer Artikel&lt;/a&gt; beschreibt, wie man die Dateien aus FreeNAS direkt in ownCloud verfügbar machen kann.&lt;/em&gt;&lt;/p&gt;</content><updated>2012-10-12T00:00:00-02:00</updated><category term='FreeBSD'/><link href='http://groovy-skills.com/FreeBSD/2012/10/12/owncloud-45-in-freenas-plugins-jail-oder-freebsd-installieren' rel='alternate'/></entry><entry><id>/Anwendungstipps/2012/09/21/sudo-bestimmte-kommandos-ohne-passwortabfrage-erlauben-sudoers</id><title type='text'>sudo: Bestimmte Kommandos ohne Passwortabfrage erlauben (sudoers)</title><summary type='text'>In /etc/sudoers wird festgelegt, welche Benutzer/Gruppe welche Kommandos via sudo ausführen dürfen.
Besonders interessant ist dabei die Möglichkeit, Kommandos zu nennen, welche ohne zusätzliche Passwortabfrage laufen dürfen.
/etc/sudoers via visudo editieren
sudo visudo
sudo(8), visudo(8)
Passwortlos</summary><content type='html'>&lt;p&gt;In &lt;strong&gt;/etc/sudoers&lt;/strong&gt; wird festgelegt, welche Benutzer/Gruppe welche Kommandos via &lt;code&gt;sudo&lt;/code&gt; ausführen dürfen.&lt;/p&gt;
&lt;p&gt;Besonders interessant ist dabei die Möglichkeit, Kommandos zu nennen, welche &lt;em&gt;ohne zusätzliche Passwortabfrage&lt;/em&gt; laufen dürfen.&lt;/p&gt;
&lt;h2&gt;/etc/sudoers via visudo editieren&lt;/h2&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo visudo
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;http://manpages.ubuntu.com/sudo.8&quot; title=&quot;Ubuntu-Manpage zu Systemkommando &amp;#39;sudo, sudoedit - execute a command as another user&amp;#39;&quot;&gt;sudo(8)&lt;/a&gt;, &lt;a href=&quot;http://manpages.ubuntu.com/visudo.8&quot; title=&quot;Ubuntu-Manpage zu Kommando &amp;#39;visudo - edit the sudoers file&amp;#39;&quot;&gt;visudo(8)&lt;/a&gt;&lt;br /&gt;
&lt;!-- &lt;a class=&apos;man&apos; href=&apos;http://manpages.ubuntu.com/sudo.8&apos; title=&apos;Ubuntu-Manpage zu Systemkommando sudo, sudoedit - execute a command as another user&apos;&gt;sudo(8)&lt;/a&gt; --&gt;&lt;/p&gt;
&lt;h2&gt;Passwortloses sudo für bestimmte Gruppe erlauben&lt;/h2&gt;
&lt;p&gt;Durch Hinzufügen der folgenden Zeilen erlaubt man Mitgliedern der &lt;strong&gt;Gruppe adm&lt;/strong&gt; die gelisteten Kommandos direkt auszuführen:&lt;/p&gt;
&lt;pre&gt;%adm ALL=(ALL:ALL) NOPASSWD:    /usr/bin/apt-get upgrade,       /usr/bin/apt-get update, /usr/bin/apt-get autoremove, \
                                /bin/netstat -tulpen,           /bin/netstat -lnp, \
                                /usr/sbin/openvpn, \
                                /usr/bin/vi /etc/bash.bashrc&lt;/pre&gt;
&lt;p&gt;Wie man sieht, kann auch vorgegeben werden, welche Schalter vorhanden sein müssen. Der Befehl &lt;code&gt;sudo netstat -lnp&lt;/code&gt; würde demnach erfolgreich ausgeführt werden, während &lt;code&gt;sudo netstat -l&lt;/code&gt; weiterhin die Authorisierung via Passwort erfordert.&lt;/p&gt;
&lt;h2&gt;Wichtige Anmerkungen&lt;/h2&gt;
&lt;ol&gt;
	&lt;li&gt;Einträge weiter unten in der Datei haben &lt;em&gt;höhere&lt;/em&gt; Priorität als vorangestellte. Um Schwierigkeiten zu vermeiden, sollte der Ausschnitt aus dem obigem Beispiel am Ende der Datei eingefügt werden.&lt;/li&gt;
	&lt;li&gt;Da zuerst in die temporäre Datei &lt;strong&gt;/etc/sudoers.tmp&lt;/strong&gt; geschrieben wird, treten die Einstellungen erst &lt;em&gt;nach dem Schließen des Editors&lt;/em&gt; in Kraft.&lt;/li&gt;
&lt;/ol&gt;</content><updated>2012-09-21T00:00:00-03:00</updated><category term='Anwendungstipps'/><link href='http://groovy-skills.com/Anwendungstipps/2012/09/21/sudo-bestimmte-kommandos-ohne-passwortabfrage-erlauben-sudoers' rel='alternate'/></entry><entry><id>/FreeBSD/2012/09/16/bestehende-freenas-plugins-jail-importieren-nach-factory-reset</id><title type='text'>Bestehende FreeNAS Plugins-Jail importieren (nach Factory Reset)</title><summary type='text'>In FreeNAS Version 8.2 scheint die Möglichkeit zum Import einer bestehenden Plugins-Jail zu fehlen. Mit wenig Aufwand kann man dennoch eine bestehnede Jail wieder zum Einsatz bringen:
Sicherstellen, dass der Plugins-Dienst inaktiv ist (Services &gt; Plugins &gt; Management &gt; Settings)
	Bestehende Jail umbe</summary><content type='html'>&lt;p&gt;In FreeNAS Version 8.2 scheint die Möglichkeit zum Import einer bestehenden Plugins-Jail zu fehlen. Mit wenig Aufwand kann man dennoch eine bestehnede Jail wieder zum Einsatz bringen:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Sicherstellen, dass der Plugins-Dienst inaktiv ist (&lt;em&gt;Services &amp;gt; Plugins &amp;gt; Management &amp;gt; Settings&lt;/em&gt;)&lt;/li&gt;
	&lt;li&gt;Bestehende Jail umbenennen&lt;br /&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;csh&quot;&gt;mv /mnt/volume1/jail/plugins-jail /mnt/volume1/jail/plugins-jail_backup
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
	&lt;li&gt;Eine neue Plugins-Jails via WebUI erstellen (&lt;em&gt;Services &amp;gt; Plugins &amp;gt; Management &amp;gt; Settings&lt;/em&gt;)&lt;br /&gt;
	&lt;ul&gt;&lt;br /&gt;
		&lt;li&gt;&lt;strong&gt;Speicherort:&lt;/strong&gt; /mnt/volume1/jail/&lt;/li&gt;
		&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; plugins-jail&lt;/li&gt;
&lt;p&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;Die neu erzeugte Jail mit der der ursprünglichen vertauschen&lt;br /&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;csh&quot;&gt;mv /mnt/volume1/jail/plugins-jail /mnt/volume1/jail/plugins-jail_pristine
mv /mnt/volume1/jail/plugins-jail_backup /mnt/volume1/jail/plugins-jail
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;Den Plugins-Dienst via WebUI starten (&lt;em&gt;Services &amp;gt; Control Services&lt;/em&gt;)&lt;/li&gt;&lt;/p&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a class=&apos;man&apos; href=&apos;http://www.freebsd.org/cgi/man.cgi?query=mv&amp;amp;sektion=1&amp;amp;manpath=freebsd&apos; title=&apos;FreeBSD Manpage zu Kommando mv - move files&apos;&gt;mv(1)&lt;/a&gt;&lt;/p&gt;</content><updated>2012-09-16T00:00:00-03:00</updated><category term='FreeBSD'/><link href='http://groovy-skills.com/FreeBSD/2012/09/16/bestehende-freenas-plugins-jail-importieren-nach-factory-reset' rel='alternate'/></entry><entry><id>/FreeBSD/2012/09/15/ssl-zertifikat-erzeugen-und-direkt-in-die-nginx-conf-ubernehmen</id><title type='text'>SSL Zertifikat erzeugen und direkt in die nginx.conf übernehmen</title><summary type='text'>Im Folgenden wird csh-Syntax verwendet. Für bash oder sh müssen die Variablendeklarationen entsprechend abgeändert werden.
# Variablen initialisieren und in nginx-Verzeichnis wechseln
set BASE_FILENAME=`hostname`
set key=${BASE_FILENAME}.key
set csr=${BASE_FILENAME}.csr
set crt=${BASE_FILENAME}.crt
c</summary><content type='html'>&lt;p&gt;&lt;em&gt;Im Folgenden wird &lt;strong&gt;csh&lt;/strong&gt;-Syntax verwendet. Für &lt;strong&gt;bash&lt;/strong&gt; oder &lt;strong&gt;sh&lt;/strong&gt; müssen die Variablendeklarationen entsprechend abgeändert werden.&lt;/em&gt;&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;csh&quot;&gt;&amp;lt;span class=&quot;c&quot;&amp;gt;# Variablen initialisieren und in nginx-Verzeichnis wechseln&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;nb&quot;&amp;gt;set &amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;BASE_FILENAME&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;sb&quot;&amp;gt;`&amp;lt;/span&amp;gt;hostname&amp;lt;span class=&quot;sb&quot;&amp;gt;`&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;nb&quot;&amp;gt;set &amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;key&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;BASE_FILENAME&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt;.key
&amp;lt;span class=&quot;nb&quot;&amp;gt;set &amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;csr&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;BASE_FILENAME&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt;.csr
&amp;lt;span class=&quot;nb&quot;&amp;gt;set &amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;crt&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;BASE_FILENAME&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt;.crt
&amp;lt;span class=&quot;nb&quot;&amp;gt;cd&amp;lt;/span&amp;gt; /usr/local/etc/nginx

&amp;lt;span class=&quot;c&quot;&amp;gt;# Schlüssel generieren&amp;lt;/span&amp;gt;
openssl genrsa -out &amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;key&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt; 1024
&amp;lt;span class=&quot;c&quot;&amp;gt;# CSR erstellen (FQDN als Common Name eingeben!)&amp;lt;/span&amp;gt;
openssl req -new -key &amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;key&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt; -out &amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;csr&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;c&quot;&amp;gt;# Signiertes Zertifikat erstellen&amp;lt;/span&amp;gt;
openssl x509 -req -days 3650 -in &amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;csr&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt; -signkey &amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;key&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt; -out &amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;crt&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt;

&amp;lt;span class=&quot;c&quot;&amp;gt;# Korrekte Dateinamen in nginx.conf referenzieren&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;c&quot;&amp;gt;# Achtung: Nutzt man in der nginx.conf mehrere unterschiedliche&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;c&quot;&amp;gt;# Zertifikate, ist das Ersetzen sämtlicher Vorkommnisse laut&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;c&quot;&amp;gt;# folgender Kommandos wahrscheinlich unerwünscht.&amp;lt;/span&amp;gt;
sed -i &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;&amp;amp;#39;&amp;lt;/span&amp;gt; -e &amp;lt;span class=&quot;s2&quot;&amp;gt;&amp;amp;quot;s/^ *ssl_certificate_key.*/        ssl_certificate_key  ${key}/g&amp;amp;quot;&amp;lt;/span&amp;gt; /usr/local/etc/nginx/nginx.conf
sed -i &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;&amp;amp;#39;&amp;lt;/span&amp;gt; -e &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;s/^ *ssl_certificate.*/        ssl_certificate      ${crt}/g&amp;amp;#39;&amp;lt;/span&amp;gt; /usr/local/etc/nginx/nginx.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a class=&apos;man&apos; href=&apos;http://www.freebsd.org/cgi/man.cgi?query=openssl&amp;amp;sektion=1&amp;amp;manpath=freebsd&apos; title=&apos;FreeBSD Manpage zu Kommando openssl - OpenSSL command line tool&apos;&gt;openssl(1)&lt;/a&gt;, &lt;a class=&apos;man&apos; href=&apos;http://www.freebsd.org/cgi/man.cgi?query=sed&amp;amp;sektion=1&amp;amp;manpath=freebsd&apos; title=&apos;FreeBSD Manpage zu Kommando sed -- stream editor&apos;&gt;sed(1)&lt;/a&gt;&lt;/p&gt;</content><updated>2012-09-15T00:00:00-03:00</updated><category term='FreeBSD'/><link href='http://groovy-skills.com/FreeBSD/2012/09/15/ssl-zertifikat-erzeugen-und-direkt-in-die-nginx-conf-ubernehmen' rel='alternate'/></entry><entry><id>/Anwendungstipps/2012/08/31/kmail-mails-in-posteingang-optimal-zusammenstellen--gruppieren</id><title type='text'>KMail: Mails in Posteingang optimal zusammenstellen &amp;amp; gruppieren</title><summary type='text'>Schon seit einigen Versionen bietet KMail die Möglichkeit, E-Mails nach bestimmten Kriterien zusammen zu stellen.
Bedeutung der Begriffe “Zusammenstellung” und “Gruppierung”
Abhängig vom Inhalt des jeweiligen Ordners sind unterschiedliche Optionen interessant.
Zusammenstellung
Legt man in einem Ordne</summary><content type='html'>&lt;p&gt;Schon seit einigen Versionen bietet &lt;b&gt;KMail&lt;/b&gt; die Möglichkeit, E-Mails nach bestimmten Kriterien zusammen zu stellen.&lt;/p&gt;
&lt;h2&gt;Bedeutung der Begriffe &amp;#8220;Zusammenstellung&amp;#8221; und &amp;#8220;Gruppierung&amp;#8221;&lt;/h2&gt;
&lt;p&gt;Abhängig vom Inhalt des jeweiligen Ordners sind unterschiedliche Optionen interessant.&lt;/p&gt;
&lt;h3&gt;Zusammenstellung&lt;/h3&gt;
&lt;p&gt;Legt man in einem Ordner beispielsweise ausschließlich die Korrespondenz mit einer bestimmten Person ab, so bietet sich eine &lt;em&gt;Zusammenstellung nach Datum&lt;/em&gt; an.&lt;/p&gt;
&lt;p&gt;Die jeweiligen Tage werden damit auf- und zuklappbar und es ist möglich nur die gewünschten Zeiträume zu betrachten.&lt;/p&gt;
&lt;h3&gt;Gruppierung&lt;/h3&gt;
&lt;p&gt;Innerhalb der jeweiligen Zusammenstellung können einzelne Mails &lt;strong&gt;gruppiert&lt;/strong&gt; werden. Das bedeutet, dass die Mails &lt;em&gt;einer Korrespondenz&lt;/em&gt; (Mail, Antwort, weitere Antworten) hierarchisch aufgelistet werden. Es lässt sich auf den ersten Blick erkennen, welche Mail auf welche folgte.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Um dies optimal nutzen zu können, sollten sowohl empfangene als auch versendete Nachrichten im selben Ordner abgelegt werden.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Gruppierte Zusammenstellung nach Absender/Empfänger&lt;/h2&gt;
&lt;p&gt;Wenn man nun das Programm so konfiguriert, dass &lt;em&gt;versendete&lt;/em&gt; Nachrichten im &lt;strong&gt;Posteingang&lt;/strong&gt; (!) landen, kann es für diesen Ordner optimal sein, Zusammenstellungen auf Basis des jeweiligen &amp;#8220;Gesprächspartners&amp;#8221; zu erstellen.&lt;/p&gt;
&lt;p&gt;Dies kann mit &lt;em&gt;Ansicht &amp;gt; Nachrichtenliste &amp;gt; Zusammenstellung &amp;gt; Absender/Empfänger, flach&lt;/em&gt; erreicht werden.&lt;/p&gt;
&lt;p&gt;Allerdings fehlt standardmäßig eine Option, die so erstellten Zusammenstellungen zusätzlich zu &lt;strong&gt;gruppieren&lt;/strong&gt;. So erstellt man sie:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Klick auf &lt;em&gt;Ansicht &amp;gt; Nachrichtenliste &amp;gt; Zusammenstellung &amp;gt; Einrichten &amp;#8230;&lt;/em&gt;&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;Absender/Empfänger, flach&lt;/em&gt; wählen und Knopf &lt;strong&gt;Zusammenstellung kopieren&lt;/strong&gt; drücken&lt;/li&gt;
	&lt;li&gt;Im Reiter &lt;em&gt;Zusammenstellung und Gruppierung&lt;/em&gt; die &lt;em&gt;Diskussionsfaden-Gruppierung&lt;/em&gt; auf &lt;strong&gt;Nur exakt&lt;/strong&gt; (oder eine andere außer &amp;#8220;Keine&amp;#8221;) setzen&lt;/li&gt;
	&lt;li&gt;Im selben Reiter die &lt;em&gt;Diskussionsfaden-Aufklapp-Richtlinie&lt;/em&gt; je nach Wunsch setzen&lt;/li&gt;
	&lt;li&gt;Im Reiter &lt;em&gt;Allgemein&lt;/em&gt; den &lt;em&gt;Namen&lt;/em&gt; beispielsweise auf &lt;strong&gt;Absender/Empfänger, gruppiert&lt;/strong&gt; ändern&lt;/li&gt;
	&lt;li&gt;Mit &lt;strong&gt;OK&lt;/strong&gt; bestätigen und die neue Zusammenstellung unter &lt;em&gt;Ansicht &amp;gt; Nachrichtenliste &amp;gt; Zusammenstellung&lt;/em&gt; auswählen.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;/images/20120831_kmail_nachrichtenzusammenstellung_absender-empfanger-gruppiert.jpeg&quot; title=&quot;Zusammenstellung nach Absender/Empfänger, gruppiert&quot; alt=&quot;Zusammenstellung nach Absender/Empfänger, gruppiert&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Sortierung&lt;/h3&gt;
&lt;p&gt;Um eine optimale Übersichtlichkeit zu erreichen, sollte zusätzlich die Sortierung gesetzt werden. Dazu wählt man unter &lt;em&gt;Ansicht &amp;gt; Nachrichtenliste &amp;gt; Sortierung &amp;gt; Sortierkriterium für Gruppen&lt;/em&gt; die Option &lt;strong&gt;nach Datum/Zeit der neuesten Nachricht einer Gruppe&lt;/strong&gt; aus.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Ab sofort erscheint die &lt;strong&gt;Zusammenstellung&lt;/strong&gt; jenes Korrespondenzpartners, mit dem man zuletzt kommuniziert hat, in der Nachrichtenliste ganz oben.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sinnvoll ist diese Konfiguration vor allem, wenn man sich angewöhnt hat im Posteingang lediglich unerledigte Nachrichten zu behalten und abgeschlossene zu löschen oder in einem anderen Ordner zu archivieren.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/20120831_kmail_sortierung_nach_datum-zeit_der_neuesten_nachricht_einer_gruppe.jpeg&quot; title=&quot;Sortierung nach Datum/Zeit der neuesten Nachricht einer Gruppe&quot; alt=&quot;Sortierung nach Datum/Zeit der neuesten Nachricht einer Gruppe&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://manpages.ubuntu.com/kmail.1&quot; title=&quot;Ubuntu-Manpage zu Kommando &amp;#39;kmail - KDE email client&amp;#39;&quot;&gt;kmail(1)&lt;/a&gt;&lt;/p&gt;</content><updated>2012-08-31T00:00:00-03:00</updated><category term='Anwendungstipps'/><link href='http://groovy-skills.com/Anwendungstipps/2012/08/31/kmail-mails-in-posteingang-optimal-zusammenstellen--gruppieren' rel='alternate'/></entry><entry><id>/Grails/2012/08/19/ultimativer-showdown-grails-vs-rails</id><title type='text'>Ultimativer Showdown: Grails vs Rails</title><summary type='text'>Vor rund zwei Jahren begannen wir die Entwicklung einer Web-Applikation. Aufgrund vorhandener Skills im Bereich Groovy &amp; Java, wurde Grails als Framework gewählt.
Immer wieder schien das Framework, das sich mit dem Slogan “the search is over” brüstet, einer effizienten Entwicklung Steine in den Weg z</summary><content type='html'>&lt;p&gt;Vor rund zwei Jahren begannen wir die Entwicklung einer Web-Applikation. Aufgrund vorhandener Skills im Bereich Groovy &amp;amp; Java, wurde &lt;b&gt;Grails&lt;/b&gt; als Framework gewählt.&lt;/p&gt;
&lt;p&gt;Immer wieder schien das Framework, das sich mit dem Slogan &lt;em&gt;&amp;#8220;the search is over&amp;#8221;&lt;/em&gt; brüstet, einer effizienten Entwicklung Steine in den Weg zu werfen.&lt;/p&gt;
&lt;p&gt;Einfache Aufgaben erforderten komplexe Eigenprogrammierungen und kritische Fehler blieben unbehoben. Als der Veröffentlichungstermin der nun aktuellen &lt;b&gt;Grails&lt;/b&gt;-Version 2 über das Jahr 2011 hinweg mehrmals verschoben wurde, kamen erste Zweifel auf.&lt;/p&gt;
&lt;p&gt;Im Februar 2012 war unsere Applikation technisch bereit für den Go-Live. Die Fehleranfälligkeit und Komplexität von &lt;b&gt;Grails&lt;/b&gt; veranlasste uns &lt;em&gt;dennoch&lt;/em&gt; dazu, Alternativen zu suchen anstatt weitere Zeit mit diesem mangelhaften Werkzeug zu verschwenden.&lt;/p&gt;
&lt;p&gt;Das Projekt wurde mit &lt;b&gt;Rails&lt;/b&gt; neu gestartet und befindet sich seither in rascherer Entwicklung als zuvor.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Seit 4. Juli 2012 ist das Projekt &lt;a href=&quot;http://corilla.net?r=g&quot; title=&quot;Corilla - Geh raus und fang an&quot;&gt;Corilla&lt;/a&gt; im Grundumfang online und überschreitet in Bezug auf Stabilität und Geschwindigkeit sämtliche Erwartungen.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Vergleich&lt;/h2&gt;
&lt;p&gt;Im Folgenden sind die Vorteile von &lt;b&gt;Rails&lt;/b&gt; gelistet welche innerhalb der ersten beiden Monate im &lt;b&gt;Rails&lt;/b&gt;-Projekt sofort positiv aufgefallen sind.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sie sind in der Reihenfolge gelistet in der sie bemerkt wurden. Somit ist die Reihenfolge ohne Bezug zur Relevanz des jeweiligen Punktes.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Verglichen wird die Rails Version 3.2 mit Grails 2.0.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;SQLite vs. H2 als Datenbank in der Entwicklungsumgebung&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;Rails&lt;/b&gt; verwendet in der Development-Umgebung standardmäßig &lt;strong&gt;SQLite&lt;/strong&gt; als Datenbank &amp;#8211; &lt;b&gt;Grails&lt;/b&gt; 2 setzt auf &lt;strong&gt;H2&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;H2 ist eine in-memory Datenbank. Sämtliche Datensätze gehen beim Neustart der Applikation verloren. Testdatensätze muss man stets neu anlegen.&lt;/li&gt;
	&lt;li&gt;Die SQLite-Datenbanken werden im Projektverzeichnis gespeichert. Bei Bedarf können sie somit auch einfach in die Versionsverwaltung aufgenommen werden (obgleich das Format dafür eher ungeeignet ist).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tatsächlich sollte man bei der Entwicklung jenes &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;DBMS&lt;/span&gt;&lt;/span&gt; verwenden, welches auch in der Produktivumgebung zum Einsatz kommt. Dennoch ist für einen raschen Start der &lt;b&gt;Rails&lt;/b&gt;-Ansatz klar vorzuziehen.&lt;/p&gt;
&lt;h3&gt;Design aus Scaffolding&lt;/h3&gt;
&lt;p&gt;In &lt;b&gt;Rails&lt;/b&gt; ist das generierte Design aus dem Scaffolding Generator simpel gehalten. Damit ist es sinnvoll als Vorlage nutzbar.&lt;/p&gt;
&lt;p&gt;In &lt;b&gt;Grails&lt;/b&gt; ist der Aufwand, die ungewollten Teile zu löschen, oft größer als der Vorteil überhaupt erst ein Scaffolding für die Views zur Verfügung zu haben.&lt;/p&gt;
&lt;h3&gt;Rails Validations &amp;#8211; Grails Constraints&lt;/h3&gt;
&lt;p&gt;Datenvalidierung passiert in &lt;b&gt;Rails&lt;/b&gt; lediglich auf Applikationsebene.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Grails&lt;/b&gt; hinterlegt zusätzlich &lt;em&gt;Datenbank-Constraints&lt;/em&gt;. Während letzteres definitiv als Best-Practice anzusehen ist, führt es wiederum zu Problemen welche die Vorteile nichtig machen.&lt;/p&gt;
&lt;p&gt;Im Rahmen eines &lt;a href=&quot;http://jira.grails.org/browse/GRAILS-8121&quot;&gt;Grails Feature-Request&lt;/a&gt; wurde ein case-insensitive Constraint gefordert, der in quasi jeder Webapplikation zumindest für E-Mail Adressen notwendig ist. Die Idee wurde mit der widersprüchlichen Begründung abgelehnt, dass die Anforderung zu stark von der verwendeten Datenbank abhängen würde.&lt;/p&gt;
&lt;p&gt;Während eine manuelle Implementierung in &lt;b&gt;Grails&lt;/b&gt; via &lt;code&gt;.withNewSession&lt;/code&gt; zu weiteren Verkomplizierungen bei Unit-Tests führt, bietet &lt;b&gt;Rails&lt;/b&gt; standardmäßig die notwendige Flexibilität. Die folgende Definition erfüllt die Anforderung:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&amp;lt;span class=&quot;ss&quot;&amp;gt;:uniqueness&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;p&quot;&amp;gt;{&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;ss&quot;&amp;gt;:case_sensitive&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;kp&quot;&amp;gt;false&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;p&quot;&amp;gt;}&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;Applikations-&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt;&lt;/span&gt; in Entwicklungsumgebung&lt;/h3&gt;
&lt;p&gt;In &lt;b&gt;Rails&lt;/b&gt; kann die Applikation unter &lt;strong&gt;http://localhost:3000&lt;/strong&gt; abgerufen werden, während &lt;b&gt;Grails&lt;/b&gt; zusätzlich den Applikationsnamen erfordert (&lt;strong&gt;http://localhost:8080/grailsapp&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;Der kleine Vorteil der &lt;b&gt;Rails&lt;/b&gt; Variante ist, dass nur ein Lesezeichen im Browser ausreicht um die jeweils in Entwicklung befindliche Applikation aufrufen zu können.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Grails&lt;/b&gt; hat den zusätzlichen Nachteil dass bei Falschschreibung des Applikationsnamens in der &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt;&lt;/span&gt; eine komplett leere Seite erscheint.&lt;/p&gt;
&lt;p&gt;Als Konsequenz suchte ein Entwickler unnötig nach einem Fehler als der Applikationsname von Klein- auf Großschreibung geändert.&lt;br /&gt;
Das entsprechende Lesezeichen war ungültig geworden.&lt;/p&gt;
&lt;h3&gt;Scaffolding Formulare&lt;/h3&gt;
&lt;p&gt;In &lt;b&gt;Rails&lt;/b&gt; wird für die generierte &lt;strong&gt;edit-&lt;/strong&gt; und &lt;strong&gt;new-Action&lt;/strong&gt; auf das gleiche Formular-Template (&amp;#8220;partial&amp;#8221;) zurückgegriffen, was im Großteil der Webapplikationen gewünscht ist und den Quellcode &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;DRY&lt;/span&gt;&lt;/span&gt; hält.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Grails&lt;/b&gt; hingegen generiert für beide Actions jeweils eigene Formulare welche man erst mühevoll zusammenführen muss, um dem &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;DRY&lt;/span&gt;&lt;/span&gt;-Prinzip folgen zu können.&lt;/p&gt;
&lt;h3&gt;Log Ausgaben&lt;/h3&gt;
&lt;p&gt;Das Logging in &lt;b&gt;Rails&lt;/b&gt; beinhaltet die tatsächlichen Werte. Fehler in &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SQL&lt;/span&gt;&lt;/span&gt; Anweisungen können somit rasch gefunden werden.&lt;br /&gt;
&lt;em&gt;(Besonders interessant in diesem Zusammenhang ist die &lt;a href=&quot;http://edgeguides.rubyonrails.org/active_record_querying.html#running-explain&quot; title=&quot;EXPLAIN und Automatic EXPLAIN in der Rails Dokumentation&quot;&gt;Unterstützung für &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;EXPLAIN&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In &lt;b&gt;Grails&lt;/b&gt; fehlen die Werte &amp;#8211; stattdessen sind nur Fragezeichen sichtbar.&lt;/p&gt;
&lt;h3&gt;Festlegung von &amp;#8220;variablen&amp;#8221; Constraints&lt;/h3&gt;
&lt;p&gt;Constraints werden in &lt;b&gt;Grails&lt;/b&gt; nur beim Start evaluiert.&lt;/p&gt;
&lt;p&gt;Legt man beispielsweise fest, dass eine Datumsfeld nur ein Datum vom aktuellen Tag oder davor beinhalten darf, wird für die Auswertung der &lt;strong&gt;Tag des Starts der Webapplikation (!)&lt;/strong&gt; genutzt. Ein &lt;a href=&quot;http://jira.grails.org/browse/GRAILS-8149&quot;&gt;entsprechender Bug-Report&lt;/a&gt; beschreibt das Problem.&lt;/p&gt;
&lt;p&gt;In &lt;b&gt;Rails&lt;/b&gt; kann die Aufgabenstellung mittels eines &lt;strong&gt;lambda&lt;/strong&gt; gelöst werden.&lt;/p&gt;
&lt;p&gt;Generell ist das Arbeiten mit Datumseinträgen in &lt;b&gt;Grails&lt;/b&gt; schrecklich komplex &amp;#8211; auch wenn man &lt;i&gt;Joda Time&lt;/i&gt; zur Vereinfachung einsetzt.&lt;/p&gt;
&lt;h3&gt;Definition von Models&lt;/h3&gt;
&lt;p&gt;Die entsprechende &lt;b&gt;Grails&lt;/b&gt; Syntax hierfür ist einfach gestaltet. Beispielsweise kann ein Datenbankfeld auf Basis einer selbst definierten Klasse definieren (&lt;code&gt;MyClass fieldname&lt;/code&gt;). &lt;b&gt;Grails&lt;/b&gt; kümmert sich dann intern um die entsprechende &amp;#8220;Übersetzung&amp;#8221; auf Datenbankebene.&lt;/p&gt;
&lt;p&gt;Das in diesem Fall etwas irreführende Schlüsselwort &amp;#8220;&lt;code&gt;belongs_to&lt;/code&gt;&amp;#8221;, welches bei &lt;b&gt;Rails&lt;/b&gt; zum Einsatz kommt, ist oft schwieriger nachzuvollziehen aber letztendlich flexibler.&lt;/p&gt;
&lt;h3&gt;Methoden: Rückgabewert oder Veränderung des Objekts?&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Dieser Punkt ist eher ein Vergleich &amp;#8220;Ruby vs. Java&amp;#8221; als &amp;#8220;Rails vs. Grails&amp;#8221;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In &lt;b&gt;Java&lt;/b&gt; ist kaum erkennbar, ob eine Methode das aufrufende Objekt ändert oder nur einen entsprechenden Rückgabewert liefert. Man bedient sich hoffnungsvoll der Logik oder muss in den Dokumentationen nachsehen.&lt;/p&gt;
&lt;p&gt;Ein &lt;em&gt;Rufzeichen am Ende eines Methodennamens&lt;/em&gt; deutet in &lt;b&gt;Ruby&lt;/b&gt;-Konvention auf eine Änderung des aufrufenden Objekts hin &amp;#8211; oder verlangt eine Exception im Fehlerfall.&lt;/p&gt;
&lt;h3&gt;Massen-Zuweisung von Werten&lt;/h3&gt;
&lt;p&gt;&lt;i&gt;Mass-Assignment&lt;/i&gt; birgt das Risiko in sich, Benutzern versehentlich das beliebige Befüllen von Datenbankfeldern zu erlauben auf welche der Zugriff eigentlich verwehrt ist.&lt;/p&gt;
&lt;p&gt;In &lt;b&gt;Grails&lt;/b&gt; vermeidet man das Risiko grundsätzlich nur durch &lt;em&gt;Verzicht&lt;/em&gt; auf die Funktionalität.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Rails&lt;/b&gt; bietet eine sichere Lösung:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&amp;lt;span class=&quot;n&quot;&amp;gt;config&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;active_record&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;whitelist_attributes&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;kp&quot;&amp;gt;true&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;Constraints für E-Mail Adressen&lt;/h3&gt;
&lt;p&gt;Fern man auf ein entsprechendes Plugin verzichtet, muss man in &lt;b&gt;Rails&lt;/b&gt; die Validierung von E-Mail Adressen selbst definieren. Je nachdem wie streng man &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RFC&lt;/span&gt;&lt;/span&gt;-Konformität anstrebt, kann sich das Unterfangen sehr komplex gestalten.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Grails&lt;/b&gt; bietet hingegen einen &lt;code&gt;email&lt;/code&gt;-Constraint.&lt;/p&gt;
&lt;h3&gt;Stacktraces&lt;/h3&gt;
&lt;p&gt;In &lt;b&gt;Rails&lt;/b&gt; sind die Stacktraces generell kürzer. Fehlermeldungen sind aus bisheriger Erfahrung stets deutlich und ermöglichen ein rasches Finden und Beheben von Fehlern.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Grails&lt;/b&gt; ist zum Großteil in Java geschrieben (!). Dadurch werden die Stacktraces weit länger und es ist oft unklar ob man mit einem Fehler in der Applikation oder im Framework selbst konfrontiert ist.&lt;/p&gt;
&lt;p&gt;Weit schlimmer ist allerdings dass man für die Nutzung von &lt;b&gt;Grails&lt;/b&gt; zwei Sprachen beherrschen muss: &lt;em&gt;Groovy und Java&lt;/em&gt;.&lt;br /&gt;
&lt;em&gt;Dabei ist sind die Anforderungen an Java-Fertigkeiten besonders hoch.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Rails&lt;/b&gt; ist ausschließlich in Ruby implementiert. Es ist unnötig C Quellcode zu lesen.&lt;br /&gt;
&lt;em&gt;(Obgleich die Ruby-Standardimplementierung selbst in C geschrieben ist.)&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Tests und Test-Driven Development&lt;/h3&gt;
&lt;p&gt;Tests laufen in &lt;b&gt;Rails&lt;/b&gt; schneller als in &lt;b&gt;Grails&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Besonders wichtig ist, dass man in &lt;b&gt;Rails&lt;/b&gt; die Tests auch jederzeit starten kann &lt;em&gt;während&lt;/em&gt; man den Webserver in der Entwicklungsumgebung (localhost:3000) betriebt.&lt;/p&gt;
&lt;p&gt;In &lt;b&gt;Grails&lt;/b&gt; scheitert dies. &lt;em&gt;Entweder&lt;/em&gt; der Entwicklungsserver &lt;em&gt;oder&lt;/em&gt; die Tests laufen.&lt;/p&gt;
&lt;h3&gt;Routing und erlaubte Requests&lt;/h3&gt;
&lt;p&gt;In &lt;b&gt;Rails&lt;/b&gt; bestimmt das Routing, also die &lt;i&gt;Rake Middleware&lt;/i&gt;, welche Request-Arten (&lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;, &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;) für welche Action erlaubt sind.&lt;/p&gt;
&lt;p&gt;In &lt;b&gt;Grails&lt;/b&gt; muss man dies explizit abfangen um die Applikation zusätzlich abzusichern oder eine unterschiedliche Handhabung zu erreichen.&lt;/p&gt;
&lt;h3&gt;Flexibilität des Datenbankmodells&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;Rails&lt;/b&gt; Migrations sind für uns &lt;em&gt;der&lt;/em&gt; Vorteil von &lt;b&gt;Rails&lt;/b&gt;. Sie ermöglichen eine flexible Entwicklung. Ruhigen Gewissens kann man eine Struktur nutzen und, sollte sich heraus stellen das ein Ansatz ungünstig war, rasch auf eine andere Modellierung wechseln.&lt;/p&gt;
&lt;p&gt;Ein Grund warum unser Projekt auf &lt;b&gt;Grails&lt;/b&gt;-Basis über den Entwicklungszeitraum hinweg offline blieb, war die Sorge das gröbere Änderungen am Datenmodell einen großen Mehraufwand beim manuellen Migrieren erfordern würden.&lt;/p&gt;
&lt;p&gt;Mit den Migrations von &lt;b&gt;Rails&lt;/b&gt; ist diese Sorge &lt;em&gt;gänzlich&lt;/em&gt; beseitigt.&lt;/p&gt;
&lt;h3&gt;Arbeit mit Datum und Uhrzeit&lt;/h3&gt;
&lt;p&gt;Viele &lt;code&gt;Date&lt;/code&gt;-Funktionen in Java (&lt;b&gt;Grails&lt;/b&gt;) sind zu Gunsten des unnötig komplexen &lt;code&gt;Calendar&lt;/code&gt;-Konzepts überholt (&lt;em&gt;deprecated&lt;/em&gt;). Joda Time vereinfacht den Umgang ein wenig, führt aber andererseits auch zu Schwierigkeiten und &lt;em&gt;notwendigen Konvertierungen&lt;/em&gt; vor dem Speichern in die Datenbank.&lt;/p&gt;
&lt;p&gt;Die Einfachheit der Ruby/&lt;b&gt;Rails&lt;/b&gt; Methoden spricht für sich selbst:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&amp;lt;span class=&quot;n&quot;&amp;gt;x&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;mi&quot;&amp;gt;5&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;hours&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;from_now&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;n&quot;&amp;gt;year&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;n&quot;&amp;gt;x&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;year&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;n&quot;&amp;gt;currently_open&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;no&quot;&amp;gt;Time&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;now&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;between?&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;n&quot;&amp;gt;opens_at&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;n&quot;&amp;gt;closes_at&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;Auslesen der Instanzvariablen des Controllers&lt;/h3&gt;
&lt;p&gt;In &lt;b&gt;Rails&lt;/b&gt; können mittels der &lt;code&gt;assigns()&lt;/code&gt; Methode die im Controller gesetzten Instanzvariablen &amp;#8220;von Außen&amp;#8221; abgefragt werden. Das ermöglicht ausgesprochen einfache funktionale Tests. Folgendes Beispiel prüft ob die Anzahl der aufgelisteten Aktivitäten mit der Anzahl in der Datenbank überein stimmt.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&amp;lt;span class=&quot;n&quot;&amp;gt;activities_count&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;mi&quot;&amp;gt;3&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;c1&quot;&amp;gt;# 3 Aktivitäten erstellen&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;n&quot;&amp;gt;activities_count&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;times&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;k&quot;&amp;gt;do&amp;lt;/span&amp;gt;
  &amp;lt;span class=&quot;no&quot;&amp;gt;FactoryGirl&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;build&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;ss&quot;&amp;gt;:activity&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;)&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;k&quot;&amp;gt;end&amp;lt;/span&amp;gt;

&amp;lt;span class=&quot;c1&quot;&amp;gt;# Anzahl der Aktivitäten aus index-action überprüfen&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;n&quot;&amp;gt;get&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;ss&quot;&amp;gt;:index&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;n&quot;&amp;gt;assert_equal&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;n&quot;&amp;gt;activities_count&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;n&quot;&amp;gt;assigns&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;ss&quot;&amp;gt;:activities&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;count&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In &lt;b&gt;Grails&lt;/b&gt; hingegen ist uns nur die komplizierte Möglichkeit über &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;GUI&lt;/span&gt;&lt;/span&gt;-Selektoren bekannt. Der Aufwand für derartige Tests spricht aber selten dafür, sie auch tatsächlich einzusetzen (vgl. Beitrag zu &lt;a href=&quot;/Grails/2011/07/25/geb-starthilfe---grails-functional-testing&quot; title=&quot;Beitrag &amp;#39;Geb Starthilfe - Grails Functional Testing&amp;#39;&quot;&gt;Geb Functional Testing&lt;/a&gt;).&lt;/p&gt;
&lt;h3&gt;Hilfreiche Fehlermeldungen&lt;/h3&gt;
&lt;p&gt;Fehlermeldungen in &lt;b&gt;Rails&lt;/b&gt; sind oft überraschend ausführlich. Folgendes Beispiel zeigt eine klare Formulierung. Sie beinhaltet sogar &lt;em&gt;Vorschläge zur Korrektur (!)&lt;/em&gt; und eine passende &lt;em&gt;Vermutung&lt;/em&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ActiveRecord::HasManyThroughSourceAssociationNotFoundError: Could not find the source association(s) :subscribed_activity or :subscribed_activities in model Subscription. Try &amp;#8216;has_many :subscribed_activities, :through =&amp;gt; :subscriptions, :source =&amp;gt; &lt;name&gt;&amp;#8217;. Is it one of :subscriber or :activity?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In &lt;b&gt;Grails&lt;/b&gt; folgt man oft der falschen Fährte.&lt;/p&gt;
&lt;h3&gt;JavaScript standardmäßig unaufdringlich&lt;/h3&gt;
&lt;p&gt;In &lt;b&gt;Rails&lt;/b&gt; wird JavaScript &lt;em&gt;standardmäßig&lt;/em&gt; &amp;#8220;unaufdringlich&amp;#8221; (&lt;em&gt;unobstrusive&lt;/em&gt;) gehalten.&lt;/p&gt;
&lt;p&gt;Möchte man JavaScript in einer &lt;b&gt;Grails&lt;/b&gt; Applikation unobstrusive halten, muss man auf die Unterstützung durch das Framework verzichten und die entsprechenden Funktionen selbst programmieren.&lt;/p&gt;
&lt;h3&gt;Vorkompilierte Klassen&lt;/h3&gt;
&lt;p&gt;Nur in seltenen Fällen ist in &lt;b&gt;Rails&lt;/b&gt; während der Entwicklung ein Neustart der Applikation erforderlich &amp;#8211; beispielsweise nach dem Hinzufügen neuer Plugins (&lt;i&gt;Gems&lt;/i&gt;).&lt;/p&gt;
&lt;p&gt;Ansonsten ist es allerdings sogar möglich den aktuellen Entwicklungsstand aus einem Repository zu ziehen (&lt;code&gt;git pull&lt;/code&gt;) ohne Schwierigkeiten erwarten zu müssen.&lt;br /&gt;
Ein gesonderter Säuberungslauf ist unnötig.&lt;/p&gt;
&lt;p&gt;In &lt;b&gt;Grails&lt;/b&gt; kommt es regelmäßig vor, dass sonderbare Probleme wie aus dem Nichts auftauchen zu scheinen. Aus Erfahrung weiß man später, dass nur ein Säuberungslauf Abhilfe schaffen kann. Im Detail bedeutet das:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Applikation stoppen&lt;/li&gt;
	&lt;li&gt;Säubern (&lt;code&gt;grails clean&lt;/code&gt;)&lt;/li&gt;
	&lt;li&gt;Applikation starten (&lt;code&gt;grails run-app&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Der Ablauf kann je nach Umfang der Applikation &lt;em&gt;mehrere kostbare Minuten&lt;/em&gt; beanspruchen.&lt;/p&gt;
&lt;p&gt;Das Grails-Plugin &lt;a href=&quot;http://grails.org/plugin/nadd-neutralizer&quot; title=&quot;Grails-Plugin N.A.D.D. Neutralizer&quot;&gt;N.A.D.D. Neutralizer&lt;/a&gt; unterstreicht die Ironie:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This plugin will use text to speech to tell you when key events in your build are complete. So say you are like me with a project that takes several minutes to start after grails run-app. You can, guilt-free, go browse your favorite sites without worrying about getting caught up in something. When your app is up and running, this plugin announces on your speakers, &amp;#8220;Application is running!&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Alleine die Existenz eines solchen Plugins sollte skeptisch machen.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Plugin-Infrastruktur&lt;/h3&gt;
&lt;p&gt;Die Verwaltung von &lt;i&gt;Gems&lt;/i&gt; in &lt;b&gt;Rails&lt;/b&gt; ist dank &lt;i&gt;Bundler&lt;/i&gt; sehr einfach.&lt;/p&gt;
&lt;p&gt;Die &lt;b&gt;Grails&lt;/b&gt; Plugin-Infrastruktur ist sehr streng und erlaubt den Entwicklern Kompatibilitätsanforderungen zu hinterlegen. Da diesen für gewöhnlich unbekannt ist, mit welchen Versionen ihr Plugin funktioniert, tragen sie oft sonderbare Grenzen ein. Umerziehungsmaßnahmen seitens der &lt;b&gt;Grails&lt;/b&gt; Advokaten schlagen fehl und so passieren Dinge wie das folgende:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quartz am 22.04.2012:&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;| Error Plugin quartz-1.0-RC1 requires version [1.2 &amp;gt; 1.3.7] of Grails which your current Grails installation does not meet. Please try install a different version of the plugin or Grails.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In diesem Beispiel stand keine andere Version des Plugin zur Verfügung. Allerdings ist davon auszugehen, dass die Versionsobergrenze (1.3.7) schlichtweg falsch gesetzt war und das Plugin durchaus auch mit der &lt;b&gt;Grails&lt;/b&gt; Version 2 kompatibel wäre.&lt;/p&gt;
&lt;h3&gt;Speicherverbrauch&lt;/h3&gt;
&lt;p&gt;Für die &lt;b&gt;Grails&lt;/b&gt; Entwicklung sollten mindestens &lt;em&gt;1,6 GB freier Hauptspeicher&lt;/em&gt; zur Verfügung stehen.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Rails&lt;/b&gt; ist mit einer Anforderung von rund &lt;em&gt;800 MB&lt;/em&gt; nur halb so gierig.&lt;/p&gt;
&lt;p&gt;Im Folgenden ist die Aufteilung der Ressourcen beschrieben.&lt;/p&gt;
&lt;h4&gt;Frameworks&lt;/h4&gt;
&lt;p&gt;Der &lt;b&gt;Rails&lt;/b&gt; Serverprozess (WEBrick) beansprucht 75 MB Hauptspeicher.&lt;/p&gt;
&lt;p&gt;Die &lt;b&gt;Grails&lt;/b&gt; Applikation mit ähnlichem Funktionsumfang benötigt mit 800 MB das Zehnfache (!)&lt;/p&gt;
&lt;h4&gt;Entwicklungsumgebungen&lt;/h4&gt;
&lt;p&gt;Sowohl RubyMine (für Ruby/Rails) als auch IntelliJ &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;IDEA&lt;/span&gt;&lt;/span&gt; (für Java/Groovy/Grails) werden vom tschechischen Unternehmen &lt;a href=&quot;http://www.jetbrains.com/&quot;&gt;JetBrains&lt;/a&gt; entwickelt. Es kann also davon ausgegangen werden, dass die Qualität der beiden Entwicklungsumgebungen auf ähnlichen Niveau befindet.&lt;/p&gt;
&lt;p&gt;Der Speicherverbrauch von IntelliJ &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;IDEA&lt;/span&gt;&lt;/span&gt; (&lt;b&gt;Grails&lt;/b&gt;) mit gestarteter Applikation liegt laut eines kurzen Tests bei &lt;em&gt;780 MB&lt;/em&gt;.&lt;br /&gt;
RubyMine (&lt;b&gt;Rails&lt;/b&gt;) verbraucht rund &lt;em&gt;600 MB&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Von einer Entwicklung mit SpringSource &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;STS&lt;/span&gt;&lt;/span&gt; (Eclipse) oder NetBeans ist übrigens abzuraten. Beide bieten in Bezug auf die &lt;b&gt;Grails&lt;/b&gt; Entwicklung kaum Vorteile. Ein guter Texteditor ist vorzuziehen.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;&lt;/span&gt; via content_for&lt;/h3&gt;
&lt;p&gt;Mit Methoden wie &lt;code&gt;content_for()&lt;/code&gt;, bietet &lt;b&gt;Rails&lt;/b&gt; elegante Möglichkeiten um &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;&lt;/span&gt; zu generieren. View Helper bleiben &lt;em&gt;übersichtlich und sicher&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Vergleichbares könnte man in &lt;b&gt;Grails&lt;/b&gt; theoretisch mittels der &lt;i&gt;Builder&lt;/i&gt; erreichen, aber letztendlich ist dort das manuelle Zusammenstückeln der Elemente noch der sinnvollste Weg.&lt;/p&gt;
&lt;h3&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;&lt;/span&gt; Escaping&lt;/h3&gt;
&lt;p&gt;In &lt;b&gt;Rails&lt;/b&gt; werden View Ausgaben (&lt;code&gt;&amp;amp;lt;%= ... %&amp;amp;gt;&lt;/code&gt;) standardmäßig maskiert (&lt;em&gt;escaped&lt;/em&gt;). Dadurch werden viele potentielle Angriffspunkte wie &lt;i&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;XSS&lt;/span&gt;&lt;/span&gt;&lt;/i&gt; geschlossen.&lt;br /&gt;
&lt;em&gt;(Tipp: Benennt man einen Übersetzungsstring in einer i18n-Datei mit der Endung &lt;code&gt;_html&lt;/code&gt; weiß &lt;b&gt;Rails&lt;/b&gt; automatisch, dass für den hinterlegten Text das Escaping ausgesetzt werden soll)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ein &lt;b&gt;Grails&lt;/b&gt;-Projekt sollte man mit der entsprechenden Konfiguration absichern:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;&amp;lt;span class=&quot;n&quot;&amp;gt;grails&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;views&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;default&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;codec&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;html&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;c1&quot;&amp;gt;// none, html, base64&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;Array Zugriff&lt;/h3&gt;
&lt;p&gt;In Groovy (&lt;b&gt;Grails&lt;/b&gt;) wird eine Exception ausgelöst, wenn der abgefragte Bereich die größe des Arrays übersteigt. In einem Beispiel wie diesem muss man zuerst die Gesamtlänge abfragen, um dann entsprechend &amp;#8220;korrekt&amp;#8221; zugreifen zu können: &lt;code&gt;&quot;123&quot;[0..10]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;In Ruby (&lt;b&gt;Rails&lt;/b&gt;) spart man sich die Abfrage. Im obigen Beispiel erhält man einfach &amp;#8220;so viel wie möglich&amp;#8221; &amp;#8211; also das Array von 0-2.&lt;/p&gt;
&lt;h3&gt;Case insensitive scoped uniqueness&lt;/h3&gt;
&lt;p&gt;In diesem &lt;b&gt;Grails&lt;/b&gt; Beispiel wird sichergestellt, dass ein Veröffentlicher ( &lt;em&gt;scope&lt;/em&gt; ) keine Events mit gleichem Titel ( &lt;em&gt;uniqueness&lt;/em&gt; ) veröffentlicht. Dabei soll Groß-/Kleinschreibung ignoriert werden ( &lt;em&gt;case-insensitive&lt;/em&gt; ).&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;&amp;lt;span class=&quot;n&quot;&amp;gt;title&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nl&quot;&amp;gt;nullable:&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;kc&quot;&amp;gt;false&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nl&quot;&amp;gt;blank:&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;kc&quot;&amp;gt;false&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nl&quot;&amp;gt;unique:&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;kc&quot;&amp;gt;false&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nl&quot;&amp;gt;size:&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;mi&quot;&amp;gt;5&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;..&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;mi&quot;&amp;gt;30&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;,&amp;lt;/span&amp;gt;
	&amp;lt;span class=&quot;nl&quot;&amp;gt;validator:&amp;lt;/span&amp;gt;  &amp;lt;span class=&quot;o&quot;&amp;gt;{&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;n&quot;&amp;gt;val&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;n&quot;&amp;gt;obj&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;-&amp;amp;gt;&amp;lt;/span&amp;gt;	&amp;lt;span class=&quot;o&quot;&amp;gt;(&amp;lt;/span&amp;gt;
			&amp;lt;span class=&quot;cm&quot;&amp;gt;/* checks if the publisher has published an event with the exact same title (case-insensitive match) */&amp;lt;/span&amp;gt;
			&amp;lt;span class=&quot;o&quot;&amp;gt;!&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;Event&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;withNewSession&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;{&amp;lt;/span&amp;gt;	&amp;lt;span class=&quot;c1&quot;&amp;gt;// if the get() returns an event, then this is an update - which is fine&amp;lt;/span&amp;gt;
				&amp;lt;span class=&quot;o&quot;&amp;gt;!&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;Event&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;get&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;obj&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;id&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;&amp;amp;amp;&amp;amp;amp;&amp;lt;/span&amp;gt;  &amp;lt;span class=&quot;n&quot;&amp;gt;Event&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;findAllByTitleIlikeAndPublisher&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;val&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;n&quot;&amp;gt;obj&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;publisher&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;)&amp;lt;/span&amp;gt;
			&amp;lt;span class=&quot;o&quot;&amp;gt;}&amp;lt;/span&amp;gt;
	&amp;lt;span class=&quot;o&quot;&amp;gt;)}&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;o&quot;&amp;gt;)&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Das Gleiche in &lt;b&gt;Rails&lt;/b&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&amp;lt;span class=&quot;n&quot;&amp;gt;validates&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;ss&quot;&amp;gt;:title&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;ss&quot;&amp;gt;:length&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;p&quot;&amp;gt;{&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;ss&quot;&amp;gt;:in&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;mi&quot;&amp;gt;5&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;mi&quot;&amp;gt;30&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;p&quot;&amp;gt;},&amp;lt;/span&amp;gt;
          &amp;lt;span class=&quot;ss&quot;&amp;gt;:uniqueness&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;p&quot;&amp;gt;{&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;ss&quot;&amp;gt;:case_sensitive&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;kp&quot;&amp;gt;false&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;ss&quot;&amp;gt;:scope&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;ss&quot;&amp;gt;:publisher_id&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;p&quot;&amp;gt;}&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;Variablenübergabe an Views&lt;/h3&gt;
&lt;p&gt;Alle Instanzvariablen (&lt;code&gt;@variblenname&lt;/code&gt;) aus der entsprechenden Action sind in &lt;b&gt;Rails&lt;/b&gt; von der View aus verwendbar.&lt;/p&gt;
&lt;p&gt;In &lt;b&gt;Grails&lt;/b&gt; muss Alles in Form einer Map explizit aus dem Controller übergeben werden.&lt;/p&gt;
&lt;h3&gt;Counter-Cache&lt;/h3&gt;
&lt;p&gt;Um die Anzahl der zugehörigen Objekte zu finden stellt &lt;b&gt;Rails&lt;/b&gt; die &lt;a href=&quot;http://guides.rubyonrails.org/association_basics.html#belongs_to-counter_cache&quot;&gt;counter_cache Funktionalität&lt;/a&gt; bereit. Per Konvention wird bestimmt welches Feld benutzt werden soll.&lt;/p&gt;
&lt;p&gt;Möchte man in &lt;b&gt;Grails&lt;/b&gt; vermeiden bei jedem Aufruf ein &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SQL&lt;/span&gt;&lt;/span&gt; &lt;code&gt;COUNT()&lt;/code&gt; abzusetzen, müsste eine ähnliche Funktionalität mittels diverser &lt;i&gt;Interceptors&lt;/i&gt; manuell implementiert werden.&lt;/p&gt;
&lt;p&gt;&amp;#8220;Kleinigkeiten&amp;#8221; wie diese zeigen vor allem auf, wie weit &lt;b&gt;Rails&lt;/b&gt; bereits in den Details durchdacht ist, während &lt;b&gt;Grails&lt;/b&gt; beständig &amp;#8220;am Anfang&amp;#8221; stehen zu scheint.&lt;/p&gt;
&lt;h2&gt;Fazit&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;Grails&lt;/b&gt; mag dank Groovy für &lt;em&gt;Java-Veteranen (!)&lt;/em&gt; eine Erleichterung bieten. Als Framework ist es allerdings weit von den dem entfernt was die Eigenwerbung verspricht.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Für agile Web-Entwicklung und das schnelle Erreichen von Releases ist es schlicht ungeeignet.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Rails&lt;/b&gt; hingegen scheint sämtliche Best-Practices in der Web-Entwicklung zu vereinen und als Standard vorzulegen.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Der Arbeitsverlauf steckt voller positiver Überraschungen und das Endergebnis kann sich sehen lassen.&lt;/em&gt;&lt;/p&gt;</content><updated>2012-08-19T00:00:00-03:00</updated><category term='Grails'/><link href='http://groovy-skills.com/Grails/2012/08/19/ultimativer-showdown-grails-vs-rails' rel='alternate'/></entry><entry><id>/Jekyll/2012/08/16/shell-kommando-zum-raschen-andern-der-jekyll-front-matter</id><title type='text'>Shell-Kommando zum raschen Ändern der Jekyll-Post Front Matter</title><summary type='text'>In der Jekyll YAML Front-Matter werden Eckdaten wie der Titel des jeweiligen Artikels hinterlegt. Welche weiteren Informationen benötigt werden, hängt unter anderem von den verwendeten Jekyll-Plugins ab.
Batch-Ändern von Einträgen in der Jekyll-Post YAML Front Matter
Achtung: Im folgenden Beispiel wi</summary><content type='html'>&lt;p&gt;In der &lt;strong&gt;Jekyll &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;YAML&lt;/span&gt;&lt;/span&gt; Front-Matter&lt;/strong&gt; werden Eckdaten wie der &lt;em&gt;Titel&lt;/em&gt; des jeweiligen Artikels hinterlegt. Welche weiteren Informationen benötigt werden, hängt unter anderem von den verwendeten Jekyll-Plugins ab.&lt;/p&gt;
&lt;h2&gt;Batch-Ändern von Einträgen in der Jekyll-Post &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;YAML&lt;/span&gt;&lt;/span&gt; Front Matter&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Achtung: Im folgenden Beispiel wird die Originaldatei mit neuer Endung gesichert. Allerdings überschreibt ein erneutes Ausführen des Kommandos diese Sicherung wieder!&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&amp;lt;span class=&quot;c&quot;&amp;gt;# Die Kategorie sämtlicher Jekyll-Posts im aktuellen Verzeichnis&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;c&quot;&amp;gt;# auf den Namen des aktuellen Verzeichnisses abändern:&amp;lt;/span&amp;gt;
sed --in-place&amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt;_with-previous-category &amp;lt;span class=&quot;s2&quot;&amp;gt;&amp;amp;quot;s/^category:.*$/category: \&amp;amp;quot;${PWD##*/}\&amp;amp;quot;/g&amp;amp;quot;&amp;lt;/span&amp;gt; *.textile

&amp;lt;span class=&quot;c&quot;&amp;gt;# Schlagworte in der Jekyll-Post Front Matter abändern:&amp;lt;/span&amp;gt;
sed --in-place&amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt;_with-previous-tags &amp;lt;span class=&quot;s2&quot;&amp;gt;&amp;amp;quot;s/^tags:.*\]$/tags: \[${PWD##*/}\]/g&amp;amp;quot;&amp;lt;/span&amp;gt; *.textile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;http://manpages.ubuntu.com/sed&quot; title=&quot;Ubuntu-Manpage zu Kommando &amp;#39;sed - stream editor for filtering and transforming text&amp;#39;&quot;&gt;sed(1)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Weitere Informationen zu &lt;code&gt;${PWD##*/}&lt;/code&gt; finden sich in &lt;a href=&quot;http://stackoverflow.com/questions/1371261/get-current-directory-name-without-full-path-in-bash-script#answer-1371283&quot; title=&quot;Antwort zu Stackoverflow-Frage &amp;#39;Get current directory name (without full path) in Bash Script&amp;#39;&quot;&gt;dieser Stackoverflow-Antwort&lt;/a&gt;.&lt;/p&gt;</content><updated>2012-08-16T00:00:00-03:00</updated><category term='Jekyll'/><link href='http://groovy-skills.com/Jekyll/2012/08/16/shell-kommando-zum-raschen-andern-der-jekyll-front-matter' rel='alternate'/></entry><entry><id>/Corilla/2012/08/16/meistgewunscht-umgesetzt</id><title type='text'>Meistgewünscht? Umgesetzt!</title><summary type='text'>Übersichtlichkeit verbessert

Aufteilung der Doos auf mehrere Seiten
Bisher wurden Doos einfach in einer Liste angezeigt, welche mit jedem Eintrag wuchs.
Nun sind sie in Seiten zu je 10 Aktivitäten unterteilt.

Aktuelle und künftige Doos bevorzugt
Sinnvollerweise wollten einige von euch lediglich akt</summary><content type='html'>&lt;h2&gt;Übersichtlichkeit verbessert&lt;/h2&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h3&gt;Aufteilung der Doos auf mehrere Seiten&lt;/h3&gt;
&lt;p&gt;Bisher wurden &lt;i&gt;Doos&lt;/i&gt; einfach in einer Liste angezeigt, welche mit jedem Eintrag wuchs.&lt;br /&gt;
Nun sind sie in &lt;strong&gt;Seiten zu je 10 Aktivitäten&lt;/strong&gt; unterteilt.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h3&gt;Aktuelle und künftige Doos bevorzugt&lt;/h3&gt;
&lt;p&gt;Sinnvollerweise wollten einige von euch &lt;strong&gt;lediglich aktuelle und künftige &lt;i&gt;Doos&lt;/i&gt;&lt;/strong&gt; in der Auflistung sehen. &lt;em&gt;Erledigt.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Mit einem raschen Klick auf &amp;#8220;Stöbern&amp;#8221; findet man nun an erster Stelle das zeitlich näheste Doo.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Zwischen vergangenen und künftigen Aktivitäten wechselt man über den entsprechenden Filter.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h3&gt;Registrierungsablauf verständlich gestaltet&lt;/h3&gt;
&lt;p&gt;Die Registrierungsseite ist mit den drei Feldern &lt;strong&gt;Benutzername&lt;/strong&gt;, &lt;strong&gt;E-Mail Adresse&lt;/strong&gt; &amp;amp; &lt;strong&gt;Passwort&lt;/strong&gt; tatsächlich etwas ungewöhnlich.&lt;/p&gt;
&lt;p&gt;Das eine einmalige Angabe des &lt;em&gt;Passworts&lt;/em&gt; ausreicht, sorgte für Verwirrung und verhinderte bei einigen das erfolgreiche Erstellen eines Corilla-Kontos.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Nun erscheint unter jedem Feld ein Hinweis der den jeweiligen Zweck verdeutlicht.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sollte dich das gleiche Problem bisher von der Registrierung abgehalten haben, kannst du sie jetzt nachholen:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://corilla.net/de/benutzer/neu?r=w9nrkk&quot; title=&quot;Besuche das Registrierungsformular von &amp;#39;Corilla - geh raus &amp;amp; fang an!&amp;#39;&quot;&gt;Klicke jetzt hier um dich bei Corilla zu registrieren!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;Viel Spaß &amp;amp; Schöne Grüße!&lt;br /&gt;
&amp;lt;&amp;lt;&amp;gt;&amp;gt;&lt;/p&gt;</content><updated>2012-08-16T00:00:00-03:00</updated><category term='Corilla'/><link href='http://groovy-skills.com/Corilla/2012/08/16/meistgewunscht-umgesetzt' rel='alternate'/></entry><entry><id>/Anwendungstipps/2012/08/14/in-kde-kubuntu-auf-dateien-des-samsung-galaxy-note-zugreifen</id><title type='text'>In KDE (Kubuntu) auf Dateien des Samsung Galaxy Note zugreifen</title><summary type='text'>(Der hier beschriebene Ablauf funktionert wahrscheinlich bei unterschiedlichen Android-Geräten)
Schließt man ein Samsung GT-N7000 (Note) per USB an den Kubuntu Rechner, wird standardmäßig das Media Transfer Protocol (MTP) für den Datenaustausch verwendet.
Zumindest in Ubuntu 11.04 &amp; 12.04 führt dies </summary><content type='html'>&lt;p&gt;&lt;em&gt;(Der hier beschriebene Ablauf funktionert wahrscheinlich bei unterschiedlichen Android-Geräten)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Schließt man ein Samsung GT-N7000 (Note) per &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;USB&lt;/span&gt;&lt;/span&gt; an den Kubuntu Rechner, wird standardmäßig das &lt;a href=&quot;https://de.wikipedia.org/wiki/Media_Transfer_Protocol&quot; title=&quot;Wikipedia-Artikel &amp;#39;Media Transfer Protocol&amp;#39;&quot;&gt;Media Transfer Protocol (&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MTP&lt;/span&gt;&lt;/span&gt;)&lt;/a&gt; für den Datenaustausch verwendet.&lt;/p&gt;
&lt;p&gt;Zumindest in Ubuntu 11.04 &amp;amp; 12.04 führt dies scheinbar zu Problemen.&lt;br /&gt;
&lt;em&gt;Man kann lediglich die Verzeichnisse sehen, während die Dateien selbst unsichtbar bleiben.&lt;/em&gt;&lt;br /&gt;
Auch im &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PTP&lt;/span&gt;&lt;/span&gt;-Modus ist die Nutzung unmöglich.&lt;/p&gt;
&lt;p&gt;Die dritte Variante, das &lt;strong&gt;Gerät als &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;USB&lt;/span&gt;&lt;/span&gt;-Massenspeicher&lt;/strong&gt; einzubinden, war in früheren Android Versionen Standard und funktionierte mit Kubuntu einwandfrei.&lt;br /&gt;
In Android 4.0 (Ice Cream Sandwich) ist diese Möglichkeit nach wie vor vorhanden. Allerdings ist sie gut versteckt.&lt;/p&gt;
&lt;h2&gt;Galaxy Note als &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;USB&lt;/span&gt;&lt;/span&gt;-Massenspeicher einbinden&lt;/h2&gt;
&lt;p&gt;Um das Galaxy Note &lt;em&gt;als &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;USB&lt;/span&gt;&lt;/span&gt;-Massenspeicher&lt;/em&gt; einzubinden, geht man wie folgt vor:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;USB&lt;/span&gt;&lt;/span&gt;-Kabel vom Telefon &lt;strong&gt;abschließen&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;Unter &lt;em&gt;Einstellungen &amp;gt; Mehr&amp;#8230; &amp;gt; &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;USB&lt;/span&gt;&lt;/span&gt;-Verbindung&lt;/em&gt; die Schaltfläche &lt;strong&gt;Speicher mit PC verbinden&lt;/strong&gt; berühren&lt;/li&gt;
	&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;USB&lt;/span&gt;&lt;/span&gt;-Kabel &lt;strong&gt;anschließen&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;Schaltfläche &lt;strong&gt;Speicher mit PC verbinden&lt;/strong&gt; berühren&lt;/li&gt;
	&lt;li&gt;Die folgende Warnung mit &lt;strong&gt;OK&lt;/strong&gt; bestätigen&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nun kann man das Gerät wie gewoht in &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;KDE&lt;/span&gt;&lt;/span&gt; einbinden und wie ein gewöhnliches Speichermedien nutzen.&lt;/p&gt;</content><updated>2012-08-14T00:00:00-03:00</updated><category term='Anwendungstipps'/><link href='http://groovy-skills.com/Anwendungstipps/2012/08/14/in-kde-kubuntu-auf-dateien-des-samsung-galaxy-note-zugreifen' rel='alternate'/></entry><entry><id>/Rails/2012/07/26/lokale-postgresql-datenbank-fur-rails-entwicklung-einrichten</id><title type='text'>Lokale PostgreSQL Datenbank für Rails Entwicklung einrichten</title><summary type='text'># PostgreSQL Datenbankdienst und Header/Library installieren
sudo apt-get install postgresql libpq-dev
# Benutzer mit Berechtigung zum Anlegen neuer Datenbanken erstellen
sudo -u postgres createuser -U postgres -dRS `whoami`
-d entspricht --createdb
	-R entspricht --no-superuser
	-S entspricht --no-c</summary><content type='html'>&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&amp;lt;span class=&quot;c&quot;&amp;gt;# PostgreSQL Datenbankdienst und Header/Library installieren&amp;lt;/span&amp;gt;
sudo apt-get install postgresql libpq-dev
&amp;lt;span class=&quot;c&quot;&amp;gt;# Benutzer mit Berechtigung zum Anlegen neuer Datenbanken erstellen&amp;lt;/span&amp;gt;
sudo -u postgres createuser -U postgres -dRS &amp;lt;span class=&quot;sb&quot;&amp;gt;`&amp;lt;/span&amp;gt;whoami&amp;lt;span class=&quot;sb&quot;&amp;gt;`&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;-d&lt;/strong&gt; entspricht &lt;code&gt;--createdb&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;-R&lt;/strong&gt; entspricht &lt;code&gt;--no-superuser&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;-S&lt;/strong&gt; entspricht &lt;code&gt;--no-createrole&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://manpages.ubuntu.com/createuser.1.html&quot; title=&quot;Ubuntu-Manpage zu Kommando &amp;#39;createuser - define a new PostgreSQL user account&amp;#39;&quot;&gt;createuser(1)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bei Bedarf kann man den erstellten Benutzer mit folgendem Befehl wieder entfernen:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo -u postgres dropuser &amp;lt;span class=&quot;sb&quot;&amp;gt;`&amp;lt;/span&amp;gt;whoami&amp;lt;span class=&quot;sb&quot;&amp;gt;`&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;http://manpages.ubuntu.com/dropuser.1.html&quot; title=&quot;Ubuntu-Manpage zu Kommando &amp;#39;dropuser - remove a PostgreSQL user account&amp;#39;&quot;&gt;dropuser(1)&lt;/a&gt;&lt;/p&gt;</content><updated>2012-07-26T00:00:00-03:00</updated><category term='Rails'/><link href='http://groovy-skills.com/Rails/2012/07/26/lokale-postgresql-datenbank-fur-rails-entwicklung-einrichten' rel='alternate'/></entry><entry><id>/Corilla/2012/07/04/corilla-sagt-hallo</id><title type='text'>Corilla sagt Hallo!</title><summary type='text'>Corilla erblickt das Licht der Welt. Und umgekehrt.
Seit wenigen Sekunden ist Corilla online.
Die Plattform startet heute in die Beta-Testphase.
Das bedeutet, dass ich trotz intensiver Bemühung keine gravierenden Fehler mehr auslösen konnte. Jetzt darfst du’s versuchen!
Wie?
Melde dich einfach bei Co</summary><content type='html'>&lt;h2&gt;Corilla erblickt das Licht der Welt. Und umgekehrt.&lt;/h2&gt;
&lt;p&gt;Seit wenigen Sekunden ist Corilla online.&lt;/p&gt;
&lt;h3&gt;Die Plattform startet heute in die Beta-Testphase.&lt;/h3&gt;
&lt;p&gt;Das bedeutet, dass &lt;em&gt;ich&lt;/em&gt; trotz intensiver Bemühung keine gravierenden Fehler mehr auslösen konnte. Jetzt darfst du&amp;#8217;s versuchen!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Wie?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Melde dich einfach bei Corilla an und verwende die Plattform frei nach Belieben. Über gröbere Fehler informiert mich Corilla automatisch. Kleinere Dinge, die dich ärgern, oder dir fehlen, kannst du per Kontaktformular mitteilen.&lt;/p&gt;
&lt;h3&gt;Ein Doo, viele Doos?&lt;/h3&gt;
&lt;p&gt;Bei Corilla heißt eine Aktivität kurz &lt;em&gt;&amp;#8216;Doo&amp;#8217;&lt;/em&gt;.&lt;br /&gt;
Zum heutigen Stand ist der Funktionsumfang auf das Grundkonzept der Plattform begrenzt: &lt;strong&gt;Doos einstellen, Doos durchstöbern.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Die ersten Monate der Entwicklung wurden vor allem zur Schaffung eines starken Fundaments genutzt.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Corilla ist schnell, umfangreich getestet und für Suchmaschinen optimiert. Und, wie man so hört, ausgesprochen attraktiv.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Derzeit keine Unterstützung für Internet Explorer&lt;/h3&gt;
&lt;p&gt;Falls du Internet Explorer verwendest, wirst du von &amp;#8216;attraktiv&amp;#8217; wenig mitbekommen, denn in diesem Browser ist das Design noch ganz &lt;em&gt;zerschossen&lt;/em&gt;.&lt;br /&gt;
&lt;em&gt;(Je älter deine Version, desto lustiger der Effekt.)&lt;/em&gt;&lt;br /&gt;
&amp;#8230; aber wer verwendet schon noch Internet Explorer?&lt;/p&gt;
&lt;h3&gt;Reservierte Benutzernamen&lt;/h3&gt;
&lt;p&gt;Einige von euch haben sich schon vorab Benutzernamen reservieren lassen. Falls das auch bei dir der Fall sein sollte, melde dich bei Corilla zuerst mit einem anderen Namen an und gib mir dann Bescheid.&lt;br /&gt;
Ich ändere ihn dann auf deinen Wunschnamen.&lt;/p&gt;
&lt;h3&gt;Genug geredet&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://corilla.net/?r=w9nrkk&quot; title=&quot;Besuche Corilla, geh raus &amp;amp; fang an!&quot;&gt;Klicke jetzt hier um Corilla zu besuchen!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lass dir dabei ruhig Zeit &amp;#8211; Ich folge derweil Corilla&amp;#8217;s Leitspruch &lt;em&gt;&amp;#8220;Geh raus &amp;amp; fang an!&amp;#8221;&lt;/em&gt; und gehe jetzt ein Bisschen &lt;a href=&quot;http://coril.la/j/?r=w9nrkk&quot;&gt;verrückt feiern&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;Viel Spaß &amp;amp; Schöne Grüße!&lt;br /&gt;
&amp;lt;&amp;lt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Für die Neuankömmlinge &amp;#8211; Hier der Link zum Nachlesen der ersten Nachricht:&lt;br /&gt;
&lt;a href=&quot;http://eepurl.com/nfZev&quot; title=&quot;Zum Nachlesen: Corilla Insider Infos Ausgabe #1&quot;&gt;Corilla Insider Infos Ausgabe #1: &amp;#8216;Gerade noch rechtzeitig&amp;#8217;&lt;/a&gt;&lt;/p&gt;</content><updated>2012-07-04T00:00:00-03:00</updated><category term='Corilla'/><link href='http://groovy-skills.com/Corilla/2012/07/04/corilla-sagt-hallo' rel='alternate'/></entry><entry><id>/Corilla/2012/07/02/gerade-noch-rechtzeitig</id><title type='text'>Gerade noch rechtzeitig</title><summary type='text'>… zumindest nach Winterzeit. In London.
Es hat ein bisschen länger gedauert, das versprochene Video zu erstellen. Somit kommt auch diese E-Mail verspätet an. Mittlerweile sind 28 Empfänger für die Corilla Insider Infos angemeldet – weit mehr als ich so kurzfristig erwartet hätte. Freut mich.
Worum ge</summary><content type='html'>&lt;h2&gt;&amp;#8230; zumindest nach Winterzeit. In London.&lt;/h2&gt;
&lt;p&gt;Es hat ein bisschen länger gedauert, das versprochene Video zu erstellen. Somit kommt auch diese E-Mail verspätet an. Mittlerweile sind 28 Empfänger für die &lt;em&gt;Corilla Insider Infos&lt;/em&gt; angemeldet &amp;#8211; weit mehr als ich so kurzfristig erwartet hätte. Freut mich.&lt;/p&gt;
&lt;h3&gt;Worum geht&amp;#8217;s?&lt;/h3&gt;
&lt;p&gt;Erstmals in der Schulzeit hatte ich die Idee eine Webplattform zu schaffen, welche die Menschen beim Koordinieren gemeinsamer Aktivitäten unterstützt. Vor zwei Jahren griff ich diese Idee wieder auf und nun, viele Stunden und Erfahrungen später, ist &lt;i&gt;Corilla&lt;/i&gt; bereit für die Welt.&lt;/p&gt;
&lt;h4&gt;Das Konzept ist simpel:&lt;/h4&gt;
&lt;ul&gt;
	&lt;li&gt;Wer etwas &lt;em&gt;Interessantes geplant&lt;/em&gt; hat und noch andere dabei haben möchte, kann die Informationen dazu auf Corilla veröffentlichen.&lt;/li&gt;
	&lt;li&gt;Wer für einen bestimmten Zeitraum noch &lt;em&gt;etwas zu tun sucht&lt;/em&gt;, kann die veröffentlichten Infos anderer durchstöbern und sich anschließen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Genau diese &lt;em&gt;Grundanforderung&lt;/em&gt; erfüllt &lt;em&gt;Corilla&lt;/em&gt; zum aktuellen Entwicklungsstand: &lt;strong&gt;Aktivitäten einstellen, Aktivitäten heraussuchen.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Hunderte weitere Ideen die ich selbst gerne in &lt;em&gt;Corilla&lt;/em&gt; umgesetzt sehen möchte, sind bereits notiert. Und weil das Internet so schnelllebig ist, mache ich die Plattform bereits diese Woche &amp;#8211; voraussichtlich in der &lt;em&gt;Nacht von Mittwoch auf Donnerstag&lt;/em&gt; &amp;#8211; für jeden zugänglich.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Das erlaubt mir, flexibel auf Wünsche zu reagieren und Corilla von Anfang an in eine Richtung zu entwickeln, die für die Nutzer den größten Wert bringt.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mit deiner Anmeldung zu den Corilla Insider Infos bist du Teil des &lt;em&gt;&amp;#8220;eisernen Kerns der ersten Stunde&amp;#8221;&lt;/em&gt; geworden.&lt;/strong&gt;&lt;br /&gt;
Du wirst als Erster erfahren, wenn &lt;em&gt;Corilla&lt;/em&gt; online ist und ich finde es richtig, dich generell ein &lt;em&gt;Bisschen&lt;/em&gt; zu bevorzugen :)&lt;/p&gt;
&lt;p&gt;Als erstes Goodie, gibt es hier ein Video, in dem ich mich im Zeitraffer durch die ersten fünf Monate der Corilla-Entstehung beame &amp;#8211; untermalt mit genialer Mukke von K-OS. Es soll dir die Wartezeit bis zum &lt;em&gt;Corilla&lt;/em&gt;-Start ein Bisschen versüßen.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://secure.vimeo.com/45037646&quot; title=&quot;Video &amp;quot;Corilla: Die ersten fünf Monate&amp;quot; auf Vimeo&quot;&gt;Klicke hier um das Video &amp;#8216;Corilla: Die ersten fünf Monate&amp;#8217; anzusehen&lt;/a&gt;&lt;br /&gt;
(Jede Kugel steht für eine Datei.)&lt;/p&gt;
&lt;p&gt;Viel Spaß &amp;amp; Alles Gute!&lt;br /&gt;
&amp;lt;&amp;lt;&amp;gt;&amp;gt;&lt;/p&gt;</content><updated>2012-07-02T00:00:00-03:00</updated><category term='Corilla'/><link href='http://groovy-skills.com/Corilla/2012/07/02/gerade-noch-rechtzeitig' rel='alternate'/></entry><entry><id>/FreeBSD/2012/05/30/6-vorteile-von-freebsd-im-serverbetrieb</id><title type='text'>6 Vorteile von FreeBSD im Serverbetrieb</title><summary type='text'>Diese Vorteile fehlen zum Großteil in anderen Betriebssystemen und räumen somit FreeBSD als Betriebssystem im Serverbereich eine besonders interessante Position ein.
Jails !
	effiziente “Virtualisierung”
	
	Zuverlässiger Update-Verlauf mit minimaler Downtime
	Sichere Aktualisierung von Konfigurations</summary><content type='html'>&lt;p&gt;Diese Vorteile fehlen zum Großteil in anderen Betriebssystemen und räumen somit FreeBSD als Betriebssystem im Serverbereich eine besonders interessante Position ein.&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.at.freebsd.org/doc/de/books/handbook/jails-intro.html&quot; title=&quot;Das FreeBSD-Handbuch, Kapitel 16.3: Einführung (Jails)&quot;&gt;Jails !&lt;/a&gt;&lt;br /&gt;
	&lt;ul&gt;&lt;br /&gt;
		&lt;li&gt;effiziente &amp;#8220;Virtualisierung&amp;#8221;&lt;/li&gt;
&lt;p&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.at.freebsd.org/doc/de/books/handbook/updating-upgrading-freebsdupdate.html&quot; title=&quot;Das FreeBSD-Handbuch, Kapitel 25.2: FreeBSD-Update (FreeBSD aktualisieren)&quot;&gt;Zuverlässiger Update-Verlauf mit minimaler Downtime&lt;/a&gt;&lt;br /&gt;
	&lt;ul&gt;&lt;br /&gt;
		&lt;li&gt;Sichere Aktualisierung von Konfigurationsdateien durch manuelles Zusammeführen&lt;/li&gt;&lt;br /&gt;
		&lt;li&gt;lediglich zwei Reboots notwendig&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.at.freebsd.org/doc/de/books/handbook/snapshots.html&quot; title=&quot;Das FreeBSD-Handbuch, Kapitel 19.14: Schnappschüsse von Dateisystemen (Speichermedien)&quot;&gt;Snapshots bei &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;UFS&lt;/span&gt;&lt;/span&gt; / &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;FFS&lt;/span&gt;&lt;/span&gt; und &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;ZFS&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
	&lt;ul&gt;&lt;br /&gt;
		&lt;li&gt;rasche Sicherungen vor dem Ausführen ungeübter Operationen&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.freebsd.org/cgi/man.cgi?query=fsck&amp;amp;sektion=8&quot; title=&quot;FreeBSD Manpage zu Systemverwaltungs-Kommando &amp;#39;fsck&amp;#39;&quot;&gt;fsck im Betrieb&lt;/a&gt;&lt;br /&gt;
	&lt;ul&gt;&lt;br /&gt;
		&lt;li&gt;konsistente Dateisystemzustände ohne Neustart&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.at.freebsd.org/doc/de/books/handbook/&quot; title=&quot;Das FreeBSD-Handbuch - The FreeBSD German Documentation Project (Inhaltsverzeichnis)&quot;&gt;Das FreeBSD-Handbuch&lt;/a&gt;&lt;br /&gt;
	&lt;ul&gt;&lt;br /&gt;
		&lt;li&gt;Schnelles Finden von Best-Practices&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.at.freebsd.org/doc/de/books/handbook/filesystems-zfs.html&quot; title=&quot;Das FreeBSD-Handbuch, Kapitel 21.2: Das Z-Dateisystem (ZFS) (Dateisystemunterstützung)&quot;&gt;Z-Dateisystem (&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;ZFS&lt;/span&gt;&lt;/span&gt;)&lt;/a&gt;&lt;br /&gt;
	&lt;ul&gt;&lt;br /&gt;
		&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;ZFS&lt;/span&gt;&lt;/span&gt; Pool verhindert zu viel Platz auf der einen Partition zu haben der auf der anderen fehlt.&lt;/li&gt;&lt;br /&gt;
		&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;ZFS&lt;/span&gt;&lt;/span&gt; Replikation ermöglicht einfaches Spiegeln und rasches Sichern&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/p&gt;
&lt;/ol&gt;
&lt;p&gt;Die Liste ist nach unserer &lt;em&gt;subjektiven&lt;/em&gt; Relevanz sortiert und mit einer Anmerkung versehen welche beschreibt warum eine Funktionalität für uns wertvoll ist.&lt;/p&gt;</content><updated>2012-05-30T00:00:00-03:00</updated><category term='FreeBSD'/><link href='http://groovy-skills.com/FreeBSD/2012/05/30/6-vorteile-von-freebsd-im-serverbetrieb' rel='alternate'/></entry><entry><id>/Rails/2012/04/09/git-repositories-zusammenfuhren-git-pull</id><title type='text'>Git Repositories zusammenführen (git pull)</title><summary type='text'>Mittels git pull kann man ein Git Repository in ein anderes ziehen und so beide zu einem zusammenführen. Die Historien beider Git-Repos bleiben dabei erhalten:
cd /pfad/zum/ersten_git_repo/
git pull /pfad/zum/zweiten_git_repo/
git pull(1) führt dabei ein git fetch gefolgt von einem git merge aus.
In </summary><content type='html'>&lt;p&gt;Mittels &lt;code&gt;git pull&lt;/code&gt; kann man ein Git Repository in ein anderes ziehen und so beide zu einem zusammenführen. Die Historien beider Git-Repos bleiben dabei erhalten:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&amp;lt;span class=&quot;nb&quot;&amp;gt;cd&amp;lt;/span&amp;gt; /pfad/zum/ersten_git_repo/
git pull /pfad/zum/zweiten_git_repo/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;http://manpages.ubuntu.com/git-pull.1.html&quot; class=&quot;colorbox-link&quot; title=&quot;Ubuntu-Manpage zum Kommando &amp;#39;git pull&amp;#39;&quot;&gt;git pull(1)&lt;/a&gt; führt dabei ein &lt;code&gt;git fetch&lt;/code&gt; gefolgt von einem &lt;code&gt;git merge&lt;/code&gt; aus.&lt;/p&gt;
&lt;p&gt;In &lt;code&gt;git log&lt;/code&gt; kann man nun die Historie beider Projekte sehen &amp;#8211; und einen zusätzlichen &lt;em&gt;commit&lt;/em&gt; der das soeben durchgeführte &lt;em&gt;merge&lt;/em&gt; darstellt.&lt;/p&gt;
&lt;h2&gt;In ein Unterverzeichnis ziehen&lt;/h2&gt;
&lt;p&gt;Mit obigem Ansatz landen sämtliche Dateien des &lt;em&gt;zweiten&lt;/em&gt; Git-Repositories im Hauptverzeichnis des ersten. Um das zu vermeiden, kann man zuerst im zweiten Repository die Dateien in ein Unterverzeichnis verschieben:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&amp;lt;span class=&quot;nb&quot;&amp;gt;cd&amp;lt;/span&amp;gt; /pfad/zum/zweiten_git_repo/
mkdir verzeichnis_zweites_repo
&amp;lt;span class=&quot;c&quot;&amp;gt;# -k sorgt dafür, dass der Befehl trotz Warnung des mv-Kommandos durchgeführt wird:&amp;lt;/span&amp;gt;
git mv -k * verzeichnis_zweites_repo
git commit -m &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;moved all files into subdirectory verzeichnis_zweites_repo&amp;amp;#39;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;c&quot;&amp;gt;# an dieser Stelle dieses Repository in das erste ziehen (siehe erstes Listing dieses Artikels)&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;Rückwirkend in ein Unterverzeichnis ziehen&lt;/h2&gt;
&lt;p&gt;In der &lt;em&gt;aktuellen&lt;/em&gt; Revision liegen die Dateien dann zwar im korrekten Unterverzeichnis. In der Historie sind sie jedoch nach wie vor im Hauptverzeichnis zu finden.&lt;/p&gt;
&lt;p&gt;Diesen Nachteil kann man vermeiden, indem man &lt;code&gt;git filter-branch&lt;/code&gt; zum Verschieben in das Unterverzeichnis nutzt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Achtung:&lt;/strong&gt; &lt;code&gt;git filter-branch&lt;/code&gt; ändert die Historie. Siehe dazu diesen Hinweis aus der &lt;a href=&quot;http://manpages.ubuntu.com/git-filter-branch.1.html&quot; title=&quot;Ubuntu-Manpage zu Kommando &amp;#39;git filter-branch&amp;#39;&quot;&gt;git filter-branch(1)&lt;/a&gt; Manpage:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;WARNING&lt;/span&gt;&lt;/span&gt;!&lt;/strong&gt; The rewritten history will have different object names for all the objects and will not converge with the original branch. You will not be able to easily push and distribute the rewritten branch on top of the original branch. Please do not use this command if you do not know the full implications, and avoid using it anyway, if a simple single commit would suffice to fix your problem.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&amp;lt;span class=&quot;nb&quot;&amp;gt;cd&amp;lt;/span&amp;gt; /pfad/zum/zweiten_git_repo/
git filter-branch --tree-filter &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;mkdir .temp; mv * .temp&amp;amp;#39;&amp;lt;/span&amp;gt; HEAD
git filter-branch -f --tree-filter &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;mv .temp verzeichnis_zweites_repo&amp;amp;#39;&amp;lt;/span&amp;gt; HEAD
&amp;lt;span class=&quot;c&quot;&amp;gt;# an dieser Stelle dieses Repository in das erste ziehen (siehe erstes Listing dieses Artikels)&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;Unterverzeichnisse ohne Eingriff in das zweite Git-Repository?&lt;/h2&gt;
&lt;p&gt;Ich könnte mir vorstellen, dass etwas Ähnliches direkt mit &lt;code&gt;git pull&lt;/code&gt; umsetzbar ist ohne das zweite Repository verändern zu müssen.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Solltest Du eine solche Möglichkeit kennen, freue ich mich über einen entsprechenden Hinweis in den Kommentaren.&lt;/em&gt;&lt;/p&gt;</content><updated>2012-04-09T00:00:00-03:00</updated><category term='Rails'/><link href='http://groovy-skills.com/Rails/2012/04/09/git-repositories-zusammenfuhren-git-pull' rel='alternate'/></entry><entry><id>/Anwendungstipps/2012/02/15/amarok-2-im-oldschool-amarok-1-stil-gestalten</id><title type='text'>Amarok 2 im Oldschool-Amarok 1 Stil gestalten</title><summary type='text'>In KDE3 gefiel mir ganz besonders die optische Gestaltung des Musikwiedergabeprogramms Amarok. Das Design ließ den Inhalten ausreichend Platz und das dunkle Funky Monkey Farbschema verlieh dem Player einen einzigartigen Charakter.
Amarok 2 in KDE4 ist lieblos und plump gestaltet. Die einzelnen Elemen</summary><content type='html'>&lt;p&gt;In KDE3 gefiel mir ganz besonders die optische Gestaltung des Musikwiedergabeprogramms &lt;b&gt;Amarok&lt;/b&gt;. Das Design ließ den Inhalten ausreichend Platz und das dunkle &lt;b&gt;Funky Monkey Farbschema&lt;/b&gt; verlieh dem Player einen einzigartigen Charakter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Amarok 2&lt;/strong&gt; in KDE4 ist lieblos und plump gestaltet. Die einzelnen Elemente des Wiedergabeprogramms verschwenden unnötig Platz und verdrängen das Wichtigste: &lt;em&gt;Die Wiedergabeliste&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;KDE&lt;/span&gt;&lt;/span&gt; ist flexibel&lt;/h2&gt;
&lt;p&gt;Zurecht ist &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;KDE&lt;/span&gt;&lt;/span&gt; seit jeher für seine Anpassbarkeit bekannt und so bieten sich bei Amarok 2 ausreichend Möglichkeiten um auch in der neuen Version den Stil von Amarok 1 weitgehend zu imitieren.&lt;/p&gt;
&lt;p&gt;In Amarok 2.4.3 müssen drei Bereiche umgestaltet werden:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Aufbau und Inhalt der Wiedergabeliste&lt;/li&gt;
	&lt;li&gt;Anordnung der einzelnen Elemente&lt;/li&gt;
	&lt;li&gt;Hauptfenster schlank gestalten&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Aufbau und Inhalt der Wiedergabeliste gestalten&lt;/h3&gt;
&lt;p&gt;Die Wiedergabeliste kann unter &lt;em&gt;Wiedergabeliste &amp;gt; Ansichten &amp;gt; Ansichten einrichten &amp;#8230;&lt;/em&gt; gestaltet werden. Meine fertige Zusammenstellung kann hier kopiert werden:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt;&amp;lt;span class=&quot;cp&quot;&amp;gt;&amp;amp;lt;!DOCTYPE layouts&amp;amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;playlist_layouts&amp;amp;gt;&amp;lt;/span&amp;gt;
 &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;layout&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;group_by=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;None&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;tooltips=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;true&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;name=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;Amarok 1.4.9&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;single_track&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;active_indicator_row=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;0&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;show_cover=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
   &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;row&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;element&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;suffix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;prefix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;size=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;0&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;bold=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;alignment=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;center&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;value=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;Play count&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;underline=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;italic=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;element&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;suffix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;prefix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;size=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;0.3&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;bold=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;alignment=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;left&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;value=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;Title&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;underline=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;italic=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;element&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;suffix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;prefix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;size=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;0.15&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;bold=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;alignment=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;left&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;value=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;Artist&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;underline=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;italic=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;element&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;suffix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;prefix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;size=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;0.15&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;bold=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;alignment=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;left&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;value=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;Album&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;underline=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;italic=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;element&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;suffix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;prefix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;size=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;0&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;bold=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;alignment=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;right&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;value=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;Year&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;underline=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;italic=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;element&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;suffix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;prefix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;size=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;0&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;bold=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;alignment=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;center&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;value=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;Track number&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;underline=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;italic=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;element&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;suffix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;prefix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;size=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;0&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;bold=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;alignment=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;center&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;value=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;Bitrate&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;underline=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;italic=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;element&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;suffix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;prefix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;size=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;0.25&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;bold=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;true&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;alignment=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;center&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;value=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;Moodbar&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;underline=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;italic=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;element&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;suffix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;prefix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;size=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;0&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;bold=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;alignment=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;center&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;value=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;Rating&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;underline=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;italic=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
   &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/row&amp;amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/single_track&amp;amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;group_head&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;active_indicator_row=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;0&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;show_cover=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;group_body&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;active_indicator_row=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;0&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;show_cover=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
   &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;row&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;element&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;suffix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;prefix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;size=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;0.5&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;bold=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;true&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;alignment=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;left&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;value=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;Title&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;underline=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;italic=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;element&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;suffix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;prefix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;size=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;0&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;bold=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;alignment=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;left&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;value=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;Artist&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;underline=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;italic=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;true&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;element&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;suffix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;prefix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;size=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;0&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;bold=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;alignment=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;right&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;value=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;Length&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;underline=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;italic=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
   &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/row&amp;amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/group_body&amp;amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;group_variousArtistsBody&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;active_indicator_row=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;0&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;show_cover=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
   &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;row&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;element&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;suffix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;prefix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;size=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;0.5&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;bold=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;true&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;alignment=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;left&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;value=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;Title&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;underline=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;italic=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;element&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;suffix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;prefix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;size=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;0&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;bold=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;alignment=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;left&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;value=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;Artist&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;underline=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;italic=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;true&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;element&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;suffix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;prefix=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;size=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;0&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;bold=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;alignment=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;right&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;value=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;Length&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;underline=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;italic=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;false&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
   &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/row&amp;amp;gt;&amp;lt;/span&amp;gt;
  &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/group_variousArtistsBody&amp;amp;gt;&amp;lt;/span&amp;gt;
 &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/layout&amp;amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/playlist_layouts&amp;amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
	&lt;li&gt;Obige Definition in eine Textdatei namens &lt;em&gt;Amarok 1.4.9.xml&lt;/em&gt; im Verzeichnis &lt;em&gt;$&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HOME&lt;/span&gt;&lt;/span&gt;/.kde/share/apps/amarok/playlist_layouts/&lt;/em&gt; kopieren&lt;/li&gt;
	&lt;li&gt;Amarok neustarten&lt;br /&gt;
	&lt;ul&gt;&lt;br /&gt;
		&lt;li&gt;&lt;code&gt;killall --wait amarok &amp;amp;amp;&amp;amp;amp; amarok&lt;/code&gt;&lt;/li&gt;
&lt;p&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;&lt;em&gt;Wiedergabeliste &amp;gt; Ansichten &amp;gt; Amarok 1.4.9&lt;/em&gt; wählen&lt;/li&gt;&lt;/p&gt;
&lt;/ol&gt;
&lt;h3&gt;Anordnung der einzelnen Elemente optimieren&lt;/h3&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;em&gt;Ansicht &amp;gt; Ansicht sperren&lt;/em&gt; &lt;strong&gt;deaktivieren&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Kontext&lt;/strong&gt; &lt;em&gt;auf&lt;/em&gt; &lt;strong&gt;Medienquellen&lt;/strong&gt; positionieren&lt;br /&gt;
	&lt;ul&gt;&lt;br /&gt;
		&lt;li&gt;Dies erstellt automatisch einen Reiter der das Umschalten zwischen den beiden Ansichten ermöglicht.&lt;/li&gt;
&lt;p&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;&lt;strong&gt;Wiedergabeliste&lt;/strong&gt; rechts davon einordnen&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;&lt;em&gt;Ansicht &amp;gt; Schmale Werzeugleiste&lt;/em&gt; &lt;strong&gt;aktivieren&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;&lt;em&gt;Ansicht &amp;gt; Ansicht sperren&lt;/em&gt; &lt;strong&gt;aktivieren&lt;/strong&gt;&lt;/li&gt;&lt;/p&gt;
&lt;/ol&gt;
&lt;h3&gt;Fenster schlanker machen&lt;/h3&gt;
&lt;p&gt;Dieser Schritt ist optional. Allerdings wäre es schade gerade auf eine der Hauptstärken des K Desktop Environment zu verzichten.&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Fenster-Umrandung entfernen: &lt;em&gt;Alt+F3 &amp;gt; Erweitert [W] &amp;gt; Keine Umrandung [K]&lt;/em&gt;&lt;/li&gt;
	&lt;li&gt;Fenster neu positionieren: &lt;em&gt;Alt+F3 &amp;gt; Verschieben [V]&lt;/em&gt;&lt;/li&gt;
	&lt;li&gt;Fenstergröße anpassen: &lt;em&gt;Alt+F3 &amp;gt; Größe ändern [G]&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Unter folgendem Punkt können diese Einstellungen auch permanent festgelegt werden:&lt;br /&gt;
&lt;em&gt;Alt+F3 &amp;gt; Erweitert [W] &amp;gt; Spezielle Einstellungen für dieses Fenster &amp;#8230; [F]&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Wo ist der Funky Monkey?&lt;/h2&gt;
&lt;p&gt;Amarok 2 übernimmt immer das aktuell eingestellte Farbschema der Desktopumgebung.&lt;/p&gt;
&lt;p&gt;Es gibt Möglichkeiten ein eigenes Farbschema zu setzen, welches dann ausschließlich für das Wiedergabeprogramm verwendet wird. Diese Möglichkeiten bringen allerdings diverse Nachteile mit sich, weshalb ich davon abrate sie zu verfolgen und im Rahmen dieser Beschriebung vernachlässige.&lt;/p&gt;
&lt;p&gt;Bei Bedarf veröffentliche ich das entsprechende Farbschema für KDE4 mit einigen Hinweisen zu den Umsetzungsvarianten.&lt;/p&gt;</content><updated>2012-02-15T00:00:00-02:00</updated><category term='Anwendungstipps'/><link href='http://groovy-skills.com/Anwendungstipps/2012/02/15/amarok-2-im-oldschool-amarok-1-stil-gestalten' rel='alternate'/></entry><entry><id>/WordPress/2011/10/13/wordpress-netzwerk-seite-in-9-schritten-zu-neuem-server-migrieren</id><title type='text'>WordPress Netzwerk-Seite in 9 Schritten zu neuem Server migrieren</title><summary type='text'>Anhand dieses Ablaufs kann eine WordPress Netzwerkinstallation ( Multisite ) von einem zum anderen Server migriert werden.
Am Zielsystem
	Mapped-Domains definieren
		WordPress Tables löschen
	
	Am Quellsystem
	Kommentare sperren
		Verwaltungsmodus ( Maintenance Mode ) aktivieren
	
	Am Zielsystem
	Dat</summary><content type='html'>&lt;p&gt;Anhand dieses Ablaufs kann eine WordPress Netzwerkinstallation ( &lt;em&gt;Multisite&lt;/em&gt; ) von einem zum anderen Server migriert werden.&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;Am Zielsystem&lt;/strong&gt;&lt;br /&gt;
	&lt;ol&gt;&lt;br /&gt;
		&lt;li&gt;Mapped-Domains definieren&lt;/li&gt;
		&lt;li&gt;WordPress Tables löschen&lt;/li&gt;
&lt;p&gt;&lt;/ol&gt;&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;&lt;strong&gt;Am Quellsystem&lt;/strong&gt;&lt;br /&gt;
	&lt;ol&gt;&lt;br /&gt;
		&lt;li&gt;Kommentare sperren&lt;/li&gt;&lt;br /&gt;
		&lt;li&gt;&lt;a href=&quot;/WordPress/2011/08/24/wordpress-wartung-verwaltungsbereich-sperren&quot;&gt;Verwaltungsmodus ( &lt;em&gt;Maintenance Mode&lt;/em&gt; ) aktivieren&lt;/a&gt;&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;/ol&gt;&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;&lt;strong&gt;Am Zielsystem&lt;/strong&gt;&lt;br /&gt;
	&lt;ol&gt;&lt;br /&gt;
		&lt;li&gt;Dateien von Quellsystem ziehen (via &lt;code&gt;rsync&lt;/code&gt;; inkl. &lt;code&gt;chown -R www:www ./&lt;/code&gt;)&lt;/li&gt;&lt;br /&gt;
		&lt;li&gt;Datenbank von Quellsystem ziehen (via &lt;code&gt;mysqldump&lt;/code&gt; und &lt;code&gt;mysql&lt;/code&gt;)&lt;/li&gt;&lt;br /&gt;
		&lt;li&gt;wp-config.php anpassen&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;/ol&gt;&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;&lt;strong&gt;Am Arbeitsplatzrechner&lt;/strong&gt;&lt;br /&gt;
	&lt;ol&gt;&lt;br /&gt;
		&lt;li&gt;Zielsystem via &lt;strong&gt;/etc/hosts Eintrag&lt;/strong&gt; testen&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;/ol&gt;&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;&lt;strong&gt;Bei Domainregistrar&lt;/strong&gt;&lt;br /&gt;
	&lt;ol&gt;&lt;br /&gt;
		&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;DNS&lt;/span&gt;&lt;/span&gt;-Einträge (inkl. Mapped Domains) hinterlegen&lt;/li&gt;&lt;/p&gt;
&lt;p&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/p&gt;
&lt;/ol&gt;
&lt;p&gt;Der Fokus dieser Vorgehensweise liegt darauf, sowohl Downtime und Aufwand gering zu halten.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Ist die Verfügbarkeit besonders kritisch, sollte auf eine Variante mit Datenbankreplikation zurückgegriffen werden.&lt;/em&gt;&lt;/p&gt;</content><updated>2011-10-13T00:00:00-02:00</updated><category term='WordPress'/><link href='http://groovy-skills.com/WordPress/2011/10/13/wordpress-netzwerk-seite-in-9-schritten-zu-neuem-server-migrieren' rel='alternate'/></entry><entry><id>/Anwendungstipps/2011/09/28/wave-audiodateien-aus-bin-cue-extrahieren</id><title type='text'>WAVE-Audiodateien aus .bin/.cue extrahieren</title><summary type='text'>The Nameless Mod ist als eines der besten Mods für das Kultspiel Deus Ex bekannt.
Der Soundtrack zum Spiel steht auf der Projektseite kostenlos als Archiv zum Download bereit. Das Archiv enthält zwei CD’s als Speicherabbild/Cuesheet-Kombination (Dateiendungen .bin und .cue).
Einzelne Dateien als FLAC</summary><content type='html'>&lt;p&gt;&lt;strong&gt;The Nameless Mod&lt;/strong&gt; ist als eines der besten Mods für das Kultspiel &lt;a href=&quot;http://www.mobygames.com/game/deus-ex&quot; title=&quot;Artikel zu &amp;#39;Deus Ex&amp;#39;a auf MobyGames.com&quot;&gt;Deus Ex&lt;/a&gt; bekannt.&lt;/p&gt;
&lt;p&gt;Der &lt;a href=&quot;http://www.thenamelessmod.com/downloads/#downloads_ost&quot; title=&quot;Nameless-Mod Soundtrack auf der offiziellen Mod-Webseite&quot;&gt;Soundtrack zum Spiel&lt;/a&gt; steht auf der Projektseite kostenlos als Archiv zum Download bereit. Das Archiv enthält &lt;strong&gt;zwei CD&amp;#8217;s als Speicherabbild/Cuesheet-Kombination&lt;/strong&gt; (&lt;em&gt;Dateiendungen .bin und .cue&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Einzelne Dateien als &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;FLAC&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt; oder &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OGG&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt; fehlen, um die Fans zu animieren, die CD zu bestellen und mit dem Kauf die Entwickler zu unterstützen.&lt;/p&gt;
&lt;h3&gt;Audio-Dateien direkt auslesen anstatt auf CD brennen&lt;/h3&gt;
&lt;p&gt;Möchte man die Audiotracks dennoch lieber direkt speichern anstatt sie auf CD zu brennen, kann man mit dem Programm &lt;a href=&quot;http://manpages.ubuntu.com/bchunk.1&quot; title=&quot;Ubuntu-Manpage zu Kommando &amp;#39;bchunk - CD image format conversion from bin/cue to iso/cdr&amp;#39;&quot;&gt;bchunk(1)&lt;/a&gt; die einzelnen Tracks direkt &lt;strong&gt;als &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;WAV&lt;/span&gt;&lt;/span&gt;-Dateien&lt;/strong&gt; (&lt;em&gt;Waveform Audio File Format &amp;#8211; Dateiendung .wav&lt;/em&gt;) auslesen.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&amp;lt;span class=&quot;c&quot;&amp;gt;# bchunk-Installation in Ubuntu:&amp;lt;/span&amp;gt;
sudo apt-get install bchunk
&amp;lt;span class=&quot;c&quot;&amp;gt;# Auslesen der WAVE-Dateien im Verzeichnis &amp;amp;#39;Friendly Disc&amp;amp;#39;:&amp;lt;/span&amp;gt;
bchunk -w TNMOST_Friendly.bin TNMOST_Friendly.cue TNMOST_Friendly
&amp;lt;span class=&quot;c&quot;&amp;gt;# Auslesen der WAVE-Dateien im Verzeichnis &amp;amp;#39;Hostile Disc&amp;amp;#39;:&amp;lt;/span&amp;gt;
bchunk -w TNMOST_Hostile.bin  TNMOST_Hostile.cue  TNMOST_Hostile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Als Resultat erhält man fortlaufend nummerierte &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;WAV&lt;/span&gt;&lt;/span&gt;-Dateien, welche nun beispielsweise mit &lt;a href=&quot;http://manpages.ubuntu.com/flac&quot; title=&quot;Ubuntu-Manpage zum Kommando &amp;#39;flac&amp;#39;&quot;&gt;flac(1)&lt;/a&gt; komprimiert und mittels &lt;a href=&quot;http://manpages.ubuntu.com/krename&quot; title=&quot;Ubuntu-Manpage zum Kommando &amp;#39;krename&amp;#39;&quot;&gt;krename(1)&lt;/a&gt; sinnvoll benannt werden können.&lt;/p&gt;</content><updated>2011-09-28T00:00:00-03:00</updated><category term='Anwendungstipps'/><link href='http://groovy-skills.com/Anwendungstipps/2011/09/28/wave-audiodateien-aus-bin-cue-extrahieren' rel='alternate'/></entry><entry><id>/FreeBSD/2011/09/08/ubertragenes-datenvolumen-des-dd-befehls-ausgeben-status-siginfo</id><title type='text'>Übertragenes Datenvolumen des dd Befehls ausgeben STATUS/SIGINFO</title><summary type='text'>Während der Befehl dd läuft, kann man in diversen UNIX-Systemen durch Drücken von STRG+T Details ausgeben lassen:
# Testkommando inkl. Ausgabe nach Drücken von STRG+T
dd if=/dev/random of=/dev/null
load: 0.63  cmd: dd 53428 [running] 1.78r 0.01u 1.76s 16% 868k
153125+0 records in
153125+0 records out</summary><content type='html'>&lt;p&gt;Während der Befehl &lt;code&gt;dd&lt;/code&gt; läuft, kann man in diversen &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;UNIX&lt;/span&gt;&lt;/span&gt;-Systemen durch Drücken von &lt;strong&gt;STRG+T&lt;/strong&gt; Details ausgeben lassen:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;csh&quot;&gt;&amp;lt;span class=&quot;c&quot;&amp;gt;# Testkommando inkl. Ausgabe nach Drücken von STRG+T&amp;lt;/span&amp;gt;
dd &amp;lt;span class=&quot;k&quot;&amp;gt;if&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt;/dev/random &amp;lt;span class=&quot;nv&quot;&amp;gt;of&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt;/dev/null
load: 0.63  cmd: dd 53428 &amp;lt;span class=&quot;o&quot;&amp;gt;[&amp;lt;/span&amp;gt;running&amp;lt;span class=&quot;o&quot;&amp;gt;]&amp;lt;/span&amp;gt; 1.78r 0.01u 1.76s 16% 868k
153125+0 records in
153125+0 records out
78400000 bytes transferred in 1.788752 secs &amp;lt;span class=&quot;o&quot;&amp;gt;(&amp;lt;/span&amp;gt;43829439 bytes/sec&amp;lt;span class=&quot;o&quot;&amp;gt;)&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Detail zum &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;STATUS&lt;/span&gt;&lt;/span&gt; Zeichen&lt;/strong&gt; sind in &lt;a class=&apos;man&apos; href=&apos;http://www.freebsd.org/cgi/man.cgi?query=termios&amp;amp;sektion=4&amp;amp;manpath=freebsd&apos; title=&apos;FreeBSD Manpage zu Dateiformat termios&apos;&gt;termios(4)&lt;/a&gt; vermerkt.&lt;br /&gt;
Das &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SIGINFO&lt;/span&gt;&lt;/span&gt;-Signal&lt;/strong&gt; ist auf &lt;a href=&quot;https://en.wikipedia.org/wiki/SIGINFO&quot; title=&quot;Wikipedia-Artikel &amp;#39;SIGINFO&amp;#39;&quot;&gt;Wikipedia&lt;/a&gt; erläutert.&lt;/p&gt;</content><updated>2011-09-08T00:00:00-03:00</updated><category term='FreeBSD'/><link href='http://groovy-skills.com/FreeBSD/2011/09/08/ubertragenes-datenvolumen-des-dd-befehls-ausgeben-status-siginfo' rel='alternate'/></entry><entry><id>/WordPress/2011/08/24/wordpress-wartung-verwaltungsbereich-sperren</id><title type='text'>WordPress Wartung: Verwaltungsbereich sperren</title><summary type='text'>Für WordPress existieren einige “Maintenance Mode”-Plugins, welche die komplette Seite sperren.
Oft möchte man während einer Wartung allerdings nur Änderungen an der Datenbank verhindern während die Seite für Besucher weiterhin angezeigt werden soll.
Der Artikel WordPress Maintenance Mode Without a P</summary><content type='html'>&lt;p&gt;Für WordPress existieren einige &amp;#8220;Maintenance Mode&amp;#8221;-Plugins, welche die komplette Seite sperren.&lt;/p&gt;
&lt;p&gt;Oft möchte man während einer Wartung allerdings nur &lt;em&gt;Änderungen&lt;/em&gt; an der Datenbank verhindern während die Seite für Besucher weiterhin angezeigt werden soll.&lt;/p&gt;
&lt;p&gt;Der Artikel &lt;a href=&quot;http://sivel.net/2009/10/wordpress-maintenance-mode-without-a-plugin-part-3/&quot; title=&quot;Artikel &amp;#39;WordPress Maintenance Mode Without a Plugin Part 3&amp;#39; auf Sivel.net&quot;&gt;WordPress Maintenance Mode Without a Plugin Part 3&lt;/a&gt; beschreibt den umgekehrten Ansatz &amp;#8211; das Backend bleibt aktiv während Frontend Zugriffe verboten werden.&lt;/p&gt;
&lt;p&gt;Dieser Ansatz muss also nur noch entsprechend angepasst werden.&lt;/p&gt;
&lt;h3&gt;WordPress Login Sperre einrichten&lt;/h3&gt;
&lt;p&gt;Dazu erstellt man im WordPress Hauptverzeichnis die Datei &lt;code&gt;.maintenance&lt;/code&gt; mit folgendem Inhalt:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;php&quot;&gt;&amp;lt;span class=&quot;cp&quot;&amp;gt;&amp;amp;lt;?php&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;k&quot;&amp;gt;if&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;p&quot;&amp;gt;(&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nb&quot;&amp;gt;stristr&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;$_SERVER&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;REQUEST_URI&amp;amp;#39;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;],&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;/wp-admin&amp;amp;#39;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;||&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nb&quot;&amp;gt;stristr&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;$_SERVER&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;[&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;REQUEST_URI&amp;amp;#39;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;],&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;/wp-login.php&amp;amp;#39;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;p&quot;&amp;gt;)&amp;lt;/span&amp;gt;
	&amp;lt;span class=&quot;nv&quot;&amp;gt;$upgrading&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nb&quot;&amp;gt;time&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;p&quot;&amp;gt;();&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;cp&quot;&amp;gt;?&amp;amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;x&quot;&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Möchte man die Meldung noch aussagekr&amp;auml;ftiger gestalten, kann man die Datei &lt;code&gt;wp-content/maintenance.php&lt;/code&gt; erstellen. Beispielinhalt:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;DOCTYPE&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;html&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;PUBLIC&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;err&quot;&amp;gt;&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;-&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;err&quot;&amp;gt;//&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;W3C&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;err&quot;&amp;gt;//&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;DTD&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;XHTML&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;1&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;err&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;0&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;Strict&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;err&quot;&amp;gt;//&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;EN&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;err&quot;&amp;gt;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;err&quot;&amp;gt;&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;http:&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;err&quot;&amp;gt;//&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;www&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;err&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;w3&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;err&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;org&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;err&quot;&amp;gt;/&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;TR&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;err&quot;&amp;gt;/&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;xhtml1&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;err&quot;&amp;gt;/&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;DTD&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;err&quot;&amp;gt;/&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;xhtml1-strict&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;err&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;dtd&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;err&quot;&amp;gt;&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;html&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;xmlns=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;http://www.w3.org/1999/xhtml&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;dir=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;ltr&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;lang=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;de-DE&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;

	&amp;lt;span class=&quot;cp&quot;&amp;gt;&amp;amp;lt;?php $heading = &amp;amp;#39;Wartungsarbeiten - Maintenance&amp;amp;#39; ?&amp;amp;gt;&amp;lt;/span&amp;gt;

	&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;head&amp;amp;gt;&amp;lt;/span&amp;gt;
		&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;meta&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;http-equiv=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;Content-Type&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;content=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;text/html; charset=utf-8&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
		&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;link&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;rel=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;#39;stylesheet&amp;amp;#39;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;id=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;#39;login-css&amp;amp;#39;&amp;lt;/span&amp;gt;  &amp;lt;span class=&quot;na&quot;&amp;gt;href=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;#39;/wp-admin/css/login.css&amp;amp;#39;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;type=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;#39;text/css&amp;amp;#39;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;media=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;#39;all&amp;amp;#39;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
		&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;link&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;rel=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;#39;stylesheet&amp;amp;#39;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;id=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;#39;colors-fresh-css&amp;amp;#39;&amp;lt;/span&amp;gt;  &amp;lt;span class=&quot;na&quot;&amp;gt;href=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;#39;/wp-admin/css/colors-fresh.css&amp;amp;#39;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;type=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;#39;text/css&amp;amp;#39;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;media=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;#39;all&amp;amp;#39;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
		&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;title&amp;amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;cp&quot;&amp;gt;&amp;amp;lt;?php echo $heading; ?&amp;amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/title&amp;amp;gt;&amp;lt;/span&amp;gt;
	&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/head&amp;amp;gt;&amp;lt;/span&amp;gt;

	&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;lt;/span&amp;gt;
		&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;div&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;style=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;margin:0px auto; max-width:960px;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;gt;&amp;lt;/span&amp;gt;
			&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;h1&amp;amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;cp&quot;&amp;gt;&amp;amp;lt;?php echo $heading; ?&amp;amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/h1&amp;amp;gt;&amp;lt;/span&amp;gt;
			&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;br/&amp;amp;gt;&amp;lt;/span&amp;gt;
			&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;h2&amp;amp;gt;&amp;amp;lt;em&amp;amp;gt;&amp;lt;/span&amp;gt;DEUTSCH:&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/em&amp;amp;gt;&amp;lt;/span&amp;gt; Administrationsbereich tempor&amp;lt;span class=&quot;ni&quot;&amp;gt;&amp;amp;amp;auml;&amp;lt;/span&amp;gt;r gesperrt&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/h2&amp;amp;gt;&amp;lt;/span&amp;gt;
			&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;lt;/span&amp;gt;Aufgrund von Wartungsarbeiten d&amp;lt;span class=&quot;ni&quot;&amp;gt;&amp;amp;amp;uuml;&amp;lt;/span&amp;gt;rfen derzeit keine &amp;lt;span class=&quot;ni&quot;&amp;gt;&amp;amp;amp;Auml;&amp;lt;/span&amp;gt;nderungen vorgenommen werden. Daher ist der Zugang zur WordPress Verwaltungsoberfl&amp;lt;span class=&quot;ni&quot;&amp;gt;&amp;amp;amp;auml;&amp;lt;/span&amp;gt;che gesperrt.&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&amp;lt;/span&amp;gt;
			&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;br/&amp;amp;gt;&amp;lt;/span&amp;gt;
			&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;h2&amp;amp;gt;&amp;amp;lt;em&amp;amp;gt;&amp;lt;/span&amp;gt;ENGLISH:&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/em&amp;amp;gt;&amp;lt;/span&amp;gt; Admin-Interface temporarly locked&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/h2&amp;amp;gt;&amp;lt;/span&amp;gt;
			&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;p&amp;amp;gt;&amp;lt;/span&amp;gt;Due to scheduled maintenance changes are currently disallowed. Thus login to the WordPress backend is denied. &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&amp;lt;/span&amp;gt;
		&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;lt;/span&amp;gt;
	&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/body&amp;amp;gt;&amp;lt;/span&amp;gt;

&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;/html&amp;amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Das Beispiel bindet die gleichen &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;&lt;/span&gt; Dateien ein, wie das WordPress Anmeldeformular und sorgt somit für die Verwendung der bekannten Schriftart.&lt;/p&gt;
&lt;p&gt;Es kann natürlich beliebig optimiert werden. Einge Möglichkeit wäre die Sprache je nach &lt;a href=&quot;https://secure.wikimedia.org/wikipedia/de/wiki/Locale&quot; title=&quot;Artikel &amp;#39;Locale&amp;#39; in der deutschsprachigen Wikipedia&quot;&gt;Locale&lt;/a&gt; des Besuchers zu setzen.&lt;/p&gt;</content><updated>2011-08-24T00:00:00-03:00</updated><category term='WordPress'/><link href='http://groovy-skills.com/WordPress/2011/08/24/wordpress-wartung-verwaltungsbereich-sperren' rel='alternate'/></entry><entry><id>/Grails/2011/08/24/war-dateien-in-tomcat-7-entpacken---unpackwars</id><title type='text'>WAR Dateien in Tomcat 7 entpacken - unpackWARs</title><summary type='text'>Bereits in Vorgängerversionen ist Tomcat standardmäßig so konfiguriert, dass WAR Dateien beim Deployment entpackt werden.
Das ermöglicht unter anderem, statische Inhalte (CSS, JS, Bilder, …) über einen anderen Webserver bereit zu stellen.
Allerdings kann es unter gewissen Umständen passieren, dass na</summary><content type='html'>&lt;p&gt;Bereits in Vorgängerversionen ist Tomcat &lt;em&gt;standardmäßig&lt;/em&gt; so konfiguriert, dass &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;WAR&lt;/span&gt;&lt;/span&gt; Dateien beim Deployment entpackt werden.&lt;/p&gt;
&lt;p&gt;Das ermöglicht unter anderem, statische Inhalte (&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;&lt;/span&gt;, JS, Bilder, &amp;#8230;) über einen anderen Webserver bereit zu stellen.&lt;/p&gt;
&lt;p&gt;Allerdings kann es unter gewissen Umständen passieren, dass nach dem Update auf Tomcat 7 Applikationen verpackt bleiben &amp;#8211; &lt;em&gt;obwohl &lt;code&gt;unpackWARs&lt;/code&gt; oder &lt;code&gt;unpackWAR&lt;/code&gt; gesetzt ist.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Wann bleibt unpackWARs in Tomcat 7 effektlos?&lt;/h3&gt;
&lt;p&gt;Ein Vergleich der Tomcat-Dokumentationen zu &lt;code&gt;unpackWAR&lt;/code&gt; im Context Container-Abschnitt &amp;#8216;Standard Implementation&amp;#8217; zeigt warum:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;https://tomcat.apache.org/tomcat-6.0-doc/config/context.html#Standard_Implementation&quot; class=&quot;colorbox-link&quot; title=&quot;unpackWAR in der offiziellen Tomcat 6 Dokumentation&quot;&gt;unpackWAR in Tomcat 6&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;https://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Standard_Implementation&quot; class=&quot;colorbox-link&quot; title=&quot;unpackWAR in der offiziellen Tomcat 7 Dokumentation&quot;&gt;unpackWAR in Tomcat 7&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wichtiger Unterschied: &lt;em&gt;&lt;strong&gt;&amp;#8220;Note that &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;WAR&lt;/span&gt;&lt;/span&gt; files located outside of a Host&amp;#8217;s appBase are never unpacked.&amp;#8221;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Hat man also beispielsweise in der &lt;code&gt;context.xml&lt;/code&gt; (oder &lt;code&gt;ROOT.xml&lt;/code&gt;) einen Pfad außerhalb des laut &lt;code&gt;server.xml&lt;/code&gt; definierten &lt;a href=&quot;https://tomcat.apache.org/tomcat-7.0-doc/config/host.html&quot; class=&quot;colorbox-link&quot;&gt;Hosts&lt;/a&gt; angegeben, so ist &lt;code&gt;unpackWARs&lt;/code&gt; &lt;em&gt;effektlos&lt;/em&gt;.&lt;/p&gt;
&lt;h4&gt;Beispiel&lt;/h4&gt;
&lt;p&gt;Inhalt von &lt;code&gt;/usr/local/apache-tomcat-7.0/conf/Catalina/localhost/ROOT.xml&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;Context&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;docBase=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;/home/someuser/some-grails-app.war&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;path=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;reloadable=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;true&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;Lösung: Symlink zur Applikation in webapps Verzeichnis&lt;/h3&gt;
&lt;p&gt;Damit &lt;span class=&quot;caps&quot;&gt;WAR&lt;/span&gt;&amp;#8217;s wieder entpackt werden, kann man entweder die &lt;strong&gt;appBase&lt;/strong&gt; in der Host-Definition anpassen oder man entfernt die &lt;code&gt;ROOT.xml&lt;/code&gt; und setzt stattdessen einen entsprechenden Symlink:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&amp;lt;span class=&quot;c&quot;&amp;gt;# Verschieben der original ROOT-Applikation:&amp;lt;/span&amp;gt;
mv /usr/local/apache-tomcat-7.0/webapps/ROOT /usr/local/apache-tomcat-7.0/webapps/ROOT_orig
&amp;lt;span class=&quot;c&quot;&amp;gt;# Verlinken der Grails-Beispielapplikation als ROOT.war:&amp;lt;/span&amp;gt;
ln -s /home/someuser/some-grails-app.war /usr/local/apache-tomcat-7.0/webapps/ROOT.war
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Der hier gesetzte Link sorgt dafür, dass die Grails Applikation mit dem Namen &amp;#8220;some-grails-app&amp;#8221; als &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;ROOT&lt;/span&gt;&lt;/span&gt;-Anwendung entpackt und gestartet wird.&lt;/p&gt;</content><updated>2011-08-24T00:00:00-03:00</updated><category term='Grails'/><link href='http://groovy-skills.com/Grails/2011/08/24/war-dateien-in-tomcat-7-entpacken---unpackwars' rel='alternate'/></entry><entry><id>/FreeBSD/2011/08/10/liste-kurzlich-installierter-ports-ausgeben</id><title type='text'>Liste kürzlich installierter Ports ausgeben</title><summary type='text'>ls -lcrt /var/db/pkg/*/+DESC
Quelle: installdate of a port/package?</summary><content type='html'>&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;csh&quot;&gt;ls -lcrt /var/db/pkg/*/+DESC
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Quelle: &lt;a href=&quot;http://freebsd.1045724.n5.nabble.com/installdate-of-a-port-package-tp3962201p3962202.html&quot; title=&quot;Thema &amp;#39;installdate of a port/package?&amp;#39; im Mailinglist-Archive von freebsd-stable&quot;&gt;installdate of a port/package?&lt;/a&gt;&lt;/p&gt;</content><updated>2011-08-10T00:00:00-03:00</updated><category term='FreeBSD'/><link href='http://groovy-skills.com/FreeBSD/2011/08/10/liste-kurzlich-installierter-ports-ausgeben' rel='alternate'/></entry><entry><id>/Grails/2011/07/25/geb-starthilfe---grails-functional-testing</id><title type='text'>Geb Starthilfe - Grails Functional Testing</title><summary type='text'>Mittels Unit- und Integration-Tests kann die Qualität einer Grails Web-Applikation zum Großteil sichergestellt werden.
Um eine Funktionalität aus Nutzersicht zu überprüfen ist eine andere Herangehensweise erforderlich: Man startet die Applikation und überprüft per Browser ob die verschiedenen Anwendu</summary><content type='html'>&lt;p&gt;Mittels &lt;em&gt;Unit- und Integration-Tests&lt;/em&gt; kann die Qualität einer Grails Web-Applikation zum Großteil sichergestellt werden.&lt;/p&gt;
&lt;p&gt;Um eine Funktionalität aus Nutzersicht zu überprüfen ist eine andere Herangehensweise erforderlich: Man startet die Applikation und überprüft per Browser ob die verschiedenen Anwendungsfälle wie gewünscht durchgeführt werden können.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Um langfristig zu gewährleisten, dass die Funktionalität erhalten bleibt, müsste man die Schritte nach jeder weiteren Code-Änderung wiederholen.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dies ist umständlich bis unmöglich und &lt;strong&gt;kann in Grails mittels Geb automatisiert werden&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Anwendungsfälle von funktionalen Tests&lt;/h3&gt;
&lt;p&gt;Es gibt unendlich viele Möglichkeiten durch eine Web-Applikation zu navigieren. Dementsprechend sinnlos ist der Versuch &amp;#8220;möglichst Alles&amp;#8221; zu testen.&lt;/p&gt;
&lt;p&gt;Folgende Szenarien sind aus meiner Sicht für &amp;#8220;functional testing&amp;#8221; interessant:&lt;/p&gt;
&lt;h4&gt;Sicherstellung von Kern-Funktionalität&lt;/h4&gt;
&lt;p&gt;Die Durchführbarkeit, zumindest jener Anwendungsfälle ohne welche die Web-Applikation nutzlos werden würde, kann gut über funktionale Tests sichergestellt werden.&lt;/p&gt;
&lt;h4&gt;Planung von Usability-Tests&lt;/h4&gt;
&lt;p&gt;Bei der Planung von Tests der Benutzerfreundlichkeit kann man den idealen Ablauf zur Lösung der Aufgabe definieren und damit sicherstellen, dass &lt;em&gt;zumindest&lt;/em&gt; dieser Weg zum Zeitpunkt des Tests mit dem Teilnehmer funktionieren wird.&lt;/p&gt;
&lt;h4&gt;Regressionsvermeidung&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://secure.wikimedia.org/wikipedia/en/wiki/Software_regression&quot; title=&quot;Artikel &amp;#39;Software Regression&amp;#39; in der englischsprachigen Wikipedia&quot;&gt;Regressionen&lt;/a&gt; &amp;#8211; für mich einer der Hauptgründe überhaupt Tests zu schreiben.&lt;/p&gt;
&lt;p&gt;Für jeden gefundenen Programmfehler wird ein Test geschrieben, welcher diesen Fehler reproduziert. Dann implementiert man die Lösung so, dass der Test erfolgreich verläuft &amp;#8211; natürlich ohne dabei den Test zu ändern.&lt;/p&gt;
&lt;p&gt;Somit wird eine Applikation langfristig immer &amp;#8220;besser&amp;#8221;, da sich ein bereits gefundener Bug unmöglich erneut in das Programm einschleichen kann.&lt;/p&gt;
&lt;p&gt;&lt;!--nextpage--&gt;&lt;/p&gt;
&lt;h3&gt;Starthilfe zur Geb-Entwicklung&lt;/h3&gt;
&lt;p&gt;Wie der Titel der offiziellen Dokumentation, &amp;#8220;The Book of Geb&amp;#8221;, vermuten lässt, ist Geb ist umfangreich dokumentiert.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Zumindest das &lt;a href=&quot;http://www.gebish.org/manual/current/intro.html#introduction&quot; title=&quot;Kapitel &amp;#39;Introduction&amp;#39; im &amp;#39;Book of Geb&amp;#39;&quot;&gt;Einführungskapitel&lt;/a&gt; solltest du an dieser Stelle gelesen haben.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Eine Sammlung weiterer wichtiger Ressourcen ist am Ende dieses Artikels zusammen gefasst.&lt;/p&gt;
&lt;p&gt;Im Folgenden möchte ich auf einige &lt;strong&gt;Hürden und Tücken&lt;/strong&gt; hinweisen um dir einen einfachen Einstieg in Geb zu ermöglichen.&lt;/p&gt;
&lt;p&gt;&lt;!--nextpage--&gt;&lt;/p&gt;
&lt;h3&gt;Geb-Hürde 1: Abhängigkeitskonflikt verhindert sämtliche Grails Kommandos&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Error executing script Clean: loader constraint violation: when resolving overridden method &quot;org.apache.xerces.jaxp.SAXParserImpl.getParser()Lorg/xml/sax/Parser;&quot; the class loader (instance of org/codehaus/groovy/grails/cli/support/GrailsRootLoader) of the current class, org/apache/xerces/jaxp/SAXParserImpl, and its superclass loader (instance of), have different Class objects for the type org/xml/sax/Parser used in the signature&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;Umgang mit der Hürde&lt;/h4&gt;
&lt;p&gt;Diesen Fehler konnte ich durch Ausschluss der Abhängigkeit zu &lt;code&gt;xercesImpl&lt;/code&gt; bei &lt;code&gt;selenium-htmlunit-driver&lt;/code&gt; beheben:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;&amp;lt;span class=&quot;cm&quot;&amp;gt;/** Ausschnitt aus der Datei BuildConfig.groovy **/&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;c1&quot;&amp;gt;// ...&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;n&quot;&amp;gt;grails&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;project&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;dependency&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;resolution&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;{&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;c1&quot;&amp;gt;// ...&amp;lt;/span&amp;gt;
  &amp;lt;span class=&quot;n&quot;&amp;gt;dependencies&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;{&amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;n&quot;&amp;gt;test&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;org.codehaus.geb:geb-spock:0.6.0&amp;amp;quot;&amp;lt;/span&amp;gt;

    &amp;lt;span class=&quot;n&quot;&amp;gt;def&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;n&quot;&amp;gt;driverVersion&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;err&quot;&amp;gt;&amp;amp;#39;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;mf&quot;&amp;gt;2.1&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;mi&quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;err&quot;&amp;gt;&amp;amp;#39;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;c1&quot;&amp;gt;// slow startup if set to &amp;amp;#39;latest.release&amp;amp;#39;&amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;n&quot;&amp;gt;test&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;org.seleniumhq.selenium:selenium-htmlunit-driver:${driverVersion}&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;{&amp;lt;/span&amp;gt;
      &amp;lt;span class=&quot;n&quot;&amp;gt;exclude&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;err&quot;&amp;gt;&amp;amp;#39;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;xml&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;-&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;apis&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;err&quot;&amp;gt;&amp;amp;#39;&amp;lt;/span&amp;gt;
      &amp;lt;span class=&quot;n&quot;&amp;gt;exclude&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;err&quot;&amp;gt;&amp;amp;#39;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;xercesImpl&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;err&quot;&amp;gt;&amp;amp;#39;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;c1&quot;&amp;gt;// IMPORTANT!&amp;lt;/span&amp;gt;
      &amp;lt;span class=&quot;c1&quot;&amp;gt;//exclude &amp;amp;#39;xmlParserAPIs&amp;amp;#39;&amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;o&quot;&amp;gt;}&amp;lt;/span&amp;gt;
    &amp;lt;span class=&quot;n&quot;&amp;gt;test&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;org.seleniumhq.selenium:selenium-firefox-driver:${driverVersion}&amp;amp;quot;&amp;lt;/span&amp;gt;

    &amp;lt;span class=&quot;c1&quot;&amp;gt;// other drivers ...&amp;lt;/span&amp;gt;
  &amp;lt;span class=&quot;o&quot;&amp;gt;}&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;o&quot;&amp;gt;}&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Das Problem ist im &lt;a href=&quot;http://grails.1312388.n4.nabble.com/org-apache-xerces-jaxp-SAXParserImpl-getParser-Lorg-xml-sax-Parser-Error-trying-to-include-compile-o-td1695193.html#a1714758&quot; title=&quot;Beitrag &amp;#39;org.apache.xerces.jaxp.SAXParserImpl.getParser Lorg /xml/sax/Parser; Error trying to include compile &amp;#39;org.codehaus.groovy.modules:groovyws:0.5.1&amp;#39;&amp;#39; auf Nabble.com&quot;&gt;Grail &amp;#8211; user Forum&lt;/a&gt; erläutert.&lt;/p&gt;
&lt;p&gt;&lt;!--nextpage--&gt;&lt;/p&gt;
&lt;h3&gt;Geb-Hürde 2: Abstraktionsebenen erschweren den Einstieg&lt;/h3&gt;
&lt;p&gt;Beim Einsatz von Geb in Grails müssen viele Ebenen zusammen arbeiten:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;Grails Geb Plugin&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Eigentliches Geb&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Grails Testing Framework / Spock&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Selenium WebDriver&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Browser (HtmlUnit, Firefox, Chromium, IE)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Schwierigkeiten sind vor allem beim Grails Plugin (aufgrund der mangelhaften Dokumentation) und den Browsern oder &amp;#8220;Browser-Drivers&amp;#8221; wahrscheinlich.&lt;/p&gt;
&lt;h4&gt;Umgang mit der Hürde&lt;/h4&gt;
&lt;p&gt;Um das Grails Plugin möglichst schnell verstehen zu lernen ist &lt;a href=&quot;http://ldaley.com/&quot; title=&quot;Persönliche Website von Luke Daley&quot;&gt;Luke Daley&amp;#8217;s&lt;/a&gt; &lt;a href=&quot;https://github.com/geb/geb-example-grails/tree/1b5dc3f71dac6786377d5cbfe46604b910f92046/test/functional&quot; title=&quot;Projekt &amp;#39;geb-example-grails&amp;#39; auf GitHub.com&quot;&gt;Beispielprojekt auf GitHub&lt;/a&gt; hilfreich.&lt;/p&gt;
&lt;p&gt;Übernimm am besten die Beispieldateien in dein Projekt und passe sie dann entsprechend an.&lt;/p&gt;
&lt;p&gt;&lt;!--nextpage--&gt;&lt;/p&gt;
&lt;h3&gt;Geb-Hürde 2: Unzureichende Spezifizierung erschwert die Identifikation&lt;/h3&gt;
&lt;p&gt;Um innerhalb eines Tests überprüfen zu können, auf welcher Seite sich Geb gerade befindet, benötigt es gewisse Anhaltspunkte. Die Summe der Anhaltspunkte muss die jeweilige Seiten korrekt und vor allem eindeutig identifizieren.&lt;/p&gt;
&lt;p&gt;Im oben genannten Beispielprojekt kannst du anhand der &lt;code&gt;static at&lt;/code&gt;-Deklarationen erkennen, dass die einzelnen Pages hauptsächlich über ihren Titel identifiziert werden.&lt;/p&gt;
&lt;p&gt;Oft reicht dies aus.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Spätestens bei einer mehrsprachigen Applikation schlägt es in dieser Form allerdings fehl.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Das entsprechende Stacktrace ist wenig hilfreich. Unter anderem fehlt ein Hinweis auf welcher Seite man sich denn &amp;#8211; anstelle der erwarteten &amp;#8211; befindet.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Condition not satisfied: at LoginPage | false&amp;lt;/code&amp;gt;

&amp;lt;code&amp;gt;junit.framework.AssertionFailedError: Condition not satisfied:&amp;lt;/code&amp;gt;

&amp;lt;code&amp;gt;at LoginPage
|
false&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Versäumst du die eindeutige Definition, öffnet das also viele Fehlerquellen.&lt;/p&gt;
&lt;h4&gt;Umgang mit der Hürde&lt;/h4&gt;
&lt;p&gt;Es ist also sinnvoll, eine Seite über zusätzliche Elemente zu identifizieren.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;&amp;lt;span class=&quot;kd&quot;&amp;gt;static&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;n&quot;&amp;gt;at&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;{&amp;lt;/span&amp;gt;
  &amp;lt;span class=&quot;c1&quot;&amp;gt;// heading, ...&amp;lt;/span&amp;gt;
  &amp;lt;span class=&quot;n&quot;&amp;gt;title&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=~&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;/(?&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;i&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;melde&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;/&amp;lt;/span&amp;gt;
  &amp;lt;span class=&quot;n&quot;&amp;gt;$&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;(&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;input.loginbtn&amp;amp;quot;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;,&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nl&quot;&amp;gt;id:&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;err&quot;&amp;gt;&amp;amp;#39;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;loginbtn&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;err&quot;&amp;gt;&amp;amp;#39;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;).&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;value&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;()&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=~&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;/(?&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;i&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;anmelden&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;/&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;o&quot;&amp;gt;}&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;!--nextpage--&gt;&lt;/p&gt;
&lt;h3&gt;Geb-Hürde 3: jQuery 1.6 wird in HtmlUnit fehlerhaft ausgeführt&lt;/h3&gt;
&lt;p&gt;Bei funktionialen Tests wird ein am System &lt;em&gt;verfügbarer&lt;/em&gt; Browser gesteuert.&lt;/p&gt;
&lt;p&gt;Man sieht also beispielsweise das Firefox-Fenster in welchem die definierten Anweisungen durchlaufen werden.&lt;/p&gt;
&lt;p&gt;Andererseits fungiert auch HtmlUnit als Browser, bietet allerdings die Möglichkeit die Äblaufe im Hintergrund vorzunehmen.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Aufgrunddessen ist HtmlUnit für Build-Automation die erste Wahl.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Verwendet die zu testende Applikation jQuery, kommt es bei den aktuellen Versionen (1.6.x) zu einem Fehler:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;The data necessary to complete this operation is not yet available.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;http://steveliles.blogspot.com/2011/05/jquery-htmlunit-runtimeerror-messages.html&quot; title=&quot;Artikel &amp;#39;JQuery + HtmlUnit = runtimeError messages galore&amp;#39; von Steve Liles&quot;&gt;einem Blogbeitrag&lt;/a&gt; von Steve Liles ist die Ursache ausführlich beschrieben.&lt;/p&gt;
&lt;h4&gt;Umgang mit der Hürde&lt;/h4&gt;
&lt;p&gt;Um das Problem in unserem Fall zu umgehen muss die Deklaration von &lt;code&gt;driver&lt;/code&gt; in der Datei &lt;code&gt;GebConfig.groovy&lt;/code&gt; so geändert werden, dass ein anderer Browser verwendet wird. Zum Beispiel:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;&amp;lt;span class=&quot;n&quot;&amp;gt;def&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;n&quot;&amp;gt;driver&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;k&quot;&amp;gt;new&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;n&quot;&amp;gt;HtmlUnitDriver&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;(&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;BrowserVersion&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;FIREFOX_3_6&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;)&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;c1&quot;&amp;gt;// fails if BrowserVersion is left to the default value&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;!--nextpage--&gt;&lt;/p&gt;
&lt;h3&gt;Geb-Hürde 4: Fehler der Browser und Browser-Driver wirken sich im Test aus&lt;/h3&gt;
&lt;p&gt;Durch die Möglichkeit, verschiedene Browser automatisch steuern zu lassen, wirken sich die Eigenheiten und Bugs der jeweiligen Browser auf unsere Tests aus.&lt;/p&gt;
&lt;p&gt;Zum Beispiel gibt es bei der Verwendung von Firefox scheinbar ein Problem beim Absenden von Formularen mittels &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;ENTER&lt;/span&gt;&lt;/span&gt; &lt;a href=&quot;https://code.google.com/p/selenium/issues/detail?id=2079#c1&quot; title=&quot;Selenium Issue 2079: using .SendKeys Keys.Enter on a form submit button with Firefox RemoteWebDriver doesn&amp;#39;t submit the form&quot;&gt;&lt;sup class=&quot;footnote&quot; id=&quot;fnr1&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/a&gt;, welches bei der Nutzung des &lt;em&gt;FirefoxDriver&lt;/em&gt; auftritt.&lt;/p&gt;
&lt;p&gt;Mit HtmlUnit hingegen funktioniert das Senden wie erwartet.&lt;/p&gt;
&lt;h4&gt;Umgang mit der Hürde&lt;/h4&gt;
&lt;p&gt;Im Zweifelsfall ist es daher sinnvoll, die Test&amp;#8217;s mit unterschiedlichen Browsern laufen zu lassen. Die entsprechenden Befehle sind als Kommentare in der &lt;code&gt;GebConfig.groovy&lt;/code&gt; Beispieldatei vermerkt.&lt;/p&gt;
&lt;p&gt;&lt;!--nextpage--&gt;&lt;/p&gt;
&lt;h3&gt;Geb-Hürde 5: Mehrsprachigkeit erschwert das Finden von Elementen&lt;/h3&gt;
&lt;p&gt;Standardmäßig stellt Grails die Sprache einer Applikation entsprechend der Sprachkonfiguration im Browser des Besuchers ein.&lt;/p&gt;
&lt;p&gt;Wenn also Firefox auf Deutsch und HtmlUnit auf Englisch eingestellt ist, fehlen möglicherweise Seiteninhalte, welche zur Identifikation oder Navigation einer Seite genutzt werden.&lt;/p&gt;
&lt;p&gt;Die bereits früher im Artikel beschriebene Definition würde auf jene Seiten zutreffen, welche &amp;#8220;melde&amp;#8221; (in Groß-, Klein- oder gemischter Schreibweise) enthalten:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;&amp;lt;span class=&quot;n&quot;&amp;gt;title&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=~&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;/(?&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;i&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;melde&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;/&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Allerdings ist der Inhalt des Title-Elements auf Englisch wahrscheinlich anders.&lt;/p&gt;
&lt;h4&gt;Umgang mit der Hürde&lt;/h4&gt;
&lt;p&gt;Um auch die Zeichenkette &amp;#8220;Login&amp;#8221; gelten zu lassen, muss die Definition entsprechend angepasst werden:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;&amp;lt;span class=&quot;n&quot;&amp;gt;title&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=~&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;/(?&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;i&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;melde&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;|(?&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;i&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;)&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;n&quot;&amp;gt;login&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;/&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Alternativ könnte man dafür sorgen, dass alle Browser-Driver die selbe Sprache anfordern. Ich habe darauf verzichtet eine Lösung dafür zu suchen, wäre aber an einer interessiert.&lt;/p&gt;
&lt;p&gt;&lt;!--nextpage--&gt;&lt;/p&gt;
&lt;h3&gt;Geb-Hürde 6: Die Verwendung von Variablen führt zu Fehlern&lt;/h3&gt;
&lt;p&gt;In einer Spezifikation hatte ich versucht die Werte über eine Variable zu setzen:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;&amp;lt;span class=&quot;n&quot;&amp;gt;def&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;n&quot;&amp;gt;subject&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;Subject for testing the contact form via Geb&amp;amp;quot;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;c1&quot;&amp;gt;// ... some logic&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;n&quot;&amp;gt;contactForm&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;subject&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;n&quot;&amp;gt;subject&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Offensichtlich versucht Geb in diesem Fall ein Element namens &lt;em&gt;subject&lt;/em&gt; auf der Website zu finden, anstatt die deklarierte Variable zu verwenden:&lt;/p&gt;
&lt;p&gt;@No such property: subject for class: geb.navigator.EmptyNavigator&lt;/p&gt;
&lt;p&gt;groovy.lang.MissingPropertyException: No such property: subject for class: geb.navigator.EmptyNavigator&lt;br /&gt;
at geb.navigator.EmptyNavigator.propertyMissing(EmptyNavigator.groovy:151)&lt;br /&gt;
at geb.navigator.Navigator.getProperty(Navigator.groovy)@&lt;/p&gt;
&lt;h4&gt;Umgang mit der Hürde&lt;/h4&gt;
&lt;p&gt;Ob und wie es möglich ist, Variablen zu nutzen ist mir derzeit unbekannt.&lt;/p&gt;
&lt;p&gt;Wenn du auf Variablen verzichten kannst, weise einfach Strings zu.&lt;/p&gt;
&lt;p&gt;&lt;!--nextpage--&gt;&lt;/p&gt;
&lt;h3&gt;Ressourcen&lt;/h3&gt;
&lt;p&gt;Folgende Ressourcen sind im Zusammenhang mit Geb hilfreich.&lt;/p&gt;
&lt;h4&gt;Dokumentation &amp;amp; Beispiele&lt;/h4&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.gebish.org/manual/current/&quot; title=&quot;Offizielle Dokumentation zu Geb&quot;&gt;The Book Of Geb&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.gebish.org/manual/current/navigator.html#accessing_tag_name_attributes_text_and_classes&quot;&gt;4.8 Accessing tag name, attributes, text and classes&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.gebish.org/manual/current/navigator.html#sending_keystrokes&quot;&gt;4.9 Sending keystrokes&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;https://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/Keys.html&quot;&gt;org.openqa.selenium.Keys JavaDoc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;https://github.com/geb/geb-example-grails/tree/1b5dc3f71dac6786377d5cbfe46604b910f92046/test/functional&quot;&gt;GitHub geb-example-grails&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://blog.springsource.com/2010/08/28/the-future-of-functional-web-testing/&quot; title=&quot;Artikel &amp;#39;The future of functional web testing?&amp;#39; im SpringSource Team Blog&quot;&gt;The future of functional web testing?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Verwendete Technologien&lt;/h4&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.grails.org/doc/latest/guide/9.%20Testing.html#9.3%20Functional%20Testing&quot;&gt;Grails Dokumentation: 9.3 Functional Testing&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;https://code.google.com/p/selenium/wiki/HtmlUnitDriver&quot;&gt;HtmlUnitDriver Information about the HtmlUnit Driver&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;https://selenium.googlecode.com/svn/trunk/docs/api/java/index.html?org/openqa/selenium/htmlunit/HtmlUnitDriver.html&quot;&gt;org.openqa.selenium.htmlunit.HtmlUnitDriver JavaDoc&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://htmlunit.sourceforge.net/apidocs/index.html&quot;&gt;HtmlUnit &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://htmlunit.sourceforge.net/apidocs/index.html?com/gargoylesoftware/htmlunit/BrowserVersion.html&quot;&gt;com.gargoylesoftware.htmlunit.BrowserVersion JavaDoc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Fehlerdetails&lt;/h4&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://grails.1312388.n4.nabble.com/org-apache-xerces-jaxp-SAXParserImpl-getParser-Lorg-xml-sax-Parser-Error-trying-to-include-compile-o-tp1695193p1714758.html&quot;&gt;Re: org.apache.xerces.jaxp.SAXParserImpl.getParser Lorg /xml/sax/Parser; Error trying to include compile &amp;#8216;org.codehaus.groovy.modules:groovyws:0.5.1&amp;#8217;&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://steveliles.blogspot.com/2011/05/jquery-htmlunit-runtimeerror-messages.html&quot;&gt;JQuery + HtmlUnit = runtimeError messages galore&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;https://code.google.com/p/selenium/issues/detail?id=2079&quot;&gt;Selenium Issue 2079: using .SendKeys Keys.Enter  on a form submit button with Firefox RemoteWebDriver doesn&amp;#8217;t submit the form&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><updated>2011-07-25T00:00:00-03:00</updated><category term='Grails'/><link href='http://groovy-skills.com/Grails/2011/07/25/geb-starthilfe---grails-functional-testing' rel='alternate'/></entry><entry><id>/Grails/2011/05/09/dry-verwendung-von-constraints-in-grails-view</id><title type='text'>DRY-Verwendung von Constraints in Grails-View</title><summary type='text'>Um dem Prinzip zur Redundanzvermeidung (DRY – Don’t repeat yourself) gerecht zu werden, kann man in Grails auf die Constraints einer Domainklasse in Grails auf einfache Art und Weise auch von anderen Stellen aus zugreifen – beispielsweise in der View oder im Controller.
Folgendes Beispiel zeigt die V</summary><content type='html'>&lt;p&gt;Um dem Prinzip zur Redundanzvermeidung (&lt;em&gt;&lt;a href=&quot;https://secure.wikimedia.org/wikipedia/de/wiki/Don%E2%80%99t_repeat_yourself&quot; title=&quot;Artikel zu DRY in der deutschsprachigen Wikipedia&quot;&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;DRY&lt;/span&gt;&lt;/span&gt; &amp;#8211; Don&amp;#8217;t repeat yourself&lt;/a&gt;&lt;/em&gt;) gerecht zu werden, kann man in Grails auf die &lt;strong&gt;Constraints einer Domainklasse&lt;/strong&gt; in Grails auf einfache Art und Weise auch von anderen Stellen aus zugreifen &amp;#8211; beispielsweise in der &lt;strong&gt;View&lt;/strong&gt; oder im &lt;strong&gt;Controller&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Folgendes Beispiel zeigt die Verwendung des &lt;strong&gt;&lt;a href=&quot;http://www.grails.org/doc/latest/ref/Constraints/size.html&quot; title=&quot;Grails Framework Reference - Constraints: size&quot;&gt;size&lt;/a&gt; Constraints&lt;/strong&gt; um die maximale Länge (&lt;a href=&quot;http://www.w3schools.com/tags/att_input_maxlength.asp&quot; title=&quot;w3schools.com: HTML &amp;#39;input&amp;#39; maxlength Attribute&quot;&gt;maxlength&lt;/a&gt;) eines &lt;a href=&quot;http://www.w3schools.com/tags/tag_input.asp-Feldes&quot; title=&quot;w3schools.com: HTML &amp;amp;lt;input&amp;amp;gt; Tag&quot;&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;INPUT&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; zu beschränken:&lt;/p&gt;
&lt;h3&gt;Constraint aus dem Grails-Controller übergeben&lt;/h3&gt;
&lt;p&gt;z.B. in Action &amp;#8220;create&amp;#8221; von MyDomainController.groovy:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;java&quot;&gt;&amp;lt;span class=&quot;c1&quot;&amp;gt;// Constraint in Controller abrufen und an die View übergeben&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;k&quot;&amp;gt;return&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;[&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nl&quot;&amp;gt;titleMax:&amp;lt;/span&amp;gt;    &amp;lt;span class=&quot;n&quot;&amp;gt;MyDomain&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;constraints&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;title&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;size&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;.&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;na&quot;&amp;gt;max&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;()&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;o&quot;&amp;gt;]&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;Constraint in der Grails-View verwenden&lt;/h3&gt;
&lt;p&gt;z.B. in mydomain/create.gsp&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;&amp;lt;span class=&quot;c&quot;&amp;gt;&amp;amp;lt;!-- Constraint in der View nutzen --&amp;amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;g:textField&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;name=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;title&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;maxlength=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;${titleMax}&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Grails Framework Reference: &lt;a class=&quot;colorbox-link&quot; title=&quot;Dokumentation zu &amp;quot;constraints&amp;quot; in der offiziellen Grails Framework Reference&quot; href=&quot;http://grails.org/doc/latest/ref/Domain%20Classes/constraints.html&quot;&gt;constraints&lt;/a&gt;&lt;/p&gt;</content><updated>2011-05-09T00:00:00-03:00</updated><category term='Grails'/><link href='http://groovy-skills.com/Grails/2011/05/09/dry-verwendung-von-constraints-in-grails-view' rel='alternate'/></entry><entry><id>/Anwendungstipps/2011/03/10/suchmaschinenoptimierung-ubuntu-style-buchstaben-im-title-zahlen</id><title type='text'>Suchmaschinenoptimierung Ubuntu Style: Buchstaben im Title zählen</title><summary type='text'>Sucht man einen Begriff in einer Suchmaschine (z.B. ixquick, Google, Bing, Yahoo! …), wird in den Ergebnissen der Titel der gefundenen Seite verlinkt dargestellt.
Für diese Titel steht in der Regel begrenzter Platz zur Verfügung – normalerweise genau eine Zeile.
Die optimale Länge eines Seitentitels
</summary><content type='html'>&lt;p&gt;Sucht man einen Begriff in einer Suchmaschine (z.B. ixquick, Google, Bing, Yahoo! &amp;#8230;), wird in den Ergebnissen der &lt;strong&gt;Titel der gefundenen Seite&lt;/strong&gt; verlinkt dargestellt.&lt;/p&gt;
&lt;p&gt;Für diese Titel steht in der Regel begrenzter Platz zur Verfügung &amp;#8211; normalerweise genau eine Zeile.&lt;/p&gt;
&lt;h3&gt;Die optimale Länge eines Seitentitels&lt;/h3&gt;
&lt;p&gt;Wie lang eine solche Zeile sein darf unterscheidet sich geringfügig von Suchmaschine zu Suchmaschine. Man kann die Längen durch Tests herausfinden. &lt;a title=&quot;Artikel &amp;quot;Page Title Length for Search Engines&amp;quot; im Blog von Powermapper.com&quot; href=&quot;http://blog.powermapper.com/blog/post/Page-Title-Length-for-Search-Engines.aspx&quot;&gt;Im Blog von Powermapper&lt;/a&gt; sind die Ergebnisse solcher Tests aufgelistet.&lt;/p&gt;
&lt;p&gt;Eine &lt;strong&gt;Länge von 65 Zeichen&lt;/strong&gt; ist unter Berücksichtigung der gängigen Suchmaschinen optimal.&lt;/p&gt;
&lt;h3&gt;Die Anzahl der Zeichen im Titel zählen&lt;/h3&gt;
&lt;p&gt;Natürlich könnte man die Zeichen jeder Überschrift im Kopf zählen. Da sich das allerdings sehr aufwendig gestaltet, gibt es bei manchen Systemen einen entsprechenden Zähler.&lt;/p&gt;
&lt;p&gt;Hat man einen Blog im &lt;a title=&quot;Hauptseite des &amp;quot;Life Blogs&amp;quot; Netzwerks&quot; href=&quot;http://life.at&quot;&gt;Life Blogs Netzwerk&lt;/a&gt;, so ist dieser standardmäßig mit einem Zähler ausgestattet, welcher während der Eingabe die Anzahl der verwendeten Zeichen darstellt.&lt;/p&gt;
&lt;p&gt;Benötigt man einen Zähler für andere Webseiten (&lt;em&gt;z.B. Titel von YouTube Videos&lt;/em&gt;), so könnte man den Text dennoch im Blog eingeben und umkopieren, sobald die Länge korrekt ist.&lt;/p&gt;
&lt;p&gt;Versierte Nutzer werden es allerdings oft praktikabler finden, die Titellänge mit schnell verfügbaren Kommandos zu testen und anzupassen.&lt;/p&gt;
&lt;h3&gt;Kommando in Ubuntu/Linux und FreeBSD&lt;/h3&gt;
&lt;p&gt;In Unix-orientierten Systemen gibt es für gewöhnlich die beiden Befehle &lt;a title=&quot;FreeBSD Man-Page zum Kommando &amp;quot;echo&amp;quot;&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=echo&quot;&gt;echo(1)&lt;/a&gt; (eine Zeile Text anzeigen) sowie &lt;a title=&quot;FreeBSD Man Page zum Kommando &amp;quot;wc&amp;quot;&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=wc&amp;amp;sektion=1&quot;&gt;wc(1)&lt;/a&gt; (Bytes, Wörter und Zeilen von Dateien zählen).&lt;/p&gt;
&lt;p&gt;Folgende Zeile schickt den Text an &lt;strong&gt;wc&lt;/strong&gt;, welches wiederum die Anzahl der Zeichen ausgibt:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&amp;lt;span class=&quot;nb&quot;&amp;gt;echo&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;ZU PRÜFENDER SEITENTITEL&amp;amp;#39;&amp;lt;/span&amp;gt; | wc -m
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Wichtig:&lt;/strong&gt; Der Text in diesem Beispiel muss &lt;em&gt;frei von einfachen Hochkommata&lt;/em&gt; (&lt;code&gt;&apos;&lt;/code&gt;) sein.&lt;/p&gt;
&lt;p&gt;Nachdem man mit &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;ENTER&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt; bestätigt, wird die Anzahl der Zeichen ausgegeben. Mit der Taste &lt;strong&gt;Pfeil nach oben&lt;/strong&gt; holt man den Text wieder in die aktuelle Zeile, bearbeitet ihn erneut und bestätigt wieder mit &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;ENTER&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;. Das wiederholt man bis der Titel die gewünschte Länge erreicht hat.&lt;/p&gt;
&lt;h3&gt;Wo gibt man diese Kommandos ein?&lt;/h3&gt;
&lt;p&gt;In den aktuellen K/Ubuntu Versionen ist der sicherste Weg, den &lt;strong&gt;Schnellstarter (&lt;kbd&gt;Alt+F2&lt;/kbd&gt;)&lt;/strong&gt; aufzurufen und dort dann den &lt;em&gt;Programmnamen&lt;/em&gt; einzugeben:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;In Ubuntu/Gnome: &lt;strong&gt;gnome-terminal&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;In Kubuntu/&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;KDE&lt;/span&gt;&lt;/span&gt;: &lt;strong&gt;konsole&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;</content><updated>2011-03-10T00:00:00-02:00</updated><category term='Anwendungstipps'/><link href='http://groovy-skills.com/Anwendungstipps/2011/03/10/suchmaschinenoptimierung-ubuntu-style-buchstaben-im-title-zahlen' rel='alternate'/></entry><entry><id>/Grails/2011/01/29/bei-unerreichbarkeit-von-apache-tomcat-automatisch-eine-selbst-erstellte-html-seite-darstellen</id><title type='text'>Bei Unerreichbarkeit von Apache Tomcat automatisch eine selbst erstellte HTML-Seite darstellen</title><summary type='text'>Während eines “Redeploys” ist eine Applikation unerreichbar.
Hat man Apache HTTPD mit Tomcat verbunden, kann man diese Situationen und sogar den Ausfall des Apache Tomcat Dienstes elegant behandeln.
Die offizielle Dokumentation zu mod_jk definiert empfohlene Timeout-Werte. Bleibt eine Anfrage seitens</summary><content type='html'>&lt;p&gt;Während eines &amp;#8220;Redeploys&amp;#8221; ist eine Applikation unerreichbar.&lt;/p&gt;
&lt;p&gt;Hat man &lt;a title=&quot;Artikel &amp;quot;Apache HTTPD &amp;amp; Apache Tomcat 6 per AJP Connector verbinden (Ubuntu 10.04.1)&amp;quot;&quot; href=&quot;http://experience.life.at/2010/09/apache_httpd_und_apache_tomcat_6_per_ajp_connector_verbinden_ubuntu_10-04/&quot;&gt;Apache &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTPD&lt;/span&gt;&lt;/span&gt; mit Tomcat verbunden&lt;/a&gt;, kann man diese Situationen und sogar den Ausfall des Apache Tomcat Dienstes elegant behandeln.&lt;/p&gt;
&lt;p&gt;Die &lt;a title=&quot;Erklärung zu &amp;quot;CPing/CPong&amp;quot; im Abschnitt &amp;quot;JK Timeout Attributes&amp;quot; im offiziellen Apache Tomcat Connector Handbuch&quot; href=&quot;http://tomcat.apache.org/connectors-doc/generic_howto/timeouts.html#CPing/CPong&quot;&gt;offizielle Dokumentation zu mod_jk&lt;/a&gt; definiert empfohlene Timeout-Werte. Bleibt eine Anfrage seitens Tomcat innerhalb der definierten Zeitfenster unbeantwortet, kann Apache &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTPD&lt;/span&gt;&lt;/span&gt; eine alternative Seite mit entsprechenden Hinweisen ausliefern.&lt;/p&gt;
&lt;p&gt;Anstatt Besuchern kryptische und abschreckende Standard-Fehlermeldungen anzuzeigen, kann eine_ frei gestaltete Seite mit Hinweisen zum weiteren Vorgehen_ präsentiert werden. Dabei können alle Funktionalitäten der Apache &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTPD&lt;/span&gt;&lt;/span&gt; Installation (&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;&lt;/span&gt;, &amp;#8230;) genutzt werden. Eine einfache (X)&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;&lt;/span&gt; Seite ist oft ausreichend.&lt;br /&gt;
&lt;h2&gt;Apache &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTPD&lt;/span&gt;&lt;/span&gt;: Die ErrorDocument Direktiven konfigurieren&lt;/h2&gt;&lt;p&gt;&lt;br /&gt;
Welche Seite in einem solchen Fehlerfall angezeigt wird, definiert man in der &lt;em&gt;Apache &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTPD&lt;/span&gt;&lt;/span&gt; Konfigurationsdatei&lt;/em&gt; über &lt;a title=&quot;Dokumentation zu &amp;quot;ErrorDocument&amp;quot; im Apache HTTPD Handbuch&quot; href=&quot;http://httpd.apache.org/docs/2.2/de/mod/core.html#errordocument&quot;&gt;die ErrorDocument-Direktive&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Im folgenden Beispiel wird in der Datei &lt;em&gt;/etc/apache2/conf.d/localized-error-pages&lt;/em&gt; für &lt;a title=&quot;Abschnitt &amp;quot;Status Code Definitions&amp;quot; aus RFC 2616 (&amp;quot;Hypertext Transfer Protocol -- HTTP/1.1&amp;quot;)&quot; href=&quot;http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html&quot;&gt;einige der möglichen Statuscodes&lt;/a&gt; je eine &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;&lt;/span&gt;-Seite definiert.&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;apache&quot;&gt;&amp;lt;span class=&quot;c&quot;&amp;gt;# 404 - Not Found&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;nb&quot;&amp;gt;ErrorDocument&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;m&quot;&amp;gt;404&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;sx&quot;&amp;gt;/404.shtml&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;c&quot;&amp;gt;# 500 - Internal Server Error&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;nb&quot;&amp;gt;ErrorDocument&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;m&quot;&amp;gt;500&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;sx&quot;&amp;gt;/500.shtml&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;c&quot;&amp;gt;# 503 - Service Unavailable&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;nb&quot;&amp;gt;ErrorDocument&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;m&quot;&amp;gt;503&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;sx&quot;&amp;gt;/503.shtml&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Damit diese Seiten auch für Tomcat angezeigt werden, muss die Konfiguration des entsprechenden &lt;a title=&quot;Erklärung zu &amp;quot;workers.properties configuration&amp;quot; im offiziellen Apache Tomcat Connector Handbuch&quot; href=&quot;http://tomcat.apache.org/connectors-doc/reference/workers.html&quot;&gt;Workers&lt;/a&gt; angepasst werden. Nach Befolgen der &lt;a title=&quot;Artikel &amp;quot;Apache HTTPD &amp;amp; Apache Tomcat 6 per AJP Connector verbinden (Ubuntu 10.04.1)&amp;quot;&quot; href=&quot;http://experience.life.at/2010/09/apache_httpd_und_apache_tomcat_6_per_ajp_connector_verbinden_ubuntu_10-04/&quot;&gt;Anleitung zum Verbinden von Tomcat &amp;amp; &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTPD&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;, müsste der worker als &amp;#8220;&lt;strong&gt;ajp13_worker&lt;/strong&gt;&amp;#8221; benannt sein.&lt;/p&gt;&lt;br /&gt;
&lt;h2&gt;Apache Tomcat: Die worker.properties konfigurieren&lt;/h2&gt;&lt;br /&gt;
&lt;p&gt;Demnach sind folgende Werte in &lt;em&gt;/etc/libapache2-mod-jk/workers.properties&lt;/em&gt; einzutragen:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;apache&quot;&gt;&amp;lt;span class=&quot;err&quot;&amp;gt;worker&amp;lt;/span&amp;gt;.&amp;lt;span class=&quot;err&quot;&amp;gt;ajp13_worker&amp;lt;/span&amp;gt;.&amp;lt;span class=&quot;err&quot;&amp;gt;ping_mode=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nb&quot;&amp;gt;A&amp;lt;/span&amp;gt;
worker.ajp13_worker.ping_timeout=10000
&amp;lt;span class=&quot;err&quot;&amp;gt;worker&amp;lt;/span&amp;gt;.&amp;lt;span class=&quot;err&quot;&amp;gt;ajp13_worker&amp;lt;/span&amp;gt;.&amp;lt;span class=&quot;err&quot;&amp;gt;fail_on_status=500,503&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Die ersten beiden Zeilen definieren die Timeouts. Die dritte Zeile definiert bei welchen Statuscodes der Worker als &lt;em&gt;&amp;#8220;versagt&amp;#8221;&lt;/em&gt; (failed) betrachtet wird. In der offiziellen Dokumentation können &lt;a title=&quot;Abschnitt &amp;quot;Advanced Worker Directives&amp;quot; im Apache Tomcat Connector Reference Guide&quot; href=&quot;http://tomcat.apache.org/connectors-doc/reference/workers.html#Advanced%20Worker%20Directives&quot;&gt;Details zu fail_on_status&lt;/a&gt; nachgelesen werden.&lt;br /&gt;
&lt;h2&gt;Die Konfiguration testen&lt;/h2&gt;&lt;br /&gt;
Hat man beispielsweise die Datei &lt;strong&gt;503.shtml&lt;/strong&gt; entsprechend erstellt und abgelegt, kann man testen, ob sie korrekt angezeigt wird.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Dazu liest man die Apache &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTPD&lt;/span&gt;&lt;/span&gt; Konfiguration neu ein, stoppt Tomcat und versucht die entsprechende Applikation &lt;em&gt;per Browser&lt;/em&gt; zu erreichen.&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo service apache2 reload
sudo service tomcat6 stop
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Hinweis: Um &lt;a class=&quot;colorbox-link&quot; title=&quot;Artikel &amp;quot;Single Point of Failure&amp;quot; in der deutschsprachigen Wikipedia&quot; href=&quot;https://secure.wikimedia.org/wikipedia/de/wiki/Single_Point_of_Failure&quot;&gt;Server Single Points of Failure&lt;/a&gt; zu vermeiden bietet mod_jk sehr interessante Möglichkeiten um im Fehlerfall oder auch bei unterschiedlichen Zugriffen auf andere Server umzuleiten. Neben einer Redundanz welche die Verfügbarkeit der Dienste absichert kann damit eine effiziente Lastverteilung erreicht werden.&lt;/em&gt;&lt;/p&gt;&lt;/p&gt;</content><updated>2011-01-29T00:00:00-02:00</updated><category term='Grails'/><link href='http://groovy-skills.com/Grails/2011/01/29/bei-unerreichbarkeit-von-apache-tomcat-automatisch-eine-selbst-erstellte-html-seite-darstellen' rel='alternate'/></entry><entry><id>/Anwendungstipps/2011/01/19/tiny-tiny-rss-als-standard-feedreader-in-firefox-einrichten</id><title type='text'>Tiny Tiny RSS als Standard-Feedreader in Firefox einrichten</title><summary type='text'>Tiny Tiny RSS ist ein webbasierter open source Feed Aggregator. Sobald er auf einem Webserver installiert ist, kann man damit von überall aus Newsfeeds lesen und verwalten (Stichwort “Content-Syndication”).
Vielleicht schreibe ich demnächst mehr über die Software und ihre breiten Einsatzmöglichkeiten</summary><content type='html'>&lt;p&gt;&lt;a href=&quot;http://tt-rss.org/redmine/&quot; title=&quot;Offizielle Webpräsenz des TT RSS Projekts&quot;&gt;Tiny Tiny &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;&lt;/span&gt;&lt;/a&gt; ist ein webbasierter open source Feed Aggregator. Sobald er auf einem Webserver installiert ist, kann man damit von überall aus Newsfeeds lesen und verwalten (Stichwort &amp;#8220;&lt;a href=&quot;https://secure.wikimedia.org/wikipedia/de/wiki/Syndication#WWW&quot; title=&quot;Artikel &amp;amp;quot;Content-Syndication&amp;amp;quot; bei Wikipedia.&quot;&gt;Content-Syndication&lt;/a&gt;&amp;#8221;).&lt;/p&gt;
&lt;p&gt;Vielleicht schreibe ich demnächst mehr über die Software und ihre breiten Einsatzmöglichkeiten.&lt;/p&gt;
&lt;p&gt;Vorerst möchte ich hier erklären, wie man &lt;em&gt;Tiny Tiny &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;&lt;/span&gt; als Standard-Newsreader für &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;&lt;/span&gt;/Atom Feeds&lt;/em&gt; einrichtet.&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Website der* Tiny Tiny &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;&lt;/span&gt; Installation aufrufen*&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Einloggen&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;Rechts oben&lt;/em&gt; auf &lt;strong&gt;Einstellungen&lt;/strong&gt; klicken&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;Registerkarte&lt;/em&gt; &lt;strong&gt;Feeds&lt;/strong&gt; wählen&lt;/li&gt;
	&lt;li&gt;Darunter &lt;strong&gt;Firefox Integration ausklappen&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;Knopf&lt;/em&gt; &lt;strong&gt;Diese Website als Feedreader registrieren.&lt;/strong&gt; anklicken und bestätigen.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Firefox neu starten&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;Eine Website&lt;/em&gt; besuchen und den &lt;strong&gt;gewünschten Feed anklicken&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;Bei &lt;em&gt;Diesen Feed abonnieren mit&lt;/em&gt; &lt;strong&gt;Tiny Tiny &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;&lt;/span&gt; auswählen&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;[&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OPTIONAL&lt;/span&gt;&lt;/span&gt;] &lt;strong&gt;Häkchen&lt;/strong&gt; bei &lt;em&gt;Feeds immer mit Tiny Tiny &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;&lt;/span&gt; abonnieren.&lt;/em&gt; setzen&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;Knopf&lt;/em&gt; &lt;strong&gt;Jetzt abonnieren&lt;/strong&gt; klicken&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Hat man eingestellt, die Feeds immer mit Tiny Tiny &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;&lt;/span&gt; zu abonnieren (optionaler Punkt 10.) kann man dies später wie folgt ändern.&lt;br /&gt;
&lt;h3&gt;Einstellung für Standard-Newsreader ändern&lt;/h3&gt;&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Im &lt;em&gt;Firefox-Menü&lt;/em&gt; &lt;strong&gt;Bearbeiten &amp;gt; Einstellungen &amp;#8230;&lt;/strong&gt; klicken&lt;/li&gt;
	&lt;li&gt;Auf &lt;strong&gt;Anwendungen&lt;/strong&gt; klicken&lt;/li&gt;
	&lt;li&gt;Im &lt;em&gt;Suchfeld&lt;/em&gt; nach &lt;strong&gt;&amp;#8220;Web-Feed&amp;#8221;&lt;/strong&gt; filtern&lt;/li&gt;
	&lt;li&gt;In der &lt;em&gt;Spalte &amp;#8220;Aktion&amp;#8221;&lt;/em&gt; die &lt;strong&gt;gewünschte Auswahl treffen&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;</content><updated>2011-01-19T00:00:00-02:00</updated><category term='Anwendungstipps'/><link href='http://groovy-skills.com/Anwendungstipps/2011/01/19/tiny-tiny-rss-als-standard-feedreader-in-firefox-einrichten' rel='alternate'/></entry><entry><id>/Anwendungstipps/2010/12/31/samtliche-symbolische-links-zu-einer-bestimmten-datei-finden</id><title type='text'>Sämtliche symbolische Links zu einer bestimmten Datei finden</title><summary type='text'>Index-Node (Inode) Nummer der Datei feststellenls -di ${DATEI}

	Die gefundene Inode Nummer mittels find suchensudo find -L / -inum ${INODE_NUMMER} 2&gt;/dev/null

Einzeiler zum Finden sämtlicher Verweise auf die Datei
Gleiches wie oben als Einzeiler:
sudo find -L / -inum `ls -di ${DATEI} | awk &apos;{ print</summary><content type='html'>&lt;ol&gt;
	&lt;li&gt;Index-Node (Inode) Nummer der Datei feststellen&lt;br /&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;ls -di &amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;DATEI&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
	&lt;li&gt;Die gefundene Inode Nummer mittels &lt;code&gt;find&lt;/code&gt; suchen&lt;br /&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo find -L / -inum &amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;INODE_NUMMER&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt; 2&amp;amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Einzeiler zum Finden sämtlicher Verweise auf die Datei&lt;/h2&gt;
&lt;p&gt;Gleiches wie oben als Einzeiler:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo find -L / -inum &amp;lt;span class=&quot;sb&quot;&amp;gt;`&amp;lt;/span&amp;gt;ls -di &amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;DATEI&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt; | awk &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;{ print $1 }&amp;amp;#39;&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;sb&quot;&amp;gt;`&amp;lt;/span&amp;gt; 2&amp;amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Durch den Schalter &lt;strong&gt;-d&lt;/strong&gt; funktioniert der Befehl auch für Verzeichnisse.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://manpages.ubuntu.com/ls&quot; title=&quot;Ubuntu-Manpage zu Kommando &amp;#39;ls&amp;#39;&quot;&gt;ls(1)&lt;/a&gt;, &lt;a href=&quot;http://manpages.ubuntu.com/find&quot; title=&quot;Ubuntu-Manpage zu Subroutine &amp;#39;find&amp;#39;&quot;&gt;find(3)&lt;/a&gt;, &lt;a href=&quot;http://manpages.ubuntu.com/awk&quot; title=&quot;Ubuntu-Manpage zu Kommando &amp;#39;awk&amp;#39;&quot;&gt;awk(1)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Quelle: &lt;a href=&quot;http://ubuntuforums.org/showthread.php?t=90970&quot;&gt;http://ubuntuforums.org/showthread.php?t=90970&lt;/a&gt;&lt;/p&gt;</content><updated>2010-12-31T00:00:00-02:00</updated><category term='Anwendungstipps'/><link href='http://groovy-skills.com/Anwendungstipps/2010/12/31/samtliche-symbolische-links-zu-einer-bestimmten-datei-finden' rel='alternate'/></entry><entry><id>/Anwendungstipps/2010/12/31/anzeigen-wohin-ein-symbolischer-link-verweist</id><title type='text'>Anzeigen wohin ein symbolischer Link verweist</title><summary type='text'>readlink DATEINAME_DES_SYMLINK
</summary><content type='html'>&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;readlink DATEINAME_DES_SYMLINK
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><updated>2010-12-31T00:00:00-02:00</updated><category term='Anwendungstipps'/><link href='http://groovy-skills.com/Anwendungstipps/2010/12/31/anzeigen-wohin-ein-symbolischer-link-verweist' rel='alternate'/></entry><entry><id>/Anwendungstipps/2010/12/29/mittels-firefox-erweiterung-flagfox-den-domainbesitzer-bestimmen</id><title type='text'>Mittels Firefox Erweiterung Flagfox den Domainbesitzer bestimmen</title><summary type='text'>Immer wieder werde ich gebeten, herauszufinden, ob bestimmte Domains bereits vergeben sind oder wer aktuell Inhaber ist.
Folgender Linux-Befehl liefert für die gängigsten Top-Level-Domains rasch das Ergebnis:
whois GEWÜNSCHTEDOMAIN
Der Besuch von Whois-Websites wird dadurch meist überflüssig.
Wer die</summary><content type='html'>&lt;p&gt;Immer wieder werde ich gebeten, herauszufinden, ob bestimmte Domains bereits vergeben sind oder wer aktuell Inhaber ist.&lt;/p&gt;
&lt;p&gt;Folgender Linux-Befehl liefert für die gängigsten Top-Level-Domains rasch das Ergebnis:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;whois GEWÜNSCHTEDOMAIN
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Der Besuch von Whois-Websites wird dadurch meist überflüssig.&lt;/p&gt;
&lt;p&gt;Wer diese Möglichkeit verzichten muss, kann sich im &lt;a href=&quot;http://www.mozilla.com/de/firefox/?from=getfirefox&quot; title=&quot;Downloadbereich für den Firefox Browser auf Mozilla.org&quot;&gt;Firefox Web Browser&lt;/a&gt; eine andere Einrichtung konfigurieren.&lt;/p&gt;
&lt;p&gt;Die &amp;quot;Firefox-Erweiterung &amp;#8220;Flagfox&amp;#8221;(Beschreibung zum Plugin &amp;quot;Flagfox&amp;quot; auf der offiziellen Website von Mozilla)&amp;quot;:https://addons.mozilla.org/en-US/firefox/addon/5791/ fügt der Adresszeile eine kleine Flagge hinzu. Sie zeigt an, in welchem Land die gerade geöffnete Website gehostet wird.&lt;/p&gt;
&lt;p&gt;Klickt man &lt;em&gt;mit der &lt;strong&gt;rechten&lt;/strong&gt; Maustaste&lt;/em&gt; auf diese Flagge, erscheint in einem Kontext der Menüpunkt &amp;#8220;Whois&amp;#8221;. Wählt man diesen, wird der &lt;a href=&quot;http://whois.domaintools.com/&quot; title=&quot;WHOIS-Dienst bei DomainTools.com&quot;&gt;Whois-Dienst der Website DomainTools.com&lt;/a&gt; geöffnet.&lt;/p&gt;
&lt;p&gt;Für Kaufanfragen wendet man sich in der Regel &lt;em&gt;an den &lt;strong&gt;administrativen&lt;/strong&gt; Kontakt (&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;ADMIN&lt;/span&gt;&lt;/span&gt;-C)&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Manchmal sind die Informationen allerdings unvollständig. In diesem Fall findet sich oft ein Vermerk, welcher darauf hinweist, wo man den gesamten Whois-Eintrag abrufen kann ( &lt;em&gt;&amp;#8220;For complete domain details go to:&amp;#8221;&lt;/em&gt; ).&lt;/p&gt;
&lt;h3&gt;Zusammenfassung der einzelnen Schritte&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Einmalig&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Flagfox-Erweiterung für Firefox installieren&lt;/li&gt;
	&lt;li&gt;Firefox neu starten&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Für jede abzufragende Domain&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Die gewünschte &lt;em&gt;Website/Domain besuchen&lt;/em&gt;&lt;/li&gt;
	&lt;li&gt;Mit der_ rechten Maustaste_ auf die Flagfox-Flagge klicken&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;&amp;#8220;Whois&amp;#8221;&lt;/em&gt; anklicken&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;Überprüfen&lt;/em&gt; man den korrekten Whois-Datensatz gefunden hat (&lt;em&gt;&amp;#8220;Whois Record For GEWÜNSCHTEDOMAIN&amp;#8221;&lt;/em&gt;); Falls nicht, gibt man die korrekte Domain nochmals im Feld &lt;em&gt;&amp;#8220;Search Whois Records&amp;#8221;&lt;/em&gt; ein.&lt;/li&gt;
	&lt;li&gt;Die entsprechenden_ Kontaktdaten (z.B. &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;ADMIN&lt;/span&gt;&lt;/span&gt;-C) ansehen_ oder den Verweis zu den &amp;#8220;complete domain details&amp;#8221; folgen und sie dort auslesen.&lt;/li&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;Verwendet man einen anderen Browser, oder möchte man auf Flagfox verzichten, kann man natürlich auch direkt &lt;a href=&quot;http://whois.domaintools.com/&quot; title=&quot;WHOIS-Dienst bei DomainTools.com&quot;&gt;whois.domaintools.com&lt;/a&gt; besuchen und die Domain direkt eingeben.&lt;/em&gt;&lt;/p&gt;</content><updated>2010-12-29T00:00:00-02:00</updated><category term='Anwendungstipps'/><link href='http://groovy-skills.com/Anwendungstipps/2010/12/29/mittels-firefox-erweiterung-flagfox-den-domainbesitzer-bestimmen' rel='alternate'/></entry><entry><id>/Grails/2010/09/21/apache_httpd_und_apache_tomcat_6_per_ajp_connector_verbinden_ubuntu_10-04</id><title type='text'>Apache HTTPD &amp;amp; Apache Tomcat 6 per AJP Connector verbinden (Ubuntu 10.04.1)</title><summary type='text'>In manchen Fällen ist sinnvoll, den Apache HTTP Server in Verbindung mit dem Apache Tomcat-Dienst einzusetzen. Die meisten Anwendungsgebiete finden sich, wenn die beiden Dienste auf unterschiedlichen physischen Servern betrieben werden sollen.
Sind beide Dienste am selben Server, so soll bevorzugt da</summary><content type='html'>&lt;p&gt;In &lt;a title=&quot;Apache Tomcat Wiki - FAQ: Connectors&quot; href=&quot;http://wiki.apache.org/tomcat/FAQ/Connectors#Q3&quot;&gt;manchen Fällen&lt;/a&gt; ist sinnvoll, den &lt;a title=&quot;Offizielle Website des Apache HTTP Server Projekts&quot; href=&quot;http://httpd.apache.org/&quot;&gt;Apache &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;&lt;/span&gt; Server&lt;/a&gt; in Verbindung mit dem &lt;a title=&quot;Offizielle Website des Apache HTTP Server Projekts&quot; href=&quot;http://tomcat.apache.org/&quot;&gt;Apache Tomcat&lt;/a&gt;-Dienst einzusetzen. &lt;a title=&quot;Artikel &amp;quot;Fronting Tomcat&amp;quot; von Mladen Turk&quot; href=&quot;http://people.apache.org/%7Emturk/docs/article/ftwai.html&quot;&gt;Die meisten Anwendungsgebiete&lt;/a&gt; finden sich, wenn die beiden Dienste &lt;em&gt;auf unterschiedlichen physischen Servern&lt;/em&gt; betrieben werden sollen.&lt;/p&gt;
&lt;p&gt;Sind beide Dienste am selben Server, so soll bevorzugt das &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;AJP&lt;/span&gt;&lt;/span&gt; (&lt;a title=&quot;Wikipedia: Apache JServ Protocol&quot; href=&quot;http://de.wikipedia.org/wiki/Apache_JServ_Protocol&quot;&gt;Apache JServ Protocol&lt;/a&gt;) bzw. der &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;AJP&lt;/span&gt;&lt;/span&gt;-Connector verwendet werden um die Kommunikation herzustellen.&lt;br /&gt;
&lt;blockquote&gt;When using a single server, the performance when using a native webserver in  front of the Tomcat instance is most of the time significantly worse than a standalone Tomcat with its default &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;&lt;/span&gt; connector, even if a large part of the web application is made of static files. If integration with the native webserver is  needed for any reason, an &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;AJP&lt;/span&gt;&lt;/span&gt; connector will provide faster performance than  proxied &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;&lt;/span&gt;. &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;AJP&lt;/span&gt;&lt;/span&gt; clustering is the most efficient from the Tomcat perspective.  It is otherwise functionally equivalent to &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;&lt;/span&gt; clustering. [Von &lt;a title=&quot;Apache Tomcat 6 Handbuch: Connectors&quot; href=&quot;http://tomcat.apache.org/tomcat-6.0-doc/connectors.html&quot;&gt;http://tomcat.apache.org/tomcat-6.0-doc/connectors.html&lt;/a&gt;]&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;
Folgende Anleitung beschreibt die Einrichtung des Connectors auf einem &lt;a title=&quot;Ubuntu.com: Ubuntu Server&quot; href=&quot;http://www.ubuntu.com/server&quot;&gt;Ubuntu 10.04.1 &lt;/a&gt;Server.&lt;/p&gt;&lt;br /&gt;
&lt;h2&gt;Voraussetzungen&lt;/h2&gt;&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
	&lt;li&gt;Apache 2.2 (&lt;code&gt;sudo apt-get install apache2.2-bin&lt;/code&gt;)&lt;/li&gt;&lt;br /&gt;
	&lt;li&gt;Apache Tomcat 6 (&lt;code&gt;sudo apt-get install tomcat6&lt;/code&gt;)&lt;/li&gt;&lt;/p&gt;
&lt;/ul&gt;
&lt;h2&gt;Apache 2 Connector installieren&lt;/h2&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo apt-get install libapache2-mod-jk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;Apache &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;&lt;/span&gt; konfigurieren&lt;/h2&gt;
&lt;p&gt;In &lt;em&gt;Datei /etc/apache2/sites-enabled/000-default&lt;/em&gt; innerhalb der entsprechenden  _&lt;VirtualHost&gt; Direktive _einen &amp;#8220;Einhängepunkt&amp;#8221; für die Tomcat-Applikation festlegen:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;apache&quot;&gt;&amp;lt;span class=&quot;nb&quot;&amp;gt;JkMount&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;sx&quot;&amp;gt;/NAME_DER_TOMCAT_APPLIKATION/&amp;lt;/span&amp;gt;* ajp13_worker
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(Details hierzu unter &lt;a title=&quot;Apache Tomcat 3.3 Manual: Working with mod_jk&quot; href=&quot;http://tomcat.apache.org/tomcat-3.3-doc/mod_jk-howto.html#s73&quot;&gt;Working with mod_jk&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Jk in der &lt;em&gt;Datei /etc/apache2/mods-enabled/jk.load&lt;/em&gt; konfigurieren:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;apache&quot;&gt;&amp;lt;span class=&quot;nb&quot;&amp;gt;LoadModule&amp;lt;/span&amp;gt; jk_module &amp;lt;span class=&quot;sx&quot;&amp;gt;/usr/lib/apache2/modules/mod_jk.so&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;nb&quot;&amp;gt;JkWorkersFile&amp;lt;/span&amp;gt;   &amp;lt;span class=&quot;sx&quot;&amp;gt;/etc/libapache2-mod-jk/workers.properties&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;nb&quot;&amp;gt;JkLogFile&amp;lt;/span&amp;gt;       &amp;lt;span class=&quot;sx&quot;&amp;gt;/var/log/apache2/mod_jk.log&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;nb&quot;&amp;gt;JkLogLevel&amp;lt;/span&amp;gt;      &amp;lt;span class=&quot;k&quot;&amp;gt;error&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(&lt;em&gt;workers.properties&lt;/em&gt; enthält unter anderem die Konfiguration für den oben eingesetzten &amp;#8220;ajp13_worker&amp;#8221;. Die Datei wird automatisch bei der Installation des Pakets libapache2-mod-jk angelegt)&lt;br /&gt;
&lt;h2&gt;Apache Tomcat konfigurieren&lt;/h2&gt;&lt;p&gt;&lt;br /&gt;
In der &lt;em&gt;Datei /etc/tomcat6/server.xml&lt;/em&gt; ist die nötige Zeile bereits &amp;#8211; auskommentiert &amp;#8211; vorhanden. Um den Zugriff von Apache &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;&lt;/span&gt; zu ermöglichen, muss die folgende Zeile aktiviert werden, indem man die Kommentarzeichen entfernt:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt; &amp;lt;span class=&quot;nt&quot;&amp;gt;&amp;amp;lt;Connector&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;port=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;8009&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;protocol=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;AJP/1.3&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;na&quot;&amp;gt;redirectPort=&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;s&quot;&amp;gt;&amp;amp;quot;8443&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;nt&quot;&amp;gt;/&amp;amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3&gt;[&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OPTIONAL&lt;/span&gt;&lt;/span&gt;] Direkten Zugriff zu Apache Tomcat deaktivieren&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Möchte man ausschließlich Zugriffe via Apache &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;&lt;/span&gt; erlauben, kann man den Connector-Block für das &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;&lt;/span&gt;-Protokoll in Tomcat auskommentieren:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt;&amp;lt;span class=&quot;c&quot;&amp;gt;&amp;amp;lt;!-- commented out to disable direct access to Tomcat&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;c&quot;&amp;gt;&amp;amp;lt;Connector port=&amp;amp;quot;8080&amp;amp;quot; protocol=&amp;amp;quot;HTTP/1.1&amp;amp;quot;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;c&quot;&amp;gt;connectionTimeout=&amp;amp;quot;20000&amp;amp;quot;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;c&quot;&amp;gt;URIEncoding=&amp;amp;quot;UTF-8&amp;amp;quot;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;c&quot;&amp;gt;redirectPort=&amp;amp;quot;8443&amp;amp;quot; /&amp;amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;c&quot;&amp;gt;--&amp;amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;Apache &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;&lt;/span&gt; und Apache Tomcat neu laden / starten&lt;/h2&gt;&lt;br /&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo service apache2 reload
sudo service tomcat6 restart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;Siehe auch&lt;/h2&gt;&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
	&lt;li&gt;&lt;a title=&quot;Docshare.com Installing Tomcat6 on Ubuntu with Jk Connector&quot; href=&quot;http://www.docshare.com/doc/197611/Installing-Tomcat6-on-Ubuntu-with-Jk-Connector&quot;&gt;Installing Tomcat6 on Ubuntu with Jk Connector&lt;/a&gt;&lt;/li&gt;&lt;/p&gt;
&lt;/ul&gt;</content><updated>2010-09-21T00:00:00-03:00</updated><category term='Grails'/><link href='http://groovy-skills.com/Grails/2010/09/21/apache_httpd_und_apache_tomcat_6_per_ajp_connector_verbinden_ubuntu_10-04' rel='alternate'/></entry><entry><id>/Linux/2009/12/09/rdesktop-patch-mittels-alt-tab-aus-rdesktop-session-weg-wechseln</id><title type='text'>rdesktop Patch: Mittels Alt-Tab aus rdesktop-Session weg wechseln</title><summary type='text'>Folgendes Patch für rdesktop 1.6.0 verhindert, dass die Tastenkombination Alt-Tab innerhalb der Session gefangen wird.
Somit ist es möglich diese Kombination zu nutzen um zu anderen Anwendungen des Hauptsystems zu wechseln.
--- rdesktop-1.6.0/xkeymap.c	2007-10-08 14:34:05.000000000 +0200
+++ rdesktop</summary><content type='html'>&lt;p&gt;Folgendes Patch für &lt;strong&gt;rdesktop 1.6.0&lt;/strong&gt; verhindert, dass die Tastenkombination &lt;kbd&gt;Alt-Tab&lt;/kbd&gt; innerhalb der Session gefangen wird.&lt;/p&gt;
&lt;p&gt;Somit ist es möglich diese Kombination zu nutzen um zu anderen Anwendungen des Hauptsystems zu wechseln.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;diff&quot;&gt;&amp;lt;span class=&quot;gd&quot;&amp;gt;--- rdesktop-1.6.0/xkeymap.c	2007-10-08 14:34:05.000000000 +0200&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;gi&quot;&amp;gt;+++ rdesktop-1.6.0vle/xkeymap.c	2009-12-09 16:25:32.000000000 +0100&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;gu&quot;&amp;gt;@@ -597,6 +597,23 @@&amp;lt;/span&amp;gt;
 				ui_seamless_toggle();
 			break;

&amp;lt;span class=&quot;gi&quot;&amp;gt;+		/* Added to allow ALT(left only)+TAB with local machines&amp;amp;#39; windows&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;gi&quot;&amp;gt;+		* note that no keyboard-shortcut relying on ALT_L will work within the RDP-session! */&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;gi&quot;&amp;gt;+		case XK_Alt_L:&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;gi&quot;&amp;gt;+			XUngrabKeyboard(g_display, CurrentTime);&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;gi&quot;&amp;gt;+&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;gi&quot;&amp;gt;+		/* alternatively switch Windows on Alt-Tab-Tab */&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;gi&quot;&amp;gt;+/*		case XK_Tab:&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;gi&quot;&amp;gt;+			if (get_key_state(state, XK_Alt_L))&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;gi&quot;&amp;gt;+			{&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;gi&quot;&amp;gt;+*/&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;gi&quot;&amp;gt;+				/* Alt-Tab:&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;gi&quot;&amp;gt;+				* Ungrab the keyboard so that user can use Windows manager&amp;amp;#39;s hot keys */&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;gi&quot;&amp;gt;+/*&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;gi&quot;&amp;gt;+				XUngrabKeyboard(g_display, CurrentTime);&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;gi&quot;&amp;gt;+			}&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;gi&quot;&amp;gt;+*/&amp;lt;/span&amp;gt;
&amp;lt;span class=&quot;gi&quot;&amp;gt;+			break;&amp;lt;/span&amp;gt;
 	}
 	return False;
 }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;http://manpages.ubuntu.com/rdesktop.1&quot; title=&quot;Ubuntu-Manpage zu Kommando &amp;#39;rdesktop - Remote Desktop Protocol client&amp;#39;&quot;&gt;rdesktop(1)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Für viele Anwendungsfälle ist &lt;a href=&quot;http://www.cendio.com/seamlessrdp/&quot; title=&quot;Cendia SeamlessRDP&quot;&gt;SeamlessRDP&lt;/a&gt; eine sinnvolle Alternative zu diesem Patch.&lt;/p&gt;</content><updated>2009-12-09T00:00:00-02:00</updated><category term='Linux'/><link href='http://groovy-skills.com/Linux/2009/12/09/rdesktop-patch-mittels-alt-tab-aus-rdesktop-session-weg-wechseln' rel='alternate'/></entry><entry><id>/Anwendungstipps/2009/09/02/windows-xp-nach-mainboard--oder-festplattentausch-lauffahig-machen</id><title type='text'>Windows XP nach Mainboard- oder Plattentausch lauffähig machen</title><summary type='text'>Wechselt man bei einem Windows XP System grundlegende Hardware wie das Motherboard, kann dadurch der Betriebssystemstart versagen. Gleiches gilt natürlich, wenn man eine Festplatte mit Windows in einen anderen PC nutzen möchte.
Problembehebung nach dem Umbau
Wenn der Umbau bereits erfolgt ist, kann d</summary><content type='html'>&lt;p&gt;Wechselt man bei einem &lt;b&gt;Windows XP System&lt;/b&gt; grundlegende Hardware wie das &lt;strong&gt;Motherboard&lt;/strong&gt;, kann dadurch der Betriebssystemstart versagen. Gleiches gilt natürlich, wenn man eine Festplatte mit Windows in einen anderen PC nutzen möchte.&lt;/p&gt;
&lt;h2&gt;Problembehebung nach dem Umbau&lt;/h2&gt;
&lt;p&gt;Wenn der Umbau bereits erfolgt ist, kann das Problem wie folgt behoben werden:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.ubcd4win.com/downloads.htm&quot; title=&quot;Abschnitt &amp;#39;Dowsloads&amp;#39; auf der offizielle Website von UBCD4Win&quot;&gt;&lt;b&gt;Ultimate Boot CD for Windows (UBCD4Win)&lt;/b&gt;&lt;/a&gt; herunterladen und installieren&lt;/li&gt;
	&lt;li&gt;&lt;b&gt;UBCD4Win&lt;/b&gt; ausführen&lt;/li&gt;
	&lt;li&gt;Originale &lt;strong&gt;Windows XP CD einlegen&lt;/strong&gt; und als Quellmedium angeben&lt;/li&gt;
	&lt;li&gt;Quellmedium durch &lt;strong&gt;Klick auf &amp;#8220;Check&amp;#8221;&lt;/strong&gt; validieren&lt;/li&gt;
	&lt;li&gt;&lt;b&gt;UBCD4Win&lt;/b&gt; brennen&lt;/li&gt;
	&lt;li&gt;Computer von der &lt;b&gt;UBCD4Win&lt;/b&gt; CD starten&lt;/li&gt;
	&lt;li&gt;Im Boot-Menü &lt;strong&gt;Launch “The Ultimate Boot CD for Windows”&lt;/strong&gt; laden&lt;/li&gt;
	&lt;li&gt;Zu &lt;em&gt;Start &amp;gt; Programs &amp;gt; Registry Tools &amp;gt; Fix_hdc &amp;gt; Fix hard disk controller&lt;/em&gt; navigieren&lt;/li&gt;
	&lt;li&gt;Mit Taste &lt;kbd&gt;M&lt;/kbd&gt; eine &lt;strong&gt;Aktualisierung der Massenspeicher-Treiber veranlassen&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;Computer ohne CD &lt;strong&gt;neu starten&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Quellen und weiterführende Informationen:&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.raymond.cc/blog/archives/2008/07/09/move-windows-xp-hard-drive-or-change-motherboard-without-getting-blue-screen-of-death/&quot; title=&quot;Blogartikel &amp;#39;Move Windows XP hard drive or change Motherboard without getting Blue Screen of Death&amp;#39;&quot;&gt;&lt;cite&gt;Move Windows XP hard drive or change Motherboard without getting Blue Screen of Death&lt;/cite&gt;&lt;/a&gt; &amp;#8211; Raymond.cc&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://michaelstevenstech.com/moving_xp.html&quot; title=&quot;Abschnitt &amp;#39;Move XP: Changing a Motherboard or Moving a Hard Drive with XP Installed&amp;#39;&quot;&gt;&lt;cite&gt;Changing a Motherboard or Moving a Hard Drive with XP Installed&lt;/cite&gt;&lt;/a&gt; &amp;#8211; MichaelStevensTech.com&lt;/li&gt;
&lt;/ul&gt;</content><updated>2009-09-02T00:00:00-03:00</updated><category term='Anwendungstipps'/><link href='http://groovy-skills.com/Anwendungstipps/2009/09/02/windows-xp-nach-mainboard--oder-festplattentausch-lauffahig-machen' rel='alternate'/></entry><entry><id>/Anwendungstipps/2009/06/08/exif-information-uber-die-erstellungszeit-eines-fotos-korrigieren</id><title type='text'>Exif-Information über die Erstellungszeit eines Fotos korrigieren</title><summary type='text'>Im Exif (Exchangeable Image File Format) Header einer JPEG-Datei werden Metadaten zum jeweiligen Bild gespeichert. Mit dem Werkzeug jhead können diese Informationen per Kommandozeile geändert werden.
Hat man beispielsweise bei einer Reise in eine andere Zeitzone versäumt, die Zeit der Kamera auf die </summary><content type='html'>&lt;p&gt;Im &lt;b&gt;Exif (Exchangeable Image File Format) Header&lt;/b&gt; einer &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;JPEG&lt;/span&gt;&lt;/span&gt;-Datei werden Metadaten zum jeweiligen Bild gespeichert. Mit dem Werkzeug &lt;b&gt;jhead&lt;/b&gt; können diese Informationen per Kommandozeile geändert werden.&lt;/p&gt;
&lt;p&gt;Hat man beispielsweise bei einer Reise in eine andere Zeitzone versäumt, die Zeit der Kamera auf die lokale Zeit umzustellen, kann man mit &lt;b&gt;jhead&lt;/b&gt; nachträglich eine entsprechende Korrektur vornehmen.&lt;/p&gt;
&lt;p&gt;Folgendes Beispiel setzt die &lt;strong&gt;Erstellungszeit des Bildes um 6 Stunden früher&lt;/strong&gt; als in der Datei ursprünglich angegeben:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&amp;lt;span class=&quot;c&quot;&amp;gt;# jhead installieren&amp;lt;/span&amp;gt;
sudo apt-get install jhead
&amp;lt;span class=&quot;c&quot;&amp;gt;# &amp;amp;quot;Time-adjust&amp;amp;quot; um minus 6 Stunden&amp;lt;/span&amp;gt;
jhead -ta-6:00 &amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;JPEG_BILD&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;http://manpages.ubuntu.com/jhead.1&quot; title=&quot;Ubuntu-Manpage zu Kommando &amp;#39;jhead - Digicam JPEG Exif header manipulation tool&amp;#39;&quot;&gt;jhead(1)&lt;/a&gt;&lt;/p&gt;</content><updated>2009-06-08T00:00:00-03:00</updated><category term='Anwendungstipps'/><link href='http://groovy-skills.com/Anwendungstipps/2009/06/08/exif-information-uber-die-erstellungszeit-eines-fotos-korrigieren' rel='alternate'/></entry><entry><id>/Anwendungstipps/2008/07/14/t-mobile-webnwalk-card-compact-iii-in-ubuntu-8-04-einrichten</id><title type='text'>T Mobile web&apos;n&apos;walk Card compact III in Ubuntu 8.04 einrichten</title><summary type='text'>T Mobile web’n’walk Card compact III ist lediglich die Markenbezeichnung für eine Option GlobeTrotter Max.
HSO Treiber installieren
tar zxf hso-1.2.tar.gz
cd hso
make
sudo make install
Rezero installieren
tar xzvf rezero_hso-udev.tar.gz
cd rezero_hso-udev
# Direkt installieren, statt, wie in manchen </summary><content type='html'>&lt;p&gt;&lt;em&gt;&lt;strong&gt;T Mobile web&amp;#8217;n&amp;#8217;walk Card compact &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;III&lt;/span&gt;&lt;/span&gt; ist lediglich die Markenbezeichnung für eine Option GlobeTrotter Max.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HSO&lt;/span&gt;&lt;/span&gt; Treiber installieren&lt;/h2&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;tar zxf hso-1.2.tar.gz
&amp;lt;span class=&quot;nb&quot;&amp;gt;cd &amp;lt;/span&amp;gt;hso
make
sudo make install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;Rezero installieren&lt;/h2&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;tar xzvf rezero_hso-udev.tar.gz
&amp;lt;span class=&quot;nb&quot;&amp;gt;cd &amp;lt;/span&amp;gt;rezero_hso-udev
&amp;lt;span class=&quot;c&quot;&amp;gt;# Direkt installieren, statt, wie in manchen Anleitungen beschrieben, neu kompilieren (make)&amp;lt;/span&amp;gt;
sudo make install
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;Treiber &amp;#8220;option&amp;#8221; in Blacklist aufnehmen&lt;/h2&gt;
&lt;p&gt;Da der &lt;strong&gt;option&lt;/strong&gt; Treiber mit &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HSO&lt;/span&gt;&lt;/span&gt; in Konflikt steht, muss er per Blacklisting deaktiviert werden.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&amp;lt;span class=&quot;nb&quot;&amp;gt;echo&amp;lt;/span&amp;gt; &amp;lt;span class=&quot;s2&quot;&amp;gt;&amp;amp;quot;blacklist option&amp;amp;quot;&amp;lt;/span&amp;gt; &amp;amp;gt;&amp;amp;gt; /etc/modprobe.d/blacklist
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;HSOLink installieren&lt;/h2&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;sudo dpkg -i --force-architecture hsolink_1.0.46-1_i386.deb
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Der Benutzer muss Mitglied der Gruppe &lt;strong&gt;dialout&lt;/strong&gt; sein:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;usermod -a -G dialout BENUTZERNAME
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Quellen:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://rende.se/index.php?n=Main.UbuntuHardyOnT61#GTMax&quot;&gt;Dag Rende: Ubuntu 8.04 on ThinkPad T61 &amp;#8211; Option GlobeTrotter Max 7.2 ready 3G modem&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.pharscape.org/Linux-and-3G.html&quot;&gt;PHARscape: Linux and 3G&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><updated>2008-07-14T00:00:00-03:00</updated><category term='Anwendungstipps'/><link href='http://groovy-skills.com/Anwendungstipps/2008/07/14/t-mobile-webnwalk-card-compact-iii-in-ubuntu-8-04-einrichten' rel='alternate'/></entry><entry><id>/Anwendungstipps/2007/03/22/audiodatei-per-cuesheet-aufteilen</id><title type='text'>Audiodatei per Cuesheet aufteilen</title><summary type='text'>Falls die Datei in einem anderen Format vorliegt, muss sie zuerst in eine WAVE (Waveform Audio File Format) umgewandelt werden. Dazu kann mplayer verwendet werden. Beispiel:
# audiodump.wav erzeugen
mplayer audiodatei.flac -ao pcm
mplayer(1)
Anschließend wird die WAV-Datei mit Hilfe der Informationen</summary><content type='html'>&lt;p&gt;Falls die Datei in einem anderen Format vorliegt, muss sie zuerst in eine &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;WAVE&lt;/span&gt;&lt;/span&gt; (Waveform Audio File Format)&lt;/strong&gt; umgewandelt werden. Dazu kann &lt;strong&gt;mplayer&lt;/strong&gt; verwendet werden. Beispiel:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&amp;lt;span class=&quot;c&quot;&amp;gt;# audiodump.wav erzeugen&amp;lt;/span&amp;gt;
mplayer audiodatei.flac -ao pcm
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;http://manpages.ubuntu.com/mplayer.1&quot; title=&quot;Ubuntu-Manpage zu Kommando &amp;#39;mplayer - movie player&amp;#39;&quot;&gt;mplayer(1)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Anschließend wird die &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;WAV&lt;/span&gt;&lt;/span&gt;-Datei mit Hilfe der Informationen aus dem &lt;strong&gt;Cuesheet&lt;/strong&gt; und dem Programm &lt;strong&gt;bchunk&lt;/strong&gt; aufgeteilt.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;bchunk audiodump.wav cuesheet.cue -w &amp;lt;span class=&quot;k&quot;&amp;gt;${&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;nv&quot;&amp;gt;BELIEBIGER_PRAEFIX&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;k&quot;&amp;gt;}&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;http://manpages.ubuntu.com/bchunk.1&quot; title=&quot;Ubuntu-Manpage zu Kommando &amp;#39;bchunk - CD image format conversion from bin/cue to iso/cdr&amp;#39;&quot;&gt;bchunk(1)&lt;/a&gt;&lt;/p&gt;</content><updated>2007-03-22T00:00:00-03:00</updated><category term='Anwendungstipps'/><link href='http://groovy-skills.com/Anwendungstipps/2007/03/22/audiodatei-per-cuesheet-aufteilen' rel='alternate'/></entry><entry><id>/Anwendungstipps/2006/05/10/dateien-in-verzeichnis-zahlen</id><title type='text'>Dateien in Verzeichnis zählen</title><summary type='text'>find ./ -type f | wc -l
find(3), wc(1)</summary><content type='html'>&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;find ./ -type f | wc -l
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;http://manpages.ubuntu.com/find&quot; title=&quot;Ubuntu-Manpage zu Subroutine &amp;#39;find&amp;#39;&quot;&gt;find(3)&lt;/a&gt;, &lt;a href=&quot;http://manpages.ubuntu.com/wc&quot; title=&quot;Ubuntu-Manpage zum Kommando &amp;#39;wc&amp;#39;&quot;&gt;wc(1)&lt;/a&gt;&lt;/p&gt;</content><updated>2006-05-10T00:00:00-03:00</updated><category term='Anwendungstipps'/><link href='http://groovy-skills.com/Anwendungstipps/2006/05/10/dateien-in-verzeichnis-zahlen' rel='alternate'/></entry><entry><id>/Anwendungstipps/2005/11/17/kde-version-ausgeben</id><title type='text'>KDE Version ausgeben</title><summary type='text'># in KDE3
kde-config -v

# in KDE4
kde4-config -v
kde-config(1), kde4-config(1)</summary><content type='html'>&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&amp;lt;span class=&quot;c&quot;&amp;gt;# in KDE3&amp;lt;/span&amp;gt;
kde-config -v

&amp;lt;span class=&quot;c&quot;&amp;gt;# in KDE4&amp;lt;/span&amp;gt;
kde4-config -v
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;http://manpages.ubuntu.com/kde-config&quot; title=&quot;Ubuntu-Manpage zum Kommando &amp;#39;kde-config&amp;#39;&quot;&gt;kde-config(1)&lt;/a&gt;, &lt;a href=&quot;http://manpages.ubuntu.com/kde4-config&quot; title=&quot;Ubuntu-Manpage zum Kommando &amp;#39;kde4-config&amp;#39;&quot;&gt;kde4-config(1)&lt;/a&gt;&lt;/p&gt;</content><updated>2005-11-17T00:00:00-02:00</updated><category term='Anwendungstipps'/><link href='http://groovy-skills.com/Anwendungstipps/2005/11/17/kde-version-ausgeben' rel='alternate'/></entry><entry><id>/Anwendungstipps/2005/10/24/webinhalte-mittels-wget-leechen</id><title type='text'>Webinhalte mittels wget leechen</title><summary type='text'>Beispiel: Sämtliche PNG-Dateien herunterladen
wget -e robots=off -r -l1 -A.png http://example.org
-e robots=off robots.txt ignorieren
	-r rekursiv
	-l Anzahl Levels bei Rekursion (ACHTUNG: -l0 bedeutet unendlich)
	-A akzeptierte Dateiypen (kommagetrennt)
wget(1)
Quelle/weitere Infos: How to non-inter</summary><content type='html'>&lt;p&gt;&lt;strong&gt;Beispiel: Sämtliche &lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PNG&lt;/span&gt;&lt;/span&gt;-Dateien herunterladen&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;wget -e &amp;lt;span class=&quot;nv&quot;&amp;gt;robots&amp;lt;/span&amp;gt;&amp;lt;span class=&quot;o&quot;&amp;gt;=&amp;lt;/span&amp;gt;off -r -l1 -A.png http://example.org
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;-e robots=off&lt;/code&gt; robots.txt ignorieren&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;-r&lt;/code&gt; rekursiv&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;-l&lt;/code&gt; Anzahl Levels bei Rekursion (&lt;span class=&quot;caps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;ACHTUNG&lt;/span&gt;&lt;/span&gt;: -l0 bedeutet unendlich)&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;-A&lt;/code&gt; akzeptierte Dateiypen (kommagetrennt)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://manpages.ubuntu.com/wget.1.html&quot; title=&quot;Ubuntu-Manpage zu Kommando &amp;#39;wget - the non-interactive network downloader&amp;#39;&quot;&gt;wget(1)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quelle/weitere Infos:&lt;/strong&gt; &lt;a href=&quot;http://www.akadia.com/services/wget.html&quot;&gt;How to non-interactively retrieve files from the Web&lt;/a&gt;&lt;/p&gt;</content><updated>2005-10-24T00:00:00-02:00</updated><category term='Anwendungstipps'/><link href='http://groovy-skills.com/Anwendungstipps/2005/10/24/webinhalte-mittels-wget-leechen' rel='alternate'/></entry><entry><id>/Anwendungstipps/2005/10/24/mittels-awk-leerzeilen-aus-einer-textdatei-entfernen</id><title type='text'>Mittels awk Leerzeilen aus einer Textdatei entfernen</title><summary type='text'>cat infile | awk &apos;{ if ($0) print }&apos; &gt; outfile
</summary><content type='html'>&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;cat infile | awk &amp;lt;span class=&quot;s1&quot;&amp;gt;&amp;amp;#39;{ if ($0) print }&amp;amp;#39;&amp;lt;/span&amp;gt; &amp;amp;gt; outfile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><updated>2005-10-24T00:00:00-02:00</updated><category term='Anwendungstipps'/><link href='http://groovy-skills.com/Anwendungstipps/2005/10/24/mittels-awk-leerzeilen-aus-einer-textdatei-entfernen' rel='alternate'/></entry></feed>