<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>Groovy Skills International</title>
 <link href="http://groovy-skills.com/atom.xml" rel="self"/>
 <link href="http://groovy-skills.com"/>
 <updated>2025-10-15T12:26:39+02:00</updated>
 <id>http://groovy-skills.com</id>
 <author>
   <name>Dice</name>

   
 </author>

 
 <entry>
   <title>Konfiguration für Dovecot-Version 2.4 formatieren</title>
   <link href="http://groovy-skills.com/linux/2025/10/14/konfiguration-fur-dovecot-version-2-dot-4-formatieren"/>
   <updated>2025-10-14T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2025/10/14/konfiguration-fur-dovecot-version-2-dot-4-formatieren</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;Dovecot Version 2.4 verwendet für die Konfiguration andere Direktiven&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; als die Vorgängerversionen. Eine Paket-Aktualisierung könnte den Benutzer mit der Notwendigkeit zur Anpassung überraschen.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Insbesondere wenn man den Mailzusteller weitestgehend mit Standardwerten konfiguriert hat um &lt;em&gt;ihn als lokalen Mailspeicher zu betreiben &lt;sup class=&quot;footnote&quot; id=&quot;fnr2&quot;&gt;&lt;a href=&quot;#fn2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/em&gt;, kann man mit wenigen Änderungen an der Beispiel-Konfiguration den Betrieb wieder aufnehmen:&lt;/p&gt;
&lt;h2&gt;Bisherige Konfiguration sichern&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /etc/dovecot
mv dovecot.conf &lt;span class=&quot;s2&quot;&gt;&quot;dovecot.conf_&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
mv conf.d &lt;span class=&quot;s2&quot;&gt;&quot;conf.d_&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Neue Konfiguration zusammenstellen&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;cp /usr/share/examples/dovecot/dovecot.conf &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'ssl = no'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/dovecot/dovecot.conf
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;''&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/dovecot/dovecot.conf
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'listen = 127.0.0.1'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/dovecot/dovecot.conf

&lt;span class=&quot;nv&quot;&gt;SET_MAIL_HOME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'s|^mail_home = .*|mail_home = /home/%{user}|g'&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SET_MAIL_DRIVER&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'s|^mail_driver = .*|mail_driver = maildir|g'&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SET_MAIL_PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'s|^mail_path = .*|mail_path = ~/.Maildir|g'&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SET_MAIL_UID&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'s|^mail_uid = .*|mail_uid = %{user}|g'&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SET_MAIL_GID&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'s|^mail_gid = .*|mail_gid = %{user}|g'&lt;/span&gt;

sed &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$SET_MAIL_HOME&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; ; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$SET_MAIL_DRIVER&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; ; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$SET_MAIL_PATH&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; ; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$SET_MAIL_UID&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; ; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$SET_MAIL_GID&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; /etc/dovecot/dovecot.conf

&lt;span class=&quot;nv&quot;&gt;DISABLE_LMTP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'s|^\( *lmtp\) |#\1 |g'&lt;/span&gt;
sed &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$DISABLE_LMTP&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; /etc/dovecot/dovecot.conf

&lt;span class=&quot;nv&quot;&gt;DISABLE_SSL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'s|^\( *cert_file\) .*|\1 = /dev/null|g  ;  s|^\( *key_file\) .*|\1 = /dev/null|g'&lt;/span&gt;
sed &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$DISABLE_SSL&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; /etc/dovecot/dovecot.conf&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Neue Konfiguration validieren&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;doveconf &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; /etc/dovecot/dovecot.conf &lt;span class=&quot;nt&quot;&gt;-x&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Werden keine Fehler gemeldet, sollte &lt;b&gt;Dovecot&lt;/b&gt; nach dem Neustart des Dienstes wieder einsatzfähig sein.&lt;/p&gt;
&lt;h2&gt;Inhalt der dovecot.conf&lt;/h2&gt;
&lt;p&gt;Zum Vergleich sei hier noch die Datei &lt;b&gt;/etc/dovecot/dovecot.conf&lt;/b&gt; nach der Aufbereitung durch obige Befehle gezeigt:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-conf&quot; data-lang=&quot;conf&quot;&gt;&lt;span class=&quot;n&quot;&gt;dovecot_config_version&lt;/span&gt; = &lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;.&lt;span class=&quot;m&quot;&gt;4&lt;/span&gt;.&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dovecot_storage_version&lt;/span&gt; = &lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;.&lt;span class=&quot;m&quot;&gt;4&lt;/span&gt;.&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;
!&lt;span class=&quot;n&quot;&gt;include_try&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;conf&lt;/span&gt;.&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;/*.&lt;span class=&quot;n&quot;&gt;conf&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;protocols&lt;/span&gt; {
  &lt;span class=&quot;n&quot;&gt;imap&lt;/span&gt; = &lt;span class=&quot;n&quot;&gt;yes&lt;/span&gt;
}
&lt;span class=&quot;n&quot;&gt;mail_home&lt;/span&gt; = /&lt;span class=&quot;n&quot;&gt;home&lt;/span&gt;/%{&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;}
&lt;span class=&quot;n&quot;&gt;mail_driver&lt;/span&gt; = &lt;span class=&quot;n&quot;&gt;maildir&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;mail_path&lt;/span&gt; = ~/.&lt;span class=&quot;n&quot;&gt;Maildir&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;mail_uid&lt;/span&gt; = %{&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;}
&lt;span class=&quot;n&quot;&gt;mail_gid&lt;/span&gt; = %{&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;}
&lt;span class=&quot;n&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;inbox&lt;/span&gt; {
  &lt;span class=&quot;n&quot;&gt;inbox&lt;/span&gt; = &lt;span class=&quot;n&quot;&gt;yes&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;separator&lt;/span&gt; = /
}
&lt;span class=&quot;n&quot;&gt;passdb&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pam&lt;/span&gt; {
}
&lt;span class=&quot;n&quot;&gt;ssl_server&lt;/span&gt; {
  &lt;span class=&quot;n&quot;&gt;cert_file&lt;/span&gt; = /&lt;span class=&quot;n&quot;&gt;dev&lt;/span&gt;/&lt;span class=&quot;n&quot;&gt;null&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;key_file&lt;/span&gt; = /&lt;span class=&quot;n&quot;&gt;dev&lt;/span&gt;/&lt;span class=&quot;n&quot;&gt;null&lt;/span&gt;
}
&lt;span class=&quot;n&quot;&gt;ssl&lt;/span&gt; = &lt;span class=&quot;n&quot;&gt;no&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;listen&lt;/span&gt; = &lt;span class=&quot;m&quot;&gt;127&lt;/span&gt;.&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;.&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;.&lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;hr /&gt;
&lt;p style=&quot;vertical-align:middle;&quot; class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;a href=&quot;#fnr1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;https://doc.dovecot.org/2.4.1/core/summaries/settings.html&quot;&gt;All Dovecot Settings [Version 2.4.1]&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn2&quot;&gt;&lt;a href=&quot;#fnr2&quot;&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;/linux/2024/09/26/dovecot-als-lokalen-mailspeicher-konfigurieren&quot;&gt;Groovy-Skills Artikel: Dovecot als lokalen Mailspeicher konfigurieren&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Libreboot-Bootreihenfolge festlegen (Beispiel IBM X200)</title>
   <link href="http://groovy-skills.com/openbsd/2025/08/11/libreboot-bootreihenfolge-festlegen-beispiel-ibm-x200"/>
   <updated>2025-08-11T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/openbsd/2025/08/11/libreboot-bootreihenfolge-festlegen-beispiel-ibm-x200</id>
   <content type="html">&lt;p&gt;&lt;b&gt;&lt;span class=&quot;caps&quot;&gt;WICHTIG&lt;/span&gt;: Dieser Beitrag ist in seiner Entwurffassung veröffentlicht und dient vorrangig als Unterstützung bei der autonomen Lösungssuche durch den Leser. Der Beitrag erfüllt nicht die üblichen Qualitätsstandards dieses Blogs und erfordert damit ein tieferes Verständnis der Zusammenhänge. Falsch angewendete Befehle können zu unerwünschten Problemen wie Datenverlust führen oder gar irreparable Defekte verursachen.&lt;/b&gt;&lt;/p&gt;
&lt;blockquote cite=&quot;https://seabios.org/Runtime_config#Configuring_boot_order&quot;&gt;
&lt;p&gt;The easiest way to find the available boot methods is to look for &amp;#8220;Searching bootorder for&amp;#8221; in the SeaBIOS debug output.&lt;br /&gt;
- &lt;a href=&quot;https://web.archive.org/web/20250805070856/https://seabios.org/Runtime_config#Configuring_boot_order&quot;&gt;&lt;em&gt;https://seabios.org/Runtime_config#Configuring_boot_order (web-archive)&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;/p&gt;
&lt;blockquote cite=&quot;https://libreboot.org/docs/install/devmem.html#devmem-access-error&quot;&gt;
&lt;p&gt;if .. you get an error related to &lt;code&gt;/dev/mem&lt;/code&gt; access, you should reboot with &lt;code&gt;iomem=relaxed&lt;/code&gt; kernel parameter before running flashprog&lt;br /&gt;
On NetBSD and OpenBSD systems, the equivalent to &lt;code&gt;iomem=relaxed&lt;/code&gt; in this case is &lt;code&gt;kernel.securelevel=-1&lt;/code&gt;;&lt;br /&gt;
- &lt;a href=&quot;https://libreboot.org/docs/install/devmem.html#devmem-access-error&quot;&gt;&lt;em&gt;https://libreboot.org/docs/install/devmem.html#devmem-access-error&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Liste der Bootgeräte aus SeaBIOS-Log lesen&lt;/h2&gt;
&lt;blockquote cite=&quot;https://seabios.org/Debugging#Diagnostic_information&quot;&gt;
&lt;p&gt;SeaBIOS has the ability to output diagnostic messages.&lt;br /&gt;
On coreboot these messages are generally written to the &amp;#8220;cbmem&amp;#8221; console (CONFIG_DEBUG_COREBOOT).&lt;br /&gt;
One can obtain the &lt;code&gt;cbmem&lt;/code&gt; tool from the coreboot repository and run &amp;#8220;cbmem -c&amp;#8221; to view the SeaBIOS diagnostic messages.&lt;br /&gt;
- &lt;a href=&quot;https://web.archive.org/web/20250805070856/https://seabios.org/Debugging#Diagnostic_information&quot; title=&quot;web archive&quot;&gt;https://seabios.org/Debugging#Diagnostic_information&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;cbmem &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'^Searching bootorder'&lt;/span&gt; |sort|uniq &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /tmp/mybootlist.txt&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Hinweis:&lt;/strong&gt; Bei US-Keyboard-Layouts befindet sich Zirkumflex (&lt;kbd&gt;^&lt;/kbd&gt;) auf &lt;kbd&gt;Umschalt+6&lt;/kbd&gt;.&lt;/p&gt;
&lt;h2&gt;Liste der Bootgeräte nach Bedarf ordnen&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;EDITOR&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;:-&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;vi&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; /tmp/mybootlist.txt&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Aktuelle Firmware sichern&lt;/h2&gt;
&lt;blockquote cite=&quot;https://libreboot.org/docs/install/#howto-readwriteerase-the-boot-flash&quot;&gt;
&lt;p&gt;You should still make several dumps, even if you&amp;#8217;re flashing internally, to ensure that you get the same checksums. Check each dump using &lt;code&gt;sha1sum&lt;/code&gt;&lt;br /&gt;
- &lt;a href=&quot;https://libreboot.org/docs/install/#howto-readwriteerase-the-boot-flash&quot;&gt;&lt;em&gt;https://libreboot.org/docs/install/#howto-readwriteerase-the-boot-flash&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;flashrom &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; internal &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; ~/dump.bin&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Firmware-&lt;span class=&quot;caps&quot;&gt;ROM&lt;/span&gt; herunterladen&lt;/h2&gt;
&lt;blockquote cite=&quot;https://libreboot.org/docs/install/x200.html#open-source-biosuefi-firmware&quot;&gt;
&lt;p&gt;There are two possible flash chip sizes for the X200: 4MiB (32Mbit) or 8MiB (64Mbit). This can be identified by the type of flash chip below the palmrest: 4MiB is &lt;span class=&quot;caps&quot;&gt;SOIC&lt;/span&gt;-8, 8MiB is &lt;span class=&quot;caps&quot;&gt;SOIC&lt;/span&gt;-16.&lt;br /&gt;
- &lt;a href=&quot;https://libreboot.org/docs/install/x200.html#open-source-biosuefi-firmware&quot;&gt;&lt;em&gt;https://libreboot.org/docs/install/x200.html#open-source-biosuefi-firmware&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Beispiellink zu Firmware:&lt;/strong&gt; &lt;code&gt;https://mirrors.mit.edu/libreboot/stable/20241206/roms/libreboot-20241206rev11_x200_4mb.tar.xz&lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Firmware-&lt;span class=&quot;caps&quot;&gt;ROM&lt;/span&gt; entpacken (&lt;code&gt;tar xvf ...&lt;/code&gt;)&lt;/li&gt;
	&lt;li&gt;Gewünschte &lt;span class=&quot;caps&quot;&gt;ROM&lt;/span&gt; nach &lt;code&gt;/tmp&lt;/code&gt; kopieren: (&lt;code&gt;cp ...corebootfb.rom /tmp/&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Liste der Boot-Geräte in Firmware-&lt;span class=&quot;caps&quot;&gt;ROM&lt;/span&gt; einfügen&lt;/h2&gt;
&lt;p&gt;Kommando &lt;strong&gt;cbfstool&lt;/strong&gt; aus Paket &lt;b&gt;coreboot-utils&lt;/b&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;cbfstool corebootfb.rom add &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; mybootlist.txt &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; bootorder &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; raw
cbfstool corebootfb.rom print&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;&lt;span class=&quot;caps&quot;&gt;BIOS&lt;/span&gt; mit modifizierter Firmware flashen&lt;/h2&gt;
&lt;p&gt;Kommando &lt;strong&gt;flashrom&lt;/strong&gt; aus Paket &lt;b&gt;fwupd&lt;/b&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;flashrom &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; internal &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;MX25L3205(A)&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-w&lt;/span&gt; /tmp/corebootfb.com&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</content>
 </entry>
 
 <entry>
   <title>coreboot-Leichtgewichte: StarBook, Lemur Pro, NovaCostum V54</title>
   <link href="http://groovy-skills.com/allgemein/2024/11/09/coreboot-leichtgewichte-starbook-lemur-pro-novacostum-v54"/>
   <updated>2024-11-09T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/allgemein/2024/11/09/coreboot-leichtgewichte-starbook-lemur-pro-novacostum-v54</id>
   <content type="html">&lt;p&gt;Die Kaufentscheidung für ein leichtgewichtiges Laptop kann nach wie vor schnell getroffen werden, denn während &lt;a href=&quot;https://www.coreboot.org/&quot; title=&quot;quelloffene, freie Plattforminitialisierung zum Ersetzen von BIOS und UEFI&quot;&gt;coreboot&lt;/a&gt; eine Grundvoraussetzung für jeden sicheren Computer darstellt, scheinen aktuell lediglich drei Marken konkurrenzfähige coreboot-Notebooks anzubieten:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;b&gt;System76 (US)&lt;/b&gt; mit dem &lt;a href=&quot;https://system76.com/laptops/lemp13&quot;&gt;Lemur Pro&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;b&gt;StarLabs (UK)&lt;/b&gt; mit dem &lt;a href=&quot;https://starlabs.systems/pages/starbook&quot;&gt;StarBook&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;b&gt;NovaCostum (NL)&lt;/b&gt; mit dem &lt;a href=&quot;https://novacustom.com/product/v54-series/&quot;&gt;V54&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Schnellübersicht&lt;/h2&gt;
&lt;p&gt;Die Tabelle zeigt die Eckdaten der drei 14-Zoller:&lt;/p&gt;
&lt;table&gt;
	&lt;tr&gt;
		&lt;th&gt;&lt;/th&gt;
		&lt;th&gt;StarBook    &lt;/th&gt;
		&lt;th&gt;Lemur Pro     &lt;/th&gt;
		&lt;th&gt;NovaCostum V54  &lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th&gt;Gewicht [kg]      &lt;/th&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;&lt;strong&gt;1.40&lt;/strong&gt;   &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;&lt;strong&gt;1.00&lt;/strong&gt;    &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;&lt;strong&gt;1.60&lt;/strong&gt; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th&gt;Höhe    [cm]      &lt;/th&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;1.80    &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;1.70     &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;1.80  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th&gt;Breite  [cm]      &lt;/th&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;32.63    &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;31.20     &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;31.70  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th&gt;Tiefe   [cm]      &lt;/th&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;22.04    &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;22.30     &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;23.50  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th&gt;Display           &lt;/th&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;16:9 / 2160p &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;16:10 / 1200p &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;16:10 / 1800p &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th&gt;nits    [cd/m²]   &lt;/th&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;&lt;strong&gt;625&lt;/strong&gt;      &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;&lt;strong&gt;400&lt;/strong&gt;       &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;&lt;strong&gt;300&lt;/strong&gt;    &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th&gt;&lt;span class=&quot;caps&quot;&gt;CPU&lt;/span&gt;     (max)     &lt;/th&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;U7 165H    &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;U7 155U     &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;U7 155H  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th&gt;&lt;span class=&quot;caps&quot;&gt;RAM&lt;/span&gt; (min-max):    &lt;/th&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;32 &amp;#8211; 96    &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;8 &amp;#8211; 56     &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;8 &amp;#8211; 96  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th&gt;Festplatten (max) &lt;/th&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;&lt;strong&gt;1&lt;/strong&gt;      &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;&lt;strong&gt;2&lt;/strong&gt;       &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;&lt;strong&gt;2&lt;/strong&gt;    &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Gewicht sowie Endpreis hängen von der gewählten Ausstattung ab. Bei jedem Anbieter gibt es auch eine schwächere &lt;span class=&quot;caps&quot;&gt;CPU&lt;/span&gt;-Option.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Dovecot als lokalen Mailspeicher konfigurieren</title>
   <link href="http://groovy-skills.com/linux/2024/09/26/dovecot-als-lokalen-mailspeicher-konfigurieren"/>
   <updated>2024-09-26T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2024/09/26/dovecot-als-lokalen-mailspeicher-konfigurieren</id>
   <content type="html">&lt;p&gt;&lt;b&gt;Achtung: Diese Anleitung gilt nur bis Dovecot-Version 2.3. &lt;a href=&quot;https://doc.dovecot.org/main/installation/upgrade/2.3-to-2.4.html&quot;&gt;Ab Version 2.4 wurde das Format der Konfigurationsdateien geändert.&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;E-Mail Programme verwalten lokale Nachrichten für gewöhnlich selbst. Das kann zu sehr spezifischen Fehlern führen und zeitaufwendige Migrationen notwendig machen, sollte man einst das Werkzeug wechseln wollen.&lt;/p&gt;
&lt;p&gt;Um eine langfristige Unabhängigkeit von der Software und eine flexible Handhabung zu sichern, kann man einen dedizierten &lt;span class=&quot;caps&quot;&gt;IMAP&lt;/span&gt;-Dienst zur Nachrichtenverwaltung konfigurieren.&lt;/p&gt;
&lt;p&gt;Das erlaubt es, die gewohnte E-Mail Umgebung weiter zu verwenden, während man gleichzeitig die hohen Qualitätsansprüche eines spezialisierten Diensts geltend macht.&lt;/p&gt;
&lt;p&gt;Nach Installation &amp;#8211; &lt;code&gt;xbps-install -Su dovecot&lt;/code&gt; in Void Linux &amp;#8211; ist der Konfigurationsaufwand für den Dovecot &lt;span class=&quot;caps&quot;&gt;IMAP&lt;/span&gt;-Dienst überraschend gering:&lt;/p&gt;
&lt;h2&gt;Lokale Nutzung definieren&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Dienst nur via localhost anbieten&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SET_LISTEN&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'s|^#listen = .*|listen = 127.0.0.1|g'&lt;/span&gt;
sed &lt;span class=&quot;nt&quot;&gt;-i_&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$SET_LISTEN&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        /etc/dovecot/dovecot.conf

&lt;span class=&quot;c&quot;&gt;# ~/.Maildir als Mailverzeichnis verwenden&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SET_MAIL_LOCATION&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'s|^#mail_location = .*|mail_location = maildir:~/.Maildir|g'&lt;/span&gt;
sed &lt;span class=&quot;nt&quot;&gt;-i_&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$SET_MAIL_LOCATION&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        /etc/dovecot/conf.d/10-mail.conf

&lt;span class=&quot;c&quot;&gt;# SSL deaktivieren&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SET_SSL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'s|^ssl = .*|ssl = no|g'&lt;/span&gt;
sed &lt;span class=&quot;nt&quot;&gt;-i_&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$SET_SSL&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        /etc/dovecot/conf.d/10-ssl.conf&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Authentifizierungsmethode festlegen&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;## Variante 1: Passwortabfrage deaktivieren&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#[ -f /etc/dovecot/conf.d/auth-static.conf.ext ] ||&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#        cp /usr/share/examples/dovecot/conf.d/auth-static.conf.ext /etc/dovecot/conf.d/auth-static.conf.ext &lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#SET_INCLUDE='s|^#!include auth-static.conf.ext|!include auth-static.conf.ext|g'&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#sed -i_$(date +%Y%m%d) &quot;$SET_INCLUDE&quot; \&lt;/span&gt;
        /etc/dovecot/conf.d/10-auth.conf

&lt;span class=&quot;c&quot;&gt;# Variante 2: Zugriff per Linux-Passwort authorisieren&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; /etc/dovecot/conf.d/auth-system.conf.ext &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt;
        cp /usr/share/examples/dovecot/conf.d/auth-system.conf.ext /etc/dovecot/conf.d/auth-system.conf.ext
&lt;span class=&quot;nv&quot;&gt;SET_INCLUDE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'s|^#!include auth-system.conf.ext|!include auth-system.conf.ext|g'&lt;/span&gt;
sed &lt;span class=&quot;nt&quot;&gt;-i_&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$SET_INCLUDE&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        /etc/dovecot/conf.d/10-auth.conf&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;em&gt;Variante 1&lt;/em&gt; ermöglicht allen Benutzern Zugriff auf sämtliche E-Mails (!). Sie sollte nur nach gründlicher Analyse der Sicherheits-Anforderungen in Betracht gezogen werden, kann aber bei Linux-Distribution interessant sein, welche im Grundsystem kein &lt;a href=&quot;https://www.linux-pam.org&quot; title=&quot;Pluggable Authentication Modules&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PAM&lt;/span&gt;&lt;/a&gt; beinhalten. Das ist beispielsweise bei Alpine Linux der Fall.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Variante 2&lt;/em&gt; nutzt &lt;span class=&quot;caps&quot;&gt;PAM&lt;/span&gt; um beim Mailabruf die Eingabe des lokalen Linux-Benutzerpassworts anzufordern.&lt;/p&gt;
&lt;p&gt;Sobald man Dovecot-Dienst aktiviert und gestartet hat &amp;#8211; in Void-Linux per &lt;code&gt;sudo ln -s /etc/service/dovecot /var/service/dovecot&lt;/code&gt; &amp;#8211; kann man im E-Mail Programmen den &lt;span class=&quot;caps&quot;&gt;IMAP&lt;/span&gt;-Abruf einrichten. Als Server gibt man dafür &lt;b&gt;localhost&lt;/b&gt; an. Benutzername und Passwort entsprechen den Daten des Linux-Benutzers.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Android auf SHIFT6mq parallel zu postmarketOS installieren</title>
   <link href="http://groovy-skills.com/linux/2023/12/08/android-auf-shift6mq-parallel-zu-postmarketos-installieren"/>
   <updated>2023-12-08T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/linux/2023/12/08/android-auf-shift6mq-parallel-zu-postmarketos-installieren</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Dies ist &lt;strong&gt;Artikel 4&lt;/strong&gt; zur Einrichtung eines SHIFT6mq mit postmarketOS. Weitere Artikel der Serie sind in den Fußnoten verlinkt.&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;sup class=&quot;footnote&quot; id=&quot;fnr2&quot;&gt;&lt;a href=&quot;#fn2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; &lt;sup class=&quot;footnote&quot; id=&quot;fnr3&quot;&gt;&lt;a href=&quot;#fn3&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Parallel zu postmarketOS kann auf dem SHIFT6mq (Codename: &lt;em&gt;axolotl&lt;/em&gt;) ein zweites Betriebssystem installiert werden.&lt;/p&gt;
&lt;p&gt;Da im Rahmen des ersten Artikels&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; dieser Serie &lt;em&gt;Slot A&lt;/em&gt; für Linux genutzt wurde, wird nun hier erläutert, wie man Android in &lt;strong&gt;Slot B&lt;/strong&gt; schreibt.&lt;/p&gt;
&lt;h2&gt;Voraussetzungen&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;Das Telefon muss per &lt;span class=&quot;caps&quot;&gt;USB&lt;/span&gt; mit dem Linux-PC verbunden sein.&lt;/li&gt;
	&lt;li&gt;Um auf das Telefon zugreifen zu können, muss das Benutzerkonto des PC&amp;#8217;s über die nötigen Rechte verfügen. In Void-Linux sollte diese Anforderung durch Mitgliedschaft in der Gruppe &lt;strong&gt;plugdev&lt;/strong&gt; erfüllt sein: &lt;code&gt;sudo usermod -aG plugdev $USER&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;ShiftOS-L herunterladen&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;(PC)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Als Android wird die Variante &amp;#8220;&lt;strong&gt;ShiftOS-L&lt;/strong&gt;&amp;#8221; von &lt;a href=&quot;https://downloads.shiftphones.com/axolotl&quot;&gt;downloads.shiftphones.com/axolotl&lt;/a&gt; verwendet.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Diese beiden Konstanten setzen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;ARCHIV&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;SHIFT6MQ.SOS.3.10.L.20231025-RELEASE-LIGHT-OTA.zip
&lt;span class=&quot;nv&quot;&gt;PRUEFSUMME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0fccccee11eaa2cbec2c8e50256561b2f9480081dd12ca62dc803bfdc19af3e7

&lt;span class=&quot;c&quot;&gt;# Archiv herunterladen und prüfen&lt;/span&gt;
curl &lt;span class=&quot;nt&quot;&gt;-OC&lt;/span&gt; - https://downloads.shiftphones.com/builds/&lt;span class=&quot;nv&quot;&gt;$ARCHIV&lt;/span&gt;
sha256sum &lt;span class=&quot;nv&quot;&gt;$ARCHIV&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-Fw&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$PRUEFSUMME&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Unerwartete Prüfsumme! Abbrechen!'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&amp;amp;2&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;ShiftOS-L installieren&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Um Android in Slot B zu schreiben, muss der Bootloader auf Slot A eingestellt sein.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Obwohl das Aufspielen des Systems im Recovery-Modus erfolgt, beginnt dieser Abschnitt mit der Wahl des Slots und daher im &lt;b&gt;Bootloader-Modus&lt;/b&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Gegenüberliegenden Slot aktivieren&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;(Modus: Bootloader)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Für folgenden Ablauf startet man den Bootloader durch Drücken von &amp;#8220;Lauter&amp;#8221; (also &lt;code&gt;VolUp&lt;/code&gt;) während man das Telefon (via &lt;code&gt;Power&lt;/code&gt;) einschaltet.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;fastboot &lt;span class=&quot;nt&quot;&gt;--set-active&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;a
fastboot getvar current-slot 2&amp;gt;&amp;amp;1 | &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'current-slot: a$'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Fehler: Falscher Slot aktiv!'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&amp;amp;2

fastboot reboot recovery&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Nach erfolgreichem Ausführen der Befehle sollte das Telefon auf Slot A eingestellt und im &lt;b&gt;Recovery-Modus&lt;/b&gt; gestartet sein.&lt;/p&gt;
&lt;h3&gt;Android-System schreiben&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;(Modus: Recovery)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Den &lt;b&gt;Recovery-Modus&lt;/b&gt; kann man auch aktivieren indem man &amp;#8220;Leiser&amp;#8221; (also &lt;code&gt;VolDown&lt;/code&gt;) gedrückt hält während man das Telefon (via &lt;code&gt;Power&lt;/code&gt;) einschaltet.&lt;/p&gt;
&lt;p&gt;Dort wählt man dann den Menüpunkt &amp;#8220;&lt;strong&gt;Apply update from &lt;span class=&quot;caps&quot;&gt;ADB&lt;/span&gt;&lt;/strong&gt;&amp;#8221; und führt am PC folgenden Befehl aus. Der Vorgang dauert zirka drei Minuten:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;adb sideload &lt;span class=&quot;nv&quot;&gt;$ARCHIV&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;em&gt;Übrigens werden so auch Updates eingespielt.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Android-System starten&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;(Modus: Bootloader)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Abschließend wählt man im Recovery-Modus den Menüpunkt &amp;#8220;&lt;strong&gt;Reboot to bootloader&lt;/strong&gt;&amp;#8221; und aktiviert Slot B um das nun dort installierte ShiftOS-L zu starten:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;fastboot &lt;span class=&quot;nt&quot;&gt;--set-active&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;b
fastboot reboot&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Gratulation! An dieser Stelle sollte Android/ShiftOS-L gestartet sein!&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;[optional] Android Updater deaktivieren&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;(Modus: Android)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ist später ein Update verfügbar, zeigt Android eine Notifikation und bietet die Möglichkeit es herunter zu laden. Weil die Aktualisierung den durch postmarketOS belegten Slot benötigen würde, schlägt ein darauffolgender Installationsversuch allerdings fehl.&lt;/p&gt;
&lt;p&gt;Der Update-Hinweis kann also irreführend sein, weshalb es sinnvoll sein kann, ihn zu deaktivieren:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;em&gt;Einstellungen &amp;gt; Apps &amp;amp; Benachrichtigungen &amp;gt; &lt;span class=&quot;caps&quot;&gt;ALLE&lt;/span&gt; [] &lt;span class=&quot;caps&quot;&gt;APPS&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;ANZEIGEN&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;Kebab-Menü (die drei vertikalen Punkte ··· rechts oben) &amp;gt; System-Apps anzeigen&lt;/em&gt;&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;&amp;#8220;Updater&amp;#8221; am End der Liste wählen &amp;gt; &lt;span class=&quot;caps&quot;&gt;DEAKTIVIEREN&lt;/span&gt; &amp;gt; &lt;span class=&quot;caps&quot;&gt;APP&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;DEAKTIVIEREN&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p style=&quot;vertical-align:middle;&quot; class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;a href=&quot;#fnr1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;/linux/2023/12/05/postmarketos-auf-shift6mq-smartphone-installieren&quot;&gt;Artikel 1 der Serie: postmarketOS auf SHIFT6mq Smartphone installieren&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn2&quot;&gt;&lt;a href=&quot;#fnr2&quot;&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;/linux/2023/12/06/platz-aus-android-benutzerpartition-fur-postmarketos-freigeben&quot;&gt;Artikel 2 der Serie: Platz aus Android-Benutzerpartition für postmarketOS freigeben&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn3&quot;&gt;&lt;a href=&quot;#fnr3&quot;&gt;&lt;sup&gt;3&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;/linux/2023/12/07/bootloader-firmware-des-shift6mq-smartphones-aktualisieren&quot;&gt;Artikel 3 der Serie: Bootloader-Firmware des SHIFT6mq Smartphones aktualisieren&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn4&quot;&gt;&lt;a href=&quot;#fnr4&quot;&gt;&lt;sup&gt;4&lt;/sup&gt;&lt;/a&gt; &lt;em&gt;Artikel 4 (dieser)&lt;/em&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Bootloader-Firmware des SHIFT6mq Smartphones aktualisieren</title>
   <link href="http://groovy-skills.com/linux/2023/12/07/bootloader-firmware-des-shift6mq-smartphones-aktualisieren"/>
   <updated>2023-12-07T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/linux/2023/12/07/bootloader-firmware-des-shift6mq-smartphones-aktualisieren</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Dies ist &lt;strong&gt;Artikel 3&lt;/strong&gt; zur Einrichtung eines SHIFT6mq mit postmarketOS. Weitere Artikel der Serie sind in den Fußnoten verlinkt.&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;sup class=&quot;footnote&quot; id=&quot;fnr2&quot;&gt;&lt;a href=&quot;#fn2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Grundsätzlich sollte das Werkzeug &lt;b&gt;fwupd&lt;/b&gt; in postmarketOS den Bootloader automatisch aktualisieren&lt;sup class=&quot;footnote&quot; id=&quot;fnr6&quot;&gt;&lt;a href=&quot;#fn6&quot;&gt;6&lt;/a&gt;&lt;/sup&gt;. Da dies bei einem SHIFT6mq im Auslieferzustand (&lt;em&gt;Bootloader-Version 3.6.20220211&lt;/em&gt;) jedoch ausblieb, wird hier die Durchführung eines manuellen Updates beschrieben.&lt;/p&gt;
&lt;p&gt;Ein aktueller Bootloader ermöglicht vor Allem das Umschalten zwischen den installierten Betriebssystemen.&lt;/p&gt;
&lt;h2&gt;Voraussetzungen für die Einrichtung&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;Das Telefon muss per &lt;span class=&quot;caps&quot;&gt;USB&lt;/span&gt; mit dem Linux-PC verbunden sein.&lt;/li&gt;
	&lt;li&gt;Am PC müssen &lt;code&gt;fastboot&lt;/code&gt; sowie &lt;code&gt;7zip&lt;/code&gt; vorhanden sein. Unter Void Linux werden sie beispielsweise via &lt;code&gt;xbps-install -Su android-tools 7zip&lt;/code&gt; installiert.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Bootloader herunterladen und entpacken&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;(PC)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Verfügbare Bootloader-Versionen stehen auf der Seite des &lt;a href=&quot;https://fwupd.org/lvfs/devices/eco.shift.axolotl.abl.firmware&quot; title=&quot;LVFS Downloadbereich für &amp;#39;axolotl&amp;#39;&quot;&gt;Linux Vendor Firmware Service&lt;/a&gt; bereit.&lt;/p&gt;
&lt;p&gt;Diese beiden Konstanten referenzieren die zum Zeitpunkt des Verfassens aktuelle Version und können bei Bedarf angepasst werden. (Die angegebene Prüfsumme wurde für diesen Artikel lokal ermittelt.)&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Diese Konstanten setzen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;CAB_DATEI&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;d316238f79ceb89ce415716641f50b92ef10f3c47f747572d5a976f2932db2dc-abl_5.0.20221224.cab
&lt;span class=&quot;nv&quot;&gt;PRUEFSUMME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;b75a6818a48422d0f6d3b2ff7e4f9794e51fe8f9ae8c04a47702a0426144d5ef

&lt;span class=&quot;c&quot;&gt;# Archiv laden und prüfen&lt;/span&gt;
curl &lt;span class=&quot;nt&quot;&gt;-LOC&lt;/span&gt; - https://fwupd.org/downloads/&lt;span class=&quot;nv&quot;&gt;$CAB_DATEI&lt;/span&gt;
sha256sum &lt;span class=&quot;nv&quot;&gt;$CAB_DATEI&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-Fw&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$PRUEFSUMME&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Unerwartete Prüfsumme! Abbrechen!'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&amp;amp;2

&lt;span class=&quot;c&quot;&gt;# Archiv entpacken&lt;/span&gt;
7z x &lt;span class=&quot;nv&quot;&gt;$CAB_DATEI&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Bootloader aufspielen&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;(Modus: Bootloader)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;An dieser Stelle startet man das Telefon wieder im &lt;b&gt;Bootloader-Modus&lt;/b&gt;, indem man beim Einschalten des Telefons (via &lt;code&gt;Power&lt;/code&gt;) gleichzeitig &amp;#8220;Lauter&amp;#8221; (also &lt;code&gt;VolUp&lt;/code&gt;) gedrückt hält.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Abbild-Dateiname bestimmen &lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;cab_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;CAB_DATEI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;#*-&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;img_datei&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;cab_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;%%.cab&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;.img

&lt;span class=&quot;c&quot;&gt;# Abbild zu Telefon laden&lt;/span&gt;
fastboot flash abl &lt;span class=&quot;nv&quot;&gt;$img_datei&lt;/span&gt; reboot bootloader&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h3&gt;Umschalten der Boot-Slots ermöglichen&lt;/h3&gt;
&lt;p&gt;Dieser Befehl aktiviert die beiden Bootloader-Menüelemente &amp;#8220;&lt;strong&gt;Activate slot _a&lt;/strong&gt;&amp;#8221; sowie &amp;#8220;&lt;strong&gt;Activate slot _b&lt;/strong&gt;&amp;#8221;&lt;sup class=&quot;footnote&quot; id=&quot;fnr7&quot;&gt;&lt;a href=&quot;#fn7&quot;&gt;7&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;fastboot oem enable-developer-mode
fastboot reboot bootloader&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Gratulation! Nun sollte man ab sofort im Bootloader-Menü und ohne PC einen Boot-Slot auswählen und das dortige Betriebssystem direkt starten können.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p style=&quot;vertical-align:middle;&quot; class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;a href=&quot;#fnr1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;/linux/2023/12/05/postmarketos-auf-shift6mq-smartphone-installieren&quot;&gt;Artikel 1 der Serie: postmarketOS auf SHIFT6mq Smartphone installieren&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn2&quot;&gt;&lt;a href=&quot;#fnr2&quot;&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;/linux/2023/12/06/platz-aus-android-benutzerpartition-fur-postmarketos-freigeben&quot;&gt;Artikel 2 der Serie: Platz aus Android-Benutzerpartition für postmarketOS freigeben&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn3&quot;&gt;&lt;a href=&quot;#fnr3&quot;&gt;&lt;sup&gt;3&lt;/sup&gt;&lt;/a&gt; &lt;em&gt;Artikel 3 (dieser)&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn4&quot;&gt;&lt;a href=&quot;#fnr4&quot;&gt;&lt;sup&gt;4&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;/linux/2023/12/08/android-auf-shift6mq-parallel-zu-postmarketos-installieren&quot;&gt;Artikel 4 der Serie: Android auf SHIFT6mq parallel zu postmarketOS installieren&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn6&quot;&gt;&lt;a href=&quot;#fnr6&quot;&gt;&lt;sup&gt;6&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;https://forum.shiftphones.com/threads/postmarketos-als-dualboot.4832/#post-49005&quot;&gt;Shift Forum: Bootloader-Aktualisierung per fwupd&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn7&quot;&gt;&lt;a href=&quot;#fnr7&quot;&gt;&lt;sup&gt;7&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;https://forum.shiftphones.com/threads/shift6mq-lineageos-19-1-android-12l.4468/page-3#post-43235&quot;&gt;Shift Forum: &lt;span class=&quot;caps&quot;&gt;OEM&lt;/span&gt; Entwicklermodus&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Platz aus Android-Benutzerpartition für postmarketOS freigeben</title>
   <link href="http://groovy-skills.com/linux/2023/12/06/platz-aus-android-benutzerpartition-fur-postmarketos-freigeben"/>
   <updated>2023-12-06T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/linux/2023/12/06/platz-aus-android-benutzerpartition-fur-postmarketos-freigeben</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Dies ist &lt;strong&gt;Artikel 2&lt;/strong&gt; der Serie zur Einrichtung eines SHIFT6mq mit postmarketOS. Um die hier beschriebenen Schritte ausführen zu können, muss postmarketOS am Telefon entsprechend des ersten Artikels&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; lauffähig installiert sein. (Weitere Artikel der Serie sind in den Fußnoten verlinkt.&lt;sup class=&quot;footnote&quot; id=&quot;fnr3&quot;&gt;&lt;a href=&quot;#fn3&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;)&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Ausgangssituation&lt;/h2&gt;
&lt;p&gt;Die Android &amp;#8220;userdata&amp;#8221;-Partition belegt standardmäßig den Großteil des Speicherplatzes. Beim SHIFT6mq sind das rund 107 GB welche postmarketOS vorenthalten bleiben.&lt;/p&gt;
&lt;p&gt;Um das zu ändern, soll der Bereich verkleinert und Platz für eine Linux-kompatible Partition geschaffen werden.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Warnung: Etwaige bestehende Dateien gehen dabei verloren oder werden beschädigt.&lt;/b&gt;&lt;/p&gt;
&lt;h2&gt;Android-Benutzerpartition verkleinern&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;(Modus: postmarketOS)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Der Speicherplatz kann grundsätzlich frei auf die beiden Betriebssysteme verteilt werden. Möchte man Android nur im Notfall nutzen, sollten 2 GB für eigene Dateien ausreichen.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Diese Konstante setzen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;NEWSIZE_IN_GB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;2&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Unter Berücksichtigung der gewünschten neuen Größe ermitteln die folgenden Befehle die neue Konfiguration und ändern die bestehende Partition entsprechend ab.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Vorgehen absichern&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# &quot;userdata&quot;-Partition finden&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;userdata_entry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo &lt;/span&gt;print | doas parted /dev/sda | &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-w&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;' userdata$'&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;userdata_number&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$userdata_entry&lt;/span&gt; | awk &lt;span class=&quot;s1&quot;&gt;'{ print $1 }'&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Anfangs- und neuen Endpunkt der Partition bestimmen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;partition_start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$userdata_entry&lt;/span&gt; | awk &lt;span class=&quot;s1&quot;&gt;'{ print $2 }'&lt;/span&gt; | cut &lt;span class=&quot;nt&quot;&gt;-dG&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f1&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;partition_end&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$partition_start&lt;/span&gt; + &lt;span class=&quot;nv&quot;&gt;$NEWSIZE_IN_GB&lt;/span&gt; | bc&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'\n%s\n\nPartition %s wurde als userdata erkannt.\n'&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
       &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$userdata_entry&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$userdata_number&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'\nSie wird auf auf den Bereich %sGB - %sGB konfiguriert.\n'&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
       &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$partition_start&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$partition_end&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Neue Größe setzen&lt;/span&gt;
doas parted /dev/sda resizepart &lt;span class=&quot;nv&quot;&gt;$userdata_number&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;partition_end&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;GB&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;em&gt;An diesem Punkt sollte &lt;code&gt;doas fdisk -l /dev/sda&lt;/code&gt; bereits die neue Größe für die Partition anzeigen.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Die Anleitung geht davon aus, dass man erst in einem späteren Schritt ein neues Android installiert. Möchte man ein bestehendes weiter nutzen, muss im Recovery-Modus ein Factory-Reset durchgeführt werden, damit es diese Änderung erkennt.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Zusätzliche Partition erstellen&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;(Modus: postmarketOS)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Unmittelbar auf die nun verkleinerte &amp;#8220;userdata&amp;#8221;-Partition soll die neue Partition für postmarketOS folgen.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Diese Schritte beziehen sich auf zuvor gesetzte Variablen. Es muss daher die bisher genutzte Kommandozeile weiter verwendet werden.&lt;/em&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Vorgehen absichern&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Anfangs- und neuen Endpunkt der Partition bestimmen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;next_number&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$((&lt;/span&gt;userdata_number &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;next_partition_start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$partition_end&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;disk_end&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'unit GB\nprint'&lt;/span&gt; | doas parted /dev/sda | sed &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;/^Disk/ s|^Disk .*: &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.*&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;GB|&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\1&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;|p&quot;&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;

doas parted /dev/sda mkpart sda&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;next_number&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; ext4 &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;next_partition_start&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;GB &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;disk_end&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;GB&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h3&gt;Dateisystem einrichten&lt;/h3&gt;
&lt;p&gt;Dem Ansatz &amp;#8220;Grundsätzlich-Sicher&amp;#8221; getreu, wird das Dateisystem mit Verschlüsselung konfiguriert:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Vorgehen absichern&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Namen und Pfade bestimmen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;disk&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/dev/sda&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;next_number&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;disk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;##*/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;keyfile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/root/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;.lukskey

&lt;span class=&quot;c&quot;&gt;# Verschlüsseltes Dateisystem erstellen&lt;/span&gt;
doas dd &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/dev/urandom &lt;span class=&quot;nv&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$keyfile&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;bs&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1024 &lt;span class=&quot;nv&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;2 &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; doas chmod 400 &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$keyfile&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; 
doas cryptsetup luksFormat &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$disk&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$keyfile&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
doas cryptsetup luksOpen &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$disk&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$name&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--key-file&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$keyfile&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
doas mkfs.ext4 &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; 2 &lt;span class=&quot;s2&quot;&gt;&quot;/dev/mapper/&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$name&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h3&gt;Dateisystem bei Systemstart automatisch einhängen&lt;/h3&gt;
&lt;p&gt;In postmarketOS bestimmt &lt;b&gt;dmcrypt&lt;/b&gt; welche Geräte beim Systemstart entschlüsselt werden&lt;sup class=&quot;footnote&quot; id=&quot;fnr6&quot;&gt;&lt;a href=&quot;#fn6&quot;&gt;6&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nb&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;target=%s&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;source='%s'&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;key='%s'&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$name&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$disk&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$keyfile&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; | &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
     doas tee &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt; /etc/conf.d/dmcrypt
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;/dev/mapper/&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$name&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;  /media/floppy   ext4 nofail,defaults      0 0&quot;&lt;/span&gt; | &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
     doas tee &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt; /etc/fstab
doas rc-update add dmcrypt boot

&lt;span class=&quot;c&quot;&gt;# Dateisystem sofort einhängen&lt;/span&gt;
doas mount /media/floppy&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Gratulation! Ab hier kann die neue Partition unter &lt;code&gt;/media/floppy&lt;/code&gt; genutzt werden.&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;(&amp;#8220;floppy&amp;#8221; bietet sich als Einhängepunkt an, da er in Alpine-Systemen bereits besteht und wohl nie anderwärtig gebraucht werden wird.)&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;[optional] Alternative Entschlüsselung ermöglichen&lt;/h3&gt;
&lt;p&gt;Der bisherige Ablauf hinterlegt einen Zufallsschlüssel (in &lt;code&gt;/root/&lt;/code&gt;).&lt;br /&gt;
&lt;strong&gt;Geht dieser verloren, werden sämtliche Daten unbrauchbar.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mit folgendem Kommando kann man zusätzlich ein Passwort setzen, das unabhängig vom generierten Schlüssel Zugriff zu den Daten ermöglicht:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;doas cryptsetup luksAddKey &lt;span class=&quot;nv&quot;&gt;$disk&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--key-file&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$keyfile&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;hr /&gt;
&lt;p style=&quot;vertical-align:middle;&quot; class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;a href=&quot;#fnr1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;/linux/2023/12/05/postmarketos-auf-shift6mq-smartphone-installieren&quot;&gt;Artikel 1 der Serie: postmarketOS auf SHIFT6mq Smartphone installieren&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn2&quot;&gt;&lt;a href=&quot;#fnr2&quot;&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; Artikel 2 &lt;em&gt;(dieser)&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn3&quot;&gt;&lt;a href=&quot;#fnr3&quot;&gt;&lt;sup&gt;3&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;/linux/2023/12/07/bootloader-firmware-des-shift6mq-smartphones-aktualisieren&quot;&gt;Artikel 3 der Serie: Bootloader-Firmware des SHIFT6mq Smartphones aktualisieren&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn4&quot;&gt;&lt;a href=&quot;#fnr4&quot;&gt;&lt;sup&gt;4&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;/linux/2023/12/08/android-auf-shift6mq-parallel-zu-postmarketos-installieren&quot;&gt;Artikel 4 der Serie: Android auf SHIFT6mq parallel zu postmarketOS installieren&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn6&quot;&gt;&lt;a href=&quot;#fnr6&quot;&gt;&lt;sup&gt;6&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;https://wiki.alpinelinux.org/wiki/LVM_on_LUKS#Mounting_additional_encrypted_filesystems_at_boot&quot;&gt;wiki.alpinelinux.org/wiki/LVM_on_LUKS&lt;/a&gt;&lt;br /&gt;
&lt;em&gt;Alpine-Wiki: &amp;#8220;Mounting additional encrypted filesystems at boot&amp;#8221;&lt;/em&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>postmarketOS auf SHIFT6mq Smartphone installieren</title>
   <link href="http://groovy-skills.com/linux/2023/12/05/postmarketos-auf-shift6mq-smartphone-installieren"/>
   <updated>2023-12-05T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/linux/2023/12/05/postmarketos-auf-shift6mq-smartphone-installieren</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Dies ist &lt;strong&gt;Artikel 1&lt;/strong&gt; zur Einrichtung eines SHIFT6mq mit postmarketOS. Weitere Artikel der Serie sind in den Fußnoten verlinkt.&lt;sup class=&quot;footnote&quot; id=&quot;fnr2&quot;&gt;&lt;a href=&quot;#fn2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; &lt;sup class=&quot;footnote&quot; id=&quot;fnr3&quot;&gt;&lt;a href=&quot;#fn3&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Das SHIFT6mq ist zum Zeitpunkt des Verfassens dieser Anleitung eines der leistungsfähigsten für postmarketOS geeigneten Mobiltelefone.&lt;/p&gt;
&lt;p&gt;Zwar fehlt einerseits noch die Unterstützung&lt;sup class=&quot;footnote&quot; id=&quot;fnr6&quot;&gt;&lt;a href=&quot;#fn6&quot;&gt;6&lt;/a&gt;&lt;/sup&gt; für diverse Hardwarekomponenten wie Kamera oder &lt;span class=&quot;caps&quot;&gt;GPS&lt;/span&gt;, andererseits schafft man sich mit einem echten Linux-Telefon maximale Flexibilität &amp;#8211; die Grundlage für hocheffiziente Abläufe.&lt;/p&gt;
&lt;h2&gt;Ziele: Privatsphäre und Multi-Boot&lt;/h2&gt;
&lt;p&gt;Bei dieser Anleitung ist darauf geachtet, dass das Telefon niemals mit dem Internet zu verbinden, bevor es von potentiell verräterischer Software befreit ist.&lt;/p&gt;
&lt;p&gt;Damit soll vermieden werden, dass etwaige Gegenstellen das Telefon mit dem initialen Standort und somit einem bestimmten Personenkreis verknüpfen (beispielsweise durch Verknüpfen der &lt;span class=&quot;caps&quot;&gt;IMEI&lt;/span&gt;&lt;sup class=&quot;footnote&quot; id=&quot;fnr7&quot;&gt;&lt;a href=&quot;#fn7&quot;&gt;7&lt;/a&gt;&lt;/sup&gt; mit der IP).&lt;/p&gt;
&lt;p&gt;Installiert wird in eine der beiden &amp;#8220;Superpartitionen&amp;#8221;, sodass in der anderen ein anderes Betriebssystem wie zum Beispiel ein &lt;span class=&quot;caps&quot;&gt;AOSP&lt;/span&gt;-Android&lt;sup class=&quot;footnote&quot; id=&quot;fnr8&quot;&gt;&lt;a href=&quot;#fn8&quot;&gt;8&lt;/a&gt;&lt;/sup&gt; den benötigten Platz finden kann.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Warnung: Das bestehende System wird restlos entfernt und die Benutzerdaten gehen verloren.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Warnung: Android &lt;span class=&quot;caps&quot;&gt;OTA&lt;/span&gt;-Updates benötigen einen ungenutzten Slot zur Installation neuer Versionen.&lt;sup class=&quot;footnote&quot; id=&quot;fnr9&quot;&gt;&lt;a href=&quot;#fn9&quot;&gt;9&lt;/a&gt;&lt;/sup&gt; Da postmarketOS diesen belegen wird, können Updates dann nur noch manuell (per PC/&lt;span class=&quot;caps&quot;&gt;USB&lt;/span&gt;) durchgeführt werden. Details werden in einem Folgeartikel erläutert.&lt;sup class=&quot;footnote&quot; id=&quot;fnr4&quot;&gt;&lt;a href=&quot;#fn4&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h2&gt;Voraussetzungen&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;Ausgegangen wird von einem SHIFT6mq in Werkszustand, mit vorinstalliertem und funktionstüchtigem Android (&amp;#8220;ShiftOS&amp;#8221;).&lt;/li&gt;
	&lt;li&gt;Das Telefon muss per &lt;span class=&quot;caps&quot;&gt;USB&lt;/span&gt; mit dem Linux-PC verbunden sein.&lt;/li&gt;
	&lt;li&gt;Am PC müssen &lt;a href=&quot;https://wiki.postmarketos.org/wiki/Pmbootstrap&quot;&gt;pmbootstrap&lt;/a&gt;, &lt;code&gt;fastboot&lt;/code&gt; sowie &lt;code&gt;7zip&lt;/code&gt; vorhanden sein. Unter Void Linux werden sie beispielsweise via &lt;code&gt;xbps-install -Su pmbootstrap android-tools 7zip&lt;/code&gt; installiert.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wo relevant ist am Beginn jedes Abschnitts erwähnt in welchem Modus sich das Telefon befinden muss. Dies dient lediglich der Orientierung, da es bei Befolgen der Anweisungen ohnehin zu jedem Zeitpunkt im jeweils korrekten Zustand ist.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 style=&quot;vertical-align:middle;&quot;&gt;postmarketOS für SHIFT6mq konfigurieren&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;(PC)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Zuerst erstellt man am Linux-Rechner ein postmarketOS Installationsabbild:&lt;/p&gt;
&lt;h3&gt;Umgebung aktualisieren&lt;/h3&gt;
&lt;p&gt;Dieser Schritt stellt sicher, dass man mit einer aktuellen Umgebung arbeitet.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;pmbootstrap pull
pmbootstrap status&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h3&gt;Konfiguration des Abbilds definieren&lt;/h3&gt;
&lt;p&gt;Im diesem Schritt muss als &lt;strong&gt;Vendor&lt;/strong&gt; &lt;code&gt;shift&lt;/code&gt; und ls &lt;strong&gt;Device codename&lt;/strong&gt; &lt;code&gt;axolotl&lt;/code&gt; eingestellt werden.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;pmbootstrap init&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Hackern sei &lt;code&gt;sxmo-de-sway&lt;/code&gt; als &lt;strong&gt;User interface&lt;/strong&gt; empfohlen. Diese, sowie die übrigen Optionen können den eigenen Bedürfnissen angepasst oder auf den vorgegebenen Einstellungen belassen werden.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Um Probleme beim Erstellen des Abbildes zu vermeiden, sei von der Angabe von &lt;strong&gt;Extra packages&lt;/strong&gt; abgeraten. Zusätzliche Pakete sollten besser später im laufenden System hinzugefügt werden.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Abbild für verschlüsseltes System generieren&lt;/h3&gt;
&lt;p&gt;Jedes System sollte grundsätzlich verschlüsselt erstellt werden. Damit erspart man sich spätestens bei Weitergabe des Geräts Kopfzerbrechen über etwaige verbliebene Daten.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;pmbootstrap install &lt;span class=&quot;nt&quot;&gt;--fde&lt;/span&gt;
pmbootstrap shutdown&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Per &lt;code&gt;shutdown&lt;/code&gt; löst man vorübergehende Mounts der pmbootstrap-Umgebung.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 style=&quot;vertical-align:middle;&quot;&gt;Bootloader entsperren&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;(Modus: Android)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Im &lt;strong&gt;vorinstallierten Android System &amp;#8220;ShiftOS&amp;#8221;&lt;/strong&gt; erlaubt man das Entsperren des Bootloaders:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;Entwicker-Modus aktivieren&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;Einstellungen &amp;gt; Über das Telefon &amp;gt; &amp;#8220;Build-Nummer&amp;#8221; sieben mal berühren&lt;/em&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Erlaubnis zum Entsperren des Bootloaders erteilen&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;Einstellungen &amp;gt; System &amp;gt; Erweitert &amp;gt; Entwickleroptionen &amp;gt; &amp;#8220;Erweiterter Neustart&amp;#8221; sowie &amp;#8220;&lt;span class=&quot;caps&quot;&gt;OEM&lt;/span&gt;-Entsperrung&amp;#8221; aktivieren&lt;/em&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Bootloader starten&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;Den Ausschaltknopf lange drücken und &amp;#8220;Neu starten&amp;#8221; &amp;gt; Bootloader wählen&lt;/em&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Entsperrung durchführen&lt;/strong&gt;&lt;br /&gt;
&lt;em&gt;Vom PC aus den Unlock-Befehl an das Telefon senden:&lt;br /&gt;
&lt;code&gt;fastboot flashing unlock&lt;/code&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;postmarketOS aufspielen&lt;/h2&gt;
&lt;p&gt;Ist aus dem vorigen Schritt noch der Bootloader-Modus aktiv, wechselt man nun in den &lt;b&gt;Fastboot-Modus&lt;/b&gt;:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Es sollte ausreichen, am PC den Befehl &lt;code&gt;fastboot reboot fastboot&lt;/code&gt; zu geben.&lt;/li&gt;
	&lt;li&gt;Alternativ hält man beim Einschalten des Telefons (via &lt;code&gt;Power&lt;/code&gt;) gleichzeitig &amp;#8220;Lauter&amp;#8221; (also &lt;code&gt;VolUp&lt;/code&gt;) gedrückt.&lt;/li&gt;
	&lt;li&gt;Bei neueren Bootloader-Versionen kann man den entsprechenden Menüpunkt zum direkten Wechsel zu Fastboot nutzen.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Installationsslot auswählen&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;(Modus: Fastboot)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Es stehen zwei Slots zur Verfügung. PostmarketOS wird in &lt;b&gt;Slot A&lt;/b&gt; installiert. Ein neues Android kann später in &lt;b&gt;Slot B&lt;/b&gt; geladen werden. Wie eingangs erwähnt, geht das &lt;em&gt;bestehende&lt;/em&gt; Android-System im nächsten Schritt allerdings verloren!&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;fastboot &lt;span class=&quot;nt&quot;&gt;--set-active&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;a
fastboot reboot fastboot
fastboot getvar current-slot 2&amp;gt;&amp;amp;1 | &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'current-slot: a$'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Fehler: Falscher Slot aktiv!'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&amp;amp;2&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h3&gt;Boot- und System-Partition des Telefons bespielen&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;(Modus: Fastboot)&lt;/em&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Vorgang dauert rund 76 Sekunden&lt;/span&gt;
pmbootstrap flasher flash_rootfs &lt;span class=&quot;nt&quot;&gt;--partition&lt;/span&gt; system_a
&lt;span class=&quot;c&quot;&gt;# Vorgang dauert rund 31 Sekunden&lt;/span&gt;
pmbootstrap flasher flash_kernel &lt;span class=&quot;nt&quot;&gt;--partition&lt;/span&gt; boot_a
fastboot reboot bootloader
&lt;span class=&quot;c&quot;&gt;# Vorgang dauert rund 26 Sekunden&lt;/span&gt;
fastboot erase dtbo_a
fastboot reboot fastboot&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Laut Wiki&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; &amp;#8220;steht die dtbo-Partition mit dem Mainline-Kernel in Konflikt&amp;#8221; und wird daher hier gelöscht.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 style=&quot;vertical-align:middle;&quot;&gt;Gesamten Slot A für postmarketOS nutzbar machen&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;(Modus: Fastboot)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Einige Partitionen innerhalb eines Slots werden lediglich von Android-Systemen genutzt und sind für Linux-Systeme irrelevant.&lt;/p&gt;
&lt;p&gt;Indem man sie löscht, kann der dadurch freigegebene Speicherplatz für die postmarketOS root-Partition von zirka 2 GiB (2128609280 bytes) auf rund 4.5 GiB (4813467648 bytes) erweitern.&lt;/p&gt;
&lt;p&gt;Die folgenden Befehle könnten auf einem technisch abweichenden System unerwartete Auswirkungen haben und sollten daher erst ausgeführt werden, wenn man die einzelnen Schritte versteht. Da diese Änderungen von anderen unabhängig sind, können sie auch jederzeit nachträglich vorgenommen werden.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Zurück in den Fastboot-Modus wechseln&lt;/span&gt;
fastboot reboot fastboot

&lt;span class=&quot;c&quot;&gt;# Gesamt-verfügbare Größe ermitteln&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'a'&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;:product_&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$slot&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;:|:system_&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$slot&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;:|:vendor_&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$slot&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;:|:system_ext_&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$slot&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;:&quot;&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;matches&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;fastboot getvar all 2&amp;gt;&amp;amp;1 | &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-E&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$filter&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;sizes_hex&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$matches&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; | sed &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'/partition-size/ s#.*partition-size.*:0x##p'&lt;/span&gt; | tr &lt;span class=&quot;s1&quot;&gt;'\n'&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'+'&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;sum_decimal&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;ibase=16; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;sizes_hex&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; 0&quot;&lt;/span&gt; | bc&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Relevante Partitionen:\n\n%s\n\n'&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$matches&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Die Root-Partiton wird auf %s Bytes erweitert.\n'&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$sum_decimal&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Unnötige Partitionen löschen&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;p &lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;product vendor system_ext &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do &lt;/span&gt;fastboot delete-logical-partition &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;done
&lt;/span&gt;fastboot resize-logical-partition system_&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$sum_decimal&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Neue Größe ausgeben und postmarketOS starten&lt;/span&gt;
fastboot getvar all 2&amp;gt;&amp;amp;1 | &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot; partition-size:system_&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;slot&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;:&quot;&lt;/span&gt;
fastboot reboot&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h3&gt;Dateisystem auf neue Größe ausweiten&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;(Modus: postmarketOS)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Abschließend muss per &lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt; oder in einem Terminalfenster direkt in postmarketOS das Dateisystem auf die Nutzung der neuen Partitionsgröße eingestellt werden:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;df &lt;span class=&quot;nt&quot;&gt;-h&lt;/span&gt; /dev/mapper/root
doas resize2fs /dev/mapper/root
df &lt;span class=&quot;nt&quot;&gt;-h&lt;/span&gt; /dev/mapper/root&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Gratulation! An dieser Stelle hat man ein funktionstüchtiges Linux-Telefon das man nach Belieben weiter gestalten kann.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Ausblick&lt;/h2&gt;
&lt;p&gt;Weitere Artikel zum Thema werden unter Anderem erläutern, wie man über die Benutzer-Partition noch mehr Platz für postmarketOS bereit stellt&lt;sup class=&quot;footnote&quot; id=&quot;fnr4&quot;&gt;&lt;a href=&quot;#fn4&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;, ein freies Android parallel zu postmarketOS installiert (&amp;#8220;Dualboot&amp;#8221;) oder Android-Applikationen direkt in postmarketOS ausführt.&lt;/p&gt;
&lt;p&gt;Smartphones können Zeitfresser sein. Eine Hoffnung die ich in postmarketOS setze ist, dass es langfristig auch im mobilen Bereich eine minimalistische Nutzung ermöglicht und somit dazu beiträgt Smartphones in den Hintergrund zu bringen. Menschen sind wichtiger als Maschinen.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;An dieser Stelle vielen Dank an &lt;a href=&quot;https://forum.shiftphones.com/members/amartinz.1/&quot;&gt;Alex&lt;/a&gt; von Shift für die klaren Hinweise, welche die optimale Konfiguration des SHIFT6mq für diesen Artikel deutlich vereinfacht haben!&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p style=&quot;vertical-align:middle;&quot; class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;a href=&quot;#fnr1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; &lt;em&gt;Artikel 1 (dieser)&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn2&quot;&gt;&lt;a href=&quot;#fnr2&quot;&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;/linux/2023/12/06/platz-aus-android-benutzerpartition-fur-postmarketos-freigeben&quot;&gt;Artikel 2 der Serie: Platz aus Android-Benutzerpartition für postmarketOS freigeben&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn3&quot;&gt;&lt;a href=&quot;#fnr3&quot;&gt;&lt;sup&gt;3&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;/linux/2023/12/07/bootloader-firmware-des-shift6mq-smartphones-aktualisieren&quot;&gt;Artikel 3 der Serie: Bootloader-Firmware des SHIFT6mq Smartphones aktualisieren&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn4&quot;&gt;&lt;a href=&quot;#fnr4&quot;&gt;&lt;sup&gt;4&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;/linux/2023/12/08/android-auf-shift6mq-parallel-zu-postmarketos-installieren&quot;&gt;Artikel 4 der Serie: Android auf SHIFT6mq parallel zu postmarketOS installieren&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn6&quot;&gt;&lt;a href=&quot;#fnr6&quot;&gt;&lt;sup&gt;6&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;https://wiki.postmarketos.org/wiki/SHIFT_SHIFT6mq_(shift-axolotl)&quot;&gt;SHIFT6mq im postmarketOS-Wiki&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn7&quot;&gt;&lt;a href=&quot;#fnr7&quot;&gt;&lt;sup&gt;7&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc7254&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RFC&lt;/span&gt;-7254: &lt;span class=&quot;caps&quot;&gt;IMEI&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn8&quot;&gt;&lt;a href=&quot;#fnr8&quot;&gt;&lt;sup&gt;8&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;https://source.android.com/docs/setup/about&quot;&gt;Android Open Source Project&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn9&quot;&gt;&lt;a href=&quot;#fnr9&quot;&gt;&lt;sup&gt;9&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;https://source.android.com/docs/core/ota/ab&quot;&gt;&lt;span class=&quot;caps&quot;&gt;AOSP&lt;/span&gt;: A/B (seamless) system updates&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Bildschirmausgabe einer libvirt/QEMU-Instanz als Video aufnehmen</title>
   <link href="http://groovy-skills.com/linux/2023/10/08/bildschirmausgabe-einer-libvirt-slash-qemu-instanz-als-video-aufnehmen"/>
   <updated>2023-10-08T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2023/10/08/bildschirmausgabe-einer-libvirt-slash-qemu-instanz-als-video-aufnehmen</id>
   <content type="html">&lt;p&gt;&lt;b&gt;Von einer &lt;span class=&quot;caps&quot;&gt;KVM&lt;/span&gt;/&lt;span class=&quot;caps&quot;&gt;QEMU&lt;/span&gt; Virtuellen Maschine kann zu beliebigem Zeitpunkt eine Bilddatei des aktuellen Bildschirminhalts angefordert werden.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Diese Anleitung erklärt wie man via libvirt/virsh diese Bilder in regelmäßigen Abständen speichert und diese dann zu einem Video kombiniert.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Am System müssen &lt;b&gt;bc&lt;/b&gt;, &lt;b&gt;convert&lt;/b&gt; sowie &lt;b&gt;bc&lt;/b&gt; vorhanden sein. Unter Void Linux installiert man die entsprechenden Pakete beispielsweise via &lt;code&gt;xbps-install -Su ImageMagick ffmpeg bc&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Umgebung definieren&lt;/h2&gt;
&lt;p&gt;Diese Konstanten müssen im Verlauf der gesamten Anleitung korrekt gesetzt sein.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nv&quot;&gt;VM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;name_der_virtuellen_maschine
&lt;span class=&quot;nv&quot;&gt;BILDER_PRO_SEKUNDE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;5&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Bildschirmfotos regelmäßig abspeichern&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nv&quot;&gt;DIR&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;mktemp &lt;span class=&quot;nt&quot;&gt;--tmpdir&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--directory&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$VM&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-screenrecording-XXX&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;IMG&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;mktemp &lt;span class=&quot;nt&quot;&gt;--tmpdir&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$VM&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-current-XXX&lt;/span&gt;.ppm&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;VERZOEGERUNG&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;scale=2 ; 1/&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$BILDER_PRO_SEKUNDE&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;  | bc&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Aufnahme ...'&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'(Strg-C zum Beenden)'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; :&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do
        &lt;/span&gt;virsh qemu-monitor-command &lt;span class=&quot;nv&quot;&gt;$VM&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--hmp&lt;/span&gt; screendump &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$IMG&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;/dev/null
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$IMG&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then
                &lt;/span&gt;convert &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$IMG&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$DIR&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;date +%s.%N&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.jpg&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$IMG&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
                sleep &lt;span class=&quot;nv&quot;&gt;$VERZOEGERUNG&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;else
                &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Fehler: &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$IMG&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; ist leer&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
        &lt;span class=&quot;k&quot;&gt;fi
done&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Bilder in eine Videodatei zusammenführen&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;ffmpeg &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; error &lt;span class=&quot;nt&quot;&gt;-pattern_type&lt;/span&gt; glob &lt;span class=&quot;nt&quot;&gt;-codec&lt;/span&gt; copy &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;-framerate&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$BILDER_PRO_SEKUNDE&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$DIR&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/*.jpg&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$DIR&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$VM&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.mkv&quot;&lt;/span&gt; 
        &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm &lt;span class=&quot;nt&quot;&gt;-R&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$DIR&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;.jpg &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$DIR&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$VM&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.mkv&quot;&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</content>
 </entry>
 
 <entry>
   <title>Tor-Dienst auf autorisierte Clients begrenzen</title>
   <link href="http://groovy-skills.com/linux/2023/10/02/tor-dienst-auf-autorisierte-clients-begrenzen"/>
   <updated>2023-10-02T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2023/10/02/tor-dienst-auf-autorisierte-clients-begrenzen</id>
   <content type="html">&lt;p&gt;Dienste die man im Tor-Netzwerk bereit stellt, können bei Bedarf ausschließlich autorisierten Gegenstellen verfügbar gemacht werden.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Alle Befehle dieser Anleitung werden am Client-Rechner ausgeführt. Einerseits vereinfacht dies die Erläuterungen, andererseits wird vermieden den privaten Schlüssel an weiteren Orten zwischen zu speichern.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Voraussetzungen&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;Es wird davon ausgegangen, dass &lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt;-Zugriffe zum Server &lt;strong&gt;als root&lt;/strong&gt; möglich sind.&lt;/li&gt;
	&lt;li&gt;Der versteckte Dienst muss bereits am Server eingerichtet und aktiv sein (siehe &lt;strong&gt;HiddenServiceDir&lt;/strong&gt; in &lt;code&gt;/etc/tor/torrc&lt;/code&gt;).&lt;/li&gt;
	&lt;li&gt;Am Client muss &lt;a href=&quot;https://pypi.org/project/PyNaCl/&quot;&gt;&lt;strong&gt;PyNaCl&lt;/strong&gt;&lt;/a&gt; vorhanden sein. Unter Void Linux wird es beispielsweise via &lt;code&gt;xbps-install -Su python3-pynacl&lt;/code&gt; installiert.&lt;/li&gt;
	&lt;li&gt;Am Client muss der Befehl &lt;b&gt;openbsd-nc&lt;/b&gt; vorhanden sein. Unter Void Linux installiert man das entsprechende Paket beispielsweise via &lt;code&gt;xbps-install -Su openbsd-netcat&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Umgebung definieren&lt;/h2&gt;
&lt;p&gt;Diese Konstanten müssen im Verlauf der gesamten Anleitung korrekt gesetzt sein.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Diese Konstanten entsprechend der eigenen Umgebung deklarieren&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SERVER&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;203.0.113.2
&lt;span class=&quot;nv&quot;&gt;TOR_SERVICE_PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/lib/tor/hidden_service
&lt;span class=&quot;nv&quot;&gt;NETCAT_CMD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;openbsd-nc -X 5 -x 127.0.0.1:9050 %h %p&quot;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Die Werte dieser Konstanten werden vom Server geholt&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SERVERNAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;ssh root@&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SERVER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; hostname&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;ONION&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;ssh root@&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SERVER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;TOR_SERVICE_PATH&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/hostname&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Schlüsselpaar generieren&lt;/h2&gt;
&lt;p&gt;Zum Generieren des Schlüsselpaars wird ein einfaches Python-Skript verwendet, dessen Inhalt zumindest auf verdächtige Auffälligkeiten geprüft werden sollte.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Skript laden&lt;/span&gt;
curl &lt;span class=&quot;nt&quot;&gt;-O&lt;/span&gt; https://raw.githubusercontent.com/pastly/python-snippits/7ea7cb7fd3fea47dcf723edec2e52775aee43b0a/src/tor/x25519-gen.py

&lt;span class=&quot;c&quot;&gt;# Inhalt des Skripts zur Überprüfung ausgeben&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;cat &lt;/span&gt;x25519-gen.py

&lt;span class=&quot;c&quot;&gt;# Schlüssel generieren und einlesen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;TMP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;mktemp &lt;span class=&quot;nt&quot;&gt;--tmpdir&lt;/span&gt; keypair-XXX&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
python ./x25519-gen.py | sed &lt;span class=&quot;s1&quot;&gt;'s#\: *#=#g'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$TMP&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$TMP&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$TMP&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Schlüssel prüfen&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$public&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;  | &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-E&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'.{52}'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;/dev/null &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Öffentlicher Schlüssel '&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$public&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;' ungültig!&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$private&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-E&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'.{52}'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;/dev/null &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Privater Schlüssel '&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$private&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;' ungültig!&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&amp;amp;2&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Öffentlichen Schlüssel zu Server kopieren&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;descriptor:x25519:&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$public&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; |
    ssh root@&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SERVER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; tee &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$TOR_SERVICE_PATH&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/authorized_clients/&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$HOST&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;.auth&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Privaten Schlüssel am Client hinterlegen&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nv&quot;&gt;CAUTH_PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/lib/tor/onion_auth
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;mkdir &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CAUTH_PATH&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ONION&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;%%.onion&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;:descriptor:x25519:&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$private&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; |
    &lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;tee &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CAUTH_PATH&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;/&lt;span class=&quot;nv&quot;&gt;$SERVERNAME&lt;/span&gt;.auth_private

&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;ClientOnionAuthDir &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CAUTH_PATH&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; |
    &lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;tee /etc/tor/torrc&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Vorgenommene Änderungen in Tor übernehmen&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;b&gt;Wichtig:&lt;/b&gt; Man sollte eine neue Konfiguration sehr vorsichtig übernehmen. Schränkt man hier beispielsweise den Zugang zu &lt;b&gt;&lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt;-über-Tor&lt;/b&gt; ein, sollte sicher gestellt sein, dass auch von Tor unabhängig eine &lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt;-Verbindung aufgebaut werden kann.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Test vor dem Einschränken&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Da vor dem Neustart der Dienste die Client Authorization noch inaktiv ist, muss die Verbindung an dieser Stelle noch möglich sein.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;ssh &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;ProxyCommand&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$NETCAT_CMD&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; root@&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ONION&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'OK: Verbindung ist wie erwartet noch möglich!'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h3&gt;Server-Konfiguration neu laden&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Der Befehl hierzu hängt von der verwendeten Diensteverwaltung ab.&lt;/em&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Beispiel: Server mit Alpine Linux / OpenRC&lt;/span&gt;
ssh root@&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SERVER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; service tor reload&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;b&gt;Test nach dem Einschränken&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Da der Server nun bereits auf autorisierte Gegenstellen begrenzt ist, muss an dieser Stelle jeder Verbindungsversuch scheitern:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;ssh &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;ProxyCommand&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$NETCAT_CMD&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; root@&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ONION&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'OK: Verbindungsaufbau ist wie erwartet fehlgeschlagen!'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h3&gt;Client-Konfiguration neu laden&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Der Befehl hierzu hängt von der verwendeten Diensteverwaltung ab.&lt;/em&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Beispiel: Client mit Void Linux / Runit&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;sv reload tor&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;b&gt;Test nach Aktivieren des Client-Schlüssels&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Da sich der Client dem Server gegenüber nun ordnungsgemäß authentifiziert, muss an dieser Stelle die Verbindung wieder möglich sein:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;ssh &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;ProxyCommand&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$NETCAT_CMD&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; root@&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ONION&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'OK: Verbindung ist wie erwartet wieder möglich!'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Quellen&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;https://community.torproject.org/onion-services/advanced/client-auth/&quot;&gt;Tor Project: Client Authorization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>Debian LXC-Container in Void Linux einrichten</title>
   <link href="http://groovy-skills.com/linux/2023/09/25/debian-lxc-container-in-void-linux-einrichten"/>
   <updated>2023-09-25T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2023/09/25/debian-lxc-container-in-void-linux-einrichten</id>
   <content type="html">&lt;p&gt;Lediglich der erste Punkt, die Installation der Pakete, ist Void-Linux-spezifisch. Der weitere Ablauf sollte auch ohne Anpassungen auf andere Linux-Distributionen übertragbar sein.&lt;/p&gt;
&lt;h2&gt;Erforderliche Pakete installieren&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;lxc&lt;/code&gt; sowie &lt;code&gt;debootstrap&lt;/code&gt; können in Void Linux wie folgt installiert werden:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;xbps-install &lt;span class=&quot;nt&quot;&gt;-Su&lt;/span&gt; lxc debootstrap&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Umgebung definieren&lt;/h2&gt;
&lt;p&gt;Diese Variablen müssen in jedem Schritt des folgenden Ablaufs gesetzt sein:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Diese Konstanten anpassen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;NAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;sid
&lt;span class=&quot;nv&quot;&gt;MIRROR&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;http://ftp.cz.debian.org/debian/
&lt;span class=&quot;nv&quot;&gt;CHROOT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/lib/lxc/&lt;span class=&quot;nv&quot;&gt;$NAME&lt;/span&gt;/rootfs&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Root-Dateisystem erstellen&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;mkdir &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CHROOT&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
debootstrap &lt;span class=&quot;nt&quot;&gt;--arch&lt;/span&gt; amd64 &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$NAME&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CHROOT&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$MIRROR&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Hostname setzen und und fstab initialisieren&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$NAME&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CHROOT&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/etc/hostname&quot;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'tmpfs /tmp tmpfs defaults,nosuid,nodev 0 0'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CHROOT&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/etc/fstab&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;&lt;span class=&quot;caps&quot;&gt;LXC&lt;/span&gt;-Konfiguration schreiben&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CHROOT&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/../config&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;EOF&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;
    lxc.uts.name = &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$NAME&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;
    lxc.rootfs.path = dir:/var/lib/lxc/&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$NAME&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;/rootfs
    lxc.start.auto = 1

    # &quot;Secure&quot; mounting
    lxc.mount.auto = proc:mixed sys:ro cgroup:mixed

    # Make container unpriviledged
    # (may not be desired if it's services will require full system-access)
    lxc.idmap = u 0 1000000 65536
    lxc.idmap = g 0 1000000 65536
EOF&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;[optional] Netzwerkkonfiguration ergänzen&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Dieser Abschnitt dient als Beispiel und muss den eigenen Anforderungen entsprechend angepasst werden.&lt;/em&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CHROOT&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/../config&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;EOF&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;
    # x's will be replaced by random values
    lxc.net.0.hwaddr = xx:xx:xx:xx:xx:xx
    lxc.net.0.type = veth
    lxc.net.0.flags = up
    lxc.net.0.link = br0
    lxc.net.0.ipv4.address = 192.168.1.111/24
    lxc.net.0.ipv4.gateway = 192.168.1.1
EOF&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Container starten und betreten&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;lxc-start &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$NAME&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
lxc-attach &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$NAME&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; /bin/bash&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Ab hier kann nun mit dem Debian-System wie gewohnt gearbeitet werden.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>FreeBSD-Jails auf neue Version aktualisieren</title>
   <link href="http://groovy-skills.com/freebsd/2023/07/03/freebsd-jails-auf-neue-version-aktualisieren"/>
   <updated>2023-07-03T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/freebsd/2023/07/03/freebsd-jails-auf-neue-version-aktualisieren</id>
   <content type="html">&lt;p&gt;&lt;b&gt;FreeBSD-Jails&lt;/b&gt; können mittlerweile nicht nur sehr einfach auf ein aktuelles Patchlevel gebracht, sondern auch auf neue Major-Versionen aktualisiert werden.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Damit der Erfolg der einzelnen Vorgänge nicht von der Stabilität der &lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt;-Verbindung abhängt, sollten die folgenden Befehle in &lt;code&gt;screen&lt;/code&gt; (oder &lt;code&gt;tmux&lt;/code&gt;) ausgeführt werden.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Umgebung definieren&lt;/h2&gt;
&lt;p&gt;Sämtliche Befehle werden im Hostsystem gegeben. Die meisten verwenden die Variable &lt;code&gt;JAILNAME&lt;/code&gt;, welche daher entsprechend gesetzt sein muss:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nv&quot;&gt;JAILNAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Dienste finden und stoppen&lt;/h2&gt;
&lt;p&gt;Kritische Dienste der Jail sollten deaktiviert werden.&lt;/p&gt;
&lt;p&gt;Eine Auflistung erhält man via &amp;#8220;&lt;code&gt;iocage exec $JAILNAME service -e&lt;/code&gt;&amp;#8221;. Einzelne Dienste kann man dann mittels &amp;#8220;&lt;code&gt;iocage exec $JAILNAME service $SERVICE stop&lt;/code&gt;&amp;#8221; beenden.&lt;/p&gt;
&lt;h2&gt;Jail aktualisieren&lt;/h2&gt;
&lt;p&gt;Der &lt;code&gt;update&lt;/code&gt;-Befehl bringt die Jail auf das aktuelle Patchlevel.&lt;/p&gt;
&lt;p&gt;Das darauf folgende &lt;code&gt;upgrade&lt;/code&gt; aktualisiert die Jail auf ein neues Release. Es weist auf Änderungen hin und fordert den Nutzer zu deren Prüfung und Bestätigung auf.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Diese Variable auf die gewünschte Version setzen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;RELEASE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;13.2

iocage update &lt;span class=&quot;nv&quot;&gt;$JAILNAME&lt;/span&gt;
iocage upgrade &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$RELEASE&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$JAILNAME&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Pakete innerhalb der Jail aktualisieren&lt;/h2&gt;
&lt;p&gt;Bei größeren Versionsschritten kann &amp;#8220;&lt;code&gt;pkg bootstrap&lt;/code&gt;&amp;#8221; erforderlich werden, dessen Ausführung generell unproblematisch sein sollte.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;iocage &lt;span class=&quot;nb&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$JAILNAME&lt;/span&gt; pkg bootstrap &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt;
iocage update &lt;span class=&quot;nv&quot;&gt;$JAILNAME&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--pkgs&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Jail neu starten&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;iocage restart &lt;span class=&quot;nv&quot;&gt;$JAILNAME&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Quellen&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;https://www.truenas.com/community/threads/how-to-update-upgrade-true-freenas-jails-updated.96640/&quot; title=&quot;Updated&quot;&gt;How to Update &amp;amp; Upgrade True/FreeNas Jails&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>Nachträglich Pakete in resflash-OpenBSD hinzufügen</title>
   <link href="http://groovy-skills.com/openbsd/2023/04/12/nachtraglich-pakete-in-resflash-openbsd-hinzufugen"/>
   <updated>2023-04-12T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/openbsd/2023/04/12/nachtraglich-pakete-in-resflash-openbsd-hinzufugen</id>
   <content type="html">&lt;p&gt;&lt;b&gt;&lt;span class=&quot;caps&quot;&gt;WICHTIG&lt;/span&gt;: Dieser Beitrag ist in seiner Entwurffassung veröffentlicht und dient vorrangig als Unterstützung bei der autonomen Lösungssuche durch den Leser. Der Beitrag erfüllt nicht die üblichen Qualitätsstandards dieses Blogs und erfordert damit ein tieferes Verständnis der Zusammenhänge. Falsch angewendete Befehle können zu unerwünschten Problemen wie Datenverlust führen oder gar irreparable Defekte verursachen.&lt;/b&gt;&lt;/p&gt;
&lt;h2&gt;System in &amp;#8220;Rohzustand&amp;#8221; versetzen&lt;/h2&gt;
&lt;ol&gt;
	&lt;li&gt;Paket suchen (&lt;code&gt;pkg_info -Q &amp;lt;name&amp;gt;&lt;/code&gt;)&lt;/li&gt;
	&lt;li&gt;Prozesse finden die Mountpunkte belegen&lt;br /&gt;
&lt;code&gt;for dir in /etc /var ; do find $dir -exec sh -c ' fuser $0 ' {} \; 2&amp;gt;&amp;amp;1 | sed -n 's#\(.*: ..*\)#\1#p' ; done&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;Gefundene Prozesse beenden &amp;#8211; Beispiel:&lt;br /&gt;
&lt;code&gt;rcctl ls started | grep -v sshd | xargs rcctl stop&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;/etc&lt;/code&gt; und &lt;code&gt;/var&lt;/code&gt; aushängen&lt;br /&gt;
&lt;code&gt;umount /etc /var (evtl mit -f)&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;Root-Pfad temporär schreibbar machen&lt;br /&gt;
&lt;code&gt;mount -o rw /&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Nachträglich Pakete installieren&lt;/h2&gt;
&lt;p&gt;Anstatt hier die installurl-Datei zu schreiben, kann auch &lt;code&gt;PKG_PATH&lt;/code&gt; gesetzt werden. Allerdings ist dann die Syntax eine andere.&lt;/p&gt;
&lt;p&gt;Benötigt man Software für eine ältere OpenBSD-Version, wird man vielleicht auf einem Spiegelserver in der Liste auf https://www.openbsd.org/ftp.html fündig.&lt;/p&gt;
&lt;p&gt;Beispielsweise stellte https://ftp.halifax.rwth-aachen.de/pub/OpenBSD noch am 16.11.2022 Pakete für OpenBSD 6.9 bereit. http://mirror.junda.nl/pub/OpenBSD/ hielt noch am 30.05.2024 Pakete für Version 7.2 bereit.&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Mirror als Installationsquelle angeben&lt;br /&gt;
&lt;code&gt;echo https://cdn.openbsd.org/pub/OpenBSD &amp;gt; /etc/installurl&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;Nameserver setzen&lt;br /&gt;
&lt;code&gt;echo nameserver 9.9.9.9 &amp;gt; /etc/resolv.conf&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;Neues Paket hinzufügen&lt;br /&gt;
&lt;code&gt;pkg_add vim--no_x11&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;[optional] Alle bereits installierten Paketen aktualisieren&lt;br /&gt;
&lt;code&gt;pkg_add -u&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;Ursprünglichen Konfigurationszustand wiederherstellen&lt;br /&gt;
&lt;code&gt;rm /etc/installurl /etc/resolv.conf&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Wichtig: Fügt &lt;code&gt;pkg_add&lt;/code&gt; einen neuen Benutzer hinzu, muss auch /cfg/etc/master.passwd entsprechend aktualisiert werden.&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;Gleiches gilt für &lt;code&gt;/cfg/etc/passwd&lt;/code&gt;, fern diese existiert:&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;mount /cfg
&lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;f &lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;master.passwd passwd &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do
        &lt;/span&gt;sdiff /cfg/etc/&lt;span class=&quot;nv&quot;&gt;$f&lt;/span&gt; /etc/&lt;span class=&quot;nv&quot;&gt;$f&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; /tmp/&lt;span class=&quot;nv&quot;&gt;$f&lt;/span&gt; 
        &lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; /tmp/&lt;span class=&quot;nv&quot;&gt;$f&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /cfg/etc/&lt;span class=&quot;nv&quot;&gt;$f&lt;/span&gt; 
&lt;span class=&quot;k&quot;&gt;done
&lt;/span&gt;umount /cfg&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;System neu starten&lt;/h2&gt;
&lt;p&gt;Um resflash-konformen Betrieb wieder aufzunehmen:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;reboot&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</content>
 </entry>
 
 <entry>
   <title>OpenBSD i386 in libvirt QEMU/KVM lauffähig installieren</title>
   <link href="http://groovy-skills.com/openbsd/2023/04/11/openbsd-i386-in-libvirt-qemu-slash-kvm-lauffahig-installieren"/>
   <updated>2023-04-11T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/openbsd/2023/04/11/openbsd-i386-in-libvirt-qemu-slash-kvm-lauffahig-installieren</id>
   <content type="html">&lt;p&gt;I/O der &lt;b&gt;i386-Architekturvariante&lt;/b&gt; von OpenBSD ist in &lt;span class=&quot;caps&quot;&gt;QEMU&lt;/span&gt;/&lt;span class=&quot;caps&quot;&gt;KVM&lt;/span&gt; derart langsam, dass es quasi unmöglich ist, das System zu benutzen.&lt;/p&gt;
&lt;p&gt;In diesem Artikel wird das Problem durch Deaktivieren der Kernel-Funktionen &lt;b&gt;mpbios&lt;/b&gt; sowie &lt;b&gt;acpimadt&lt;/b&gt; umgangen.&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;/p&gt;
&lt;p&gt;&lt;em&gt;Die Anleitung kann auch als Referenz für Installationen der x86_64-Variante genutzt werden. In diesem Fall kann &amp;#8211; und sollte &amp;#8211; auf den Workaround verzichtet werden. Das System funktioniert ohne ihn einwandfrei.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Umgebung definieren&lt;/h2&gt;
&lt;p&gt;Diese Variablen müssen in jedem Schritt des folgenden Ablaufs gesetzt sein:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nv&quot;&gt;VERSION&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;7.3
&lt;span class=&quot;c&quot;&gt;#ARCH=amd64&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;ARCH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;i386
&lt;span class=&quot;nv&quot;&gt;CDROM_PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/lib/libvirt/images/pool
&lt;span class=&quot;nv&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$VERSION&lt;/span&gt; | tr &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; .&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;OpenBSD herunterladen&lt;/h2&gt;
&lt;p&gt;Geladen wird das &lt;b&gt;installXX.iso&lt;/b&gt; Image der gewünschent Architektur.&lt;sup class=&quot;footnote&quot; id=&quot;fnr2&quot;&gt;&lt;a href=&quot;#fn2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt;

mkdir &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$CDROM_PATH&lt;/span&gt;
wget &lt;span class=&quot;nt&quot;&gt;-O&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$CDROM_PATH&lt;/span&gt;/openbsd-install&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;-&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ARCH&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;.iso &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        https://cdn.openbsd.org/pub/OpenBSD/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;VERSION&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ARCH&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/install&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;.iso&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Virtuelle Maschine erstellen&lt;/h2&gt;
&lt;p&gt;Hier wird &lt;b&gt;virt-install&lt;/b&gt; anstatt der grafischen Oberfläche &lt;b&gt;virt-manager&lt;/b&gt; verwendet um die virtuelle Maschine mit nur einem Befehl zu erstellen.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt;

virt-install &lt;span class=&quot;nt&quot;&gt;--noautoconsole&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;--install&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;no_install&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;yes &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;--metadata&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;openbsd - Resflash-Buildumgebung [&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$ARCH&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;]&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;--name&lt;/span&gt; openbsd-&lt;span class=&quot;nv&quot;&gt;$ARCH&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;--os-variant&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;openbsd7.0 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;--ram&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;2048 &lt;span class=&quot;nt&quot;&gt;--vcpus&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;4 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;--graphics&lt;/span&gt; spice,listen&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0.0.0.0 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;--disk&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;raw,path&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/var/lib/libvirt/images/openbsd-&lt;span class=&quot;nv&quot;&gt;$ARCH&lt;/span&gt;.raw,size&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;10 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;--cdrom&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$CDROM_PATH&lt;/span&gt;/openbsd-install&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;-&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ARCH&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;.iso &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;--network&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;bridge&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;br0&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;OpenBSD in auf serielle Konsole umschalten&lt;/h2&gt;
&lt;p&gt;Um auf die Nutzung der grafischen libvirt-Verwaltungsoberfläche &lt;b&gt;virt-manager&lt;/b&gt; auch für diesen Schritt zu verzichten, könnte eine eigene OpenBSD-&lt;span class=&quot;caps&quot;&gt;ISO&lt;/span&gt; Datei mit bereits aktivierter serieller Konsole erstellt werden&lt;sup class=&quot;footnote&quot; id=&quot;fnr3&quot;&gt;&lt;a href=&quot;#fn3&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Einfacher ist es allerdings, die Eingabe von &lt;code&gt;set tty com0&lt;/code&gt; direkt als Tastensequenz an die &lt;code&gt;boot&amp;gt;&lt;/code&gt; Aufforderung der VM zu senden um so das System auf die serielle Konsole umzuschalten:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Maschine auf serielle Konsole umschalten&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'0x1f\n'&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'0x12\n'&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'0x14\n'&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SPACE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'0x39\n'&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'0x2e\n'&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'0x18\n'&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'0x32\n'&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;ZERO&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'0x0b\n'&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'0x15\n'&lt;/span&gt;

&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt; virsh reset openbsd-&lt;span class=&quot;nv&quot;&gt;$ARCH&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sleep 3s
&lt;span class=&quot;nb&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;%b&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$s$e$t&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SPACE&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$t$t$y&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SPACE&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$c$o$m$ZERO&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; | &lt;span class=&quot;k&quot;&gt;while &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;read &lt;/span&gt;keysym &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do &lt;/span&gt;virsh send-key openbsd-&lt;span class=&quot;nv&quot;&gt;$ARCH&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--codeset&lt;/span&gt; xt &lt;span class=&quot;nv&quot;&gt;$keysym&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; sleep .1 &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;done
&lt;/span&gt;virsh send-key openbsd-&lt;span class=&quot;nv&quot;&gt;$ARCH&lt;/span&gt; KEY_ENTER &lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Verbindung zu serieller Konsole herstellen&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nun kann per Kommandozeile mittels &lt;code&gt;virsh&lt;/code&gt; eine Verbindung hergestellt werden:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt;
virsh console openbsd-&lt;span class=&quot;nv&quot;&gt;$ARCH&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;In dieser Konsole erhöht man die Baudrate der Verbindung:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;stty com0 115200&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Verwendet man &lt;em&gt;eine andere Architektur als i386&lt;/em&gt; kann das Standard-System bereits mittels Befehl &lt;code&gt;bsd.rd&lt;/code&gt; gestartet werden&lt;/p&gt;
&lt;h2&gt;[Nur i386] Problematische Kernel-Funktionen vorübergehend deaktivieren&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Innerhalb&lt;/em&gt; der selben Konsole schaltet man nun die entsprechenden Funktionen für den aktuellen Bootvorgang ab:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;boot &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt;
disable mpbios
disable acpimadt
quit&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;OpenBSD installieren&lt;/h2&gt;
&lt;p&gt;Direkt nachdem man an dieser Stelle die Installation von OpenBSD entsprechend der eigenen Anforderungen konfiguriert und installiert hat (Befehl &lt;code&gt;(I)nstall&lt;/code&gt;), wechselt man zurück in die Kommandozeile (Befehl &lt;code&gt;(S)hell&lt;/code&gt;) um &lt;em&gt;anstelle eines direkten Neustarts&lt;/em&gt; mit den weiteren Schritten dieser Anleitung fortzufahren.&lt;/p&gt;
&lt;h2&gt;[Nur i386] Problematische Kernel-Funktionen dauerhaft deaktivieren&lt;/h2&gt;
&lt;p&gt;Nach wie vor &lt;em&gt;innerhalb&lt;/em&gt; der OpenBSD Konsole schaltet man nun die entsprechenden Funktionen im Kernel dauerhaft ab:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'disable mpbios\ndisable acpimadt'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /mnt/etc/bsd.re-config
chroot /mnt sh &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'cat /etc/bsd.re-config | config -e -o /bsd.new -c /dev/stdin /bsd'&lt;/span&gt;
mv /mnt/bsd /mnt/bsd.old &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; mv /mnt/bsd.new /mnt/bsd&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Manpages: &lt;a href=&quot;https://man.openbsd.org/config.8&quot;&gt;config&lt;/a&gt;, &lt;a href=&quot;https://man.openbsd.org/bsd.re-config.5&quot;&gt;bsd.re-config&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Virtuelle CD-&lt;span class=&quot;caps&quot;&gt;ROM&lt;/span&gt; auswerfen und VM neu starten&lt;/h2&gt;
&lt;p&gt;Letztendlich wirft man über das Hostsystem die virtuelle CD-&lt;span class=&quot;caps&quot;&gt;ROM&lt;/span&gt; aus und startet das neu installierte OpenBSD-System:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;mediapath&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;virsh domblklist openbsd-&lt;span class=&quot;nv&quot;&gt;$ARCH&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-F&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CDROM_PATH&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; | awk &lt;span class=&quot;s1&quot;&gt;'{ print $1 }'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;
virsh change-media openbsd-&lt;span class=&quot;nv&quot;&gt;$ARCH&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$CDROM_PATH&lt;/span&gt;/openbsd-install&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;-&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ARCH&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;.iso &lt;span class=&quot;nv&quot;&gt;$mediapath&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--eject&lt;/span&gt;
virsh reboot openbsd-&lt;span class=&quot;nv&quot;&gt;$ARCH&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;hr /&gt;
&lt;p style=&quot;vertical-align:middle;&quot; class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;a href=&quot;#fnr1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; https://misc.openbsd.narkive.com/lr1CB95G/very-slow-i-o-under-openbsd-i386-on-qemu-kvm-from-rhel7rc&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn2&quot;&gt;&lt;a href=&quot;#fnr2&quot;&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; https://www.openbsd.org/faq/faq4.html#Download&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn3&quot;&gt;&lt;a href=&quot;#fnr3&quot;&gt;&lt;sup&gt;3&lt;/sup&gt;&lt;/a&gt; http://www.weirdnet.nl/openbsd/serial/&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Vorinstalliertes System durch Alpine Linux ersetzen</title>
   <link href="http://groovy-skills.com/linux/2023/03/21/vorinstalliertes-system-durch-alpine-linux-ersetzen"/>
   <updated>2023-03-21T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/linux/2023/03/21/vorinstalliertes-system-durch-alpine-linux-ersetzen</id>
   <content type="html">&lt;p&gt;Nur wenige Anbieter bieten virtuelle private Server (&lt;span class=&quot;caps&quot;&gt;VPS&lt;/span&gt;) mit Alpine Linux an. Oft ist allerdings ein &amp;#8220;Rettungsmodus&amp;#8221; verfügbar, der grundlegende Änderungen am System ermöglicht.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Diese Anleitung beschreibt wie man diesen Rettungsmodus nutzt um ein vorinstalliertes Betriebssystem komplett durch ein &lt;strong&gt;&amp;#8220;diskless&amp;#8221;&lt;/strong&gt; Alpine Linux zu ersetzen.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Obgleich sie auf die Änderungen in einem &lt;b&gt;&lt;span class=&quot;caps&quot;&gt;VPS&lt;/span&gt;&lt;/b&gt; optimiert ist, kann die gleiche Vorgehensweise bei Bedarf auch für lokale Installationen genutzt werden.&lt;/p&gt;
&lt;h2&gt;Rettungsmodus aktivieren&lt;/h2&gt;
&lt;p&gt;Der Rettungsmodus wird für gewöhnlich über die Web-Verwaltungsoberfläche des Hosting-Anbieters aktiviert.&lt;/p&gt;
&lt;p&gt;Sobald sich das System in diesem Modus befindet, kann man mit folgenden Schritten fortfahren.&lt;/p&gt;
&lt;h2&gt;Im Rettungssystem: Alpine Linux herunterladen&lt;/h2&gt;
&lt;p&gt;Das &lt;b&gt;&lt;span class=&quot;caps&quot;&gt;ISO&lt;/span&gt;-Abbild&lt;/b&gt; dient als Vorlage für die bootbare Partition die eingerichtet werden soll.&lt;br /&gt;
Das &lt;b&gt;minirootfs-Archiv&lt;/b&gt; stellt eine Alpine Linux chroot-Umgebung mit dem notwendigen Werkzeug `setup-bootable`&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; bereit.&lt;br /&gt;
Die &lt;b&gt;headless.apkovl&lt;/b&gt; passt die Konfiguration so an, dass bereits beim ersten Start Fernzugriff per &lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt; möglich wird.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;wget &lt;span class=&quot;nt&quot;&gt;--no-check-certificate&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        https://dl-cdn.alpinelinux.org/alpine/v3.17/releases/x86_64/alpine-minirootfs-3.17.2-x86_64.tar.gz &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        https://dl-cdn.alpinelinux.org/alpine/v3.17/releases/x86_64/alpine-virt-3.17.2-x86_64.iso &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
        https://github.com/macmpi/alpine-linux-headless-bootstrap/raw/main/headless.apkovl.tar.gz&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Im Rettungssystem: Partitionen vorbereiten&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Achtung:&lt;/strong&gt; Ab hier werden die bisherigen Inhalte des angegebenen Geräts zerstört.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Es ist auch zu berücksichtigen, dass sich im Rettungssystem der Gerätename der Festplatte oft von dem im Normalbetrieb unterscheidet.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Diese drei Konstanten anpassen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;BLOCK_DEVICE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/dev/vdb
&lt;span class=&quot;nv&quot;&gt;PARTITION1_MB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;500
&lt;span class=&quot;nv&quot;&gt;PARTITION2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;BLOCK_DEVICE&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;2

&lt;span class=&quot;nv&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;2048
&lt;span class=&quot;nv&quot;&gt;sector_size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;512
&lt;span class=&quot;nv&quot;&gt;part1_sectors&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$PARTITION1_MB&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$sector_size&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;label: dos
sector-size: &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$sector_size&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;
start=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$start&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, size=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$part1_sectors&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, type=b, bootable
start=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$start&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$part1_sectors&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, type=83
&quot;&lt;/span&gt; | sfdisk &lt;span class=&quot;nv&quot;&gt;$BLOCK_DEVICE&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Dateisystem der zweiten Partition initialisieren&lt;/span&gt;
mkfs.ext4 &lt;span class=&quot;nv&quot;&gt;$PARTITION2&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Im Rettungssystem: Temporäres Alpine Linux einrichten&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Diese Konstante anpassen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;PARTITION1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;BLOCK_DEVICE&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;1

mkdir /alpine
&lt;span class=&quot;nb&quot;&gt;tar &lt;/span&gt;xzvf alpine-minirootfs-3.17.2-x86_64.tar.gz &lt;span class=&quot;nt&quot;&gt;-C&lt;/span&gt; /alpine

&lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;d &lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;dev sys proc tmp &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do &lt;/span&gt;mount &lt;span class=&quot;nt&quot;&gt;--rbind&lt;/span&gt; /&lt;span class=&quot;nv&quot;&gt;$d&lt;/span&gt; /alpine/&lt;span class=&quot;nv&quot;&gt;$d&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;done

&lt;/span&gt;cp /etc/resolv.conf /alpine/etc/resolv.conf 
cp /etc/network/interfaces /alpine/etc/network/interfaces
cp alpine-virt-3.17.2-x86_64.iso /alpine/root/

chroot /alpine mkfs.vfat &lt;span class=&quot;nt&quot;&gt;-vn&lt;/span&gt; ALPINE &lt;span class=&quot;nv&quot;&gt;$PARTITION1&lt;/span&gt;
chroot /alpine apk update
chroot /alpine apk add alpine-conf&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Im Rettungssystem: Alpine Linux auf Zielgerät installieren&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Diese Konstante anpassen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;BLOCK_DEVICE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/dev/vdb

chroot /alpine setup-bootable &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; /root/alpine-virt-3.17.2-x86_64.iso &lt;span class=&quot;nv&quot;&gt;$PARTITION1&lt;/span&gt;

mount &lt;span class=&quot;nv&quot;&gt;$PARTITION1&lt;/span&gt; /mnt
cp headless.apkovl.tar.gz /mnt/

poweroff&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Rettungsmodus deaktivieren&lt;/h2&gt;
&lt;p&gt;An dieser Stelle schaltet man System wieder zurück in den Normalbetrieb und startet das neu installierte Alpine Linux.&lt;/p&gt;
&lt;h2&gt;Alpine Linux System konfigurieren&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Diese Konstante anpassen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;PARTITION2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;vda2

&lt;span class=&quot;c&quot;&gt;# System nach Wunsch konfigurieren&lt;/span&gt;
setup-alpine

&lt;span class=&quot;c&quot;&gt;# Zweite Partition beim Start einhängen&lt;/span&gt;
mkdir /media/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PARTITION2&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;printf&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/dev/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PARTITION2&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\t&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/media/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PARTITION2&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\t&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;ext4&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\t&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;rw&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\t&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;0 0&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/fstab

&lt;span class=&quot;c&quot;&gt;# Public Key SSH-Rootzugang vorbereiten&lt;/span&gt;
mkdir /root/.ssh &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; touch /root/.ssh/authorized_keys
chmod &lt;span class=&quot;nt&quot;&gt;-R&lt;/span&gt; go-rwx /root/.ssh
lbu include /root/.ssh/authorized_keys&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Änderungen dauerhaft übernehmen&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;lbu commit &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;code&gt;lbu commit&lt;/code&gt; muss immer ausgeführt werden, wenn Änderungen dauerhaft übernommen werden sollen. Es schreibt Konfigurationsanpassungen in &lt;strong&gt;/media/$PARTITION1/$&lt;span class=&quot;caps&quot;&gt;HOST&lt;/span&gt;.apkovl.tar.gz&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Von dieser Datei werden sie dann beim nächsten Systemstart wiederhergestellt. Das Grundsystem bleibt unverändert.&lt;/p&gt;
&lt;hr /&gt;
&lt;p style=&quot;vertical-align:middle;&quot; class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;a href=&quot;#fnr1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; https://wiki.alpinelinux.org/wiki/Alpine_setup_scripts#setup-bootable&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Alpine Linux für Raspberry Pi aufsetzen</title>
   <link href="http://groovy-skills.com/linux/2023/03/10/alpine-linux-fur-raspberry-pi-aufsetzen"/>
   <updated>2023-03-10T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/linux/2023/03/10/alpine-linux-fur-raspberry-pi-aufsetzen</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Diese Anleitung basiert auf dem Artikel im offiziellen Alpine Linux Wiki&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;. Sie beschreibt die Einrichtung eines &lt;strong&gt;&amp;#8220;diskless&amp;#8221;&lt;/strong&gt; Setup und wurde mit einem Raspberry Pi 2 Model B Rev 1.1 getestet.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Alpine Linux für Raspberry Pi herunterladen&lt;/h2&gt;
&lt;p&gt;Auf einem bereits mit Linux laufenden Raspberry Pi kann man mittels &lt;code&gt;grep -i model /proc/cpuinfo | uniq&lt;/code&gt; feststellen, welches Modell man besitzt.&lt;/p&gt;
&lt;p&gt;Dementsprechend wählt man im &lt;a href=&quot;http://alpinelinux.org/downloads/&quot;&gt;Alpine Linux Downloadbereich&lt;/a&gt; das zur Architektur passende Archiv.&lt;/p&gt;
&lt;h2&gt;SD-Karte vorbereiten&lt;/h2&gt;
&lt;p&gt;Für den Betrieb ist lediglich &lt;em&gt;eine&lt;/em&gt; bootbare &lt;span class=&quot;caps&quot;&gt;VFAT&lt;/span&gt; Partition notwendig. In diesem Beispiel wird diese relativ klein gehalten um den restlichen Platz für eine weitere Partition vom Typ F2FS zu nutzen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SD-Karte partitionieren&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Achtung:&lt;/strong&gt; Ab hier werden die bisherigen Inhalte des angegebenen Geräts zerstört.&lt;/em&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Diese beiden Konstanten anpassen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SD_CARD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/dev/mmcblk0
&lt;span class=&quot;nv&quot;&gt;PARTITION1_MB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;500

&lt;span class=&quot;nv&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;2048
&lt;span class=&quot;nv&quot;&gt;sector_size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;512
&lt;span class=&quot;nv&quot;&gt;part1_sectors&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$PARTITION1_MB&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$sector_size&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;))&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;label: dos
sector-size: &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$sector_size&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;
start=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$start&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, size=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$part1_sectors&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, type=c, bootable
start=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$((&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$start&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$part1_sectors&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;, type=83
&quot;&lt;/span&gt; | sfdisk &lt;span class=&quot;nv&quot;&gt;$SD_CARD&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Partitionen formatieren&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Diese Konstante anpassen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;BLOCK_PREFIX&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/dev/mmcblk0p

mkfs.vfat &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;BLOCK_PREFIX&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;1
mkfs.f2fs &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;BLOCK_PREFIX&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;2&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Alpine Linux aufspielen&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Diese beiden Konstanten anpassen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;BLOCK_PREFIX&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/dev/mmcblk0p
&lt;span class=&quot;nv&quot;&gt;ALPINE_ARCHIVE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;alpine-rpi-3.17.2-armv7.tar.gz

&lt;span class=&quot;nv&quot;&gt;MNT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;mktemp &lt;span class=&quot;nt&quot;&gt;--directory&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;

mount &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;BLOCK_PREFIX&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;1 &lt;span class=&quot;nv&quot;&gt;$MNT&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;tar &lt;/span&gt;xzvf &lt;span class=&quot;nv&quot;&gt;$ALPINE_ARCHIVE&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-C&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$MNT&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Optional: Audio via Klinkenstecker aktivieren&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#echo dtparam=audio=on &amp;gt;&amp;gt; $MNT/usercfg.txt &lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Optional: Overscan deaktivieren&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#           siehe https://askubuntu.com/a/1229856&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#echo disable_overscan=1 &amp;gt;&amp;gt; $MNT/usercfg.txt &lt;/span&gt;


umount &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;BLOCK_PREFIX&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;1 &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; rmdir &lt;span class=&quot;nv&quot;&gt;$MNT&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Alpine Linux System konfigurieren&lt;/h2&gt;
&lt;p&gt;Mit eingesetzter SD-Karte kann der Raspberry Pi nun gestartet werden.&lt;/p&gt;
&lt;p&gt;Die Konfiguration des Systems erfolgt entsprechend den Anforderungen des Benutzers. Um eine reibungslose Grundeinrichtung zu gewährleisten, sollten allerdings folgende Antworten wie hier gezeigt übernommen werden:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;setup-alpine

No disks available. Try boot media /media/mmcblk0p1? &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;y/n&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; n
Enter where to store configs &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; mmcblk0p1
Enter apk cache directory &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; /media/mmcblk0p1/cache&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Optimierungen ergänzen&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Ältere Paketversionen erhalten&lt;/span&gt;
sed &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'s|# BACKUP_LIMIT=3|BACKUP_LIMIT=3|g'&lt;/span&gt; /etc/lbu/lbu.conf

&lt;span class=&quot;c&quot;&gt;# Zusätzliche Paketquellen aktivieren&lt;/span&gt;
sed &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'s|#http://\(.*\)/community|http://\1/community|g'&lt;/span&gt; /etc/apk/repositories
&lt;span class=&quot;c&quot;&gt;#sed -i 's|#http://\(.*\)/testing|http://\1/testing|g' /etc/apk/repositories&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Zweite Partition bei Systemstart einhängen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;PART2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'mmcblk0p2'&lt;/span&gt;
mkdir /media/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PART2&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;/dev/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PART2&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; /media/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PART2&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; f2fs noatime,ro 0 0&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/fstab

&lt;span class=&quot;c&quot;&gt;# Public Key SSH-Rootzugang vorbereiten&lt;/span&gt;
mkdir /root/.ssh &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; touch /root/.ssh/authorized_keys &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; chmod &lt;span class=&quot;nt&quot;&gt;-R&lt;/span&gt; go-rwx /root/.ssh
lbu include /root/.ssh/authorized_keys&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Vorhandene Pakete aktualisieren und optional zusätzliche installieren&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;apk update &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apk upgrade
&lt;span class=&quot;c&quot;&gt;#apk add rsync&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Änderungen dauerhaft übernehmen&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;lbu commit &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;code&gt;lbu commit&lt;/code&gt; muss immer ausgeführt werden, wenn Änderungen dauerhaft übernommen werden sollen. Es schreibt Konfigurationsanpassungen in &lt;strong&gt;/media/mmcblk0p1/$&lt;span class=&quot;caps&quot;&gt;HOST&lt;/span&gt;.apkovl.tar.gz&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Von dieser Datei werden sie dann beim nächsten Systemstart wiederhergestellt. Das Grundsystem bleibt unverändert.&lt;/p&gt;
&lt;h2&gt;System neu starten&lt;/h2&gt;
&lt;p&gt;Abschließend sollte die Funktionstüchtigkeit des Systems nach einem Neustart verifiziert werden:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;reboot&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Hinweis: Headless-Installation&lt;/h2&gt;
&lt;p&gt;Sollte kein Bildschirm oder keine Tastatur verfügbar sein, kann &amp;#8211; entsprechendes Verständins vorausgesetzt &amp;#8211; eine &lt;a href=&quot;https://github.com/macmpi/alpine-linux-headless-bootstrap&quot;&gt;passende Overlay-Datei&lt;/a&gt; genutzt werden um bereits beim ersten Start Zugang über das Netzwerk (&lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt;) zu ermöglichen.&lt;/p&gt;
&lt;hr /&gt;
&lt;p style=&quot;vertical-align:middle;&quot; class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;a href=&quot;#fnr1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; https://wiki.alpinelinux.org/wiki/Raspberry_Pi&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Void-Linux als X2Go-ThinClient/-Server Lösung konfigurieren</title>
   <link href="http://groovy-skills.com/linux/2022/04/10/void-linux-als-x2go-thinclient-slash-server-losung-konfigurieren"/>
   <updated>2022-04-10T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2022/04/10/void-linux-als-x2go-thinclient-slash-server-losung-konfigurieren</id>
   <content type="html">&lt;p&gt;Die Anleitung(1) zur &lt;strong&gt;Konfiguration einer Thin-Client Umgebung mittels X2Go&lt;/strong&gt; ist unnötig komplex und kann mit Hilfe der richtigen Werkzeuge drastisch vereinfacht werden.&lt;/p&gt;
&lt;p&gt;Hier sind die notwendigen Schritte erläutert um &lt;b&gt;Void-Linux&lt;/b&gt; als Server zu nutzen. Dieser stellt alles Notwendige bereit um Clients über das Netzwerk zu booten und ihn dann so zu nutzen, als wäre der Benutzer am Server lokal eingeloggt:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Ein &lt;b&gt;&lt;span class=&quot;caps&quot;&gt;DHCP&lt;/span&gt;-Dienst&lt;/b&gt; weist dem Client eine &lt;em&gt;IP Adresse&lt;/em&gt; zu und teilt ihm mit wo die Inhalte für den weiteren Bootvorgang zu finden sind.&lt;/li&gt;
	&lt;li&gt;Ein &lt;b&gt;&lt;span class=&quot;caps&quot;&gt;TFTP&lt;/span&gt;-Dienst&lt;/b&gt; stellt dem Client einen &lt;em&gt;Bootloader&lt;/em&gt; zur Verfügung, welcher im weiteren Schritt Kernel und Init-Umgebung laden kann.&lt;/li&gt;
	&lt;li&gt;Ein &lt;b&gt;&lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;-Dienst&lt;/b&gt; stellt dem Client letztendlich Kernel, Init-Umgebung und ein &lt;em&gt;vollständiges Betriebssystem-Abbild&lt;/em&gt; zur Verfügung.&lt;/li&gt;
	&lt;li&gt;Zu der am Server installierten grafischen Oberfläche &lt;b&gt;&lt;span class=&quot;caps&quot;&gt;XFCE&lt;/span&gt;&lt;/b&gt; verbindet sich der Client am Ende des Startvorgangs via &lt;em&gt;X2Go-Client&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In diesem Beispiel wird in einer bereits vorbereiteten &lt;b&gt;Void-Linux&lt;/b&gt; Installation(2) die Netzwerk-Schnittstelle &lt;em&gt;eth1&lt;/em&gt; als &lt;code&gt;192.168.0.3/24&lt;/code&gt; konfiguriert.&lt;/p&gt;
&lt;p&gt;Am Server sollten dafür &lt;em&gt;mindestens 10 GB Festplattenkapazität&lt;/em&gt; zur Verfügung stehen und Clients sollten über &lt;em&gt;mindestens 1 GB &lt;span class=&quot;caps&quot;&gt;RAM&lt;/span&gt;&lt;/em&gt; verfügen.&lt;/p&gt;
&lt;h2&gt;Server für X2Go-Verbindungen vorbereiten&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Pakete installieren und X2Go-Server vorbereiten&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
xbps-install -Suy dhcp syslinux tftpd-hpa darkhttpd xfce4 x2goserver curl dracut-network binutils squashfs-tools
ln -s /etc/sv/x2gocleansessions /var/service/
x2godbadmin --createdb

# X2Go-Verbindung zu Desktopumgebung von Void-Clients ermöglichen
sed -i 's#/etc/redhat-release ]#/etc/redhat-release ] || [ -d /usr/share/void-artwork ]#g' /etc/x2go/Xsession
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;XFCE&lt;/span&gt; ohne Compositor starten&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mit aktivem Compositor ist &lt;span class=&quot;caps&quot;&gt;XFCE&lt;/span&gt; in X2Go quasi unbrauchbar(3). Er kann aber einfach deaktiviert werden:&lt;/p&gt;
&lt;pre&gt;
cat &amp;gt;&amp;gt; /usr/local/bin/xfce &amp;lt;&amp;lt; EOF
#!/bin/sh
/usr/bin/xfconf-query -c xfwm4 -p /general/use_compositing -s false
/usr/bin/xfce4-session
EOF

chmod +x /usr/local/bin/xfce
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Netzwerk-Schnittstelle konfigurieren&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
cat &amp;gt;&amp;gt; /etc/rc.local &amp;lt;&amp;lt; EOF
ip addr add 192.168.0.3/24 brd 192.168.0.255 dev eth1
ip link set eth1 up alias &quot;'Network for Thin-Clients'&quot;
EOF

/etc/rc.local
&lt;/pre&gt;
&lt;h2&gt;Dienste einrichten&lt;/h2&gt;
&lt;p&gt;Die Dienste stellen die eingangs genannten Boot-Schritte zur Verfügung: &lt;span class=&quot;caps&quot;&gt;DHCP&lt;/span&gt; &amp;gt; &lt;span class=&quot;caps&quot;&gt;TFTP&lt;/span&gt; &amp;gt; &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;DHCP&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
cat &amp;gt;&amp;gt; /etc/dhcpd.conf &amp;lt;&amp;lt; EOF
authoritative;
subnet 192.168.0.0 netmask 255.255.255.0 {
    range 192.168.0.20 192.168.0.250;
    option domain-name &quot;local&quot;;
    option domain-name-servers 192.168.0.3;
    option broadcast-address 192.168.0.255;
    option routers 192.168.0.3;
    option subnet-mask 255.255.255.0;
    option root-path &quot;/&quot;;
    filename &quot;lpxelinux.0&quot;;
}
EOF

cp -a /etc/sv/dhcpd4 /etc/sv/dhcpd4-eth1
sed -i 's#dhcpd4.pid}$#dhcpd4.pid} eth1#g' /etc/sv/dhcpd4-eth1/run
ln -s /etc/sv/dhcpd4-eth1 /var/service/dhcpd4-eth1
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;TFTP&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
# PXE Netzwerk-Bootloader anbieten
cp -a /usr/lib/syslinux/ldlinux.c32 /usr/lib/syslinux/lpxelinux.0 /var/lib/tftp/

mkdir /var/lib/tftp/pxelinux.cfg
cat &amp;gt;&amp;gt; /var/lib/tftp/pxelinux.cfg/default &amp;lt;&amp;lt; EOF
DEFAULT x2go-tce

LABEL x2go-tce
TIMEOUT 50
MENU LABEL X2Go-TCE
KERNEL http://192.168.0.3/vmlinuz
INITRD http://192.168.0.3/initrd.img
APPEND root=live:http://192.168.0.3/void.squashfs ro rd.live.image
EOF

ln -s /etc/sv/tftpd-hpa /var/service/
&lt;/pre&gt;
&lt;h3&gt;&lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;&lt;/h3&gt;
&lt;pre&gt;
# Netzwerk-Bootfähiges System bereit stellen
cp /boot/vmlinuz-`uname -r` /srv/www/darkhttpd/vmlinuz
dracut --omit &quot;bash drm btrfs crypt dmraid lvm kernel-modules kernel-modules-extra mdraid nvdimm qemu cifs lunmask nfs resume terminfo usrmount virtfs&quot; --add &quot;livenet&quot; /srv/www/darkhttpd/initrd.img
chmod +r /srv/www/darkhttpd/initrd.img

ln -s /etc/sv/darkhttpd /var/service/
&lt;/pre&gt;
&lt;p&gt;An dieser Stelle sind alle Dienste des Servers vollständig konfiguriert. Es fehlt lediglich das Betriebssystem-Abbild welches der &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;-Dienst dem Client bereit stellt.&lt;/p&gt;
&lt;p&gt;Das Erstellen des Abbilds ist in folgendem Abschnitt erläutert.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2&gt;Betriebssystem-Abbild für den Thin-Client vorkonfigurieren&lt;/h2&gt;
&lt;p&gt;Über https://voidlinux.org/download/ kann das tar-Archiv eines Void-Grundsystems gefunden werden.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Grundsystem installieren&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
URL=https://alpha.de.repo.voidlinux.org/live/current/void-x86_64-musl-ROOTFS-20210930.tar.xz
cd ~
curl -o rootfs.tar.xz &quot;$URL&quot;
mkdir ~/thin &amp;amp;&amp;amp; tar xvf rootfs.tar.xz -C ~/thin

mount --rbind /sys  ~/thin/sys  &amp;amp;&amp;amp; mount --make-rslave ~/thin/sys
mount --rbind /dev  ~/thin/dev  &amp;amp;&amp;amp; mount --make-rslave ~/thin/dev
mount --rbind /proc ~/thin/proc &amp;amp;&amp;amp; mount --make-rslave ~/thin/proc

cp /etc/resolv.conf ~/thin/etc/
echo &quot;client&quot; &amp;gt; ~/thin/etc/hostname

chroot ~/thin/ /bin/xbps-install -Suy xbps
chroot ~/thin/ /bin/xbps-install -uy
chroot ~/thin/ /bin/xbps-install -y base-system xorg-video-drivers xorg-fonts xorg-input-drivers xorg-minimal x2goclient
chroot ~/thin/ /bin/xbps-remove -y base-voidstrap
rm -Rf ~/thin/var/cache/xbps

chroot ~/thin/ /bin/passwd
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;X2Go-Verbindung definieren&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
chroot ~/thin/ /bin/mkdir /root/.x2goclient/

cat &amp;gt;&amp;gt; ~/thin/root/.x2goclient/sessions &amp;lt;&amp;lt; EOF
[server]
clipboard=none
command=xfce
fullscreen=true
host=192.168.0.3
name=srv
icon=/usr/share/void-artwork/void-logo.svg
user=
EOF
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Schritte des Systemstarts automatisieren&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
# root automatisch einloggen
sed -i 's#GETTY_ARGS=.*#GETTY_ARGS=&quot;--autologin root --noclear&quot;#g' ~/thin/etc/sv/agetty-tty1/conf

# X auf tty0 automatisch starten
echo '[ `fgconsole` -eq 1 ] &amp;amp;&amp;amp; startx' &amp;gt; ~/thin/root/.profile

# X2Go-Client automatisch starten
echo 'exec x2goclient --thinclient --session=srv --add-to-known-hosts --no-menu --no-session-edit --branding=/dev/null' &amp;gt; ~/thin/root/.xinitrc

# Herunterfahren per Ausschaltknopf ermöglichen
chroot ~/thin/ /bin/ln -s /etc/sv/acpid /etc/runit/runsvdir/default/acpid
&lt;/pre&gt;
&lt;h2&gt;Betriebssystem-Abbild als SquashFS verpacken&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Spezielle Dateisysteme aus chroot aushängen&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;umount --recursive ~/thin/sys ~/thin/dev ~/thin/proc&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Betriebsystem-Abbild generieren und in &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;-Server erstellen&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;mksquashfs ~/thin /srv/www/darkhttpd/void.squashfs&lt;/pre&gt;
&lt;p&gt;An dieser Stelle sollte ein Client über das Netzwerk via &lt;span class=&quot;caps&quot;&gt;PXE&lt;/span&gt; booten können.&lt;/p&gt;
&lt;p&gt;Im letzten Abschnitt sei noch erläutert, wie man prüft ob jeder der Dienste die notwendigen Dateien korrekt ausliefert.&lt;/p&gt;
&lt;hr/&gt;
&lt;h2&gt;Konfiguration überprüfen&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Antowort des &lt;span class=&quot;caps&quot;&gt;DHCP&lt;/span&gt;-Dienstes prüfen&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
dhcpcd -T eth1
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Verfügbarkeit der Dateien des &lt;span class=&quot;caps&quot;&gt;TFTP&lt;/span&gt;-Dienstes prüfen&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
cd `mktemp -d`
tftp 192.168.0.3 -c get pxelinux.cfg/default
tftp 192.168.0.3 -c get vmlinuz 
tftp 192.168.0.3 -c get initrd.img
stat default vmlinuz initrd.img
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Verfügbarkeit der Dateien des &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;-Dienstes prüfen&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
curl http://192.168.0.3/void.squashfs -o /dev/null
&lt;/pre&gt;
&lt;hr /&gt;
&lt;p style=&quot;vertical-align:middle;&quot; class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;a href=&quot;#fnr1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;https://wiki.x2go.org/doku.php/doc:howto:tce&quot;&gt;X2Go-ThinClientEditon-Live Installation Guide&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn2&quot;&gt;&lt;a href=&quot;#fnr2&quot;&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;https://docs.voidlinux.org/installation/index.html&quot;&gt;Void-Handbook: Installation&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn3&quot;&gt;&lt;a href=&quot;#fnr3&quot;&gt;&lt;sup&gt;3&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;https://wiki.x2go.org/doku.php/doc:de-compat#always_compatible_and_no_workarounds_required&quot;&gt;X2Go Desktop Environment Compatibility&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn4&quot;&gt;&lt;a href=&quot;#fnr4&quot;&gt;&lt;sup&gt;4&lt;/sup&gt;&lt;/a&gt; &lt;a href=&quot;https://docs.voidlinux.org/installation/guides/chroot.html#the-rootfs-method&quot;&gt;Void-Handbook: Installation via the &lt;span class=&quot;caps&quot;&gt;ROOTFS&lt;/span&gt; Method&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>LineageOS auf Samsung Galaxy Tab3 Tablet installieren</title>
   <link href="http://groovy-skills.com/allgemein/2022/04/03/lineageos-auf-samsung-galaxy-tab3-tablet-installieren"/>
   <updated>2022-04-03T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/allgemein/2022/04/03/lineageos-auf-samsung-galaxy-tab3-tablet-installieren</id>
   <content type="html">&lt;p&gt;Diese Anleitung erläutert das Ersetzen des Original-Betriebsystem eines &lt;b&gt;Samsung Galaxy Tab3&lt;/b&gt; Tablet durch das inoffizielle &amp;#8220;LineageOS&amp;#8221; (Android 7.1).&lt;/p&gt;
&lt;p&gt;Das bisherige Betriebsystem wird dabei zerstört. &lt;strong&gt;Daten die nicht verloren gehen dürfen, müssen vorab gesichert werden.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Vorbereitung&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;Heimdall&lt;/b&gt; dient zum Aufspielen der notwendigen Daten auf das Tablet. Falls nicht in den Linux-Paketquellen verfügbar, kann es &lt;a href=&quot;https://www.glassechidna.com.au/heimdall/&quot;&gt;von der offiziellen Website&lt;/a&gt; geladen und installiert werden.&lt;/p&gt;
&lt;h2&gt;&amp;#8220;Recovery&amp;#8221;-System installieren (Tablet in &amp;#8220;Downloadmodus&amp;#8221;)&lt;/h2&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;a href=&quot;https://forum.xda-developers.com/t/recovery-gt-p52xx-unofficial-twrp-3-x-for-samsung-galaxy-tab-3-10-1.3340938/post-65941300&quot;&gt;Team Win Recovery Project 3.x herunterladen&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Tablet Ausschalten und &lt;span class=&quot;caps&quot;&gt;USB&lt;/span&gt;-Kabel entfernen&lt;/li&gt;
	&lt;li&gt;Tablet in Downloadmodus starten: &lt;kbd&gt;VolumeDown&lt;/kbd&gt; und &lt;em&gt;zusätzlich&lt;/em&gt; &lt;kbd&gt;Power&lt;/kbd&gt; drücken und beide Knöpfe gedrückt halten bis ein Warnsymbol erscheint. Nun mit &lt;kbd&gt;VolumeUp&lt;/kbd&gt; bestätigen.&lt;/li&gt;
	&lt;li&gt;Tablet per &lt;span class=&quot;caps&quot;&gt;USB&lt;/span&gt; mit dem Linux-PC verbinden&lt;/li&gt;
	&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;TWRP&lt;/span&gt; vom PC aus auf das Tablet laden: &lt;br/&gt; &lt;code&gt;heimdall flash --RECOVERY twrp-3.0.2-0-santos103g.img --no-reboot&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;Bei Erfolg &lt;em&gt;(&amp;#8220;&lt;span class=&quot;caps&quot;&gt;RECOVERY&lt;/span&gt; upload successful&amp;#8221;)&lt;/em&gt; das Tablet ausschalten(1)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;LineageOS &lt;span class=&quot;caps&quot;&gt;ROM&lt;/span&gt; installieren (Tablet in &amp;#8220;Recoverymodus&amp;#8221;)&lt;/h2&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;a href=&quot;https://forum.xda-developers.com/t/rom-gt-p52xx-unofficial-7-1-2-lineageos-14-1.3587761/post-71813779&quot;&gt;LineageOS herunterladen&lt;/a&gt; und auf eine SD-Karte kopieren&lt;/li&gt;
	&lt;li&gt;Tablet Ausschalten und &lt;span class=&quot;caps&quot;&gt;USB&lt;/span&gt;-Kabel entfernen&lt;/li&gt;
	&lt;li&gt;SD-Karte mit LineageOS &lt;span class=&quot;caps&quot;&gt;ZIP&lt;/span&gt;-Datei in Tablet einsetzen(2)&lt;/li&gt;
	&lt;li&gt;Tablet in Recoverymodus starten: &lt;kbd&gt;VolumeUp&lt;/kbd&gt; und &lt;em&gt;zusätzlich&lt;/em&gt; &lt;kbd&gt;Power&lt;/kbd&gt; drücken und beide Knöpfe gedrückt halten bis das Samsung-Logo erscheint.&lt;/li&gt;
	&lt;li&gt;Bisheriges System löschen (!): &lt;b&gt;Wipe &amp;gt; Swipe to Factory Reset&lt;/b&gt;&lt;/li&gt;
	&lt;li&gt;Zurück zum Hauptmenü navigieren&lt;/li&gt;
	&lt;li&gt;Neues &lt;span class=&quot;caps&quot;&gt;ROM&lt;/span&gt; installieren: &lt;b&gt;Install &amp;gt; Select Storage &amp;gt; Micro SDCard &amp;gt; OK&lt;/b&gt; &lt;br/&gt; &lt;b&gt;lineage-14.1-20210426-&lt;span class=&quot;caps&quot;&gt;UNOFFICIAL&lt;/span&gt;-santos103g.zip &amp;gt; Swipe to confirm Flash&lt;/b&gt;&lt;/li&gt;
	&lt;li&gt;Bei Erfolg Tablet neu starten&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Der erste Start von LineageOS dauert auf diesem Gerät ungefähr 2-3 Minuten.&lt;/p&gt;
&lt;p&gt;Weitere Informationen: &lt;a href=&quot;https://forum.xda-developers.com/t/rom-gt-p52xx-unofficial-7-1-2-lineageos-14-1.3587761/&quot;&gt;[&lt;span class=&quot;caps&quot;&gt;ROM&lt;/span&gt;][GT-P52XX][&lt;span class=&quot;caps&quot;&gt;UNOFFICIAL&lt;/span&gt;][7.1.2] LineageOS 14.1&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p style=&quot;vertical-align:middle;&quot; class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;a href=&quot;#fnr1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; Bei Problemen könnten diese Beiträge hilfreich sein: &lt;a href=&quot;https://forum.xda-developers.com/t/how-to-flash-recovery-using-linux-and-heimdall-solved.4238595/&quot;&gt;How to flash recovery using Linux and Heimdall?&lt;/a&gt;, &lt;a href=&quot;https://forum.xda-developers.com/t/guide-flashing-with-heimdall.878686/&quot;&gt;Flashing with Heimdall&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn2&quot;&gt;&lt;a href=&quot;#fnr2&quot;&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; Ist bekannt welche Komponenten wohin installiert werden müssen, kann Heimdall das &lt;span class=&quot;caps&quot;&gt;ROM&lt;/span&gt; auch direkt installieren: &lt;a href=&quot;https://everydaylht.com/howtos/android/use-heimdall-to-install-kernels-recoveries-roms-on-your-samsung-android-device/&quot;&gt;Use Heimdall to Install Kernels, Recoveries, ROMs on your Samsung Android Device&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>S.M.A.R.T. Spickzettel: Gängige smartctl-Befehle</title>
   <link href="http://groovy-skills.com/freebsd/2021/10/05/smart-spickzettel-gangige-smartctl-befehle"/>
   <updated>2021-10-05T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/freebsd/2021/10/05/smart-spickzettel-gangige-smartctl-befehle</id>
   <content type="html">&lt;p&gt;Diese Liste sollte die häufigsten Befehle zur Verwaltung von Geräten mit &lt;em&gt;S.M.A.R.T.-Unterstützung&lt;/em&gt; beinhalten.&lt;/p&gt;
&lt;p&gt;Die notwendigen Werkzeuge können in den gängigen &lt;span class=&quot;caps&quot;&gt;BSD&lt;/span&gt;-/sowie Linux-Distributionen über das &lt;a href=&quot;https://pkgs.org/download/smartmontools&quot;&gt;Paket &lt;em&gt;smartmontools&lt;/em&gt;&lt;/a&gt; installiert werden.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Diese Konstante setzen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;GERAET&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'sdb'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Sämtliche &lt;span class=&quot;caps&quot;&gt;SMART&lt;/span&gt;-Informationen anzeigen&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;smartctl -a /dev/${GERAET}&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Testlauf-Dauer vorab abschätzen (ungefähr)&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;smartctl -c /dev/${GERAET}&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Schnellen &lt;span class=&quot;caps&quot;&gt;SMART&lt;/span&gt;-Check ausführen&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;smartctl -t short /dev/${GERAET}&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Detaillierten &lt;span class=&quot;caps&quot;&gt;SMART&lt;/span&gt;-Check ausführen&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;smartctl -t long /dev/${GERAET}&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Testergebnisse anzeigen&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;smartctl -l selftest /dev/${GERAET}&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Aktiven Testlauf abbrechen&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;smartctl -X /dev/${GERAET}&lt;/code&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Neue udev-Regeln nach allgemein gültigem Ansatz definieren</title>
   <link href="http://groovy-skills.com/linux/2018/10/16/neue-udev-regeln-nach-allgemein-gultigem-ansatz-definieren"/>
   <updated>2018-10-16T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2018/10/16/neue-udev-regeln-nach-allgemein-gultigem-ansatz-definieren</id>
   <content type="html">&lt;p&gt;Neue udev-Regeln nach allgemein gültigen Ansatz definieren&lt;/p&gt;
&lt;p&gt;Der Ablauf ist weitgehend allgemein gültig. Die Beispielkommandos behandeln das Einsetzen einer SD-Karte.&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Das gewünschte Gerät in /sys finden
	&lt;ul&gt;
		&lt;li&gt;Beispiel &lt;code&gt;find /sys -name 'mmcblk*'&lt;/code&gt; findet /sys/block/mmcblk0&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;Erkennunsmerkmale des Geräts auflisten
	&lt;ul&gt;
		&lt;li&gt;&lt;code&gt;udevadm info --attribute-walk /sys/block/mmcblk0&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;Passende Erkennunsmerkmale sammeln
	&lt;ul&gt;
		&lt;li&gt;&lt;code&gt;udevadm info --attribute-walk /sys/block/mmcblk0 |&lt;/code&gt; &lt;br/&gt; &lt;code&gt;grep -wE 'KERNEL|SUBSYSTEM|size' &amp;gt; /etc/udev/rules.d/10-sdcard.rules&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;Erkennungsparameter in Editor aufbereiten
	&lt;ul&gt;
		&lt;li&gt;&lt;code&gt;${EDITOR:-vi} /etc/udev/rules.d/10-sdcard.rules&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;Die &lt;strong&gt;erste Zeile&lt;/strong&gt; könnte dann beispielsweise so aussehen: &lt;br/&gt; &lt;code&gt;ACTION==&quot;add&quot;, KERNEL==&quot;mmcblk0&quot;, SUBSYSTEM==&quot;block&quot;, ATTR{size}==&quot;15949824&quot;, \&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;Aktion zum Testen der Regel ergänzen
	&lt;ul&gt;
		&lt;li&gt;Vorerest soll die &lt;strong&gt;zweite Zeile&lt;/strong&gt; lediglich das Anlegen einer neuen Datei auslösen: &lt;br/&gt; &lt;code&gt;RUN+=&quot;/usr/bin/touch /tmp/triggered-%k&quot;&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;Regel ausführbar machen und Regel laden
	&lt;ul&gt;
		&lt;li&gt;&lt;code&gt;chmod +x /etc/udev/rules.d/10-sdcard.rules&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;udevadm control --reload&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;Regel testen &amp;#8211; Vorgang simulieren und prüfen ob Datei angelegt wurde
	&lt;ul&gt;
		&lt;li&gt;&lt;code&gt;udevadm trigger --sysname-match=mmcblk0 --action=add&lt;/code&gt;&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;stat /tmp/triggered-* &amp;amp;&amp;amp; rm /tmp/triggered-*&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;Regel testen &amp;#8211; Gerät physisch einsetzen und prüfen ob Datei angelegt wurde
	&lt;ul&gt;
		&lt;li&gt;&lt;code&gt;stat /tmp/triggered-* &amp;amp;&amp;amp; rm /tmp/triggered-*&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;An dieser Stelle ist sicher gestellt, dass die Regel erwartungsgemäß ausgeführt wird. Nun kann &lt;b&gt;&lt;span class=&quot;caps&quot;&gt;RUN&lt;/span&gt;&lt;/b&gt; auf das gewünschte Kommando geändert werden oder andere Aktionen, wie beispielweise &lt;span class=&quot;caps&quot;&gt;SYMLINK&lt;/span&gt;, &lt;span class=&quot;caps&quot;&gt;OWNER&lt;/span&gt; oder &lt;span class=&quot;caps&quot;&gt;MODE&lt;/span&gt; definiert werden.&lt;/p&gt;
&lt;p&gt;Die Möglichkeiten sind in &lt;a title=&quot;Ubuntu Manpage zu 'udev'&quot; href=&quot;http://manpages.ubuntu.com/manpages/udev.7&quot;&gt;udev(7)&lt;/a&gt; dokumentiert.&lt;/p&gt;
&lt;h2&gt;Tipp: Live-Überwachung&lt;/h2&gt;
&lt;p&gt;udev-Ereignisse können mittels &lt;b&gt;udevadm monitor&lt;/b&gt; live überwacht werden. Für bessere Übersicht kann die Ausgabe nach Subsystem gefiltert werden. Beispiel:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;udevadm monitor --subsystem-match=block&lt;/code&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Internetverbindung des Sailfish X via WiFi freigeben (Workaround)</title>
   <link href="http://groovy-skills.com/allgemein/2018/01/02/internetverbindung-des-sailfish-x-via-wifi-freigeben-workaround"/>
   <updated>2018-01-02T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/allgemein/2018/01/02/internetverbindung-des-sailfish-x-via-wifi-freigeben-workaround</id>
   <content type="html">&lt;p&gt;In &lt;b&gt;Sailfish 2.1.3.7 (Kymijoki)&lt;/b&gt; ist ein Workaround notwendig um das Gerät als &lt;span class=&quot;caps&quot;&gt;WLAN&lt;/span&gt; Hotspot zu verwenden.&lt;/p&gt;
&lt;p&gt;Der Workaround ist &lt;a href=&quot;https://jolla.zendesk.com/hc/en-us/articles/115013777068-Sailfish-X-Using-WLAN-hotspot&quot; title=&quot;Sailfish X: Using WLAN hotspot&quot;&gt;in einem Jolla Support-Artikel&lt;/a&gt; beschrieben. Allerdings ist die Reihenfolge der Schritte ungenau erläutert.&lt;/p&gt;
&lt;h2&gt;Aktivieren der Internetverbindungsfreigabe&lt;/h2&gt;
&lt;p&gt;Hier die exakten Schritte zum Aktivieren der Internetverbindungsfreigabe:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;em&gt;[&lt;span class=&quot;caps&quot;&gt;GUI&lt;/span&gt;]&lt;/em&gt; Sowohl &lt;span class=&quot;caps&quot;&gt;WLAN&lt;/span&gt; als auch die Internetverbindungsfreigabe ausschalten&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;[Terminal]&lt;/em&gt; Zu Superuser-Berechtigungsebene aufsteigen
	&lt;ul&gt;
		&lt;li&gt;&lt;code&gt;devel-su&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;[Terminal]&lt;/em&gt; Betriebsmodus umstellen:
	&lt;ul&gt;
		&lt;li&gt;&lt;code&gt;echo 2 &amp;gt; /sys/module/bcmdhd/parameters/op_mode&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;[&lt;span class=&quot;caps&quot;&gt;GUI&lt;/span&gt;]&lt;/em&gt; Internetverbindungsfreigabe aktivieren&lt;/li&gt;
	&lt;li&gt;&lt;em&gt;[Terminal]&lt;/em&gt; &lt;b&gt;tether&lt;/b&gt; als master der &lt;span class=&quot;caps&quot;&gt;WLAN&lt;/span&gt; Schnittstelle &lt;b&gt;wlan0&lt;/b&gt; setzen:
	&lt;ul&gt;
		&lt;li&gt;&lt;code&gt;ip link set dev wlan0 master tether&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Deaktivieren der Internetverbindungsfreigabe&lt;/h2&gt;
&lt;p&gt;Zum Deaktivieren der Freigabe, den Betriebsmodus zurück setzen und &lt;span class=&quot;caps&quot;&gt;WLAN&lt;/span&gt; wieder einschalten:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;[&lt;span class=&quot;caps&quot;&gt;GUI&lt;/span&gt;] Internetverbindungsfreigabe ausschalten&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;echo 1 &amp;gt; /sys/module/bcmdhd/parameters/op_mode&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;[&lt;span class=&quot;caps&quot;&gt;GUI&lt;/span&gt;] &lt;span class=&quot;caps&quot;&gt;WLAN&lt;/span&gt; einschalten und verbinden (&amp;#8220;Internetverbindung herstellen&amp;#8221;)&lt;/li&gt;
&lt;/ol&gt;</content>
 </entry>
 
 <entry>
   <title>Maße und Gewicht beliebter Sailfish Handys: Nexus 5 und Xperia X</title>
   <link href="http://groovy-skills.com/allgemein/2017/10/28/masse-und-gewicht-beliebter-sailfish-handys-nexus-5-und-xperia-x"/>
   <updated>2017-10-28T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/allgemein/2017/10/28/masse-und-gewicht-beliebter-sailfish-handys-nexus-5-und-xperia-x</id>
   <content type="html">&lt;table&gt;
	&lt;tr&gt;
		&lt;th&gt;&lt;/th&gt;
		&lt;th&gt;Google Nexus 5 (1)  &lt;/th&gt;
		&lt;th&gt;Sony Xperia X (2) &lt;/th&gt;
		&lt;th&gt;Sony Xperia X Compact (3) &lt;/th&gt;
		&lt;th&gt;Sony Xperia 10  &lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th&gt;Höhe    [mm] &lt;/th&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;138                 &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;143               &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;129 &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;156   &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th&gt;Breite  [mm] &lt;/th&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;69                 &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;69               &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;65 &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;68   &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th&gt;Dick    [mm] &lt;/th&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;9                 &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;8               &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;10 &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;8   &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th&gt;Gewicht  [g] &lt;/th&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;130                 &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;153               &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;135 &lt;/td&gt;
		&lt;td style=&quot;text-align:right;&quot;&gt;?   &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Anmerkung:&lt;/strong&gt; Aus der Tabelle wird lediglich das Xperia X offiziell seitens Jolla unterstützt &amp;#8211; siehe deren &lt;a href=&quot;https://blog.jolla.com/purchase-download-install-sailfish-x-now&quot; title=&quot;Blogbeitrag &amp;#39;Purchase, download and install your Sailfish X now&amp;#39; auf Jolla.com&quot;&gt;Blogbeitrag &amp;#8216;Purchase, download and install your Sailfish X now&amp;#8217;&lt;/a&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;a href=&quot;#fnr1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; https://en.wikipedia.org/wiki/Nexus_5&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn2&quot;&gt;&lt;a href=&quot;#fnr2&quot;&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; https://en.wikipedia.org/wiki/Sony_Xperia_X&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn3&quot;&gt;&lt;a href=&quot;#fnr3&quot;&gt;&lt;sup&gt;3&lt;/sup&gt;&lt;/a&gt; https://en.wikipedia.org/wiki/Sony_Xperia_X_Compact&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Zeitpunkt der Segwit2X Aktivierung berechnen (mit Ergebnis)</title>
   <link href="http://groovy-skills.com/allgemein/2017/10/15/anleitung-zeitpunkt-der-segwit2x-aktivierung-berechnen-mit-ergebnis"/>
   <updated>2017-10-15T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/allgemein/2017/10/15/anleitung-zeitpunkt-der-segwit2x-aktivierung-berechnen-mit-ergebnis</id>
   <content type="html">&lt;p&gt;Im Internet existiert kaum eine aktualisierte Angabe bezüglich Zeitpunkt der &lt;b&gt;Segwit2X&lt;/b&gt; Aktivierung. Hier eine Anleitung zum selbst Berechnen:&lt;/p&gt;
&lt;h2&gt;Ausgangspunkt&lt;/h2&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;b&gt;Bitcoin&lt;/b&gt; ist so ausgelegt, dass im Durchschnitt alle 10 Minuten ein neuer Block gefunden (&amp;#8220;gemined&amp;#8221;) wird.&lt;/li&gt;
	&lt;li&gt;&lt;b&gt;Segwit&lt;/b&gt; wurde zum Zeitpunkt &lt;em&gt;2017-08-24 01:57:37 &lt;span class=&quot;caps&quot;&gt;UTC&lt;/span&gt;&lt;/em&gt; aktiviert(1) (&lt;a href=&quot;https://blockchain.info/block-height/481824&quot;&gt;Block 481824 auf Blockchain.info&lt;/a&gt;).&lt;/li&gt;
	&lt;li&gt;Zur Berechnung der Mining-Rate nehmen wir einen beliebigen Block als Referenzwert: &lt;a href=&quot;https://blockchain.info/block-height/489992&quot;&gt;Block 489992&lt;/a&gt; . Dieser wurde zum Zeitpunkt &lt;em&gt;2017-10-15 17:02:45 &lt;span class=&quot;caps&quot;&gt;UTC&lt;/span&gt;&lt;/em&gt; gefunden.&lt;/li&gt;
	&lt;li&gt;&lt;b&gt;Segwit2X&lt;/b&gt; soll 144*90 Blöcke &lt;strong&gt;nach Segwit&lt;/strong&gt;, also mit &lt;a href=&quot;https://blockchain.info/block-height/494784&quot;&gt;Block 494784&lt;/a&gt;, aktiviert werden.(2)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Kalkulation&lt;/h2&gt;
&lt;p&gt;Zwischen &lt;b&gt;Segwit&lt;/b&gt; und dem Referenzblock liegen 8168 Blöcke und rund 1263 Stunden (&lt;code&gt;8168 = 489992 - 481824&lt;/code&gt;; beziehungsweise &lt;code&gt;1263  = 2017-10-15 17:02:45&lt;/code&gt; minus &lt;code&gt;2017-08-24 01:57:37&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Demnach wurden im Schnitt &lt;strong&gt;6.47 Blöcke pro Stunde&lt;/strong&gt; gefunden.&lt;/p&gt;
&lt;p&gt;Vom gewählten Referenzblock ausgehend, fehlen noch 4792 Blöcke bis &lt;b&gt;Segwit2X&lt;/b&gt; (&lt;code&gt;4792 = 494784 - 489992&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Bleibt die Mining-Rate bei 6.47 Blöcken pro Stunde, dauert es ausgehend vom Referenzblock rund 741 Stunden bis zum &lt;b&gt;Segwit2X&lt;/b&gt; Block (&lt;code&gt;740.65 = 4792 / 6.47&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Das entspricht 30.86 Tagen (&lt;code&gt;30.86 = 740.65 / 24&lt;/code&gt;), also ungefähr 30 Tagen und 21 Stunden.&lt;/p&gt;
&lt;h2&gt;Ergebnis&lt;/h2&gt;
&lt;p&gt;Ausgehend von den Annahmen und Angaben, ist der erste &lt;b&gt;Segwit2X&lt;/b&gt;-Block am &lt;b&gt;2017-11-14 um zirka 21 Uhr &lt;span class=&quot;caps&quot;&gt;UTC&lt;/span&gt;&lt;/b&gt; zu erwarten.&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;a href=&quot;#fnr1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; https://bitsonline.com/segwit-bitcoin-activated/&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn2&quot;&gt;&lt;a href=&quot;#fnr2&quot;&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt; https://medium.com/@jimmysong/segwit2x-what-you-need-to-know-about-the-2mb-hard-fork-27749e1544ce&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>pfSense Boot-Slice über Kommandozeile duplizieren</title>
   <link href="http://groovy-skills.com/freebsd/2015/03/07/pfsense-boot-slice-uber-kommandozeile-duplizieren"/>
   <updated>2015-03-07T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/freebsd/2015/03/07/pfsense-boot-slice-uber-kommandozeile-duplizieren</id>
   <content type="html">&lt;p&gt;In einer typischen &lt;b&gt;pfSense &amp;#8220;embedded&amp;#8221; Installation (NanoBSD)&lt;/b&gt; ist der Speicherplatz in zwei gleich große &lt;a href=&quot;https://www.freebsd.org/doc/de/books/handbook/disk-organization.html#basics-concept-disk-model&quot; title=&quot;FreeBSD-Handbuch: Beispiel 4.2. &amp;#39;Aufteilung einer Festplatte&amp;#39;, Abschnitt &amp;#39;4.5. Festplatten, Slices und Partitionen&amp;#39;&quot;&gt;Slices&lt;/a&gt; (&amp;#8220;Partitionen&amp;#8221;) unterteilt.&lt;/p&gt;
&lt;p&gt;Grundsätzlich beinhalten beide die selben Daten.&lt;/p&gt;
&lt;p&gt;Bei einem &lt;strong&gt;Systemupdate&lt;/strong&gt; wird auf das aktuell ungenutzte Slice geschrieben. Sollte das Update Fehler verursachen, kann im Rahmen des pfSense Bootvorgangs der bisherige Stand ausgewählt und somit der Betrieb wie gewohnt fortgesetzt werden.&lt;/p&gt;
&lt;h2&gt;Slice über Weboberfläche duplizieren&lt;/h2&gt;
&lt;p&gt;Nach einem erfolgreichen Update spiegelt man das nun aktualisierte Slice zurück und bereitet damit auf ein künftiges Systemupdate vor. In &lt;strong&gt;Diagnostics &amp;gt; NanoBSD&lt;/strong&gt; der &lt;b&gt;pfSense&lt;/b&gt; Weboberfläche kann dazu der Knopf &lt;strong&gt;Duplicate slice&lt;/strong&gt; verwendet werden.&lt;/p&gt;
&lt;p&gt;Je nach Datendurchsatz dauert der Vorgang eventuell länger als die Browserverbindung aufrecht erhalten werden kann.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;In diesem Fall bleibt ungewiss, ob das Duplizieren erfolgreich war.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Slice über Kommandozeile duplizieren&lt;/h2&gt;
&lt;p&gt;Um das Problem zu umgehen, kann der entsprechende &lt;strong&gt;dd&lt;/strong&gt; Befehl manuell via &lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt; ausgeführt werden. Auch über &lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt; ist die &lt;b&gt;pfSense Developer Shell&lt;/b&gt; erreichbar.&lt;/p&gt;
&lt;p&gt;Die &lt;b&gt;pfSense Developer Shell&lt;/b&gt; ermöglicht den direkten Aufruf der &lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;-Funktionen wie sie auch die &lt;b&gt;pfSense&lt;/b&gt; Weboberfläche nutzt und erlaubt somit die Rekonstruktion eines möglichst identischen Ablaufs.&lt;/p&gt;
&lt;p&gt;Auf Basis der Erkenntnisse aus dem &lt;a href=&quot;https://github.com/pfsense/pfsense/blob/RELENG_2_2/usr/local/www/diag_nanobsd.php&quot; title=&quot;Datei diag_nanbsd.php im pfSense GitHub-Repository&quot;&gt;pfSense Quellcode&lt;/a&gt; ergibt sich folgende &lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;-Befehlsabfolge für die &lt;b&gt;Developer Shell&lt;/b&gt; in &lt;b&gt;pfSense 2.2&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Achtung:&lt;/strong&gt; &lt;em&gt;Die Befehlsfolge kann bei falscher Anwendung potentiell Schaden verursachen und darf lediglich als Leitfaden betrachtet werden.&lt;/em&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-php&quot; data-lang=&quot;php&quot;&gt;&lt;span class=&quot;nx&quot;&gt;nanobsd_detect_slice_info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;global&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$TOFLASH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$COMPLETE_PATH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$COMPLETE_BOOT_PATH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Will clone FROM &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$COMPLETE_BOOT_PATH&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; TO &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$TOFLASH&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;nanobsd_clone_slice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$COMPLETE_PATH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;SUCCESS&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;FAILURE&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;nanobsd_detect_slice_info&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;exec&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;strong&gt;Hinweis:&lt;/strong&gt; Während im Rahmen der Funktion das &lt;strong&gt;nanobsd_clone_slice&lt;/strong&gt; das dd-Kommando aktiv ist, kann der Fortschritt mittles &lt;kbd&gt;STRG+T&lt;/kbd&gt; abgefragt werden.&lt;/p&gt;
&lt;p&gt;Vergleiche dazu den Groovy-Skills Beitrag &amp;#8220;&lt;a href=&quot;/freebsd/2011/09/08/ubertragenes-datenvolumen-von-dd-ausgeben-status-siginfo-sigusr1&quot;&gt;Übertragenes Datenvolumen von dd ausgeben &lt;span class=&quot;caps&quot;&gt;STATUS&lt;/span&gt;/&lt;span class=&quot;caps&quot;&gt;SIGINFO&lt;/span&gt;/SIGUSR1&lt;/a&gt;&amp;#8221;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Installierte Ports nach einem bestimmtem Suchbegriff filtern</title>
   <link href="http://groovy-skills.com/freebsd/2014/10/20/installierte-ports-nach-einem-bestimmtem-suchbegriff-filtern"/>
   <updated>2014-10-20T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/freebsd/2014/10/20/installierte-ports-nach-einem-bestimmtem-suchbegriff-filtern</id>
   <content type="html">&lt;p&gt;Aus der Serie &lt;em&gt;&amp;#8220;Dumm kann man sein &amp;#8211; zu helfen muss man sich wissen&amp;#8221;&lt;/em&gt; wird hier ein Skript präsentiert, das die Portsammlung nutzt um herauszufinden, welche &lt;strong&gt;installierte&lt;/strong&gt; Ports einen bestimmten Suchbegriff beinhalten.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Suchbegriff hier setzen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SUCHBEGRIFF&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;INSTALLED_PORTS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;mktemp&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;PORTS_WITH_OPENSSL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;mktemp&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;

pkg info | sed &lt;span class=&quot;s1&quot;&gt;'s#-[[:digit:]].*##g'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;INSTALLED_PORTS&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /usr/ports &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; make quicksearch &lt;span class=&quot;nv&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SUCHBEGRIFF&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Port:'&lt;/span&gt; | sed &lt;span class=&quot;s1&quot;&gt;'s#-[[:digit:]].*##g'&lt;/span&gt; | awk &lt;span class=&quot;s1&quot;&gt;'{print $2}'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PORTS_WITH_OPENSSL&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;INSTALLED_PORTS&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PORTS_WITH_OPENSSL&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;

rm &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;INSTALLED_PORTS&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PORTS_WITH_OPENSSL&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;FreeBSD Manpage zum Systemverwaltungskommando 'pkg - a utility for manipulating packages'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=pkg&amp;apropos=0&amp;sektion=8&amp;arch=default&amp;format=latin1&quot;&gt;pkg(8)&lt;/a&gt;, &lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'sed - stream editor'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=sed&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;sed(1)&lt;/a&gt;, &lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'make'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=make&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;make(1)&lt;/a&gt;, &lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'grep'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=grep&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;grep(1)&lt;/a&gt;, &lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'awk - pattern scanning and processing language'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=awk&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;awk(1)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Falls es hierfür auch einen direkten Schalter im &lt;code&gt;pkg&lt;/code&gt; Kommando geben sollte, freue ich mich über einen entsprechenden Hinweis.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Entfernte Windows-Freigabe (CIFS) über rsync zu FreeNAS sichern</title>
   <link href="http://groovy-skills.com/freebsd/2014/09/12/entfernte-windows-freigabe-cifs-uber-rsync-zu-freenas-sichern"/>
   <updated>2014-09-12T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/freebsd/2014/09/12/entfernte-windows-freigabe-cifs-uber-rsync-zu-freenas-sichern</id>
   <content type="html">&lt;p&gt;Es bestehen diverse Möglichkeiten, auch einem Windows-Rechner &lt;b&gt;rsync&lt;/b&gt; &amp;#8220;beizubringen&amp;#8221;. Die Nutzung entsprechender Software von Drittanbietern stellt jedoch stets eine &lt;em&gt;potentielle&lt;/em&gt; zusätzliche Fehlerquelle dar. Ein Benutzer beschreibt seine Erfahrung mit &lt;i&gt;Deltacopy&lt;/i&gt;, einer &lt;b&gt;rsync&lt;/b&gt;-Lösung für Windows, &lt;a href=&quot;http://forums.freenas.org/index.php?threads/deltacopy-permissions.14378/#post-69956&quot;&gt;im FreeNAS-Forum&lt;/a&gt; wie folgt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It was easy to make work with FreeNAS, but its behavior was very odd and small things would cause it to fail(such as a non-english character in a filename) while doing rsync to rsync via 2 FreeNAS boxes was without any problems. Deltacopy was also very very slow, didn&amp;#8217;t always behave according to what I expected for the settings, etc.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Aus solchen Gründen ist es ratsam, kritische Anforderungen auf Basis bewährter Funktionalitäten zu lösen.&lt;/p&gt;
&lt;p&gt;Im Folgenden ist beschrieben, wie &lt;b&gt;FreeNAS&lt;/b&gt; genutzt werden kann, um Inhalte einer &lt;em&gt;entfernten&lt;/em&gt; Windows-Freigabe zum &lt;em&gt;lokalen&lt;/em&gt; Speicher zu ziehen.&lt;/p&gt;
&lt;h2&gt;Windows-Freigabe am FreeNAS-System einhängen&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Verbindungsdaten festlegen (hier eigene Werte festlegen)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;WINDOWS_IP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;WINDOWS_HOSTNAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;WINDOWS_SHARE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;WINDOWS_USER&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;WINDOWS_PASSWORD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h3&gt;Funktionierende Verbindung sicherstellen&lt;/h3&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Zugriff zur Freigabe prüfen&lt;/span&gt;
smbclient &lt;span class=&quot;nt&quot;&gt;-U&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WINDOWS_USER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-L&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WINDOWS_IP&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
smbclient &lt;span class=&quot;se&quot;&gt;\\\\&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WINDOWS_IP&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WINDOWS_SHARE&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-U&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WINDOWS_USER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PASSWORT&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Freigabe testweise lokal einhängen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;TEMP_MNT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;mktemp &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
mount_smbfs &lt;span class=&quot;nt&quot;&gt;-I&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WINDOWS_IP&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; //&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WINDOWS_USER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;@&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WINDOWS_HOSTNAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WINDOWS_SHARE&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;TEMP_MNT&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;TEMP_MNT&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
umount &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;TEMP_MNT&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h3&gt;Verbindung permanent einrichten&lt;/h3&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Schreibzugriff zu Konfigurationdateien vorübergehend ermöglichen&lt;/span&gt;
mount &lt;span class=&quot;nt&quot;&gt;-uo&lt;/span&gt; rw /

&lt;span class=&quot;c&quot;&gt;# Lokalen Mountpunkt erstellen&lt;/span&gt;
mkdir &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; /network

&lt;span class=&quot;c&quot;&gt;# Mountoptionen in fstab festlegen&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;//&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WINDOWS_USER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WINDOWS_HOSTNAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WINDOWS_SHARE&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; /network/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WINDOWS_SHARE&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; smbfs ro,-N,-I&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WINDOWS_IP&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; 0 0&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /conf/base/etc/fstab

&lt;span class=&quot;c&quot;&gt;# Zugangsdaten zur Windows-Freigabe in nsmb.conf hinterlegen&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;''&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /conf/base/etc/nsmb.conf &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;[&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WINDOWS_HOSTNAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WINDOWS_USER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;]&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /conf/base/etc/nsmb.conf &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;password=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WINDOWS_PASSWORD&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /conf/base/etc/nsmb.conf

&lt;span class=&quot;c&quot;&gt;# Schreibzugriff zu Konfigurationdateien verbieten&lt;/span&gt;
mount &lt;span class=&quot;nt&quot;&gt;-uo&lt;/span&gt; ro /&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h3&gt;Einrichtung überprüfen&lt;/h3&gt;
&lt;p&gt;Die Änderungen werden erst nach einem Neustart aktiv. Um sie sofort zu testen, geht man wie folgt vor.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;cp /conf/base/etc/nsmb.conf /etc/nsmb.conf &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
  mount &lt;span class=&quot;nt&quot;&gt;-F&lt;/span&gt; /conf/base/etc/fstab /network/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;WINDOWS_SHARE&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Rsync konfigurieren&lt;/h2&gt;
&lt;p&gt;Mit obiger Einrichtung wird die Windows-Freigabe quasi als lokale Ressource behandelt.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;rsync&lt;/b&gt; kann auch zum Kopieren zwischen lokalen Pfaden eingesetzt werden. Über das Web-Interface von &lt;b&gt;FreeNAS&lt;/b&gt; ist allerdings lediglich die Konfiguration der Nutzung eines entfernten Rechners möglich.&lt;/p&gt;
&lt;p&gt;Um Benutzers des Web-Interface dennoch eine einfache Einrichtung von &amp;#8220;Rsync Tasks&amp;#8221; zu ermöglichen, wird &lt;b&gt;FreeNAS&lt;/b&gt; selbst &lt;em&gt;logisch&lt;/em&gt; als &amp;#8220;entfernter&amp;#8221; Rechner konfiguriert.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Schreibzugriff zu Konfigurationdateien vorübergehend ermöglichen&lt;/span&gt;
mount &lt;span class=&quot;nt&quot;&gt;-uo&lt;/span&gt; rw /

&lt;span class=&quot;c&quot;&gt;# SSH Public-Key für root generieren&lt;/span&gt;
ssh-keygen

&lt;span class=&quot;c&quot;&gt;# ECDSA Hostschlüssel importieren&lt;/span&gt;
ssh-keyscan localhost &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /root/.ssh/known_hosts

&lt;span class=&quot;c&quot;&gt;# Authentifizierung via Public Key von localhost erlauben&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; /root/.ssh/id_rsa.pub | sed &lt;span class=&quot;s1&quot;&gt;'s/^/from=&quot;127.0.0.1&quot;,no-agent-forwarding,no-port-forwarding,no-user-rc,no-X11-forwarding /g'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /root/.ssh/authorized_keys

&lt;span class=&quot;c&quot;&gt;# Schreibzugriff zu Konfigurationdateien verbieten&lt;/span&gt;
mount &lt;span class=&quot;nt&quot;&gt;-uo&lt;/span&gt; ro /&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Rsync-Task einrichten&lt;/h2&gt;
&lt;p&gt;An dieser Stelle ist alles Notwendige vorbereitet, um die Einrichtung eines &lt;b&gt;Rsync-Task&lt;/b&gt; via &lt;b&gt;FreeNAS&lt;/b&gt;-Web-Interface für das Kopieren der der Daten der Windows-Freigabe zum entsprechenden Ziel-Dataset zu ermöglichen (&lt;em&gt;System &amp;gt; Rsync-Tasks &amp;gt; Add Rsync-Task&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Die Einrichtung an sich birgt noch ein relativ offensichtliches Risiko:&lt;/strong&gt;&lt;br /&gt;
Schlägt das Einhängen der Windows-Freigabe fehl, werden, wenn die &lt;b&gt;rsync&lt;/b&gt;-Option &lt;code&gt;--delete&lt;/code&gt; verwendet wird, die Inhalte aus dem Zielverzeichnis gelöscht.&lt;/p&gt;
&lt;p&gt;Sinnvollerweise wird dem entgegen gewirkt indem &lt;em&gt;vor&lt;/em&gt; Ausführen von &lt;b&gt;rsync&lt;/b&gt; die Verfügbarkeit der Quelle sichergestellt wird.&lt;/p&gt;
&lt;p&gt;Rein über das Web-Interface ist dies allerdings unmöglich. Ist das Risiko für diesen Fall als relativ gering einzuschätzen, minimieren &lt;strong&gt;regelmäßige &lt;span class=&quot;caps&quot;&gt;ZFS&lt;/span&gt; Snapshots&lt;/strong&gt; die Auswirkungen des Problems (&lt;em&gt;Storage &amp;gt; Periodic Snapshot Tasks &amp;gt; Add Periodic Snapshot&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Ansonsten muss mit einem entsprechenden Skript behandelt werden.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Von Sicherheitslücke betroffenen FreeBSD-Port installieren</title>
   <link href="http://groovy-skills.com/freebsd/2014/08/19/von-sicherheitslucke-betroffenen-freebsd-port-installieren"/>
   <updated>2014-08-19T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/freebsd/2014/08/19/von-sicherheitslucke-betroffenen-freebsd-port-installieren</id>
   <content type="html">&lt;p&gt;Ist die Version einer FreeBSD-Applikation aus der Portsammlung von einer Sicherheitslücke betroffen, kann dies zur wenig aussagekräftigen Fehlermeldung &lt;code&gt;*** Error code 1&lt;/code&gt; führen.&lt;/p&gt;
&lt;h2&gt;Versionsnummer prüfen&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# grep 'PORTVERSION' /usr/ports/www/nginx/Makefile&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;PORTVERSION&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;    1.6.0&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Versuch den Port zu bauen&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# cd /usr/ports/www/nginx &amp;amp;&amp;amp; make&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;***&lt;/span&gt; Error code 1

Stop.
make[1]: stopped &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; /usr/ports/www/nginx
&lt;span class=&quot;k&quot;&gt;***&lt;/span&gt; Error code 1

Stop.
make: stopped &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; /usr/ports/www/nginx&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Details zur Sicherheitslücke ausgeben&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# pkg audit&lt;/span&gt;
nginx-1.6.0,2 is vulnerable:
nginx &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; inject commands into SSL session vulnerability
CVE: CVE-2014-3556
WWW: http://portaudit.FreeBSD.org/ad747a01-1fee-11e4-8ff1-f0def16c5c1b.html

1 problem&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;s&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;the installed packages found.&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Installation erzwingen&lt;/h2&gt;
&lt;p&gt;Auf eigene Verantwortung kann man mit folgendem Befehl auch das Bauen eines Port mit Sicherheitslücke erzwingen:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nv&quot;&gt;DISABLE_VULNERABILITIES&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;yes make&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</content>
 </entry>
 
 <entry>
   <title>Folge mir auf Corilla</title>
   <link href="http://groovy-skills.com/corilla/2014/08/18/folge-mir-auf-corilla"/>
   <updated>2014-08-18T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/corilla/2014/08/18/folge-mir-auf-corilla</id>
   <content type="html">&lt;p&gt;Ich plane meine Woche und überlege, was ich unternehmen könnte.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Könnte ich in &lt;b&gt;Corilla&lt;/b&gt; nur jene Aktivitäten auflisten, welche von Benutzern, &lt;strong&gt;denen ich folge&lt;/strong&gt;, vorgemerkt sind? Das wäre praktisch.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So wäre meine persönliche &lt;b&gt;&amp;#8220;Doo-Liste&amp;#8221;&lt;/b&gt; übersichtlich und ich könnte interessante Aktivitäten schneller ausfindig machen.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Genau das ist ab sofort möglich.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Corilla-Benutzern folgen&lt;/h2&gt;
&lt;p&gt;Klicke im Profil eines beliebigen Benutzers auf &lt;strong&gt;&amp;#8220;Folgen&amp;#8221;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://groovy-skills.com/images/20140811_corilla_profil_cori_folgen.jpg&quot; class=&quot;crop&quot; title=&quot;Schaltfläche zum Folgen eines Benutzers&quot; alt=&quot;Schaltfläche zum Folgen eines Benutzers&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In Kürze werden damit seine &lt;em&gt;vorgemerkten&lt;/em&gt; Doos &lt;strong&gt;auch für dich in deiner Profilseite sichtbar&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Probier&amp;#8217;s aus: &lt;a href=&quot;http://corilla.net/de/benutzer/210&quot; class=&quot;nocb&quot; title=&quot;Profil von Benutzer &amp;#39;Cori&amp;#39; auf Corilla.net&quot;&gt;Folge unserem Maskottchen &lt;b&gt;Cori&lt;/b&gt; jetzt auf Corilla!&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nach wenigen Augenblicken landet damit das aktuelle Doo &lt;i&gt;&amp;#8220;International Follow-Cori Week&amp;#8221;&lt;/i&gt; auch in deiner Liste.&lt;/p&gt;
&lt;h2&gt;Automatische Doo-Liste&lt;/h2&gt;
&lt;p&gt;Mit dieser neuen &lt;strong&gt;Following-Funktionalität&lt;/strong&gt; erhältst du automatisch Doos von Menschen mit für dich passenden Interessen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Symbole&lt;/strong&gt; lassen dich den Ursprung jeder Aktivität rasch erkennen:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://groovy-skills.com/images/20140811_corilla_doo_chain_symbole_vorgemerkt_veroffentlicht_erhalten.jpg&quot; title=&quot;Symbole für &amp;quot;vorgemerkt&amp;quot;, &amp;quot;veröffentlicht&amp;quot; oder &amp;quot;erhalten&amp;quot;&quot; alt=&quot;Symbole für &amp;quot;vorgemerkt&amp;quot;, &amp;quot;veröffentlicht&amp;quot; oder &amp;quot;erhalten&amp;quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Der Clou:&lt;/strong&gt; Merkst du eine gewisse Aktivität vor, landet diese automatisch in den Doo-Listen jener Menschen, &lt;strong&gt;die wiederum dir folgen&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ein interessantes Doo &lt;strong&gt;verbreitet&lt;/strong&gt; sich somit auf einfache Art und Weise und &lt;strong&gt;erreicht rasch viele Menschen&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Über &lt;strong&gt;neue Follower&lt;/strong&gt; wirst du übrigens automatisch per E-Mail informiert.&lt;br /&gt;
(Das ist in den &lt;a href=&quot;http://corilla.net/de/benutzer/bearbeiten&quot; class=&quot;nocb&quot; title=&quot;Verwalte deine Corilla E-Mail Benachrichtigungseinstellungen&quot;&gt;Benutzereinstellungen&lt;/a&gt; änderbar.)&lt;/p&gt;
&lt;h2&gt;Eine eigene Aktivität verteilen&lt;/h2&gt;
&lt;p&gt;Möchtest du ein eigenes Doo an die Menschen &amp;#8220;schicken&amp;#8221;, die dir folgen?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Veröffentliche einfach ein neues Doo und merke es sofort selbst vor.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Probier&amp;#8217;s aus: &lt;a href=&quot;http://corilla.net/de/aktivitaten/neu&quot; class=&quot;nocb&quot; title=&quot;&amp;#39;Doo erstellen&amp;#39; auf Corilla.net&quot;&gt;Veröffentliche jetzt ein eigenes Doo auf Corilla!&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Hör auf, mich statisch zu nennen! Vorgenerierte Webseiten klagen</title>
   <link href="http://groovy-skills.com/jekyll/2014/07/28/hor-auf-mich-statisch-zu-nennen-vorgenerierte-webseiten-klagen"/>
   <updated>2014-07-28T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/jekyll/2014/07/28/hor-auf-mich-statisch-zu-nennen-vorgenerierte-webseiten-klagen</id>
   <content type="html">&lt;p&gt;&amp;#8220;Statisch&amp;#8221; hat in der Informationstechnologie viele Bedeutungen &amp;#8211; zu viele. Auch nach einer kontextuellen Eingrenzung auf einen gewissen Teilbereich, kann dieses Wort zu ungünstigen Missverständnissen führen.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;In einem kürzlichen Gespräch mit einer Führungskraft eines anderen Gebiets vermittelte das Wort &amp;#8220;statisch&amp;#8221; den Eindruck, es sei unmöglich, Animationen zu verwenden oder die Webseite nach Responsive-Prinzipien zu gestalten.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tatsächlich ist das Gegenteil der Fall.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Designs können genau wie bei Verwendung anderer Methoden oder &lt;span class=&quot;caps&quot;&gt;CMS&lt;/span&gt; frei gestaltet werden. Die wenigsten Funktionalitäten einer üblichen Unternehmenswebseite benötigen &lt;em&gt;echte Dynamik&lt;/em&gt; im Sinne von &amp;#8220;Seitengenerierung bei jeder Anfrage&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Der &lt;strong&gt;Großteil einer Webpräsenz&lt;/strong&gt; kann mittels Generatoren wie &lt;b&gt;Jekyll&lt;/b&gt; oder &lt;b&gt;Middleman&lt;/b&gt; &lt;em&gt;kostengünstiger, performanter und stabiler&lt;/em&gt; umgesetzt werden.&lt;/p&gt;
&lt;p&gt;Oft können bestimmte Berechnungen, die sonst &lt;em&gt;blindlinks serverseitig&lt;/em&gt; erledigt werden, clientseitig in &lt;strong&gt;JavaScript oder &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;&lt;/strong&gt; durchgeführt werden.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Das Entwickeln vorabgenerierter Webseiten fördert somit eine optimale Konzeptionierung und einen sauberen Programmierstil.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Verbleibende Anforderungen für dynamische Berechnungen wie zum Beispiel Kontaktformular oder Suchfunktion können über &lt;em&gt;eigens dafür optimierte (!) Werkzeuge&lt;/em&gt; erfüllt oder einfach von Drittanbietern eingebunden und bezogen  werden.&lt;/p&gt;
&lt;h2&gt;Ablöse für &amp;#8220;statisch&amp;#8221;&lt;/h2&gt;
&lt;p&gt;Um das Wort &amp;#8220;statisch&amp;#8221; und auch die Kombination &amp;#8220;statisch generiert&amp;#8221; künftig zu vermeiden, scheint die Verwendung von Begriffen wie die folgenden zweckdienlich und sinnvoll:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;vorab generiert / vorgeneriert&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;vorberechnet&lt;/li&gt;
	&lt;li&gt;vorkompiliert&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Im &lt;a href=&quot;/jekyll/2013/10/26/perfekt-einfach-was-ist-jekyll&quot;&gt;Beitrag &amp;#8216;Perfekt einfach: Was ist Jekyll?&amp;#8217;&lt;/a&gt; werden Vorteile von vorab generierten Seiten beschrieben.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Wächst ein ZFS Snapshot bei Wiederanlage einer gelöschten Datei?</title>
   <link href="http://groovy-skills.com/freebsd/2014/07/12/wachst-ein-zfs-snapshot-bei-wiederanlage-einer-geloschten-datei"/>
   <updated>2014-07-12T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/freebsd/2014/07/12/wachst-ein-zfs-snapshot-bei-wiederanlage-einer-geloschten-datei</id>
   <content type="html">&lt;p&gt;Diese Frage ist kürzlich im Rahmen eines Sicherungsszenario aufgetreten und soll hier kurz in Form einiger Terminalabfragen und -ausgaben erläutert werden.&lt;/p&gt;
&lt;h2&gt;Ausgangssituation&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;ZFS&lt;/span&gt; Version 5&lt;/li&gt;
	&lt;li&gt;Deduplication deaktiviert&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# zfs get dedup stash/install&lt;/span&gt;
NAME           PROPERTY  VALUE          SOURCE
stash/install  dedup     off            default

&lt;span class=&quot;c&quot;&gt;# zfs get version stash/install&lt;/span&gt;
NAME           PROPERTY  VALUE    SOURCE
stash/install  version   5        -&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Test 1: Lokales Umbenennen einer Datei&lt;/h2&gt;
&lt;p&gt;Eine Datei wird lediglich lokal umbenannt.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Snapshot erstellen&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# zfs snap stash/install@before_rename&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Snapshot anzeigen&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# zfs list -t snapshot | grep -E 'NAME|before_rename'&lt;/span&gt;
NAME                                                                        USED  AVAIL  REFER  MOUNTPOINT
stash/install@before_rename                                                    0      -  68.1G  -

&lt;span class=&quot;c&quot;&gt;# Datei verschieben (= umbenennen)&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# ls -ahl archlinux-2013.04.01-dual.iso&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;-rw-rw-r--&lt;/span&gt;  1 g  g   506M Apr 23  2013 archlinux-2013.04.01-dual.iso
&lt;span class=&quot;c&quot;&gt;# mv archlinux-2013.04.01-dual.iso RENAMED_x-2013.04.01-dual.iso&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Snapshot erstellen&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# zfs snap stash/install@after_rename&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# zfs list -t snapshot | grep -E 'NAME|rename'&lt;/span&gt;
NAME                                                                        USED  AVAIL  REFER  MOUNTPOINT
stash/install@before_rename                                                    0      -  68.1G  -
stash/install@after_rename                                                     0      -  68.1G  -&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Ergebnis:&lt;/strong&gt; Snapshotgröße bleibt unberührt.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Test 2: Löschen und Wiedereinkopieren über Netzwerk&lt;/h2&gt;
&lt;p&gt;Eine Datei wird lokal gelöscht und über das Netzwerk (&lt;span class=&quot;caps&quot;&gt;CIFS&lt;/span&gt;) wiedereinkopiert.&lt;/p&gt;
&lt;p&gt;Dieser Anwendungsfall ist gängig, wenn &lt;span class=&quot;caps&quot;&gt;ZFS&lt;/span&gt; als Ziel-Dateisystem für regelmäßige Sicherungen von anderen Netzwerkgeräten eingesetzt wird.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# rm RENAMED_archlinux-2013.04.01-dual.iso&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# [an dieser Stelle wurde via Netzwerk einkopiert]&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# ls -hal archlinux-2013.04.01-dual.iso &lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;-rw-------&lt;/span&gt;  1 g  g   506M Apr 23  2013 archlinux-2013.04.01-dual.iso

&lt;span class=&quot;c&quot;&gt;# Snapshot erstellen&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# zfs snap stash/install@after_recreation_via_network&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# zfs list -t snapshot | grep -E 'NAME|before|after'&lt;/span&gt;
NAME                                                                        USED  AVAIL  REFER  MOUNTPOINT
stash/install@before_rename                                                    0      -  68.1G  -
stash/install@after_rename                                                  163K      -  68.1G  -
stash/install@after_recreation_via_network                                     0      -  68.1G  -&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Ergebnis:&lt;/strong&gt; Snapshotgröße wächst mit 163K minimal an, anstatt den benötigten Speicherplatz der Datei erneut zu verbrauchen.&lt;/em&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Alles Gute! Gratuliere Corilla und gewinne Metallica VIP-Karten</title>
   <link href="http://groovy-skills.com/corilla/2014/07/04/alles-gute-gratuliere-corilla-und-gewinne-metallica-vip-karten"/>
   <updated>2014-07-04T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/corilla/2014/07/04/alles-gute-gratuliere-corilla-und-gewinne-metallica-vip-karten</id>
   <content type="html">&lt;p&gt;Heute seit genau zwei Jahren beglückt &lt;b&gt;Corilla&lt;/b&gt; das Internet mit seiner Präsenz.&lt;/p&gt;
&lt;p&gt;Für die kommenden Monate sind spannende neue Funktionen geplant, denn die Registrierungszahlen steigen &amp;#8211; und das motiviert! :)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Das, und der Geburtstag der Plattform sollen heute mit einer kleinen Aktion gefeiert werden.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Aber was soll ich denn schenken?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Möchtest du mitfeiern und &lt;span class=&quot;caps&quot;&gt;VIP&lt;/span&gt; Karten für Metallica im Wert von rund 460 Euro gewinnen?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dann schenke Corilla etwas ganz Besonderes: &lt;em&gt;Neue Benutzer!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Um am Gewinnspiel teil zu nehmen, musst du zwei Anforderungen erfüllen:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Zwei Personen müssen sich über deinen Empfehlungslink zu Corilla registrieren.&lt;/li&gt;
	&lt;li&gt;Du musst Corilla über dein bevorzugtes soziales Netzwerk gratulieren.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Beides muss &lt;strong&gt;noch vor Montagnachmittag&lt;/strong&gt; passieren. Im Folgenden sind die beiden Anforderungen genau erklärt.&lt;/p&gt;
&lt;h3&gt;1. Wie lade ich jemanden zu Corilla ein?&lt;/h3&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;a href=&quot;http://corilla.net/de/benutzer/anmelden&quot; class=&quot;nocb&quot;&gt;Logge&lt;/a&gt; dich auf Corilla mit deinem bestehenden Konto ein oder &lt;a href=&quot;http://corilla.net/de/benutzer/neu&quot; class=&quot;nocb&quot;&gt;erstelle ein neues.&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Klicke nach dem Anmelden &lt;strong&gt;rechts oben auf deinen Benutzernamen.&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;Kopiere deinen Empfehlungslink und &lt;strong&gt;lade zwei Freunde ein, sich darüber bei Corilla zu registrieren.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sobald mindestens zwei Personen die Registrierung über deinen Link abgeschlossen haben, hast du diesen Teil der Anforderung bereits erfüllt!&lt;/p&gt;
&lt;h3&gt;2. Wie gratuliere ich Corilla standesgerecht zum Geburtstag?&lt;/h3&gt;
&lt;p&gt;Das ist einfach: Klicke einen der folgenden Links und &lt;strong&gt;veröffentliche dann den vorgefertigten Geburtstagsgruß.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://twitter.com/intent/tweet?text=Alles+Gute+zum+Geburtstag%2C+%23Corilla%21+Gratuliere+Corilla+und+gewinne+VIP-Karten+f%C3%BCr+Metallica+in+Wien+@CorillaNet+&amp;amp;url=http%3A//groovy-skills.com/corilla/2014/07/04/alles-gute-gratuliere-corilla-und-gewinne-metallica-vip-karten/&quot; class=&quot;nocb&quot; title=&quot;Geburtstagsgruß in Twitter öffnen&quot;&gt;Twitter&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;https://www.facebook.com/dialog/feed?app_id=145634995501895&amp;amp;display=popup&amp;amp;caption=Alles+Gute+zum+Geburtstag%2C+Corilla%21+http%3A%2F%2Fcorilla.net&amp;amp;link=http%3A%2F%2Fgroovy-skills.com%2Fcorilla%2F2014%2F07%2F04%2Falles-gute-gratuliere-corilla-und-gewinne-metallica-vip-karten%2F&amp;amp;redirect_uri=https://www.facebook.com&quot; class=&quot;nocb&quot; title=&quot;Geburtstagsgruß in Facebook öffnen&quot;&gt;Facebook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sobald dein Gruß auf mindestens einer dieser Plattformen veröffentlicht ist, hast du auch den zweiten und letzten Teil der Anforderung erfüllt und nimmst automatisch an der Verlosung teil.&lt;/p&gt;
&lt;h2&gt;Danke für dein Geschenk und viel Glück!&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Corilla und das Team freuen sich bereits &lt;strong&gt;riesig&lt;/strong&gt;, die neuen Benutzer begrüßen zu dürfen.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wir wünschen dir viel Glück!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Vielleicht bist du nächste Woche bereits &lt;span class=&quot;caps&quot;&gt;VIP&lt;/span&gt;-Gast bei Metallica.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Details und das Kleingedruckte &amp;#8230; normal groß&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;Das Metallica-Konzert findet am 9. Juli 2014 in Wien statt. Alle Details findest du in &lt;a href=&quot;http://corilla.net/de/aktivitaten/in/trabrennbahn-krieau-wien-2/2014/7/9/155/metallica-in-wien-by-request-tour-2014?r=g&quot;&gt;diesem Corilla Doo.&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Sämtliche Corilla-Nutzer, welche beide Anforderungen bis Montag Nachmittag (7. Juli 2014 um 16:00 &lt;span class=&quot;caps&quot;&gt;MESZ&lt;/span&gt;) erfüllen, nehmen automatisch an der Verlosung teil.
	&lt;ul&gt;
		&lt;li&gt;Für die Anzahl eingeladener Personen werden Benutzer-Einladungen ab dem 4. Juli 2014 gewertet.&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;Gewinner werden umgehend benachrichtigt. Die Eintrittskarten werden voraussichtlich per Eilsendung zugestellt.&lt;/li&gt;
	&lt;li&gt;Verlost wird per Zufallsgenerator. Der Rechtsweg ist ausgeschlossen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Du willst noch mehr tun? Dann folge &lt;a href=&quot;https://twitter.com/intent/user?screen_name=CorillaNet&quot;&gt;Corilla auf Twitter&lt;/a&gt; !&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>ZFS-Snapshots vergleichen und große Dateien ausfiltern</title>
   <link href="http://groovy-skills.com/freebsd/2014/04/03/zfs-snapshots-vergleichen-und-grosse-dateien-ausfiltern"/>
   <updated>2014-04-03T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/freebsd/2014/04/03/zfs-snapshots-vergleichen-und-grosse-dateien-ausfiltern</id>
   <content type="html">&lt;p&gt;Verbrauchen &lt;b&gt;&lt;span class=&quot;caps&quot;&gt;ZFS&lt;/span&gt; Snapshots&lt;/b&gt; unerwartet viel Speicherplatz, sind oft Änderungen an großen Dateien die Ursache.&lt;/p&gt;
&lt;p&gt;E-Mail Clients wie &lt;b&gt;Thunderbird&lt;/b&gt; welche sämtliche Nachrichten eines Mailordners in einer großen Datei speichern (&lt;a href=&quot;https://de.wikipedia.org/wiki/Mbox&quot; title=&quot;Wikipedia-Artikel &amp;#39;mbox&amp;#39;&quot;&gt;mbox-Format&lt;/a&gt;) sind eine mögliche Ursache.&lt;/p&gt;
&lt;h2&gt;Veränderte Dateien identifizieren&lt;/h2&gt;
&lt;p&gt;Da scheinbar ein entsprechende Funktionalität in &lt;b&gt;&lt;span class=&quot;caps&quot;&gt;ZFS&lt;/span&gt;&lt;/b&gt; fehlt, wird hier ein kurzes Shell-Skript verwendet um veränderte Dateien zu finden.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Zu vergleichende Snapshots (ohne Angabe von Dataset und Pfad) nennen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SNAPSHOT1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SNAPSHOT2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# In das Snapshot-Verzeichnis des betroffenen Dataset wechseln&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;DATASET_MOUNTPOINT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/mnt/stash/for/spark/home
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DATASET_MOUNTPOINT&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/.zfs/snapshot

&lt;span class=&quot;c&quot;&gt;# Unterschiede in eine Datei schreiben&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;LIST_OF_DIFFERING_FILES&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;mktemp &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; snapdiff&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
diff &lt;span class=&quot;nt&quot;&gt;-qr&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SNAPSHOT1&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SNAPSHOT2&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;LIST_OF_DIFFERING_FILES&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'diff'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=diff&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;diff(1)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Große Dateien ausfiltern&lt;/h2&gt;
&lt;p&gt;Um festzustellen, welche der veränderten Dateien eine bestimmte Größe überschreiten, werden aus dem &lt;span class=&quot;caps&quot;&gt;DIFF&lt;/span&gt; die Dateinamen ausgefiltert um dann via &lt;b&gt;find&lt;/b&gt; eine Liste auszufiltern.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nv&quot;&gt;FIND_FILES_BIGGER_THAN&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'10M'&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SANITIZED_DIFF&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;mktemp &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; sanitized_diff&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Unerwünschte Zeilen aus DIFF entfernen&lt;/span&gt;
sed &lt;span class=&quot;s1&quot;&gt;'s/^.* and //g'&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;LIST_OF_DIFFERING_FILES&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; | sed &lt;span class=&quot;s1&quot;&gt;'s/ differ$//g'&lt;/span&gt; | sed &lt;span class=&quot;s1&quot;&gt;'s/^Only in .*$//g'&lt;/span&gt; | sed &lt;span class=&quot;s1&quot;&gt;'s/^File .* is a socket//g'&lt;/span&gt; | &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'^$'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SANITIZED_DIFF&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Jede Datei aus dem DIFF prüfen&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;while &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;read &lt;/span&gt;line&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do
  &lt;/span&gt;find &lt;span class=&quot;nv&quot;&gt;$line&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-type&lt;/span&gt; f &lt;span class=&quot;nt&quot;&gt;-size&lt;/span&gt; +&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;FIND_FILES_BIGGER_THAN&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-exec&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-ahl&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{}&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;done&lt;/span&gt; &amp;lt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SANITIZED_DIFF&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; 2&amp;gt; /dev/null&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'sed - stream editor'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=sed&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;sed(1)&lt;/a&gt;, &lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'grep'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=grep&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;grep(1)&lt;/a&gt;, &lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'find - search for files in a directory hierarchy'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=find&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;find(1)&lt;/a&gt;, &lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'ls - list directory contents'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=ls&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;ls(1)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bei Überschreitung des festgelegten Schwellwerts laut &lt;code&gt;${FIND_FILES_BIGGER_THAN}&lt;/code&gt; wird die betreffende Datei mittles &lt;code&gt;ls&lt;/code&gt; ausgegeben.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Rasche Einrichtung eines SFTP chroot-Zugangs in OpenSSH / FreeBSD</title>
   <link href="http://groovy-skills.com/freebsd/2014/04/03/rasche-einrichtung-eines-sftp-chroot-zugangs-in-openssh-slash-freebsd"/>
   <updated>2014-04-03T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/freebsd/2014/04/03/rasche-einrichtung-eines-sftp-chroot-zugangs-in-openssh-slash-freebsd</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;Wichtig:&lt;/strong&gt; In der Hierarchie bis zum freigegebenen Verzeichnis, muss &lt;b&gt;root&lt;/b&gt; der Besitzer der übergeordneten Verzeichnisse sein.&lt;/p&gt;
&lt;h2&gt;&lt;span class=&quot;caps&quot;&gt;SSHD&lt;/span&gt; Konfiguration eintragen&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Diese Variable nach Wunsch setzen&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SFTP_USER&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# HOME-Zugriff für Mitglieder der Gruppe 'sftp' erlauben&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Match Group sftp
        ChrootDirectory         %h
        ForceCommand            internal-sftp
        AllowTcpForwarding      no'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/ssh/sshd_config

&lt;span class=&quot;c&quot;&gt;# Benutzer als 'sftp'-Gruppenmitglied anlegen&lt;/span&gt;
pw groupadd sftp &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SFTP_USER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
pw useradd &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SFTP_USER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'SFTP Dateiempfang'&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-g&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SFTP_USER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-G&lt;/span&gt; sftp
passwd &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SFTP_USER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'echo - write arguments to the standard output'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=echo&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;echo(1)&lt;/a&gt;, &lt;a title=&quot;FreeBSD Manpage zum Systemverwaltungskommando 'pw - create, remove, modify &amp; display system users and groups'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=pw&amp;apropos=0&amp;sektion=8&amp;arch=default&amp;format=latin1&quot;&gt;pw(8)&lt;/a&gt;, &lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'passwd'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=passwd&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;passwd(1)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ein Neustart des OpenSSH-Diensts war im Test überflüssig.&lt;/p&gt;
&lt;h2&gt;&lt;span class=&quot;caps&quot;&gt;SFTP&lt;/span&gt;-Zugang testen&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nv&quot;&gt;SFTP_HOST&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'pwd'&lt;/span&gt; | sftp &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SFTP_USER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;@&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SFTP_HOST&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'sftp'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=sftp&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;sftp(1)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Mit obigen Kommando sollte die Verbindung aufgebaut und der Pfad des &lt;span class=&quot;caps&quot;&gt;HOME&lt;/span&gt;-Verzeichnisses des Benutzer ausgegeben werden.&lt;/p&gt;
&lt;h2&gt;Quellen&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://therub.org/2011/08/24/minimal-ssh-chroot-in-freebsd/&quot;&gt;The Rub: Minimal &lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt; Chroot in FreeBSD&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.techrepublic.com/blog/linux-and-open-source/chroot-users-with-openssh-an-easier-way-to-confine-users-to-their-home-directories/229/&quot;&gt;TechRepublic.com: Chroot users with OpenSSH&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>pyLoad Download Manager in FreeBSD oder FreeBSD Jail installieren</title>
   <link href="http://groovy-skills.com/freebsd/2014/03/29/pyload-download-manager-in-freebsd-oder-freebsd-jail-installieren"/>
   <updated>2014-03-29T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/freebsd/2014/03/29/pyload-download-manager-in-freebsd-oder-freebsd-jail-installieren</id>
   <content type="html">&lt;p&gt;Der &lt;a href=&quot;https://github.com/mrhanky17/pyload-freebsd&quot;&gt;&lt;b&gt;pyLoad FreeBSD Port&lt;/b&gt;&lt;/a&gt; von &lt;b&gt;MrHanky&lt;/b&gt; ermöglicht eine rasche Installation des Download Managers in FreeBSD.&lt;/p&gt;
&lt;h2&gt;Abhängigkeiten und pyLoad installieren&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;pkg install devel/git databases/py-sqlite3 ftp/py-curl graphics/py-imaging lang/python security/py-pycrypto www/py-django security/py-openssl archivers/unrar archivers/unzip lang/spidermonkey17 graphics/gocr graphics/tesseract graphics/tesseract-data

&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; ~
git clone https://github.com/mrhanky17/pyload-freebsd.git pyload
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;pyload/ &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; make install clean&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;FreeBSD Manpage zum Systemverwaltungskommando 'pkg - a utility for manipulating packages'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=pkg&amp;apropos=0&amp;sektion=8&amp;arch=default&amp;format=latin1&quot;&gt;pkg(8)&lt;/a&gt;, &lt;a title=&quot; Manpage zum Benutzerkommando 'git-clone - Clone a repository into a new directory'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=git-clone&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;git-clone(1)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Grundeinrichtung vornehmen&lt;/h2&gt;
&lt;p&gt;Die Konfiguration kann grundsätzlich laut der &lt;a href=&quot;http://pyload.org/pyload_stepbystep_linux#webinterface&quot; title=&quot;Abschnitt &amp;#39;Webinterface&amp;#39; des Artikels &amp;#39;Step-by-step installation on Linux&amp;#39;&quot;&gt;Anleitung für Linux in der offiziellen pyLoad Dokumentation&lt;/a&gt; vorgenommen werden.&lt;/p&gt;
&lt;p&gt;Der Befehl &lt;code&gt;pyload&lt;/code&gt; dient dabei als Abkürzung zu &lt;code&gt;python pyLoadCore.py&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Grundkonfiguration vornehmen (interaktiv)&lt;/span&gt;
pyload &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# pyLoad dauerhaft aktivieren&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'pyload_enable=&quot;YES&quot;'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/rc.conf

&lt;span class=&quot;c&quot;&gt;# pyLoad erstmalig starten&lt;/span&gt;
service pyload start&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;FreeBSD Manpage zum Systemverwaltungskommando 'service - run a System V init script'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=service&amp;apropos=0&amp;sektion=8&amp;arch=default&amp;format=latin1&quot;&gt;service(8)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;An dieser Stelle sollte pyLoad bereits gestartet und verwendbar sein.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Zusätzliche oder bestehende &lt;strong&gt;Benutzerkonten&lt;/strong&gt; können über &lt;code&gt;pyload -u&lt;/code&gt; erstellt und verwaltet werden.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>GitHub als CMS (2/2): Statische Webseiten mit Travis CI bauen</title>
   <link href="http://groovy-skills.com/jekyll/2014/03/20/github-als-cms-2-von-2-statische-webseiten-mit-travis-ci-bauen"/>
   <updated>2014-03-20T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/jekyll/2014/03/20/github-als-cms-2-von-2-statische-webseiten-mit-travis-ci-bauen</id>
   <content type="html">&lt;p&gt;Im &lt;a href=&quot;/jekyll/2014/03/20/github-als-cms-1-von-2-statisch-generierte-webseiten-fur-anfanger&quot; class=&quot;nocb&quot; title=&quot;Artikel &amp;#39;GitHub als CMS (1/2): Statisch generierte Webseiten für Anfänger&amp;#39;&quot;&gt;ersten Teil dieser Artikelserie&lt;/a&gt; ist erläutert, wie man Web-Autoren das Editieren von Inhalten mittels GitHub erleichtern kann.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dieser Artikel beschreibt das automatische Generieren und Veröffentlichen der Webseiten.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Grundkonzept&lt;/h2&gt;
&lt;p&gt;Grundsätzlich sind folgende Schritte erforderlich:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Quellcode beziehen&lt;/li&gt;
	&lt;li&gt;Statische Webseite bauen&lt;/li&gt;
	&lt;li&gt;Statische Webseite veröffentlichen&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Im Rahmen dieses Artikels werden dafür folgende Dienste genutzt:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Der Quellcode wird auf &lt;b&gt;GitHub&lt;/b&gt; verwaltet.&lt;/li&gt;
	&lt;li&gt;Die statische Webseite wird mittels &lt;b&gt;Travis CI&lt;/b&gt; gebaut.&lt;/li&gt;
	&lt;li&gt;Die resultierende Statische Webseite wird auf &lt;b&gt;GitHub Pages&lt;/b&gt; veröffentlicht.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;em&gt;Demnach gelten die jeweiligen Nutzungsrichtlinien von &lt;a href=&quot;https://help.github.com/articles/github-terms-of-service&quot;&gt;GitHub&lt;/a&gt; und &lt;a href=&quot;https://billing.travis-ci.com/pages/tos&quot;&gt;Travis CI&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;!-- You may use GitHub subdomains (e.g., yourname.github.io) solely as permitted and intended by the GitHub Pages tool to host your company pages, personal pages, or open source project pages, and for no other purpose. --&gt;&lt;/p&gt;
&lt;p&gt;Außerdem ist wichtig, sich bewusst zu sein, dass in beide Dienste im Standardangebot sämtliche Inhalte als Open Source behandeln und somit für jedermann einsehbar sind.&lt;/p&gt;
&lt;h2&gt;Quellcode von GitHub beziehen&lt;/h2&gt;
&lt;p&gt;Sobald man sich mit dem entsprechenden GitHub-Konto bei &lt;a href=&quot;http://travis-ci.org&quot; title=&quot;Travis CI - Free Hosted Continuous Integration Platform for the Open Source Community&quot;&gt;&lt;b&gt;Travis CI&lt;/b&gt;&lt;/a&gt; angemeldet hat, können einzelne Repositories zur Verarbeitung gewählt werden.&lt;/p&gt;
&lt;p&gt;Der Leser sollte dies ohne Schwierigkeiten handhaben können. Details sind in der &lt;a href=&quot;http://docs.travis-ci.com/user/getting-started/&quot; title=&quot;Travis CI: Getting started&quot;&gt;Travis CI Dokumentation&lt;/a&gt; erläutert.&lt;/p&gt;
&lt;h2&gt;Mittels Travis CI bauen und auf GitHub Pages veröffentlichen&lt;/h2&gt;
&lt;p&gt;Um von &lt;b&gt;Travis CI&lt;/b&gt; in ein Git-Repository schreiben zu können, muss sichergestellt werden, dass sich die Applikation authentifizieren kann.&lt;/p&gt;
&lt;p&gt;Anstatt umständlich mit &lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt;-Schlüsseln zu arbeiten, bietet es sich an, Benutzername und Passwort direkt in der Git-Remote &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; fest zu halten.&lt;/p&gt;
&lt;h3&gt;Access Token generieren&lt;/h3&gt;
&lt;p&gt;Für diese &lt;span class=&quot;caps&quot;&gt;HTTPS&lt;/span&gt;-Authentifizierung wird ein Zugriffskürzel benötigt, welches laut &lt;a href=&quot;https://help.github.com/articles/creating-an-access-token-for-command-line-use&quot; title=&quot;GitHub: Creating an access token for command line use&quot;&gt;der Beschreibung auf GitHub&lt;/a&gt; generiert werden kann.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Token zur weiteren Verarbeitung speichern&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;e2643f7d431b071c58729474daaa6d805b336596&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Access Token verschlüsseln&lt;/h2&gt;
&lt;p&gt;Würde man das Token im Klartext in die Konfigurationsdatei schreiben, könnte dieses leicht kompromittiert werden.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Travis CI&lt;/b&gt; bietet daher eine einfache Möglichkeit, derartige Daten zu &lt;a href=&quot;http://docs.travis-ci.com/user/encryption-keys/&quot; title=&quot;Travis CI Dokumentation: &amp;#39;Encryption Keys&amp;#39;&quot;&gt;verschlüsseln&lt;/a&gt; und im Rahmen des Build-Prozesses wieder &lt;a href=&quot;http://docs.travis-ci.com/user/build-configuration/#Set-environment-variables&quot; title=&quot;Travis CI: Build Configuration - Set environment variables&quot;&gt;zur Verfügung zu stellen&lt;/a&gt;.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Travis Gem installieren&lt;/span&gt;
gem install travis travis-lint

&lt;span class=&quot;c&quot;&gt;# Token verschlüsseln und in .travis.yml schreiben&lt;/span&gt;
travis encrypt &lt;span class=&quot;nv&quot;&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--add&lt;/span&gt; env.global

&lt;span class=&quot;c&quot;&gt;# Gültigkeit von .travis.yml sicherstellen&lt;/span&gt;
travis-lint&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Damit werden Kommandos im späteren &lt;b&gt;Travis CI&lt;/b&gt; Build-Prozess den ursprünglichen Wert von &lt;code&gt;${GITHUB_TOKEN}&lt;/code&gt; auslesen können.&lt;/p&gt;
&lt;h2&gt;Skript zur Veröffentlichung in .travis.yml hinterlegen&lt;/h2&gt;
&lt;p&gt;Dies ist ein vollständiges Beispiel für die Datei &lt;b&gt;.travis.yml&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Nachdem die Abhängigkeiten installiert sind, wird die Seite gebaut (&lt;code&gt;middleman build&lt;/code&gt;). Anschließend wird das Ergebnis als eigenes Git-Repository initialisiert, konfiguriert und in das Ziel-Repository veröffentlicht.&lt;/p&gt;
&lt;p&gt;Man beachte den Zugriff auf &lt;code&gt;${GITHUB_TOKEN}&lt;/code&gt; im Rahmen des &lt;code&gt;git remote&lt;/code&gt; Kommandos. Wichtig ist auch die Verwendung von &lt;code&gt;--quiet&lt;/code&gt; um zu verhindern, dass das Token auf der &lt;b&gt;Travis CI&lt;/b&gt; Website im Klartext aufscheint.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Achtung: In diesem Beispiel werden die Inhalte des Ziel-Repository gänzlich gelöscht und neu angelegt.&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;na&quot;&gt;language&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ruby&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;rvm&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;2.0.0&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;global&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;secure&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;I3lfngRydxAJzdZQ7lVf2h8EqymIH8OyR71miD1NDN5ioOfXSaVPzB6+OX2KGI9x4TXs4QKZdBpu5zEJDfLqbLbbmn4X8AayGgzEmcEkubAOc8/epdELlYRxBL4x5v5R/wRDEl+0mr9G+cYZ+UKhvFnXnUX1V9JvsHS1P+xbfHk=&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;before_install&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;sudo apt-get update -qq&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;sudo apt-get install -qq jpegoptim libjpeg-turbo-progs pngcrush optipng advancecomp&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;no&quot;&gt;bundle exec middleman build &amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class=&quot;no&quot;&gt;cd ./build &amp;amp;&amp;amp; site_url=`cat CNAME` &amp;amp;&amp;amp; [ ${site_url} != '' ] &amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class=&quot;no&quot;&gt;git init &amp;amp;&amp;amp; git remote add origin https://BENUTZERNAME:${GITHUB_TOKEN}@github.com/BENUTZERNAME/${site_url}-build.git &amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class=&quot;no&quot;&gt;git config user.email \&quot;`date '+%Y'`@example.org\&quot; &amp;amp;&amp;amp; git config user.name \&quot;Travis\ CI `date '+%Y'`\&quot; &amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class=&quot;no&quot;&gt;git add . &amp;amp;&amp;amp; git status --porcelain | git commit --quiet --file=- &amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class=&quot;no&quot;&gt;git checkout -b gh-pages &amp;amp;&amp;amp; git push --quiet --force --set-upstream origin gh-pages&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;em&gt;Im gegebenen Anwendungsfall kann ein Build nur dann als erfolgreich betrachtet werden, wenn die Webseite auch korrekt veröffentlicht wurde. Demnach ist in diesem Beispiel die gesamte Logik Teil des Abschnitts &lt;strong&gt;script&lt;/strong&gt;, während in anderen Beispielen entsprechende Hooks wie etwa &lt;strong&gt;after_success&lt;/strong&gt; angebrachter sind.&lt;/em&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>GitHub als CMS (1/2): Statisch generierte Webseiten für Anfänger</title>
   <link href="http://groovy-skills.com/jekyll/2014/03/20/github-als-cms-1-von-2-statisch-generierte-webseiten-fur-anfanger"/>
   <updated>2014-03-20T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/jekyll/2014/03/20/github-als-cms-1-von-2-statisch-generierte-webseiten-fur-anfanger</id>
   <content type="html">&lt;p&gt;Statische Website Generatoren wie &lt;b&gt;Jekyll&lt;/b&gt; oder &lt;b&gt;Middleman&lt;/b&gt; bieten unzählige &lt;a href=&quot;/jekyll/2013/10/26/perfekt-einfach-was-ist-jekyll&quot; title=&quot;Beitrag &amp;#39;Perfekt einfach: Was ist Jekyll?&amp;#39;&quot;&gt;Vorteile&lt;/a&gt; im Vergleich zum Betrieb dynamischer, &lt;span class=&quot;caps&quot;&gt;CMS&lt;/span&gt;-basierter Webseiten.&lt;/p&gt;
&lt;p&gt;Technologie-versierte Nutzern mit Erfahrung in den jeweils zutreffenden Programmiersprachen können meist relativ rasch Websites mit Hilfe dieser Generatoren erzeugen.&lt;/p&gt;
&lt;p&gt;Die Herausforderung liegt aktuell darin, diese Technologien auch &lt;strong&gt;Web-Autoren ohne Hintergrundkenntnisse&lt;/strong&gt; zugänglich zu machen.&lt;/p&gt;
&lt;h2&gt;Hindernisse und Lösungen für Web-Autoren&lt;/h2&gt;
&lt;p&gt;Vor Allem folgende Punkte gestalten sich für Web-Autoren im Zusammenhang mit statischen Website-Generatoren schwierig:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;die &lt;strong&gt;Handhabung&lt;/strong&gt; von Inhalten&lt;/li&gt;
	&lt;li&gt;das &lt;strong&gt;Generieren&lt;/strong&gt; der Webseite&lt;/li&gt;
	&lt;li&gt;das &lt;strong&gt;Veröffentlichen&lt;/strong&gt; beim Hoster&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Vereinfachte Handhabung von Inhalten&lt;/h3&gt;
&lt;p&gt;Es ist quasi undenkbar, vom Großteil der reinen Web-Autoren tief greifende &lt;b&gt;Git&lt;/b&gt;-Kenntnisse zu fordern. Daher soll dieser Punkt abstrahiert und die Handhabung bekannter &lt;span class=&quot;caps&quot;&gt;CMS&lt;/span&gt; weitgehend imitiert werden.&lt;/p&gt;
&lt;h4&gt;Online-Editoren von Drittanbietern&lt;/h4&gt;
&lt;p&gt;Online-Editoren wie &lt;a href=&quot;http://prose.io&quot; title=&quot;Prose.io: Content Editor for GitHub&quot;&gt;Prose&lt;/a&gt; und &lt;a href=&quot;http://tinypress.co&quot; title=&quot;TinyPress.io: Create and easily manage your Github page blog&quot;&gt;TinyPress&lt;/a&gt; verbinden sich direkt mit GitHub und vereinfachen den Umgang mit den Inhalten. Mit diesen Benutzeroberflächen können &lt;strong&gt;kleinere Änderungen&lt;/strong&gt; auf angenehme Weise durchgeführt werden.&lt;/p&gt;
&lt;p&gt;Die Vorschauoptionen sind derzeit (03/2014) allerdings auf Texte im Markdown-Format beschränkt.&lt;/p&gt;
&lt;h4&gt;Direkt in GitHub bearbeiten&lt;/h4&gt;
&lt;p&gt;Die Tatsache scheint einigen Entwicklern unbekannt zu sein, doch können Dateien auch direkt auf GitHub editiert werden &amp;#8211; &amp;#8220;Zen-Modus&amp;#8221; inklusive.&lt;/p&gt;
&lt;p&gt;Um die entsprechende Vorschaufunktion mit weitreichender &lt;strong&gt;Unterstützung diverser Markup-Formate&lt;/strong&gt; zu aktivieren muss eine neue Datei zumindest einmal mit entsprechender Endung gespeichert worden sein. Es empfiehlt sich daher, zuerst eine leere Datei zu erstellen.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Ein Autor muss nun lediglich darauf achten, die Dateien korrekt benannt im jeweils richtigen Verzeichnis abzulegen.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Vereinfachtes Generieren und Veröffentlichen&lt;/h3&gt;
&lt;p&gt;Sowohl das Generieren der Seiten als auch das Hochladen zum Hoster sollte dem Web-Autor gänzlich abgenommen werden.&lt;/p&gt;
&lt;p&gt;Mit &lt;b&gt;Jekyll&lt;/b&gt; und &lt;b&gt;GitHub Pages&lt;/b&gt; ist bereits viel gewonnen. In dieser Kombination übernimmt GitHub selbst das Generieren &amp;#8211; ein korrektes Repository-Setup vorausgesetzt.&lt;/p&gt;
&lt;p&gt;Dafür muss &lt;b&gt;Jekyll&lt;/b&gt; allerdings mit &lt;code&gt;safe: true&lt;/code&gt; betrieben werden, wodurch komplexe Lösungen (Plugins) weitgehend unmöglich werden.&lt;/p&gt;
&lt;h4&gt;Erweiterte Möglichkeiten&lt;/h4&gt;
&lt;p&gt;Möchte man die oben genannte Einschränkung umgehen oder generell andere Generatoren, wie beispielsweise &lt;b&gt;Middleman&lt;/b&gt;, nutzen, muss die Seite &lt;em&gt;vorab&lt;/em&gt; generiert und erst dann zum entsprechenden Hoster geladen werden.&lt;/p&gt;
&lt;p&gt;Beide Schritte können mit &lt;b&gt;Travis CI&lt;/b&gt; elegant gelöst werden.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Die entsprechende Einrichtung ist in &lt;a href=&quot;/jekyll/2014/03/20/github-als-cms-2-von-2-statische-webseiten-mit-travis-ci-bauen&quot; class=&quot;nocb&quot; title=&quot;Artikel &amp;#39;GitHub als CMS (2/2): Statische Webseiten mit Travis CI bauen&amp;#39;&quot;&gt;Teil 2 dieser Artikelserie&lt;/a&gt; erklärt.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Vorteile des Konzepts&lt;/h2&gt;
&lt;p&gt;&lt;b&gt;Git&lt;/b&gt; bietet Vieles, was herkömmlichen &lt;span class=&quot;caps&quot;&gt;CMS&lt;/span&gt; oft gesondert implementieren müssen, in ausgereifter Form:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Die &lt;strong&gt;Versionshistorie&lt;/strong&gt; erlaubt das einfache Widerrufen bestimmter Änderungen.&lt;/li&gt;
	&lt;li&gt;Über die Gewährung des &lt;strong&gt;Collaborator Status&lt;/strong&gt; in GitHub kann weiteren Benutzern Zugang zum Projekt gewährt werden.&lt;/li&gt;
	&lt;li&gt;Konzeptionell ist das &lt;strong&gt;Offline-Editieren&lt;/strong&gt; eine Standardfunktion, welche vor allem in Zusammenhang mit Applikationen wie dem &lt;b&gt;GitHub Mac Client&lt;/b&gt; zugänglich gemacht werden kann.&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>Git: Name und E-Mail Adresse zu Commits in Git-Historie ersetzen</title>
   <link href="http://groovy-skills.com/linux/2013/11/11/git-name-und-e-mail-adresse-zu-commits-in-git-historie-ersetzen"/>
   <updated>2013-11-11T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/linux/2013/11/11/git-name-und-e-mail-adresse-zu-commits-in-git-historie-ersetzen</id>
   <content type="html">&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 title=&quot;Ubuntu Manpage zum Befehl 'git-filter-branch - Rewrite branches'&quot; href=&quot;http://manpages.ubuntu.com/manpages/git-filter-branch.1&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;WARNING&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;h2&gt;Skript zum Ersetzen von Name und E-Mail Adresse&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nv&quot;&gt;FROM_COMMITTER_NAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'BISHERIGER NAME'&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;TO_NAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'NEUER NAME'&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;TO_EMAIL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'neue_email@example.com'&lt;/span&gt;
        
git filter-branch &lt;span class=&quot;nt&quot;&gt;--commit-filter&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;
        if [ &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;\$&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;GIT_COMMITTER_NAME&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; = '&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;FROM_COMMITTER_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;' ]; then
                GIT_COMMITTER_NAME='&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;TO_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;';
                GIT_AUTHOR_NAME='&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;TO_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;';
                GIT_COMMITTER_EMAIL='&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;TO_EMAIL&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;';
                GIT_AUTHOR_EMAIL='&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;TO_EMAIL&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;';
                git commit-tree &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\$&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;@;
        else
                git commit-tree &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\$&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;@;
        fi&quot;&lt;/span&gt; HEAD&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</content>
 </entry>
 
 <entry>
   <title>Perfekt einfach: Was ist Jekyll?</title>
   <link href="http://groovy-skills.com/jekyll/2013/10/26/perfekt-einfach-was-ist-jekyll"/>
   <updated>2013-10-26T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/jekyll/2013/10/26/perfekt-einfach-was-ist-jekyll</id>
   <content type="html">&lt;p&gt;Ausgehend von einer bestimmten Dateistruktur erzeugt &lt;a href=&quot;http://jekyllrb.com&quot; title=&quot;Jekyll - Simple, blog-aware, static sites&quot;&gt;&lt;b&gt;Jekyll&lt;/b&gt;&lt;/a&gt; eine &lt;strong&gt;statische &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; Seite&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Beim &lt;strong&gt;Generieren&lt;/strong&gt; werden sämtliche Inhalte der Seite bereits fertig berechnet und als Dateien abgelegt.&lt;/p&gt;
&lt;p&gt;Üblicherweise ist das Resultat &lt;em&gt;frei von dynamischen Inhalten&lt;/em&gt;. Der Webserver muss die Dateien lediglich so ausliefern, wie sie bereits vorliegen. Zu diesem Zeitpunkt entfällt der Rechenaufwand zum Zusammensetzen von Datenbankinhalten und dynamischem Code.&lt;/p&gt;
&lt;p&gt;Webseiten auf Jekyll-Basis sind demnach designbedingt &lt;strong&gt;sicherer, schneller, wartungsfrei und langlebig&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Komplexität als Nachteil von Content Management Systemen&lt;/h2&gt;
&lt;p&gt;Dynamische &lt;a href=&quot;https://de.wikipedia.org/wiki/Content-Management-System&quot; title=&quot;Wikipedia-Artikel &amp;#39;Content-Management-System&amp;#39;&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CMS&lt;/span&gt;&lt;/a&gt; schaffen Probleme, die oft mit komplexen und fehleranfälligen Ansätzen behandelt werden müssen.&lt;/p&gt;
&lt;p&gt;Ein Paradebeispiel für solche Ansätze sind Caching-Plugins wie sie für gängige &lt;span class=&quot;caps&quot;&gt;CMS&lt;/span&gt; existieren. Solche Plugins müssen &amp;#8220;entscheiden&amp;#8221;, &lt;em&gt;welche&lt;/em&gt; Inhalte &lt;em&gt;wann&lt;/em&gt; und &lt;em&gt;für wie lange&lt;/em&gt; statisch ausgeliefert werden können, bevor sie (erneut) aus den Ressourcen gebaut werden müssen.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Jekyll&lt;/b&gt; macht ein Caching in dieser Form überflüssig. Jene Inhalte, die dynamische Berechnungen erfordern, können über entsprechend spezialisierte Services oder auch über Drittanbieter gelöst werden.&lt;/p&gt;
&lt;h2&gt;Beispiel: Verwandlung von Jekyll &amp;#8220;Quellcode&amp;#8221; in &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Eine einfache Dateistruktur dient als Grundlage für &lt;b&gt;Jekyll&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;Mit dem entsprechenden Befehl weist man &lt;b&gt;Jekyll&lt;/b&gt; an eine &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;-Seitenstruktur zu generieren welche am Webserver abgelegt werden kann.&lt;/p&gt;
&lt;h3&gt;Ausgangslage: Quell-Dateistruktur&lt;/h3&gt;
&lt;p&gt;Um rasch die notwendige Struktur zu erstellen, kann der Befehl &lt;code&gt;jekyll new ${SEITENNAME}&lt;/code&gt; verwendet werden. In &lt;b&gt;Jekyll 1.2.1&lt;/b&gt; werden damit folgende Dateien und Verzeichnisse erstellt:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
├── _config.yml
├── css
│   ├── main.css
│   └── syntax.css
├── index.html
├── _layouts
│   ├── default.html
│   └── post.html
└── _posts
    └── 2013-10-26-welcome-to-jekyll.markdown

3 directories, 7 files&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h3&gt;Ergebnis: Generierte &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;-Dateistruktur&lt;/h3&gt;
&lt;p&gt;Mit &lt;code&gt;jekyll build&lt;/code&gt; wird ein Unterverzeichnis &lt;b&gt;_site&lt;/b&gt; mit folgendem Aufbau generiert:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;_site
├── css
│   ├── main.css
│   └── syntax.css
├── index.html
└── jekyll
    └── update
        └── 2013
            └── 10
                └── 26
                    └── welcome-to-jekyll.html

6 directories, 4 files&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Die folgende Aufzählung zeigt einige der Probleme auf welche jeder Webentwickler früher oder später stößt.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Update einer Website, aufgrund von Sicherheitslücken im &lt;span class=&quot;caps&quot;&gt;CMS&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&amp;#8220;Zusammenbruch&amp;#8221; einer Website durch Inkompatibilät mit der Interpreterversion des Hosters (z.B. &lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;)&lt;/li&gt;
	&lt;li&gt;Notwendigkeit zur Konfiguration eines Caching-Plugin auf &lt;span class=&quot;caps&quot;&gt;CMS&lt;/span&gt; und Betriebssystemebene&lt;/li&gt;
	&lt;li&gt;Ineffizientes Arbeiten wegen umfangreicher Ladezeiten des Backends/Administrationbereich eines &lt;span class=&quot;caps&quot;&gt;CMS&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wer einige dieser Erfahrungen gemacht hat, wird mit &lt;b&gt;Jekyll&lt;/b&gt; seinen Horizont erweitert sehen.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Tipp:&lt;/strong&gt; Wer &lt;b&gt;Jekyll&lt;/b&gt; auch weniger versierten Nutzern schmackhaft machen möchte, findet mit &lt;a href=&quot;https://github.com/prose/prose&quot; class=&quot;nocb&quot; title=&quot;Prose - A Content Editor for GitHub&quot;&gt;Prose&lt;/a&gt; einen interessanten Ansatz um Inhalte direkt online editierbar zu machen.&lt;/em&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Bye, Bye Spreadsheet. Hi, Jekyll Date Chart!</title>
   <link href="http://groovy-skills.com/jekyll/2013/10/10/bye-bye-spreadsheet-hi-jekyll-date-chart"/>
   <updated>2013-10-10T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/jekyll/2013/10/10/bye-bye-spreadsheet-hi-jekyll-date-chart</id>
   <content type="html">&lt;table&gt;
	&lt;tr&gt;
		&lt;td&gt; Deckard        &lt;/td&gt;
		&lt;td&gt; &lt;span class=&quot;caps&quot;&gt;BTC&lt;/span&gt;        &lt;/td&gt;
		&lt;td&gt; all but real                       &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 01.01.2013 &lt;/td&gt;
		&lt;td&gt;  =6000,00 &lt;/td&gt;
		&lt;td&gt; a good start                       &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 16.01.2013 &lt;/td&gt;
		&lt;td&gt;  =+1500,00 &lt;/td&gt;
		&lt;td&gt; they said we should use WordPress  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 03.03.2013 &lt;/td&gt;
		&lt;td&gt;  =-3000,00 &lt;/td&gt;
		&lt;td&gt; asked my Dad for it; thank you Dad &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 04.04.2013 &lt;/td&gt;
		&lt;td&gt;    +1500,00 &lt;/td&gt;
		&lt;td&gt; assume this is an addition         &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 05.05.2013 &lt;/td&gt;
		&lt;td&gt;    +1500,00 &lt;/td&gt;
		&lt;td&gt; sometimes Mum is more generous     &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 06.06.2013 &lt;/td&gt;
		&lt;td&gt;    +1500,00 &lt;/td&gt;
		&lt;td&gt; they said we should use WordPress  &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;table&gt;
	&lt;tr&gt;
		&lt;td&gt; Quaid       &lt;/td&gt;
		&lt;td&gt; &lt;span class=&quot;caps&quot;&gt;BTC&lt;/span&gt;        &lt;/td&gt;
		&lt;td&gt; all but real                       &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 01.01.2013 &lt;/td&gt;
		&lt;td&gt;  =4000,00 &lt;/td&gt;
		&lt;td&gt; a good start                       &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 01.02.2013 &lt;/td&gt;
		&lt;td&gt;    -3000,00 &lt;/td&gt;
		&lt;td&gt; they said we should use WordPress  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 01.03.2013 &lt;/td&gt;
		&lt;td&gt;    +1500,00 &lt;/td&gt;
		&lt;td&gt; asked my Dad for it; thank you Dad &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 01.04.2013 &lt;/td&gt;
		&lt;td&gt;    -1500,00 &lt;/td&gt;
		&lt;td&gt; assume this is an addition         &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 01.05.2013 &lt;/td&gt;
		&lt;td&gt;    +1500,00 &lt;/td&gt;
		&lt;td&gt; sometimes Mum is more generous     &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 01.06.2013 &lt;/td&gt;
		&lt;td&gt;    +1500,00 &lt;/td&gt;
		&lt;td&gt; they said we should use WordPress  &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;table&gt;
	&lt;tr&gt;
		&lt;td&gt; Hauser        &lt;/td&gt;
		&lt;td&gt; &lt;span class=&quot;caps&quot;&gt;BTC&lt;/span&gt;        &lt;/td&gt;
		&lt;td&gt; all but real                       &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 01.01.2013 &lt;/td&gt;
		&lt;td&gt;      =0,00 &lt;/td&gt;
		&lt;td&gt; a good start                       &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 01.02.2013 &lt;/td&gt;
		&lt;td&gt;    +1500,00 &lt;/td&gt;
		&lt;td&gt; they said we should use WordPress  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 01.03.2013 &lt;/td&gt;
		&lt;td&gt;    +2500,00 &lt;/td&gt;
		&lt;td&gt; asked my Dad for it; thank you Dad &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 01.04.2013 &lt;/td&gt;
		&lt;td&gt;    +1500,00 &lt;/td&gt;
		&lt;td&gt; assume this is an addition         &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 01.05.2013 &lt;/td&gt;
		&lt;td&gt;    +2500,00 &lt;/td&gt;
		&lt;td&gt; sometimes Mum is more generous     &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 01.06.2013 &lt;/td&gt;
		&lt;td&gt;    +1500,00 &lt;/td&gt;
		&lt;td&gt; they said we should use WordPress  &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;div class=&quot;dchart&quot; id=&quot;dchart-w1qq6k&quot; style=&quot;height: 450px;&quot; data-entries='[{&quot;date&quot;:&quot;2013-01-01&quot;,&quot;Deckard&quot;:6000.0,&quot;Quaid&quot;:4000.0,&quot;Hauser&quot;:0.0,&quot;total&quot;:10000.0},{&quot;date&quot;:&quot;2013-01-16&quot;,&quot;Deckard&quot;:1500.0,&quot;Quaid&quot;:&quot;0.4e4&quot;,&quot;Hauser&quot;:&quot;0.0&quot;,&quot;total&quot;:5500.0},{&quot;date&quot;:&quot;2013-02-01&quot;,&quot;Quaid&quot;:1000.0,&quot;Hauser&quot;:1500.0,&quot;Deckard&quot;:&quot;0.15e4&quot;,&quot;total&quot;:4000.0},{&quot;date&quot;:&quot;2013-03-01&quot;,&quot;Quaid&quot;:2500.0,&quot;Hauser&quot;:4000.0,&quot;Deckard&quot;:&quot;0.15e4&quot;,&quot;total&quot;:8000.0},{&quot;date&quot;:&quot;2013-03-03&quot;,&quot;Deckard&quot;:-3000.0,&quot;Quaid&quot;:&quot;0.25e4&quot;,&quot;Hauser&quot;:&quot;0.4e4&quot;,&quot;total&quot;:3500.0},{&quot;date&quot;:&quot;2013-04-01&quot;,&quot;Quaid&quot;:1000.0,&quot;Hauser&quot;:5500.0,&quot;Deckard&quot;:&quot;-0.3e4&quot;,&quot;total&quot;:3500.0},{&quot;date&quot;:&quot;2013-04-04&quot;,&quot;Deckard&quot;:-1500.0,&quot;Quaid&quot;:&quot;0.1e4&quot;,&quot;Hauser&quot;:&quot;0.55e4&quot;,&quot;total&quot;:5000.0},{&quot;date&quot;:&quot;2013-05-01&quot;,&quot;Quaid&quot;:2500.0,&quot;Hauser&quot;:8000.0,&quot;Deckard&quot;:&quot;-0.15e4&quot;,&quot;total&quot;:9000.0},{&quot;date&quot;:&quot;2013-05-05&quot;,&quot;Deckard&quot;:0.0,&quot;Quaid&quot;:&quot;0.25e4&quot;,&quot;Hauser&quot;:&quot;0.8e4&quot;,&quot;total&quot;:10500.0},{&quot;date&quot;:&quot;2013-06-01&quot;,&quot;Quaid&quot;:4000.0,&quot;Hauser&quot;:9500.0,&quot;Deckard&quot;:&quot;0.0&quot;,&quot;total&quot;:13500.0},{&quot;date&quot;:&quot;2013-06-06&quot;,&quot;Deckard&quot;:1500.0,&quot;Quaid&quot;:&quot;0.4e4&quot;,&quot;Hauser&quot;:&quot;0.95e4&quot;,&quot;total&quot;:15000.0}]' data-ykeys='[&quot;total&quot;, &quot;Deckard&quot;, &quot;Quaid&quot;, &quot;Hauser&quot;]' data-unit='[&quot;BTC&quot;]'&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;Jekyll Date Chart&lt;/b&gt; (&lt;a href=&quot;https://rubygems.org/gems/jekyll_date_chart&quot; title=&quot;Jekyll Date Chart Ruby Gem&quot;&gt;RubyGems&lt;/a&gt;, &lt;a href=&quot;https://github.com/GSI/jekyll_date_chart&quot; title=&quot;Jekyll Date Chart GitHub Repository&quot;&gt;GitHub&lt;/a&gt;) erzeugt Liniendiagramme mit Datumsbezug aus Textile-ähnlichen Tabellen.&lt;/p&gt;
&lt;p&gt;Im Folgenden werden einige Beispieldiagramme zum frisch gebackenen Jekyll Plugin aufgezeigt.&lt;/p&gt;
&lt;h2&gt;Nutzungsbeispiele mit allgemeinen Werten&lt;/h2&gt;
&lt;table&gt;
	&lt;tr&gt;
		&lt;td&gt; Push-Ups   &lt;/td&gt;
		&lt;td&gt; Repetitions &lt;/td&gt;
		&lt;td&gt; Push it to the limit, walk along the razors ed.. &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 12.02.2013 &lt;/td&gt;
		&lt;td&gt;         =12 &lt;/td&gt;
		&lt;td&gt; Hey, I&amp;#8217;ve only just started out!                 &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 13.03.2013 &lt;/td&gt;
		&lt;td&gt;          =9 &lt;/td&gt;
		&lt;td&gt; Hangover. Just don&amp;#8217;t ask.                        &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 14.04.2013 &lt;/td&gt;
		&lt;td&gt;         =15 &lt;/td&gt;
		&lt;td&gt; Look at that!                                    &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 15.05.2013 &lt;/td&gt;
		&lt;td&gt;         =20 &lt;/td&gt;
		&lt;td&gt; Superman is jealous.                             &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 16.06.2013 &lt;/td&gt;
		&lt;td&gt;         =30 &lt;/td&gt;
		&lt;td&gt; Hulk is jealous.                                 &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 17.07.2013 &lt;/td&gt;
		&lt;td&gt;         =50 &lt;/td&gt;
		&lt;td&gt; Chuck Norris is jealous.                         &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;table&gt;
	&lt;tr&gt;
		&lt;td&gt; 339        &lt;/td&gt;
		&lt;td&gt; Repetitions &lt;/td&gt;
		&lt;td&gt; If you stick with us &amp;#8230;                         &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 21.05.2013 &lt;/td&gt;
		&lt;td&gt;        =250 &lt;/td&gt;
		&lt;td&gt; Checkin&amp;#8217; on the kids, eh Toni?                   &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 22.06.2013 &lt;/td&gt;
		&lt;td&gt;        =300 &lt;/td&gt;
		&lt;td&gt; Hit my haaand, Jason!                            &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 24.07.2013 &lt;/td&gt;
		&lt;td&gt;        =339 &lt;/td&gt;
		&lt;td&gt; Look, Audri, I did it! Oh, you&amp;#8217;re still goin &amp;#8230; &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 25.08.2013 &lt;/td&gt;
		&lt;td&gt;        =349 &lt;/td&gt;
		&lt;td&gt; Might do a little bonus?? Hmpf                   &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 26.09.2013 &lt;/td&gt;
		&lt;td&gt;        =350 &lt;/td&gt;
		&lt;td&gt; Adam, we&amp;#8217;re done. Adam?!                         &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;div class=&quot;dchart&quot; id=&quot;dchart-gozzvx&quot; style=&quot;height: 450px;&quot; data-entries='[{&quot;date&quot;:&quot;2013-02-12&quot;,&quot;Push-Ups&quot;:12.0,&quot;total&quot;:12.0},{&quot;date&quot;:&quot;2013-03-13&quot;,&quot;Push-Ups&quot;:9.0,&quot;total&quot;:9.0},{&quot;date&quot;:&quot;2013-04-14&quot;,&quot;Push-Ups&quot;:15.0,&quot;total&quot;:15.0},{&quot;date&quot;:&quot;2013-05-15&quot;,&quot;Push-Ups&quot;:20.0,&quot;total&quot;:20.0},{&quot;date&quot;:&quot;2013-05-21&quot;,&quot;339&quot;:250.0,&quot;Push-Ups&quot;:&quot;0.2e2&quot;,&quot;total&quot;:270.0},{&quot;date&quot;:&quot;2013-06-16&quot;,&quot;Push-Ups&quot;:30.0,&quot;339&quot;:&quot;0.25e3&quot;,&quot;total&quot;:280.0},{&quot;date&quot;:&quot;2013-06-22&quot;,&quot;339&quot;:300.0,&quot;Push-Ups&quot;:&quot;0.3e2&quot;,&quot;total&quot;:330.0},{&quot;date&quot;:&quot;2013-07-17&quot;,&quot;Push-Ups&quot;:50.0,&quot;339&quot;:&quot;0.3e3&quot;,&quot;total&quot;:350.0},{&quot;date&quot;:&quot;2013-07-24&quot;,&quot;339&quot;:339.0,&quot;Push-Ups&quot;:&quot;0.5e2&quot;,&quot;total&quot;:389.0},{&quot;date&quot;:&quot;2013-08-25&quot;,&quot;339&quot;:349.0,&quot;Push-Ups&quot;:&quot;0.5e2&quot;,&quot;total&quot;:399.0},{&quot;date&quot;:&quot;2013-09-26&quot;,&quot;339&quot;:350.0,&quot;Push-Ups&quot;:&quot;0.5e2&quot;,&quot;total&quot;:400.0}]' data-ykeys='[&quot;total&quot;, &quot;Push-Ups&quot;, &quot;339&quot;]' data-unit='[&quot;Repetitions&quot;]'&gt;&lt;/div&gt;&lt;h2&gt;Nutzungsbeispiele mit Finanzdaten&lt;/h2&gt;
&lt;h3&gt;Zwei Tabellen &amp;#8211; zwei Diagramme&lt;/h3&gt;
&lt;table&gt;
	&lt;tr&gt;
		&lt;td&gt; Savings    &lt;/td&gt;
		&lt;td&gt; &lt;span class=&quot;caps&quot;&gt;USD&lt;/span&gt;        &lt;/td&gt;
		&lt;td&gt; all but real                       &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 01.01.2013 &lt;/td&gt;
		&lt;td&gt;  =3.000,00 &lt;/td&gt;
		&lt;td&gt; a good start                       &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 02.02.2013 &lt;/td&gt;
		&lt;td&gt; =-2.920,30 &lt;/td&gt;
		&lt;td&gt; they said we should use WordPress  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 03.03.2013 &lt;/td&gt;
		&lt;td&gt;  +2.500,00 &lt;/td&gt;
		&lt;td&gt; asked my Dad for it; thank you Dad &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 04.04.2013 &lt;/td&gt;
		&lt;td&gt;     100,50 &lt;/td&gt;
		&lt;td&gt; assume this is an addition         &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 05.05.2013 &lt;/td&gt;
		&lt;td&gt;  +2.501,15 &lt;/td&gt;
		&lt;td&gt; sometimes Mum is more generous     &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 06.06.2013 &lt;/td&gt;
		&lt;td&gt;      +1,16 &lt;/td&gt;
		&lt;td&gt; &amp;#8230; and then Dad again             &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;div class=&quot;dchart&quot; id=&quot;dchart-t0bpmr&quot; style=&quot;height: 450px;&quot; data-entries='[{&quot;date&quot;:&quot;2013-01-01&quot;,&quot;Savings&quot;:3000.0,&quot;total&quot;:3000.0},{&quot;date&quot;:&quot;2013-02-02&quot;,&quot;Savings&quot;:-2920.3,&quot;total&quot;:-2920.3},{&quot;date&quot;:&quot;2013-03-03&quot;,&quot;Savings&quot;:-420.3,&quot;total&quot;:-420.3},{&quot;date&quot;:&quot;2013-04-04&quot;,&quot;Savings&quot;:-319.8,&quot;total&quot;:-319.8},{&quot;date&quot;:&quot;2013-05-05&quot;,&quot;Savings&quot;:2181.35,&quot;total&quot;:2181.35},{&quot;date&quot;:&quot;2013-06-06&quot;,&quot;Savings&quot;:2182.51,&quot;total&quot;:2182.51}]' data-ykeys='[&quot;total&quot;, &quot;Savings&quot;]' data-unit='[&quot;USD&quot;]'&gt;&lt;/div&gt;&lt;table&gt;
	&lt;tr&gt;
		&lt;td&gt; cash       &lt;/td&gt;
		&lt;td&gt; &lt;span class=&quot;caps&quot;&gt;EUR&lt;/span&gt;        &lt;/td&gt;
		&lt;td&gt; vest, trousers, socks and the like &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 10.01.2013 &lt;/td&gt;
		&lt;td&gt;      =0,00 &lt;/td&gt;
		&lt;td&gt; we all start out naked they say    &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 02.02.2013 &lt;/td&gt;
		&lt;td&gt; =-2.000,20 &lt;/td&gt;
		&lt;td&gt; long night in Vegas; too long      &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 30.03.2013 &lt;/td&gt;
		&lt;td&gt;  +2.200,00 &lt;/td&gt;
		&lt;td&gt; mowed the lawn; big lawn           &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 20.05.2013 &lt;/td&gt;
		&lt;td&gt;    -200,15 &lt;/td&gt;
		&lt;td&gt; birthday party                     &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 30.07.2013 &lt;/td&gt;
		&lt;td&gt; =+1.650,00 &lt;/td&gt;
		&lt;td&gt; where did that come from?          &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;div class=&quot;dchart&quot; id=&quot;dchart-h5qbh1&quot; style=&quot;height: 450px;&quot; data-entries='[{&quot;date&quot;:&quot;2013-01-10&quot;,&quot;cash&quot;:0.0,&quot;total&quot;:0.0},{&quot;date&quot;:&quot;2013-02-02&quot;,&quot;cash&quot;:-2000.2,&quot;total&quot;:-2000.2},{&quot;date&quot;:&quot;2013-03-30&quot;,&quot;cash&quot;:199.8,&quot;total&quot;:199.8},{&quot;date&quot;:&quot;2013-05-20&quot;,&quot;cash&quot;:-0.35,&quot;total&quot;:-0.35},{&quot;date&quot;:&quot;2013-07-30&quot;,&quot;cash&quot;:1650.0,&quot;total&quot;:1650.0}]' data-ykeys='[&quot;total&quot;, &quot;cash&quot;]' data-unit='[&quot;EUR&quot;]'&gt;&lt;/div&gt;&lt;h3&gt;Zwei Tabellen &amp;#8211; ein Diagramm&lt;/h3&gt;
&lt;table&gt;
	&lt;tr&gt;
		&lt;td&gt; Savings    &lt;/td&gt;
		&lt;td&gt; &lt;span class=&quot;caps&quot;&gt;EUR&lt;/span&gt;        &lt;/td&gt;
		&lt;td&gt; all but real                       &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 01.01.2013 &lt;/td&gt;
		&lt;td&gt;  =3.000,00 &lt;/td&gt;
		&lt;td&gt; a good start                       &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 02.02.2013 &lt;/td&gt;
		&lt;td&gt; =-2.920,30 &lt;/td&gt;
		&lt;td&gt; they said we should use WordPress  &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 03.03.2013 &lt;/td&gt;
		&lt;td&gt;  +2.500,00 &lt;/td&gt;
		&lt;td&gt; asked my dad for it; thank you dad &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;table&gt;
	&lt;tr&gt;
		&lt;td&gt; cash       &lt;/td&gt;
		&lt;td&gt; &lt;span class=&quot;caps&quot;&gt;EUR&lt;/span&gt;        &lt;/td&gt;
		&lt;td&gt; vest, trousers, socks and the like &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 01.01.2013 &lt;/td&gt;
		&lt;td&gt;      =0,00 &lt;/td&gt;
		&lt;td&gt; we all start out naked they say    &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 02.02.2013 &lt;/td&gt;
		&lt;td&gt; =-2.000,20 &lt;/td&gt;
		&lt;td&gt; long night in Vegas; too long      &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td&gt; 03.03.2013 &lt;/td&gt;
		&lt;td&gt;  +2.200,00 &lt;/td&gt;
		&lt;td&gt; mowed the lawn; big lawn           &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;
&lt;div class=&quot;dchart&quot; id=&quot;dchart-iw5jx1&quot; style=&quot;height: 450px;&quot; data-entries='[{&quot;date&quot;:&quot;2013-01-01&quot;,&quot;Savings&quot;:3000.0,&quot;cash&quot;:0.0,&quot;total&quot;:3000.0},{&quot;date&quot;:&quot;2013-02-02&quot;,&quot;Savings&quot;:-2920.3,&quot;cash&quot;:-2000.2,&quot;total&quot;:-4920.5},{&quot;date&quot;:&quot;2013-03-03&quot;,&quot;Savings&quot;:-420.3,&quot;cash&quot;:199.8,&quot;total&quot;:-220.5}]' data-ykeys='[&quot;total&quot;, &quot;Savings&quot;, &quot;cash&quot;]' data-unit='[&quot;EUR&quot;]'&gt;&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>OpenVPN: Ohne manuelle Passworteingabe mit VPN-Anbieter verbinden</title>
   <link href="http://groovy-skills.com/linux/2013/09/26/openvpn-ohne-manuelle-passworteingabe-mit-vpn-anbieter-verbinden"/>
   <updated>2013-09-26T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2013/09/26/openvpn-ohne-manuelle-passworteingabe-mit-vpn-anbieter-verbinden</id>
   <content type="html">&lt;p&gt;Für wenige &lt;b&gt;Bitcoin&lt;/b&gt; und ohne Angabe persönlicher Details ermöglichen Anbieter wie &lt;b&gt;Private Internet Access&lt;/b&gt; (&lt;a href=&quot;https://www.privateinternetaccess.com/pages/buy-vpn/GROOVY001&quot; class=&quot;nocb&quot;&gt;Empfehlungslink&lt;/a&gt;) ein entspannteres Nutzen des Internet mit den IP Adressen ihrer &lt;span class=&quot;caps&quot;&gt;VPN&lt;/span&gt;-Server.&lt;/p&gt;
&lt;p&gt;Um die Einwahl via &lt;b&gt;OpenVPN&lt;/b&gt; beim Systemstart zu automatisieren und somit die Passwortabfrage zu vermeiden, können die entsprechenden Zugangsdaten in einer einfachen Textdatei abgelegt werden.&lt;/p&gt;
&lt;p&gt;Ein Verweis aus der OpenVPN-Client Konfigurationsdatei reicht aus um die Textdatei zu nutzen.&lt;/p&gt;
&lt;h2&gt;OpenVPN Konfigurationsdateien von Private Internet Access laden&lt;/h2&gt;
&lt;p&gt;Nach der &lt;b&gt;OpenVPN&lt;/b&gt; Installation (Ubuntu: &lt;code&gt;sudo apt-get install openvpn&lt;/code&gt;) lädt man mit folgenden Befehlen das Konfigurationspaket herunter.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'https://www.privateinternetaccess.com/openvpn/openvpn.zip'&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;tmpdir&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;mktemp &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;zip&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;tmpdir&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/openvpn.zip&quot;&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;tmpdir&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
curl &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;zip&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
unzip &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;zip&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;zip&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Befehl 'curl - transfer a URL'&quot; href=&quot;http://manpages.ubuntu.com/manpages/curl.1&quot;&gt;curl(1)&lt;/a&gt;, &lt;a title=&quot;Ubuntu Manpage zum Befehl 'unzip - list, test and extract compressed files in a ZIP archive'&quot; href=&quot;http://manpages.ubuntu.com/manpages/unzip.1&quot;&gt;unzip(1)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;OpenVPN Konfigurationsdateien zur Nutzung der Credentials-Datei umschreiben&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;sed &lt;span class=&quot;nt&quot;&gt;--in-place&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;_before_credentials_file &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;s1&quot;&gt;'s/auth-user-pass/auth-user-pass credentials.txt\nauth-nocache/g'&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;.ovpn&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Befehl 'sed - stream editor'&quot; href=&quot;http://manpages.ubuntu.com/manpages/sed.1&quot;&gt;sed(1)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Credentials-Datei mit Benutzername und Kennwort erstellen&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Hier müssen die entsprechenden Daten eingetragen werden:&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;PIA_BENUTZERNAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;PIA_PASSWORT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Daten in eine Datei schreiben&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;credentials_file&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;mktemp&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PIA_BENUTZERNAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PIA_PASSWORT&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;credentials_file&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
chmod go-rwx &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;credentials_file&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;mv &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; /etc/openvpn/&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Befehl 'echo - write arguments to the standard output'&quot; href=&quot;http://manpages.ubuntu.com/manpages/echo.1&quot;&gt;echo(1)&lt;/a&gt;, &lt;a title=&quot;Ubuntu Manpage zum Befehl 'chmod - change file modes'&quot; href=&quot;http://manpages.ubuntu.com/manpages/chmod.1&quot;&gt;chmod(1)&lt;/a&gt;, &lt;a title=&quot;Ubuntu Manpage zum Befehl 'mv - move files'&quot; href=&quot;http://manpages.ubuntu.com/manpages/mv.1&quot;&gt;mv(1)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;OpenVPN-Verbindung aktivieren&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;PIA_SERVER&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;Sweden

&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;ln &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; /etc/openvpn/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SERVER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;.ovpn /etc/openvpn/pia.conf
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;service openvpn restart&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Befehl 'ln - make links between files'&quot; href=&quot;http://manpages.ubuntu.com/manpages/ln.1&quot;&gt;ln(1)&lt;/a&gt;, &lt;a title=&quot;Ubuntu Manpage zum Systemverwaltungsbefehl 'service - run a System V init script'&quot; href=&quot;http://manpages.ubuntu.com/manpages/service.8&quot;&gt;service(8)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;An dieser Stelle sollte die Verbindung zum gewünschten Server des &lt;span class=&quot;caps&quot;&gt;VPN&lt;/span&gt;-Anbieters hergestellt sein.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Tipps und Tricks&lt;/h2&gt;
&lt;h3&gt;Gerätename für &lt;span class=&quot;caps&quot;&gt;VPN&lt;/span&gt;-Tunnel festlegen&lt;/h3&gt;
&lt;p&gt;Standardmäßig wird beim Verbindungsaufbau ein neues &lt;b&gt;tun-Gerät&lt;/b&gt; verwendet.&lt;/p&gt;
&lt;p&gt;Dadurch könnte man theoretisch zu &lt;em&gt;allen&lt;/em&gt; &lt;span class=&quot;caps&quot;&gt;VPN&lt;/span&gt;-Servern gleichzeitig eine Verbindung aufbauen.&lt;/p&gt;
&lt;p&gt;Möchte man sicherstellen, dass dies unterbunden ist, vergibt man in der Konfigurationsdatei explizit einen Namen:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;sed &lt;span class=&quot;nt&quot;&gt;--in-place&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;_before_dev_rename &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;s1&quot;&gt;'s/^dev tun$/dev tunPIA/g'&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;.ovpn&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Nun wird das &lt;b&gt;tun-Gerät&lt;/b&gt; stets als &lt;code&gt;tunPIA&lt;/code&gt; benannt.&lt;/p&gt;
&lt;p&gt;Das ist vor allem dann praktisch, wenn man den Schnittstellennamen in Skripten nutzen möchte.&lt;/p&gt;
&lt;h3&gt;Bestimmte IP Adressen von &lt;span class=&quot;caps&quot;&gt;VPN&lt;/span&gt;-Tunnel ausnehmen&lt;/h3&gt;
&lt;p&gt;Bei manchen &lt;span class=&quot;caps&quot;&gt;VPN&lt;/span&gt;-Anbietern muss man explizit ein Whitelisting von Mailservern beantragen, da sie ansonsten Verbindungen über die entsprechenden Ports blocken.&lt;/p&gt;
&lt;p&gt;Möchte man den Aufwand vermeiden, oder vertraut man einer Verbindung zum Mailserver einfach mehr, kann man einzelne IP-Adressen via OpenVPN-Konfigurationsdatei am Tunnel vorbeileiten:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# IP hier angeben&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;AUSNAHME_IP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;route &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;AUSNAHME_IP&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; 255.255.255.255 net_gateway&quot;&lt;/span&gt; | tee &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;.openvpn&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt; &lt;a title=&quot;Ubuntu Manpage zum Befehl 'tee - read from standard input and write to standard output and files'&quot; href=&quot;http://manpages.ubuntu.com/manpages/tee.1&quot;&gt;tee(1)&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Netzwerkschnittstellen elegant formatiert auflisten&lt;/h3&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Aktive Schnittstellen auflisten&lt;/span&gt;
ip &lt;span class=&quot;nt&quot;&gt;-family&lt;/span&gt; inet &lt;span class=&quot;nt&quot;&gt;-oneline&lt;/span&gt; addr show scope global |
awk &lt;span class=&quot;s1&quot;&gt;'{ printf &quot;%s %s up\n&quot;, $2, $4 }'&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Inaktive Schnittstellen auflisten&lt;/span&gt;
ip &lt;span class=&quot;nt&quot;&gt;-family&lt;/span&gt; inet &lt;span class=&quot;nt&quot;&gt;-oneline&lt;/span&gt; link show scope global |
&lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;' DOWN '&lt;/span&gt; | sed &lt;span class=&quot;s1&quot;&gt;'s/\://g'&lt;/span&gt; |
awk &lt;span class=&quot;s1&quot;&gt;'{ printf &quot;%s none down\n&quot;, $2}'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</content>
 </entry>
 
 <entry>
   <title>Fluxbox Toolbar: Mehrere Zeitzonen und dynamischen Text anzeigen</title>
   <link href="http://groovy-skills.com/linux/2013/09/22/fluxbox-toolbar-mehrere-zeitzonen-und-dynamischen-text-anzeigen"/>
   <updated>2013-09-22T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2013/09/22/fluxbox-toolbar-mehrere-zeitzonen-und-dynamischen-text-anzeigen</id>
   <content type="html">&lt;p&gt;&lt;b&gt;Fluxbox&lt;/b&gt; bietet grundsätzlich nur wenige Möglichkeiten die Toolbar um eigene Inhalte zu erweitern.&lt;/p&gt;
&lt;p&gt;Möchte man dennoch kurze Ausgaben von Kommandos und Skripts im Blickfeld behalten, so lassen sich dazu die Arbeitsflächennamen zweckentfremden.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In folgendem Beispiel wird die Arbeitsfläche so umbenannt, dass die Uhrzeiten unterschiedlicher Zeitzonen eingeblendet werden.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Kommandozeilenzugriff zu Fluxbox erlauben&lt;/h2&gt;
&lt;p&gt;Die Arbeitsflächennamen sind unter &lt;code&gt;session.screen0.workspaceNames&lt;/code&gt; in der Datei &lt;strong&gt;~/.fluxbox/init&lt;/strong&gt; hinterlegt.&lt;/p&gt;
&lt;p&gt;Ein direktes Bearbeiten der init-Datei kann allerdings elegant mit dem kaum bekannten Kommando &lt;b&gt;fluxbox-remote&lt;/b&gt; vermieden werden.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;fluxbox-remote&lt;/b&gt; ermöglicht es, die aus fluxbox-keys bekannten Kommandos auch direkt über die Shell auszuführen, fern manuell oder mit folgendem Befehl die entsprechende Erlaubnis erteilt wurde:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;sed &lt;span class=&quot;nt&quot;&gt;--in-place&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;_before_editing_allowRemoteActions &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;s1&quot;&gt;'s/\(session.screen[0-9]\+.allowRemoteActions\).*/\1:\ttrue/g'&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
~/.fluxbox/init&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot; Manpage zum Benutzerkommando 'sed - stream editor'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=sed&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;sed(1)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Arbeitsflächenname mit dynamischem Text füllen&lt;/h2&gt;
&lt;p&gt;Die meisten von &lt;code&gt;fluxbox -list-commands&lt;/code&gt; aufgelisteten Kommandos können nun direkt via &lt;b&gt;fluxbox-remote&lt;/b&gt; ausgeführt werden.&lt;/p&gt;
&lt;p&gt;Folgendes Skript macht sich dies zu Nutze um jede Sekunde die aktuelle Stunde von jeweils drei Zeitzonen in den Arbeitsflächennamen zu schreiben.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;rename_fluxbox_workspace_with_tztimes.sh&lt;/em&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/sh&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# See /usr/share/zoneinfo for supported time zones&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do
  &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;utc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;TZ &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;TZ&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;UTC &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; date +&lt;span class=&quot;s2&quot;&gt;&quot;%H&quot;&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;cet&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;TZ &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;TZ&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;Europe/Vienna &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; date +&lt;span class=&quot;s2&quot;&gt;&quot;%H&quot;&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;sgt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;TZ &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;TZ&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;Asia/Singapore &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; date +&lt;span class=&quot;s2&quot;&gt;&quot;%H&quot;&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;

  &lt;span class=&quot;nv&quot;&gt;workspace_number&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;xprop &lt;span class=&quot;nt&quot;&gt;-root&lt;/span&gt; _NET_CURRENT_DESKTOP | awk &lt;span class=&quot;s1&quot;&gt;'{print $3+1}'&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
  &lt;span class=&quot;nv&quot;&gt;workspace_name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;|&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;utc&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;cet&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;sgt&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;|&quot;&lt;/span&gt;

  fluxbox-remote &lt;span class=&quot;s2&quot;&gt;&quot;setworkspacename #&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;workspace_number&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;     &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;workspace_name&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;     +&quot;&lt;/span&gt;

  sleep 1
don&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Befehl 'fluxbox-remote - command line access to key commands for fluxbox(1)'&quot; href=&quot;http://manpages.ubuntu.com/manpages/fluxbox-remote.1&quot;&gt;fluxbox-remote(1)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Wie im Skript erkennbar, kann man jederzeit per &lt;code&gt;fluxbox-remote &quot;setworkspacename $NAME&quot;&lt;/code&gt; einen neuen Namen vergeben, was sonst nur in der graphischen Oberfläche von &lt;b&gt;Fluxbox&lt;/b&gt; möglich wäre.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Node.js und Node Package Manager (NPM) in Ubuntu installieren</title>
   <link href="http://groovy-skills.com/linux/2013/09/15/nodejs-und-node-package-manager-npm-in-ubuntu-installieren"/>
   <updated>2013-09-15T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2013/09/15/nodejs-und-node-package-manager-npm-in-ubuntu-installieren</id>
   <content type="html">&lt;p&gt;Einige interessante Dienste wie beispielsweise &lt;a href=&quot;https://en.wikipedia.org/wiki/Apache_Cordova&quot; title=&quot;Wikipedia-Artikel &amp;#39;PhoneGap&amp;#39;&quot;&gt;&lt;b&gt;Apache Cordova&lt;/b&gt; / PhoneGap&lt;/a&gt; sind mit Hilfe von &lt;a href=&quot;https://de.wikipedia.org/wiki/Node.js&quot; title=&quot;Wikipedia-Artikel &amp;#39;Node.js&amp;#39;&quot;&gt;Node.js&lt;/a&gt; als &amp;#8220;serverseitiges JavaScript&amp;#8221; implementiert.&lt;/p&gt;
&lt;p&gt;Mit folgenden Befehlen kann &lt;b&gt;Node.js&lt;/b&gt; und das dazugehörige Paketverwaltungswerkzeug &lt;b&gt;npm&lt;/b&gt; rasch installiert werden.&lt;/p&gt;
&lt;h2&gt;Node.js installieren&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-get install g++ curl libssl-dev

&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;mktemp &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
curl http://nodejs.org/dist/node-latest.tar.gz | &lt;span class=&quot;nb&quot;&gt;tar &lt;/span&gt;xzv &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;node-v&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; ./configure &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; make &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;make install&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Versionen überprüfen und &lt;span class=&quot;caps&quot;&gt;NPM&lt;/span&gt; aktualisieren&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;node &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Das &quot;Node Packaged Module&quot; 'npm' aktualisieren&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;npm install &lt;span class=&quot;nt&quot;&gt;-g&lt;/span&gt; npm

npm &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Befehl 'node - Server-side JavaScript'&quot; href=&quot;http://manpages.ubuntu.com/manpages/node.1&quot;&gt;node(1)&lt;/a&gt;, &lt;a title=&quot;Ubuntu Manpage zum Befehl 'npm - node package manager'&quot; href=&quot;http://manpages.ubuntu.com/manpages/npm.1&quot;&gt;npm(1)&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>ownCloud 5 in FreeNAS 9.1 Jail oder FreeBSD installieren</title>
   <link href="http://groovy-skills.com/freebsd/2013/09/03/owncloud-5-in-freenas-91-jail-oder-freebsd-installieren"/>
   <updated>2013-09-03T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/freebsd/2013/09/03/owncloud-5-in-freenas-91-jail-oder-freebsd-installieren</id>
   <content type="html">&lt;p&gt;Der FreeNAS Wiki-Artikel &lt;a href=&quot;http://doc.freenas.org/index.php/Adding_Jails&quot; title=&quot;FreeNAS Wiki-Artikel &amp;#39;Adding Jails&amp;#39;&quot;&gt;Adding Jails&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;SSH&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;Ports-Tree aktualisieren&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csh&quot; data-lang=&quot;csh&quot;&gt;portsnap fetch extract&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;FreeBSD Manpage zum Systemverwaltungskommando 'portsnap - fetch and extract compressed snapshots of the ports tree'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=portsnap&amp;apropos=0&amp;sektion=8&amp;arch=default&amp;format=latin1&quot;&gt;portsnap(8)&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 5.0.10 die aktuelle ownCloud-Version in den Ports.&lt;/p&gt;
&lt;p&gt;Die Installation aus den Ports bringt zwei Vorteile: Einerseits werden dabei 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;PHP&lt;/span&gt;-Ports in folgendem Schritt muss &lt;strong&gt;Build &lt;span class=&quot;caps&quot;&gt;FPM&lt;/span&gt; version&lt;/strong&gt; ausgewählt sein. &lt;span class=&quot;caps&quot;&gt;CLI&lt;/span&gt; und &lt;span class=&quot;caps&quot;&gt;CGI&lt;/span&gt; können abgewählt werden.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csh&quot; data-lang=&quot;csh&quot;&gt;cd /usr/ports/www/owncloud
make config-recursive
make install clean&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;&lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;FPM&lt;/span&gt; auf Socket umstellen und Transfer-Limits erhöhen&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csh&quot; data-lang=&quot;csh&quot;&gt;# PHP-FPM auf Socket umstellen
sed -i '' -e 's/^listen =.*/listen = \/var\/run\/php5-fpm.sock/g' /usr/local/etc/php-fpm.conf

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

# Größere Uploads ermöglichen
sed -i '' -e 's/^post_max_size =.*/post_max_size = 300M/g' /usr/local/etc/php.ini
sed -i '' -e 's/^upload_max_filesize =.*/upload_max_filesize = 200M/g' /usr/local/etc/php.ini&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'sed - stream editor'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=sed&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;sed(1)&lt;/a&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;HTTP_SSL Enable http_ssl module&lt;/strong&gt; ausgewählt sein.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csh&quot; data-lang=&quot;csh&quot;&gt;cd /usr/ports/www/nginx &amp;amp;&amp;amp; make install clean&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;&lt;span class=&quot;caps&quot;&gt;SSL&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;SSL&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 &lt;strong&gt;im server-Abschnitt&lt;/strong&gt; (&lt;span class=&quot;caps&quot;&gt;HTTPS&lt;/span&gt;) der &lt;strong&gt;/usr/local/etc/nginx/nginx.conf&lt;/strong&gt; die kommentierten Bereiche freigestellt und folgende Einträge an Stelle der vorhandenen &lt;strong&gt;location&lt;/strong&gt;-Direktiven eingefügt werden.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-nginx&quot; data-lang=&quot;nginx&quot;&gt;        &lt;span class=&quot;k&quot;&gt;root&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;/usr/local/www/owncloud&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;client_max_body_size&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;200m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# set max upload size
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;fastcgi_buffers&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;64&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4K&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;rewrite&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;^/caldav(.*)&lt;/span&gt;$ &lt;span class=&quot;n&quot;&gt;/remote.php/caldav&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;redirect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;rewrite&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;^/carddav(.*)&lt;/span&gt;$ &lt;span class=&quot;n&quot;&gt;/remote.php/carddav&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;redirect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;rewrite&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;^/webdav(.*)&lt;/span&gt;$ &lt;span class=&quot;n&quot;&gt;/remote.php/webdav&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;redirect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;index.php&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;error_page&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;403&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;/core/templates/403.php&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;error_page&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;404&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;/core/templates/404.php&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;location&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;/robots.txt&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;kn&quot;&gt;allow&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;kn&quot;&gt;log_not_found&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;off&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;kn&quot;&gt;access_log&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;off&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;location&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;~&lt;/span&gt; &lt;span class=&quot;sr&quot;&gt;^/(data|config|\.ht|db_structure\.xml|README)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;kn&quot;&gt;deny&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;location&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;# The following 2 rules are only needed with webfinger
&lt;/span&gt;                &lt;span class=&quot;kn&quot;&gt;rewrite&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;^/.well-known/host-meta&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;/public.php?service=host-meta&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;last&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;kn&quot;&gt;rewrite&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;^/.well-known/host-meta.json&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;/public.php?service=host-meta-json&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;last&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

                &lt;span class=&quot;kn&quot;&gt;rewrite&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;^/.well-known/carddav&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;/remote.php/carddav/&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;redirect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;kn&quot;&gt;rewrite&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;^/.well-known/caldav&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;/remote.php/caldav/&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;redirect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

                &lt;span class=&quot;kn&quot;&gt;rewrite&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;^(/core/doc/[^&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;/]+/&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;)&lt;/span&gt;$ &lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;/index.html&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

                &lt;span class=&quot;kn&quot;&gt;try_files&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$uri&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$uri&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;index.php&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;location&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;~&lt;/span&gt; &lt;span class=&quot;sr&quot;&gt;^(.+?\.php)(/.*)?$&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;kn&quot;&gt;try_files&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;404&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

                &lt;span class=&quot;kn&quot;&gt;include&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;fastcgi_params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;kn&quot;&gt;fastcgi_param&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;SCRIPT_FILENAME&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$document_root$1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;kn&quot;&gt;fastcgi_param&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;PATH_INFO&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;kn&quot;&gt;fastcgi_param&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;HTTPS&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;kn&quot;&gt;fastcgi_pass&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;unix:/var/run/php5-fpm.sock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;c1&quot;&gt;# Optional: set long EXPIRES header on static assets
&lt;/span&gt;        &lt;span class=&quot;k&quot;&gt;location&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;sr&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;^.+&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)&lt;/span&gt;$ &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;kn&quot;&gt;expires&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;30d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                &lt;span class=&quot;c1&quot;&gt;# Optional: Don't log access to assets
&lt;/span&gt;                &lt;span class=&quot;kn&quot;&gt;access_log&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;off&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Quelle: &lt;a href=&quot;http://doc.owncloud.org/server/5.0/admin_manual/installation/installation_others.html#nginx-configuration&quot; title=&quot;Abschnitt &amp;#39;Nginx Configuration&amp;#39; der offiziellen ownCloud Dokumentation&quot;&gt;ownCloud Administrators Manual&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;nginx und &lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;FPM&lt;/span&gt; dauerhaft aktivieren und starten&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csh&quot; data-lang=&quot;csh&quot;&gt;echo 'nginx_enable=&quot;YES&quot;' &amp;gt;&amp;gt; /etc/rc.conf
echo 'php_fpm_enable=&quot;YES&quot;' &amp;gt;&amp;gt; /etc/rc.conf

/usr/local/etc/rc.d/php-fpm start
/usr/local/etc/rc.d/nginx start&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'echo - write arguments to the standard output'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=echo&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;echo(1)&lt;/a&gt;, &lt;a title=&quot;FreeBSD Manpage zum Dateiformat/zur Konvention 'rc.conf - system configuration information'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=rc.conf&amp;apropos=0&amp;sektion=5&amp;arch=default&amp;format=latin1&quot;&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>
 </entry>
 
 <entry>
   <title>Passworteingaben und Makros in Fluxbox korrekt automatisieren</title>
   <link href="http://groovy-skills.com/linux/2013/08/13/passworteingaben-und-makros-in-fluxbox-korrekt-automatisieren"/>
   <updated>2013-08-13T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2013/08/13/passworteingaben-und-makros-in-fluxbox-korrekt-automatisieren</id>
   <content type="html">&lt;p&gt;In &lt;b&gt;&lt;span class=&quot;caps&quot;&gt;KDE&lt;/span&gt;&lt;/b&gt; funktioniert die Auto-Type Funktion aus &lt;b&gt;KeePass&lt;/b&gt; zumindest, solange das Passwort frei von Sonderzeichen ist.&lt;/p&gt;
&lt;p&gt;In &lt;b&gt;Fluxbox&lt;/b&gt; sorgt das explizite Setzen des Tastaturlayouts via &lt;b&gt;setxkbmap&lt;/b&gt; dafür, dass &lt;strong&gt;sämtliche&lt;/strong&gt; Eingaben korrekt funktionieren.&lt;/p&gt;
&lt;p&gt;Durch das Einfügen der folgenden Zeile in die Datei &lt;strong&gt;~/.fluxbox/startup&lt;/strong&gt; wird der notwendige Befehl bei jedem Start automatisch ausgeführt.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Ensure correct pasting via xvkbd makros, keepassx autotype and the like.&lt;/span&gt;
setxkbmap &lt;span class=&quot;nt&quot;&gt;-layout&lt;/span&gt; de &lt;span class=&quot;nt&quot;&gt;-variant&lt;/span&gt; neo &lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;code&gt;-variant neo&lt;/code&gt; wählt das &lt;a href=&quot;http://experience.life.at/erfahrungen/2012/04/03/erfahrungen-mit-der-neo-tastaturbelegung/&quot; title=&quot;Artikel &amp;#39;Erfahrungen mit der Neo-Tastaturbelegung&amp;#39;&quot;&gt;Neo-Tastaturlayout&lt;/a&gt; aus. Ist dies ungewünscht, kann der Schalter entfallen.&lt;/p&gt;
&lt;p&gt;Auch Textmakros aus &lt;b&gt;xvkbd&lt;/b&gt; (&lt;code&gt;xvkbd -text ...&lt;/code&gt;) funktionieren danach korrekt.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Quelle: &lt;a href=&quot;https://www.keepassx.org/forum/viewtopic.php?f=4&amp;amp;t=2320#p4291&quot; title=&quot;Thema &amp;#39;KeePassX Autotype in Dvorak&amp;#39; im Forum von KeePass.org&quot;&gt;KeePassX Autotype in Dvorak&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Speichermedium auf Fehler überprüfen und mit Zufallswerten füllen</title>
   <link href="http://groovy-skills.com/linux/2013/08/11/speichermedium-auf-fehler-uberprufen-und-mit-zufallswerten-fullen"/>
   <updated>2013-08-11T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2013/08/11/speichermedium-auf-fehler-uberprufen-und-mit-zufallswerten-fullen</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;Achtung: Diese Befehle ZERSTÖREN absichtlich die Daten auf den betreffenden Geräten!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Um Speichermedien für die Verwendung als verschlüsselte Geräte vorzubereiten, ist es dringend empfohlen, diese auf Fehler zu überprüfen und mit Zufallswerten zu befüllen.&lt;/p&gt;
&lt;p&gt;Zur Überprüfung wird hier &lt;strong&gt;badblocks&lt;/strong&gt; verwendet. Die Zufallswerte werden aus &lt;strong&gt;/dev/urandom&lt;/strong&gt; geholt.&lt;/p&gt;
&lt;h2&gt;Anmerkung zur Sicherheit der Überschreibungsvorgänge&lt;/h2&gt;
&lt;p&gt;Ein &amp;#8220;sicher&amp;#8221; vorbereitetes Medium zeichnet sich unter anderem durch den Schwierigkeit aus, Rückschlüsse auf Eigenschaften gespeicherter Daten zu ziehen.&lt;/p&gt;
&lt;p&gt;Die hier beschriebenen Methoden dienen in erster Linie dazu, das &lt;strong&gt;Ausmaß&lt;/strong&gt; verschlüsselter Datenbereiche zu verschleiern.&lt;/p&gt;
&lt;p&gt;Zufallswerte in freien Speicherbereichen erschweren es, am verschlüsselten Medium entsprechende Muster zu erkennen. Je höher die &lt;a href=&quot;https://en.wikipedia.org/wiki/Entropy_%28computing%29&quot; title=&quot;Wikipedia-Artikel &amp;#39;Entropy (computing)&amp;#39;&quot;&gt;&lt;b&gt;Entropie&lt;/b&gt;&lt;/a&gt; generierter Werte, desto &amp;#8220;zufälliger&amp;#8221; sind sie.&lt;/p&gt;
&lt;h2&gt;badblocks &amp;#8211; Integrität des Geräts überprüfen&lt;/h2&gt;
&lt;p&gt;Bei Verwendung des Schalters &lt;code&gt;-w&lt;/code&gt; in Kombination mit &lt;code&gt;-t random&lt;/code&gt; beschreibt &lt;strong&gt;badblocks&lt;/strong&gt; das Medium während der Überprüfung mit Pseudo-Zufallswerten.&lt;/p&gt;
&lt;p&gt;Je nach Risiko kann dies unzureichend und ein Beschreiben mit Zufallswerten aus &lt;strong&gt;/dev/urandom&lt;/strong&gt; sinnvoll sein.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;DISK&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;badblocks &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; 10240 &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-w&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; random &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DISK&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Systemverwaltungsbefehl 'badblocks - search a device for bad blocks'&quot; href=&quot;http://manpages.ubuntu.com/manpages/badblocks.8&quot;&gt;badblocks(8)&lt;/a&gt;&lt;/p&gt;
&lt;dl&gt;
	&lt;dt&gt;-c&lt;/dt&gt;
	&lt;dd&gt;Anzahl zeitgleich getesteter Blöcke&lt;/dd&gt;
	&lt;dt&gt;-w&lt;/dt&gt;
	&lt;dd&gt;Jeden Block mittels Schreibzugriff (!) testen&lt;/dd&gt;
	&lt;dt&gt;-t&lt;/dt&gt;
	&lt;dd&gt;Art des geschriebenen Testmusters festlegen&lt;/dd&gt;
	&lt;dt&gt;-v&lt;/dt&gt;
	&lt;dd&gt;Umfangreiche Ausgabe&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;&lt;em&gt;Pro 100 GiB Speichervolumen dauerte dieser Vorgang bei den Festplatten aus dem Jahr 2010 rund eine Stunde.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;urandom &amp;#8211; Gerät mit Zufallswerten befüllen&lt;/h2&gt;
&lt;p&gt;Die Gerätedatei &lt;strong&gt;/dev/urandom&lt;/strong&gt; arbeitet mit besonders hoher Entropie und ist somit eine der sichersten und langsamsten Methoden, Medien für eine Verschlüsselung vorzubereiten.&lt;/p&gt;
&lt;p&gt;Wird &lt;strong&gt;/dev/random&lt;/strong&gt; an Stelle von &lt;strong&gt;/dev/urandom&lt;/strong&gt; genutzt, kann der Ablauf auf Kosten der Sicherheit beschleunigt werden.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;DISK&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;dd &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/dev/urandom &lt;span class=&quot;nv&quot;&gt;of&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DISK&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Manpages: &lt;a title=&quot;Ubuntu Manpage zum Befehl 'dd - convert and copy a file'&quot; href=&quot;http://manpages.ubuntu.com/manpages/dd.1&quot;&gt;dd(1)&lt;/a&gt;, &lt;a title=&quot;Ubuntu Manpage zur Spezialdatei 'urandom - kernel random number source devices'&quot; href=&quot;http://manpages.ubuntu.com/manpages/urandom.4&quot;&gt;urandom(4)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Da dieser Vorgang bei großen Platten mehrere Tage dauert, sollte eine beständige Stromversorgung per Batterie (Laptop) oder &lt;span class=&quot;caps&quot;&gt;USV&lt;/span&gt; sichergestellt sein.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Fortschritt überprüfen [optional]&lt;/h3&gt;
&lt;p&gt;Im Beitrag &lt;a href=&quot;/freebsd/2011/09/08/ubertragenes-datenvolumen-von-dd-ausgeben-status-siginfo-sigusr1&quot; title=&quot;Übertragenes Datenvolumen von dd ausgeben STATUS/SIGINFO/USR1&quot;&gt;Übertragenes Datenvolumen von dd ausgeben&lt;/a&gt; ist erklärt, wie der Fortschritt von &lt;b&gt;dd&lt;/b&gt; regelmäßig ausgegeben werden kann.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Jekyll Plugin als Ruby Gem vorbereiten und veröffentlichen</title>
   <link href="http://groovy-skills.com/jekyll/2013/08/10/jekyll-plugin-als-ruby-gem-vorbereiten-und-veroffentlichen"/>
   <updated>2013-08-10T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/jekyll/2013/08/10/jekyll-plugin-als-ruby-gem-vorbereiten-und-veroffentlichen</id>
   <content type="html">&lt;p&gt;Die hier beschriebenen Abläufe gelten großteils auch für Gems ohne Bezug zu Jekyll.&lt;/p&gt;
&lt;h2&gt;Korrekten Aufbau des Quellcodes vorbereiten&lt;/h2&gt;
&lt;p&gt;Vorab muss sichergestellt werden, dass die Dateistruktur der Quelldateien korrekt ist.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Der &lt;strong&gt;Name des Hauptskripts&lt;/strong&gt; stellt sich aus dem späteren Gem-Namen mit der Dateiendung &lt;strong&gt;.rb&lt;/strong&gt; zusammen und ist im Unterverzeichnis &lt;strong&gt;lib&lt;/strong&gt; abgelegt.&lt;/li&gt;
	&lt;li&gt;Die &lt;strong&gt;Gem-Spezifikation&lt;/strong&gt; liegt im Hauptverzeichnis und trägt den Gem-Namen mit der Dateiendung &lt;strong&gt;.gemspec&lt;/strong&gt;. Sie wird am Einfachsten aus einer &lt;a href=&quot;http://guides.rubygems.org/make-your-own-gem#your_first_gem&quot;&gt;Vorlage&lt;/a&gt; erstellt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Beispielstruktur&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;.
├── jekyll_image_encode.gemspec
├── lib
│   └── jekyll_image_encode.rb
└── README.textile&lt;/pre&gt;
&lt;p&gt;Das Anbieten der optionalen &lt;span class=&quot;caps&quot;&gt;README&lt;/span&gt;-Datei wird dringend empfohlen.&lt;/p&gt;
&lt;h2&gt;Ruby Gem bauen und testen&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Diese Konstanten müssen den eigenen Gegebenheiten&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# entsprechend initialisiert werden&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;GEM_NAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;jekyll_image_encode
&lt;span class=&quot;nv&quot;&gt;GEM_VERSION&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0.0.1
&lt;span class=&quot;nv&quot;&gt;PATH_TO_JEKYLL_SITE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/jekyll/

&lt;span class=&quot;c&quot;&gt;# Gem bauen und lokal installieren&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PATH_TO_JEKYLL_SITE&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
gem build &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;GEM_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;.gemspec
gem install ./&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;GEM_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;-&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;GEM_VERSION&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;.gem

&lt;span class=&quot;c&quot;&gt;# Gem in Jekyll Seite laden&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;require 'jekyll_image_encode'&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; _plugins/ext.rb
jekyll serve&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Nun kann man die Funktionalität des neuen Gem &lt;a href=&quot;http://localhost:4000&quot;&gt;im Browser&lt;/a&gt; überprüfen.&lt;br /&gt;
Danach kann man den Gem mittels &lt;code&gt;gem uninstall ${GEM_NAME}&lt;/code&gt; wieder entfernen.&lt;/p&gt;
&lt;h2&gt;Quellcode in GitHub veröffentlichen&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Wichtig:&lt;/strong&gt; Es wird davon ausgegangen, dass der Gem &lt;strong&gt;lokal&lt;/strong&gt; bereits in ein Git Repository eingepflegt ist.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Zuerst wird ein &lt;a href=&quot;https://github.com/new&quot; class=&quot;nocb&quot;&gt;neues Repository&lt;/a&gt; auf GitHub erstellt.&lt;br /&gt;
Danach wird das lokale Repository in das soeben auf GitHub erstellte hochladen:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Diese Konstanten müssen den eigenen Gegebenheiten&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# entsprechend initialisiert werden&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;GITHUB_USER&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;GSI
&lt;span class=&quot;nv&quot;&gt;GEM_NAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;jekyll_image_encode
 
git remote add origin git@github.com:&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;GITHUB_USER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;GEM_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;.git
git push &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; origin master&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Jekyll Gem auf RubyGems.org veröffentlichen&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Diese Konstanten müssen den eigenen Gegebenheiten&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# entsprechend initialisiert werden&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;RUBYGEMS_USER&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;GSI
curl &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;RUBYGEMS_USER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; https://rubygems.org/api/v1/api_key.yaml &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/.gem/credentials

gem push &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;GEM_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;-&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;GEM_VERSION&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;.gem
gem list &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;GEM_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Jeyll Gem in offizielle Jekyll-Dokumentation eintragen&lt;/h2&gt;
&lt;p&gt;Zum Zeitpunkt des Verfassens dieses Artikels unterhält das Jekyll Projekt eine &lt;a href=&quot;http://jekyllrb.com/docs/plugins/#available_plugins&quot;&gt;Liste der verfügbaren Plugins&lt;/a&gt;, welche der Datei &lt;strong&gt;site/docs/plugins.md&lt;/strong&gt; des auf GitHub veröffentlichten Quellcodes entspricht.&lt;/p&gt;
&lt;p&gt;Mit Hilfe des üblichen GitHub Workflows, kann man die Listung des eigenen Jekyll Plugins beantragen:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Fork des &lt;a href=&quot;https://github.com/mojombo/jekyll&quot;&gt;jekyll Projekts&lt;/a&gt; erstellen&lt;/li&gt;
	&lt;li&gt;Datei &lt;strong&gt;site/docs/plugins.md&lt;/strong&gt; entsprechend anpassen&lt;/li&gt;
	&lt;li&gt;Änderungen per &lt;b&gt;Pull Request&lt;/b&gt; senden&lt;/li&gt;
&lt;/ol&gt;</content>
 </entry>
 
 <entry>
   <title>VirtualBox: Windows 7 aus Linux auf physische Platte installieren</title>
   <link href="http://groovy-skills.com/linux/2013/04/07/virtualbox-windows-7-aus-linux-auf-physische-platte-installieren"/>
   <updated>2013-04-07T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2013/04/07/virtualbox-windows-7-aus-linux-auf-physische-platte-installieren</id>
   <content type="html">&lt;p&gt;Im Normalfall installiert man Windows via Installations-&lt;span class=&quot;caps&quot;&gt;DVD&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Hat man jedoch ein &lt;span class=&quot;caps&quot;&gt;ISO&lt;/span&gt;-Abbild der Installations-&lt;span class=&quot;caps&quot;&gt;DVD&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 title=&quot;Ubuntu Manpage zum Befehl 'VBoxManage - x86 virtualization solution'&quot; href=&quot;http://manpages.ubuntu.com/manpages/VBoxManage.1&quot;&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;ISO&lt;/span&gt;-Abbild als CD/&lt;span class=&quot;caps&quot;&gt;DVD&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;VMDK&lt;/span&gt;-Datei für die physische Festplatte angelegt und an die entsprechende virtuelle Maschine gebunden.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Der VM_NAME kann über 'VBoxManage list vms' gefunden werden&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;VM_NAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Windows 7 Home Premium (64 bit)'&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;VMDK&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;HOME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/.VirtualBox/samsung_840_ssd.vmdk
&lt;span class=&quot;c&quot;&gt;# Die DISK_ID findet man beim Auflisten des Verzeichnisinhalts von /dev/disk/by-id/&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;DISK_ID&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;ata-Samsung_SSD_840_Series_S14GNEBCB66690P

&lt;span class=&quot;c&quot;&gt;# VMDK als Schnittstelle zu physischer Festplatte erstellen&lt;/span&gt;
VBoxManage internalcommands createrawvmdk &lt;span class=&quot;nt&quot;&gt;-filename&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;VMDK&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-rawdisk&lt;/span&gt; /dev/disk/by-id/&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DISK_ID&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# VMDK an virtuelle Maschine binden&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Name des Controllers kann mit folgendem Befehl eruiert werden: 'VBoxManage showvminfo --machinereadable &quot;${VM_NAME}&quot; | grep &quot;storagecontrollername&quot;'&lt;/span&gt;
VBoxManage storageattach &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;VM_NAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--storagectl&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;SATA-Controller&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--port&lt;/span&gt; 0 &lt;span class=&quot;nt&quot;&gt;--device&lt;/span&gt; 0 &lt;span class=&quot;nt&quot;&gt;--type&lt;/span&gt; hdd &lt;span class=&quot;nt&quot;&gt;--nonrotational&lt;/span&gt; on &lt;span class=&quot;nt&quot;&gt;--medium&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;VMDK&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Befehl 'VBoxManage - x86 virtualization solution'&quot; href=&quot;http://manpages.ubuntu.com/manpages/VBoxManage.1&quot;&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;/allgemein/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>
 </entry>
 
 <entry>
   <title>Entfernen von Jekyll Bootstrap spart tausende Codezeilen ein</title>
   <link href="http://groovy-skills.com/jekyll/2013/03/29/entfernen-von-jekyll-bootstrap-spart-tausende-codezeilen-ein"/>
   <updated>2013-03-29T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/jekyll/2013/03/29/entfernen-von-jekyll-bootstrap-spart-tausende-codezeilen-ein</id>
   <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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nv&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0
&lt;span class=&quot;nv&quot;&gt;lines_counts&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;find ./ &lt;span class=&quot;nt&quot;&gt;-type&lt;/span&gt; f &lt;span class=&quot;nt&quot;&gt;-exec&lt;/span&gt; wc &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{}&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\;&lt;/span&gt; | cut &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;' '&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-f1&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;line_count &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$lines_counts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do
  &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;expr &lt;span class=&quot;nv&quot;&gt;$sum&lt;/span&gt; + &lt;span class=&quot;nv&quot;&gt;$line_count&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;done
&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$sum&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Befehl 'find - search for files in a directory hierarchy'&quot; href=&quot;http://manpages.ubuntu.com/manpages/find.1&quot;&gt;find(1)&lt;/a&gt;, &lt;a title=&quot;Ubuntu Manpage zum Befehl 'wc - print newline, word, and byte counts for each file'&quot; href=&quot;http://manpages.ubuntu.com/manpages/wc.1&quot;&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>
 </entry>
 
 <entry>
   <title>Dateien aus FreeNAS in ownCloud Plugins Jail verfügbar machen</title>
   <link href="http://groovy-skills.com/freebsd/2012/11/05/dateien-aus-freenas-in-owncloud-plugins-jail-verfugbar-machen"/>
   <updated>2012-11-05T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/freebsd/2012/11/05/dateien-aus-freenas-in-owncloud-plugins-jail-verfugbar-machen</id>
   <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;In 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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csh&quot; data-lang=&quot;csh&quot;&gt;# Zur besseren Nachvollziehbarkeit sollte owning_group im
# Folgenden auf den Gruppennamen laut Hostsystem gesetzt werden:
set GROUPNAME_ACCORDING_TO_HOSTSYSTEM=&quot;users&quot;
set OWNCLOUD_USERNAME='dice'
set DIR=&quot;/mnt/pfad/zu/jail/usr/local/www/owncloud-4.5/data/${OWNCLOUD_USERNAME}/files/dateien&quot;
set owning_gid=`ls -dln ${DIR} | awk '{ print $4 }'`

# Der Gruppe Leserechte gewähren
chmod -R g+rX ${DIR}

# www-Benutzer in die Gruppe aufnehmen
pw groupadd ${GROUPNAME_ACCORDING_TO_HOSTSYSTEM} -g ${owning_gid} -M www

# Dienste neu starten
/usr/local/etc/rc.d/nginx restart
/usr/local/etc/rc.d/php-fpm restart&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'chmod - change file modes'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=chmod&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;chmod(1)&lt;/a&gt;, &lt;a title=&quot;FreeBSD Manpage zum Systemverwaltungskommando 'pw - create, remove, modify &amp; display system users and groups'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=pw&amp;apropos=0&amp;sektion=8&amp;arch=default&amp;format=latin1&quot;&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>
 </entry>
 
 <entry>
   <title>ownCloud 4.5 in FreeNAS 8 Plugins-Jail oder FreeBSD installieren</title>
   <link href="http://groovy-skills.com/freebsd/2012/10/12/owncloud-45-in-freenas-8-plugins-jail-oder-freebsd-installieren"/>
   <updated>2012-10-12T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/freebsd/2012/10/12/owncloud-45-in-freenas-8-plugins-jail-oder-freebsd-installieren</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;Es existiert eine vereinfachte und aktualisierte Version dieses Artikels: &lt;a href=&quot;/freebsd/2013/09/03/owncloud-5-in-freenas-91-jail-oder-freebsd-installieren&quot; class=&quot;nocb&quot;&gt;ownCloud 5 in FreeNAS 9.1 Jail oder FreeBSD installieren&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&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;SSH&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csh&quot; data-lang=&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;/figure&gt;&lt;p&gt;&lt;a title=&quot;FreeBSD Manpage zum Systemverwaltungskommando 'portsnap - fetch and extract compressed snapshots of the ports tree'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=portsnap&amp;apropos=0&amp;sektion=8&amp;arch=default&amp;format=latin1&quot;&gt;portsnap(8)&lt;/a&gt;, &lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'pkg_delete - a utility for deleting previously installed software package distributions'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=pkg_delete&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&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;PHP&lt;/span&gt;-Ports in folgendem Schritt muss &lt;strong&gt;Build &lt;span class=&quot;caps&quot;&gt;FPM&lt;/span&gt; version&lt;/strong&gt; ausgewählt sein. &lt;span class=&quot;caps&quot;&gt;CLI&lt;/span&gt; und &lt;span class=&quot;caps&quot;&gt;CGI&lt;/span&gt; können abgewählt werden.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csh&quot; data-lang=&quot;csh&quot;&gt;cd /usr/ports/www/owncloud
make config-recursive
make install clean&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csh&quot; data-lang=&quot;csh&quot;&gt;cd /usr/ports/archivers/php5-zlib &amp;amp;&amp;amp; make install clean
cd /usr/ports/converters/php5-iconv &amp;amp;&amp;amp; make install clean&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;ownCloud 4.5.0 installieren&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csh&quot; data-lang=&quot;csh&quot;&gt;cd /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;/figure&gt;&lt;p&gt;&lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'fetch - retrieve a file by Uniform Resource Locator'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=fetch&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;fetch(1)&lt;/a&gt;, &lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'tar - manipulate tape archives'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=tar&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;tar(1)&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;FPM&lt;/span&gt; auf Socket umstellen und Transfer-Limits erhöhen&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csh&quot; data-lang=&quot;csh&quot;&gt;# PHP-FPM auf Socket umstellen
sed -i '' -e 's/^listen =.*/listen = \/var\/run\/php-fpm.sock/g' /usr/local/etc/php-fpm.conf

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

# Größere Uploads ermöglichen
sed -i '' -e 's/^post_max_size =.*/post_max_size = 300M/g' /usr/local/etc/php.ini
sed -i '' -e 's/^upload_max_filesize =.*/upload_max_filesize = 200M/g' /usr/local/etc/php.ini

# Größere Downloads für Client-Apps ermöglichen (siehe untenstehende Anmerkung)
sed -i '' -e 's/^memory_limit =.*/memory_limit = 512M/g' /usr/local/etc/php.ini&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'sed - stream editor'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=sed&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csh&quot; data-lang=&quot;csh&quot;&gt;cd /usr/ports/www/nginx &amp;amp;&amp;amp; make install clean&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;&lt;span class=&quot;caps&quot;&gt;SSL&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;SSL&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 &lt;strong&gt;im server-Abschnitt&lt;/strong&gt; (&lt;span class=&quot;caps&quot;&gt;HTTPS&lt;/span&gt;) der &lt;strong&gt;/usr/local/etc/nginx/nginx.conf&lt;/strong&gt; die kommentierten Bereiche freigestellt und folgende Einträge an Stelle der vorhandenen &lt;strong&gt;location&lt;/strong&gt;-Direktiven eingefügt werden.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-nginx&quot; data-lang=&quot;nginx&quot;&gt;        &lt;span class=&quot;k&quot;&gt;root&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;/usr/local/www/owncloud-4.5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;client_max_body_size&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;200m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

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

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

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

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

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

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

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

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

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

/usr/local/etc/rc.d/php-fpm start
/usr/local/etc/rc.d/nginx start&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'echo - write arguments to the standard output'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=echo&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;echo(1)&lt;/a&gt;, &lt;a title=&quot;FreeBSD Manpage zum Dateiformat/zur Konvention 'rc.conf - system configuration information'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=rc.conf&amp;apropos=0&amp;sektion=5&amp;arch=default&amp;format=latin1&quot;&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>
 </entry>
 
 <entry>
   <title>sudo: Bestimmte Kommandos ohne Passwortabfrage erlauben (sudoers)</title>
   <link href="http://groovy-skills.com/linux/2012/09/21/sudo-bestimmte-kommandos-ohne-passwortabfrage-erlauben-sudoers"/>
   <updated>2012-09-21T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2012/09/21/sudo-bestimmte-kommandos-ohne-passwortabfrage-erlauben-sudoers</id>
   <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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;visudo&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Systemverwaltungsbefehl 'sudo - execute a command as another user'&quot; href=&quot;http://manpages.ubuntu.com/manpages/sudo.8&quot;&gt;sudo(8)&lt;/a&gt;, &lt;a title=&quot;Ubuntu Manpage zum Systemverwaltungsbefehl 'visudo - edit the sudoers file'&quot; href=&quot;http://manpages.ubuntu.com/manpages/visudo.8&quot;&gt;visudo(8)&lt;/a&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 dist-upgrade, \
                                /usr/bin/apt-get update,        /usr/bin/apt-get autoremove, \
                                /bin/netstat -tulpen,           /bin/netstat -lnp, \
                                /usr/sbin/openvpn,              /bin/kill -SIGHUP *, \
                                /sbin/modprobe pcspkr,          /usr/bin/vi /etc/bash.bashrc, \
                                /sbin/poweroff&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>
 </entry>
 
 <entry>
   <title>Bestehende FreeNAS Plugins-Jail importieren (nach Factory Reset)</title>
   <link href="http://groovy-skills.com/freebsd/2012/09/16/bestehende-freenas-plugins-jail-importieren-nach-factory-reset"/>
   <updated>2012-09-16T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/freebsd/2012/09/16/bestehende-freenas-plugins-jail-importieren-nach-factory-reset</id>
   <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 bestehende 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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csh&quot; data-lang=&quot;csh&quot;&gt;mv /mnt/volume1/jail/plugins-jail /mnt/volume1/jail/plugins-jail_backup&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;ul&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;/ul&gt;&lt;/li&gt;
	&lt;li&gt;Die neu erzeugte Jail mit der der ursprünglichen vertauschen&lt;br /&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csh&quot; data-lang=&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;/figure&gt;&lt;/li&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;/ol&gt;
&lt;p&gt;&lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'mv - move files'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=mv&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;mv(1)&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>SSL Zertifikat erzeugen und direkt in die nginx.conf übernehmen</title>
   <link href="http://groovy-skills.com/freebsd/2012/09/15/ssl-zertifikat-erzeugen-und-direkt-in-die-nginx-conf-ubernehmen"/>
   <updated>2012-09-15T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/freebsd/2012/09/15/ssl-zertifikat-erzeugen-und-direkt-in-die-nginx-conf-ubernehmen</id>
   <content type="html">&lt;h2&gt;Variablen deklarieren&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Im Folgenden ist sowohl die &lt;strong&gt;csh&lt;/strong&gt;-Syntax als auch die &lt;strong&gt;bash&lt;/strong&gt;-/&lt;strong&gt;sh&lt;/strong&gt;-Syntax gezeigt.&lt;/em&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csh&quot; data-lang=&quot;csh&quot;&gt;# Variablen initialisieren und in nginx-Verzeichnis wechseln
# CSH-Syntax (auch für tcsh und ähnliche)
set BASE_FILENAME=`hostname`
set key=${BASE_FILENAME}.key
set csr=${BASE_FILENAME}.csr
set crt=${BASE_FILENAME}.crt

# SH-Syntax (auch für bash und ähnliche)
BASE_FILENAME=`hostname`
key=${BASE_FILENAME}.key
csr=${BASE_FILENAME}.csr
crt=${BASE_FILENAME}.crt&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;&lt;span class=&quot;caps&quot;&gt;SSL&lt;/span&gt; Schlüssel, &lt;span class=&quot;caps&quot;&gt;CSR&lt;/span&gt; und Zertifikat erstellen&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /usr/local/etc/nginx

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

&lt;span class=&quot;c&quot;&gt;# Korrekte Dateinamen in nginx.conf referenzieren&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Achtung: Nutzt man in der nginx.conf mehrere unterschiedliche&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Zertifikate, ist das Ersetzen sämtlicher Vorkommnisse laut&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# folgender Kommandos wahrscheinlich unerwünscht.&lt;/span&gt;
sed &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;''&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;s/^ *ssl_certificate_key .*/        ssl_certificate_key  &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;;/g&quot;&lt;/span&gt; /usr/local/etc/nginx/nginx.conf
sed &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;''&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;s/^ *ssl_certificate .*/        ssl_certificate      &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;crt&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;;/g&quot;&lt;/span&gt; /usr/local/etc/nginx/nginx.conf&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'openssl - OpenSSL command line tool'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=openssl&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;openssl(1)&lt;/a&gt;, &lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'sed - stream editor'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=sed&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;sed(1)&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>KMail: Mails in Posteingang optimal zusammenstellen &amp; gruppieren</title>
   <link href="http://groovy-skills.com/linux/2012/08/31/kmail-mails-in-posteingang-optimal-zusammenstellen-gruppieren"/>
   <updated>2012-08-31T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2012/08/31/kmail-mails-in-posteingang-optimal-zusammenstellen--gruppieren</id>
   <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 title=&quot;Ubuntu Manpage zum Befehl 'kmail - KDE email client'&quot; href=&quot;http://manpages.ubuntu.com/manpages/kmail.1&quot;&gt;kmail(1)&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Ultimativer Showdown: Grails vs Rails</title>
   <link href="http://groovy-skills.com/grails/2012/08/19/ultimativer-showdown-grails-vs-rails"/>
   <updated>2012-08-19T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/grails/2012/08/19/ultimativer-showdown-grails-vs-rails</id>
   <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;DBMS&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;ss&quot;&gt;:uniqueness&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:case_sensitive&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h3&gt;Applikations-&lt;span class=&quot;caps&quot;&gt;URL&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;URL&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;DRY&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;DRY&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;SQL&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;EXPLAIN&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;active_record&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;whitelist_attributes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;RFC&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;hours&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;from_now&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;year&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;year&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;currently_open&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;between?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;opens_at&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;closes_at&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;activities_count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# 3 Aktivitäten erstellen&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;activities_count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;times&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;no&quot;&gt;FactoryGirl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:activity&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Anzahl der Aktivitäten aus index-action überprüfen&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:index&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;assert_equal&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;activities_count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;assigns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:activities&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;count&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;GUI&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;IDEA&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;IDEA&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;STS&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;HTML&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;HTML&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;HTML&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;lt;%= ... %&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;XSS&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;n&quot;&gt;grails&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;views&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;codec&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;html&quot;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// none, html, base64&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;n&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;nullable:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;blank:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;unique:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;size:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
	&lt;span class=&quot;nl&quot;&gt;validator:&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;	&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
			&lt;span class=&quot;cm&quot;&gt;/* checks if the publisher has published an event with the exact same title (case-insensitive match) */&lt;/span&gt;
			&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Event&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;withNewSession&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;	&lt;span class=&quot;c1&quot;&gt;// if the get() returns an event, then this is an update - which is fine&lt;/span&gt;
				&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Event&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;Event&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;findAllByTitleIlikeAndPublisher&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;publisher&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
			&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
	&lt;span class=&quot;o&quot;&gt;)}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Das Gleiche in &lt;b&gt;Rails&lt;/b&gt;:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;validates&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:length&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:in&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;30&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
          &lt;span class=&quot;ss&quot;&gt;:uniqueness&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:case_sensitive&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:scope&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:publisher_id&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;SQL&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>
 </entry>
 
 <entry>
   <title>Shell-Kommando zum raschen Ändern der Jekyll-Post Front Matter</title>
   <link href="http://groovy-skills.com/jekyll/2012/08/16/shell-kommando-zum-raschen-andern-der-jekyll-front-matter"/>
   <updated>2012-08-16T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/jekyll/2012/08/16/shell-kommando-zum-raschen-andern-der-jekyll-front-matter</id>
   <content type="html">&lt;p&gt;In der &lt;strong&gt;Jekyll &lt;span class=&quot;caps&quot;&gt;YAML&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;YAML&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Die Kategorie sämtlicher Jekyll-Posts im aktuellen Verzeichnis&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# auf den Namen des aktuellen Verzeichnisses abändern:&lt;/span&gt;
sed &lt;span class=&quot;nt&quot;&gt;--in-place&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;_with-previous-category &lt;span class=&quot;s2&quot;&gt;&quot;s/^category:.*&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;category: &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PWD&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;##*/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/g&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;.textile

&lt;span class=&quot;c&quot;&gt;# Schlagworte in der Jekyll-Post Front Matter abändern:&lt;/span&gt;
sed &lt;span class=&quot;nt&quot;&gt;--in-place&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;_with-previous-tags &lt;span class=&quot;s2&quot;&gt;&quot;s/^tags:.*&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\]&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$/&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;tags: &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\[&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PWD&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;##*/&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\]&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/g&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;.textile&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Befehl 'sed - stream editor'&quot; href=&quot;http://manpages.ubuntu.com/manpages/sed.1&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>
 </entry>
 
 <entry>
   <title>Meistgewünscht? Umgesetzt!</title>
   <link href="http://groovy-skills.com/corilla/2012/08/16/meistgewunscht-umgesetzt"/>
   <updated>2012-08-16T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/corilla/2012/08/16/meistgewunscht-umgesetzt</id>
   <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>
 </entry>
 
 <entry>
   <title>In KDE (Kubuntu) auf Dateien des Samsung Galaxy Note zugreifen</title>
   <link href="http://groovy-skills.com/linux/2012/08/14/in-kde-kubuntu-auf-dateien-des-samsung-galaxy-note-zugreifen"/>
   <updated>2012-08-14T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2012/08/14/in-kde-kubuntu-auf-dateien-des-samsung-galaxy-note-zugreifen</id>
   <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;USB&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;MTP&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;PTP&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;USB&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;USB&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;USB&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;USB&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;USB&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;USB&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;KDE&lt;/span&gt; einbinden und wie ein gewöhnliches Speichermedien nutzen.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Lokale PostgreSQL Datenbank für Rails Entwicklung einrichten</title>
   <link href="http://groovy-skills.com/rails/2012/07/26/lokale-postgresql-datenbank-fur-rails-entwicklung-einrichten"/>
   <updated>2012-07-26T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/rails/2012/07/26/lokale-postgresql-datenbank-fur-rails-entwicklung-einrichten</id>
   <content type="html">&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# PostgreSQL Datenbankdienst und Header/Library installieren&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-get install postgresql libpq-dev
&lt;span class=&quot;c&quot;&gt;# Benutzer mit Berechtigung zum Anlegen neuer Datenbanken erstellen&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; postgres createuser &lt;span class=&quot;nt&quot;&gt;-U&lt;/span&gt; postgres &lt;span class=&quot;nt&quot;&gt;-dRS&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;whoami&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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 title=&quot;Ubuntu Manpage zum Befehl 'createuser - define a new PostgreSQL user account'&quot; href=&quot;http://manpages.ubuntu.com/manpages/createuser.1&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; postgres dropuser &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;whoami&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Befehl 'dropuser - remove a PostgreSQL user account'&quot; href=&quot;http://manpages.ubuntu.com/manpages/dropuser.1&quot;&gt;dropuser(1)&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Corilla sagt Hallo!</title>
   <link href="http://groovy-skills.com/corilla/2012/07/04/corilla-sagt-hallo"/>
   <updated>2012-07-04T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/corilla/2012/07/04/corilla-sagt-hallo</id>
   <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>
 </entry>
 
 <entry>
   <title>Gerade noch rechtzeitig</title>
   <link href="http://groovy-skills.com/corilla/2012/07/02/gerade-noch-rechtzeitig"/>
   <updated>2012-07-02T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/corilla/2012/07/02/gerade-noch-rechtzeitig</id>
   <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>
 </entry>
 
 <entry>
   <title>6 Vorteile von FreeBSD im Serverbetrieb</title>
   <link href="http://groovy-skills.com/freebsd/2012/05/30/6-vorteile-von-freebsd-im-serverbetrieb"/>
   <updated>2012-05-30T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/freebsd/2012/05/30/6-vorteile-von-freebsd-im-serverbetrieb</id>
   <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;ul&gt;
		&lt;li&gt;effiziente &amp;#8220;Virtualisierung&amp;#8221;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&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;ul&gt;
		&lt;li&gt;Sichere Aktualisierung von Konfigurationsdateien durch manuelles Zusammeführen&lt;/li&gt;
		&lt;li&gt;lediglich zwei Reboots notwendig&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&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;UFS&lt;/span&gt; / &lt;span class=&quot;caps&quot;&gt;FFS&lt;/span&gt; und &lt;span class=&quot;caps&quot;&gt;ZFS&lt;/span&gt;&lt;/a&gt;
	&lt;ul&gt;
		&lt;li&gt;rasche Sicherungen vor dem Ausführen ungeübter Operationen&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&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;ul&gt;
		&lt;li&gt;konsistente Dateisystemzustände ohne Neustart&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&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;ul&gt;
		&lt;li&gt;Schnelles Finden von Best-Practices&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&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;ZFS&lt;/span&gt;)&lt;/a&gt;
	&lt;ul&gt;
		&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;ZFS&lt;/span&gt; Pool verhindert zu viel Platz auf der einen Partition zu haben der auf der anderen fehlt.&lt;/li&gt;
		&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;ZFS&lt;/span&gt; Replikation ermöglicht einfaches Spiegeln und rasches Sichern&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&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>
 </entry>
 
 <entry>
   <title>Git Repositories zusammenführen (git pull)</title>
   <link href="http://groovy-skills.com/rails/2012/04/09/git-repositories-zusammenfuhren-git-pull"/>
   <updated>2012-04-09T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/rails/2012/04/09/git-repositories-zusammenfuhren-git-pull</id>
   <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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /pfad/zum/ersten_git_repo/
git pull /pfad/zum/zweiten_git_repo/&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Befehl 'git-pull - Fetch from and merge with another repository or a local branch'&quot; href=&quot;http://manpages.ubuntu.com/manpages/git-pull.1&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /pfad/zum/zweiten_git_repo/
mkdir verzeichnis_zweites_repo
&lt;span class=&quot;c&quot;&gt;# -k sorgt dafür, dass der Befehl trotz Warnung des mv-Kommandos durchgeführt wird:&lt;/span&gt;
git mv &lt;span class=&quot;nt&quot;&gt;-k&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; verzeichnis_zweites_repo
git commit &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'moved all files into subdirectory verzeichnis_zweites_repo'&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# an dieser Stelle dieses Repository in das erste ziehen (siehe erstes Listing dieses Artikels)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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 title=&quot;Ubuntu Manpage zum Befehl 'git-filter-branch - Rewrite branches'&quot; href=&quot;http://manpages.ubuntu.com/manpages/git-filter-branch.1&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;WARNING&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /pfad/zum/zweiten_git_repo/
git filter-branch &lt;span class=&quot;nt&quot;&gt;--tree-filter&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'mkdir .temp; mv * .temp'&lt;/span&gt; HEAD
git filter-branch &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--tree-filter&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'mv .temp verzeichnis_zweites_repo'&lt;/span&gt; HEAD
&lt;span class=&quot;c&quot;&gt;# an dieser Stelle dieses Repository in das erste ziehen (siehe erstes Listing dieses Artikels)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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>
 </entry>
 
 <entry>
   <title>Amarok 2 im Oldschool-Amarok 1 Stil gestalten</title>
   <link href="http://groovy-skills.com/linux/2012/02/15/amarok-2-im-oldschool-amarok-1-stil-gestalten"/>
   <updated>2012-02-15T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/linux/2012/02/15/amarok-2-im-oldschool-amarok-1-stil-gestalten</id>
   <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;KDE&lt;/span&gt; ist flexibel&lt;/h2&gt;
&lt;p&gt;Zurecht ist &lt;span class=&quot;caps&quot;&gt;KDE&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-xml&quot; data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;!DOCTYPE layouts&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;playlist_layouts&amp;gt;&lt;/span&gt;
 &lt;span class=&quot;nt&quot;&gt;&amp;lt;layout&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;group_by=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;None&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;tooltips=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Amarok 1.4.9&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;single_track&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;active_indicator_row=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;show_cover=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;row&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;element&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;suffix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;prefix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;size=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;bold=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alignment=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;center&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Play count&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;underline=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;italic=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;element&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;suffix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;prefix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;size=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0.3&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;bold=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alignment=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;left&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Title&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;underline=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;italic=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;element&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;suffix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;prefix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;size=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0.15&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;bold=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alignment=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;left&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Artist&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;underline=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;italic=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;element&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;suffix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;prefix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;size=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0.15&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;bold=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alignment=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;left&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Album&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;underline=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;italic=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;element&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;suffix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;prefix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;size=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;bold=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alignment=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;right&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Year&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;underline=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;italic=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;element&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;suffix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;prefix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;size=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;bold=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alignment=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;center&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Track number&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;underline=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;italic=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;element&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;suffix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;prefix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;size=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;bold=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alignment=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;center&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Bitrate&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;underline=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;italic=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;element&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;suffix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;prefix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;size=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0.25&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;bold=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alignment=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;center&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Moodbar&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;underline=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;italic=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;element&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;suffix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;prefix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;size=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;bold=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alignment=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;center&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Rating&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;underline=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;italic=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;/row&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/single_track&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;group_head&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;active_indicator_row=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;show_cover=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;group_body&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;active_indicator_row=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;show_cover=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;row&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;element&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;suffix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;prefix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;size=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0.5&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;bold=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alignment=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;left&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Title&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;underline=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;italic=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;element&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;suffix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;prefix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;size=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;bold=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alignment=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;left&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Artist&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;underline=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;italic=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;element&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;suffix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;prefix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;size=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;bold=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alignment=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;right&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Length&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;underline=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;italic=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;/row&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/group_body&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;group_variousArtistsBody&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;active_indicator_row=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;show_cover=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;row&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;element&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;suffix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;prefix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;size=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0.5&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;bold=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alignment=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;left&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Title&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;underline=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;italic=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;element&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;suffix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;prefix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;size=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;bold=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alignment=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;left&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Artist&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;underline=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;italic=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;element&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;suffix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;prefix=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;size=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;bold=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alignment=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;right&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;value=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Length&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;underline=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;italic=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;/row&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/group_variousArtistsBody&amp;gt;&lt;/span&gt;
 &lt;span class=&quot;nt&quot;&gt;&amp;lt;/layout&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/playlist_layouts&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;HOME&lt;/span&gt;/.kde/share/apps/amarok/playlist_layouts/&lt;/em&gt; kopieren&lt;/li&gt;
	&lt;li&gt;Amarok neustarten
	&lt;ul&gt;
		&lt;li&gt;&lt;code&gt;killall --wait amarok &amp;amp;&amp;amp; amarok&lt;/code&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&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;/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;ul&gt;
		&lt;li&gt;Dies erstellt automatisch einen Reiter der das Umschalten zwischen den beiden Ansichten ermöglicht.&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Wiedergabeliste&lt;/strong&gt; rechts davon einordnen&lt;/li&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;li&gt;&lt;em&gt;Ansicht &amp;gt; Ansicht sperren&lt;/em&gt; &lt;strong&gt;aktivieren&lt;/strong&gt;&lt;/li&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>
 </entry>
 
 <entry>
   <title>WordPress Netzwerk-Seite in 9 Schritten zu neuem Server migrieren</title>
   <link href="http://groovy-skills.com/wordpress/2011/10/13/wordpress-netzwerk-seite-in-9-schritten-zu-neuem-server-migrieren"/>
   <updated>2011-10-13T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/wordpress/2011/10/13/wordpress-netzwerk-seite-in-9-schritten-zu-neuem-server-migrieren</id>
   <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;ol&gt;
		&lt;li&gt;Mapped-Domains definieren&lt;/li&gt;
		&lt;li&gt;WordPress Tables löschen&lt;/li&gt;
	&lt;/ol&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Am Quellsystem&lt;/strong&gt;
	&lt;ol&gt;
		&lt;li&gt;Kommentare sperren&lt;/li&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;/ol&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Am Zielsystem&lt;/strong&gt;
	&lt;ol&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;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;li&gt;wp-config.php anpassen&lt;/li&gt;
	&lt;/ol&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Am Arbeitsplatzrechner&lt;/strong&gt;
	&lt;ol&gt;
		&lt;li&gt;Zielsystem via &lt;strong&gt;/etc/hosts Eintrag&lt;/strong&gt; testen&lt;/li&gt;
	&lt;/ol&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Bei Domainregistrar&lt;/strong&gt;
	&lt;ol&gt;
		&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;DNS&lt;/span&gt;-Einträge (inkl. Mapped Domains) hinterlegen&lt;/li&gt;
	&lt;/ol&gt;&lt;/li&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>
 </entry>
 
 <entry>
   <title>WAVE-Audiodateien aus .bin/.cue extrahieren</title>
   <link href="http://groovy-skills.com/linux/2011/09/28/wave-audiodateien-aus-bin-cue-extrahieren"/>
   <updated>2011-09-28T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2011/09/28/wave-audiodateien-aus-bin-cue-extrahieren</id>
   <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;FLAC&lt;/span&gt;&lt;/strong&gt; oder &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;OGG&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 title=&quot;Ubuntu Manpage zum Befehl 'bchunk - CD image format conversion from bin/cue to iso/cdr'&quot; href=&quot;http://manpages.ubuntu.com/manpages/bchunk.1&quot;&gt;bchunk(1)&lt;/a&gt; die einzelnen Tracks direkt &lt;strong&gt;als &lt;span class=&quot;caps&quot;&gt;WAV&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# bchunk-Installation in Ubuntu:&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-get install bchunk
&lt;span class=&quot;c&quot;&gt;# Auslesen der WAVE-Dateien im Verzeichnis 'Friendly Disc':&lt;/span&gt;
bchunk &lt;span class=&quot;nt&quot;&gt;-w&lt;/span&gt; TNMOST_Friendly.bin TNMOST_Friendly.cue TNMOST_Friendly
&lt;span class=&quot;c&quot;&gt;# Auslesen der WAVE-Dateien im Verzeichnis 'Hostile Disc':&lt;/span&gt;
bchunk &lt;span class=&quot;nt&quot;&gt;-w&lt;/span&gt; TNMOST_Hostile.bin  TNMOST_Hostile.cue  TNMOST_Hostile&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Als Resultat erhält man fortlaufend nummerierte &lt;span class=&quot;caps&quot;&gt;WAV&lt;/span&gt;-Dateien, welche nun beispielsweise mit &lt;a title=&quot;Ubuntu Manpage zum Befehl 'flac - Free Lossless Audio Codec'&quot; href=&quot;http://manpages.ubuntu.com/manpages/flac.1&quot;&gt;flac(1)&lt;/a&gt; komprimiert und mittels &lt;a title=&quot;Ubuntu Manpage zum Befehl 'krename - batch file renamer'&quot; href=&quot;http://manpages.ubuntu.com/manpages/krename.1&quot;&gt;krename(1)&lt;/a&gt; sinnvoll benannt werden können.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Übertragenes Datenvolumen von dd ausgeben STATUS/SIGINFO/SIGUSR1</title>
   <link href="http://groovy-skills.com/freebsd/2011/09/08/ubertragenes-datenvolumen-von-dd-ausgeben-status-siginfo-sigusr1"/>
   <updated>2011-09-08T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/freebsd/2011/09/08/ubertragenes-datenvolumen-von-dd-ausgeben-status-siginfo-sigusr1</id>
   <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;UNIX&lt;/span&gt;-Systemen wie &lt;b&gt;FreeBSD&lt;/b&gt; durch Drücken von &lt;strong&gt;STRG+T&lt;/strong&gt; Details ausgeben lassen:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csh&quot; data-lang=&quot;csh&quot;&gt;# 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
78400000 bytes transferred in 1.788752 secs (43829439 bytes/sec)&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Auch per &lt;code&gt;kill&lt;/code&gt; beziehungsweise &lt;code&gt;pkill&lt;/code&gt; kann die entsprechende Ausgabe erzielt werden:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csh&quot; data-lang=&quot;csh&quot;&gt;# kill
set prozessid=`pgrep dd`
kill -INFO ${prozessid}

# pkill
pkill -INFO dd&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'kill - terminate or signal processes'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=kill&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;kill(1)&lt;/a&gt;, &lt;a title=&quot;FreeBSD Manpage zum Benutzerkommando 'pkill'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=pkill&amp;apropos=0&amp;sektion=1&amp;arch=default&amp;format=latin1&quot;&gt;pkill(1)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Details zum &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;STATUS&lt;/span&gt; Zeichen&lt;/strong&gt; sind in &lt;a title=&quot;FreeBSD Manpage zu Gerätetreiber 'termios - general terminal line discipline'&quot; href=&quot;http://www.freebsd.org/cgi/man.cgi?query=termios&amp;apropos=0&amp;sektion=4&amp;arch=default&amp;format=latin1&quot;&gt;termios(4)&lt;/a&gt; vermerkt.&lt;br /&gt;
Das &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;INFO&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;
&lt;h2&gt;Status von dd in Linux ausgeben&lt;/h2&gt;
&lt;p&gt;In &lt;b&gt;Linux&lt;/b&gt; kann &lt;code&gt;dd&lt;/code&gt; mit dem Signal &lt;b&gt;USR1&lt;/b&gt; zur Ausgabe des aktuellen Status aufgefordert werden:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# kill&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;prozessid&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;pidof dd&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;kill&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-USR1&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;prozessid&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# pkill&lt;/span&gt;
pkill &lt;span class=&quot;nt&quot;&gt;-USR1&lt;/span&gt; dd&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Systemverwaltungsbefehl 'pidof - find the process ID of a running program'&quot; href=&quot;http://manpages.ubuntu.com/manpages/pidof.8&quot;&gt;pidof(8)&lt;/a&gt;, &lt;a title=&quot;Ubuntu Manpage zum Befehl 'kill - terminate or signal processes'&quot; href=&quot;http://manpages.ubuntu.com/manpages/kill.1&quot;&gt;kill(1)&lt;/a&gt;, &lt;a title=&quot;Ubuntu Manpage zum Befehl 'pkill'&quot; href=&quot;http://manpages.ubuntu.com/manpages/pkill.1&quot;&gt;pkill(1)&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Watch &amp;amp; Kill&lt;/h3&gt;
&lt;p&gt;Um eine Ausgabe in regelmäßigen Abständen zu erhalten, kann das &lt;b&gt;pkill&lt;/b&gt;-Kommando mit &lt;b&gt;watch&lt;/b&gt; kombiniert werden:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;watch &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; 10 pkill &lt;span class=&quot;nt&quot;&gt;-USR1&lt;/span&gt; dd&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Befehl 'watch - execute a program periodically, showing output fullscreen'&quot; href=&quot;http://manpages.ubuntu.com/manpages/watch.1&quot;&gt;watch(1)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nähere Informationen zum Kommando finden sich im Blog &lt;a href=&quot;http://linuxcommando.blogspot.com/2008/06/show-progress-during-dd-copy.html&quot; title=&quot;Artikel &amp;#39;Show progress during dd copy&amp;#39; im Blog &amp;#39;Linux Commando&amp;#39;&quot;&gt;Linux Commando&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>WordPress Wartung: Verwaltungsbereich sperren</title>
   <link href="http://groovy-skills.com/wordpress/2011/08/24/wordpress-wartung-verwaltungsbereich-sperren"/>
   <updated>2011-08-24T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/wordpress/2011/08/24/wordpress-wartung-verwaltungsbereich-sperren</id>
   <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, sodass &lt;strong&gt;lediglich das Backend gesperrt wird, während Frontend-Zugriffe weiterhin funktionieren.&lt;/strong&gt;&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-php&quot; data-lang=&quot;php&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;stristr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$_SERVER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'/wp-admin'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;stristr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$_SERVER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'REQUEST_URI'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'/wp-login.php'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
	&lt;span class=&quot;nv&quot;&gt;$upgrading&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;DOCTYPE&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;PUBLIC&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;W3C&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;DTD&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;XHTML&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;Strict&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;EN&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;http:&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;www&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;w3&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;org&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;TR&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;xhtml1&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;DTD&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;xhtml1-strict&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;dtd&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;html&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;xmlns=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://www.w3.org/1999/xhtml&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;dir=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ltr&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;lang=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;de-DE&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;

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

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

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

&lt;span class=&quot;nt&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Das Beispiel bindet die gleichen &lt;span class=&quot;caps&quot;&gt;CSS&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>
 </entry>
 
 <entry>
   <title>WAR Dateien in Tomcat 7 entpacken - unpackWARs</title>
   <link href="http://groovy-skills.com/grails/2011/08/24/war-dateien-in-tomcat-7-entpacken-unpackwars"/>
   <updated>2011-08-24T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/grails/2011/08/24/war-dateien-in-tomcat-7-entpacken---unpackwars</id>
   <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;WAR&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;CSS&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;WAR&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-xml&quot; data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;Context&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;docBase=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/home/someuser/some-grails-app.war&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;path=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;reloadable=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h3&gt;Lösung: Symlink zur Applikation in webapps Verzeichnis&lt;/h3&gt;
&lt;p&gt;Damit WAR&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Verschieben der original ROOT-Applikation:&lt;/span&gt;
mv /usr/local/apache-tomcat-7.0/webapps/ROOT /usr/local/apache-tomcat-7.0/webapps/ROOT_orig
&lt;span class=&quot;c&quot;&gt;# Verlinken der Grails-Beispielapplikation als ROOT.war:&lt;/span&gt;
ln &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; /home/someuser/some-grails-app.war /usr/local/apache-tomcat-7.0/webapps/ROOT.war&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;ROOT&lt;/span&gt;-Anwendung entpackt und gestartet wird.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Liste kürzlich installierter Ports ausgeben</title>
   <link href="http://groovy-skills.com/freebsd/2011/08/10/liste-kurzlich-installierter-ports-ausgeben"/>
   <updated>2011-08-10T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/freebsd/2011/08/10/liste-kurzlich-installierter-ports-ausgeben</id>
   <content type="html">&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-csh&quot; data-lang=&quot;csh&quot;&gt;ls -lcrt /var/db/pkg/*/+DESC&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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>
 </entry>
 
 <entry>
   <title>Geb Starthilfe - Grails Functional Testing</title>
   <link href="http://groovy-skills.com/grails/2011/07/25/geb-starthilfe-grails-functional-testing"/>
   <updated>2011-07-25T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/grails/2011/07/25/geb-starthilfe---grails-functional-testing</id>
   <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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;cm&quot;&gt;/** Ausschnitt aus der Datei BuildConfig.groovy **/&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;grails&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;project&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;dependency&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;resolution&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;dependencies&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;org.codehaus.geb:geb-spock:0.6.0&quot;&lt;/span&gt;

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

    &lt;span class=&quot;c1&quot;&gt;// other drivers ...&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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&lt;/code&gt;

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

&lt;code&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;at&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// heading, ...&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=~&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/(?&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;melde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;
  &lt;span class=&quot;err&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;input.loginbtn&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;id:&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;loginbtn&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=~&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/(?&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;anmelden&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;n&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;driver&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;HtmlUnitDriver&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BrowserVersion&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;FIREFOX_3_6&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// fails if BrowserVersion is left to the default value&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;ENTER&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;n&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=~&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/(?&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;melde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;n&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=~&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/(?&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;melde&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|(?&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;login&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;n&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;subject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Subject for testing the contact form via Geb&quot;&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// ... some logic&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;contactForm&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;subject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;subject&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;API&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>
 </entry>
 
 <entry>
   <title>WordPress Anleitung: Einen Artikel als Ereignis markieren</title>
   <link href="http://groovy-skills.com/wordpress/2011/06/30/wordpress-anleitung-einen-artikel-als-ereignis-markieren"/>
   <updated>2011-06-30T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/wordpress/2011/06/30/wordpress-anleitung-einen-artikel-als-ereignis-markieren</id>
   <content type="html">&lt;p&gt;(WordPress Plugin &lt;a href=&quot;https://wordpress.org/extend/plugins/simple-upcoming-events/&quot;&gt;Simple Upcoming Events&lt;/a&gt;)&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Beim &lt;em&gt;Erstellen&lt;/em&gt; eines Artikels in der Box &amp;#8220;Benutzerdefinierte Felder&amp;#8221; unter &lt;strong&gt;Name&lt;/strong&gt; auf &lt;strong&gt;- Wähle -&lt;/strong&gt; klicken&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;date&lt;/strong&gt; auswählen&lt;/li&gt;
	&lt;li&gt;Rechts daneben unter &lt;strong&gt;Wert&lt;/strong&gt; das Datum im Rückwärtsformat und durch Bindestriche getrennt eingeben (z.B &lt;em&gt;2011-06-30&lt;/em&gt;)&lt;/li&gt;
	&lt;li&gt;Auf den Knopf &lt;strong&gt;Benutzerdefiniertes Feld hinzufügen&lt;/strong&gt; klicken&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;/images/20110630_simple_upcoming_events_ereignis_anlegen_date.jpg&quot; title=&quot;Benutzerdefiniertes Feld &amp;#39;date&amp;#39;&quot; alt=&quot;Benutzerdefiniertes Feld &amp;#39;date&amp;#39;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Anmerkung: Das Datum muss in der Zukunft liegen, damit das Ereignis im Menü aufscheint.&lt;/em&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>WordPress Anleitung: Einen Artikel verfassen</title>
   <link href="http://groovy-skills.com/wordpress/2011/06/13/wordpress-anleitung-einen-artikel-verfassen"/>
   <updated>2011-06-13T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/wordpress/2011/06/13/wordpress-anleitung-einen-artikel-verfassen</id>
   <content type="html">&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;Artikel&lt;/strong&gt; ausklappen&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Erstellen&lt;/strong&gt; klicken&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Überschrift &amp;amp; Text&lt;/strong&gt; eingeben&lt;/li&gt;
	&lt;li&gt;Rechts das Veröffentlichungsdatum eingeben&lt;/li&gt;
	&lt;li&gt;Die &lt;strong&gt;Kategorie&lt;/strong&gt; festlegen&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Schlagwörter&lt;/strong&gt; (= Themenbereiche) angeben, welche dieser Artikel betrifft&lt;/li&gt;
&lt;/ol&gt;</content>
 </entry>
 
 <entry>
   <title>WordPress Anleitung: Eine Seite in ein Menü einfügen</title>
   <link href="http://groovy-skills.com/wordpress/2011/06/13/wordpress-anleitung-eine-seite-in-ein-menu-einfugen"/>
   <updated>2011-06-13T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/wordpress/2011/06/13/wordpress-anleitung-eine-seite-in-ein-menu-einfugen</id>
   <content type="html">&lt;p&gt;1. Zur Menüverwaltung wechseln&lt;/p&gt;

	&lt;ul&gt;
		&lt;li&gt;Klick auf &lt;strong&gt;Design&lt;/strong&gt; &amp;gt; &lt;strong&gt;Menüs&lt;/strong&gt;&lt;/li&gt;
		&lt;li&gt;Die &lt;strong&gt;Registerkarte&lt;/strong&gt; für das gewünschte Menü anklicken&lt;/li&gt;
	&lt;/ul&gt;&lt;p&gt;2. Die Seite ins Menü setzen&lt;/p&gt;

	&lt;ul&gt;
		&lt;li&gt;Die soeben erstellte Seite unter &amp;#8220;Seiten&amp;#8221; (mittig links in der Ansicht) auswählen und &lt;strong&gt;Knopf &amp;#8220;Zum Menü hinzufügen&amp;#8221;&lt;/strong&gt; klicken.&lt;/li&gt;
		&lt;li&gt;Das kleine &lt;strong&gt;Pfeilsymbol&lt;/strong&gt; anklicken um die Details des soeben eingefügten Elements auszuklappen&lt;/li&gt;
		&lt;li&gt;Unter &lt;strong&gt;&amp;#8220;Angezeigter Name&amp;#8221;&lt;/strong&gt; das Gewünschte eintragen&lt;/li&gt;
		&lt;li&gt;Knopf &lt;strong&gt;&amp;#8220;Menü speichern&amp;#8221;&lt;/strong&gt; klicken&lt;/li&gt;
	&lt;/ul&gt;&lt;p&gt;3. Zur Kontrolle in das Frontend wechseln&lt;/p&gt;

	&lt;ul&gt;
		&lt;li&gt;Klick auf &lt;strong&gt;Titel der Seite&lt;/strong&gt; ganz links oben&lt;/li&gt;
	&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>WordPress Anleitung: Ein Seite erstellen</title>
   <link href="http://groovy-skills.com/wordpress/2011/06/13/wordpress-anleitung-ein-seite-erstellen"/>
   <updated>2011-06-13T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/wordpress/2011/06/13/wordpress-anleitung-ein-seite-erstellen</id>
   <content type="html">&lt;p&gt;1. Zum Dashboard wechseln&lt;/p&gt;

	&lt;ul&gt;
		&lt;li&gt;Klick auf &lt;strong&gt;Meine Blogs&lt;/strong&gt; &amp;gt; &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;BLOGNAME&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;p&gt;2. Seite erstellen&lt;/p&gt;

	&lt;ul&gt;
		&lt;li&gt;Klick auf &lt;strong&gt;Seiten&lt;/strong&gt; &amp;gt; &lt;strong&gt;Erstellen&lt;/strong&gt;&lt;/li&gt;
		&lt;li&gt;Unter &lt;strong&gt;Titel&lt;/strong&gt; die gewünschte Überschrift für die Seite eintragen&lt;/li&gt;
		&lt;li&gt;Im &lt;strong&gt;großen Feld&lt;/strong&gt; darunter, den frei formulierten &lt;em&gt;Text eingeben&lt;/em&gt;&lt;/li&gt;
	&lt;/ul&gt;&lt;p&gt;3. Text verlinken&lt;/p&gt;

	&lt;ul&gt;
		&lt;li&gt;Den &lt;em&gt;Text der verlinkt werden soll&lt;/em&gt;, &lt;strong&gt;markieren&lt;/strong&gt;&lt;/li&gt;
		&lt;li&gt;Auf das &lt;strong&gt;Kettenglied-Icon&lt;/strong&gt; klicken&lt;/li&gt;
	&lt;/ul&gt;&lt;p&gt;4. Seite veröffentlichen&lt;/p&gt;

	&lt;ul&gt;
		&lt;li&gt;Den &lt;strong&gt;blauen Knopf &amp;#8220;Publizieren&amp;#8221;&lt;/strong&gt; (oder &amp;#8220;Aktualisieren&amp;#8221;) klicken&lt;/li&gt;
	&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>WordPress Anleitung: Ein Bild skalieren</title>
   <link href="http://groovy-skills.com/wordpress/2011/06/13/wordpress-anleitung-ein-bild-skalieren"/>
   <updated>2011-06-13T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/wordpress/2011/06/13/wordpress-anleitung-ein-bild-skalieren</id>
   <content type="html">&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;Mediathek&lt;/strong&gt; &amp;gt; &lt;strong&gt;Medienübersicht&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;Bei Bild auf &lt;strong&gt;Bearbeiten&lt;/strong&gt; klicken&lt;/li&gt;
	&lt;li&gt;Knopf &lt;strong&gt;&amp;#8220;Bild Bearbeiten&amp;#8221;&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;Rechts oben &lt;strong&gt;&amp;#8220;Bild skalieren&amp;#8221;&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;Maße des Bildes &amp;#8211; dort &lt;strong&gt;wo aktuell die größere Zahl steht 800 eintragen&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;Klick auf &lt;strong&gt;&amp;#8220;Skalierung&amp;#8221;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;</content>
 </entry>
 
 <entry>
   <title>DRY-Verwendung von Constraints in Grails-View</title>
   <link href="http://groovy-skills.com/grails/2011/05/09/dry-verwendung-von-constraints-in-grails-view"/>
   <updated>2011-05-09T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/grails/2011/05/09/dry-verwendung-von-constraints-in-grails-view</id>
   <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;DRY&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;INPUT&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-java&quot; data-lang=&quot;java&quot;&gt;&lt;span class=&quot;c1&quot;&gt;// Constraint in Controller abrufen und an die View übergeben&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;titleMax:&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;MyDomain&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;constraints&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- Constraint in der View nutzen --&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;g:textField&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;title&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;maxlength=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;${titleMax}&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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>
 </entry>
 
 <entry>
   <title>Suchmaschinenoptimierung Ubuntu Style: Buchstaben im Title zählen</title>
   <link href="http://groovy-skills.com/linux/2011/03/10/suchmaschinenoptimierung-ubuntu-style-buchstaben-im-title-zahlen"/>
   <updated>2011-03-10T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/linux/2011/03/10/suchmaschinenoptimierung-ubuntu-style-buchstaben-im-title-zahlen</id>
   <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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'ZU PRÜFENDER SEITENTITEL'&lt;/span&gt; | wc &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;'&lt;/code&gt;) sein.&lt;/p&gt;
&lt;p&gt;Nachdem man mit &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;ENTER&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;ENTER&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;KDE&lt;/span&gt;: &lt;strong&gt;konsole&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>Bei Unerreichbarkeit von Apache Tomcat automatisch eine selbst erstellte HTML-Seite darstellen</title>
   <link href="http://groovy-skills.com/grails/2011/01/29/bei-unerreichbarkeit-von-apache-tomcat-automatisch-eine-selbst-erstellte-html-seite-darstellen"/>
   <updated>2011-01-29T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/grails/2011/01/29/bei-unerreichbarkeit-von-apache-tomcat-automatisch-eine-selbst-erstellte-html-seite-darstellen</id>
   <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;HTTPD&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;HTTPD&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;HTTPD&lt;/span&gt; Installation (&lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;, &lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;, &amp;#8230;) genutzt werden. Eine einfache (X)&lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; Seite ist oft ausreichend.&lt;br /&gt;
&lt;h2&gt;Apache &lt;span class=&quot;caps&quot;&gt;HTTPD&lt;/span&gt;: Die ErrorDocument Direktiven konfigurieren&lt;/h2&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;HTTPD&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;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;HTML&lt;/span&gt;-Seite definiert.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-apache&quot; data-lang=&quot;apache&quot;&gt;&lt;span class=&quot;c&quot;&gt;# 404 - Not Found&lt;/span&gt;
&lt;span class=&quot;nc&quot;&gt;ErrorDocument&lt;/span&gt; 404 /404.shtml
&lt;span class=&quot;c&quot;&gt;# 500 - Internal Server Error&lt;/span&gt;
&lt;span class=&quot;nc&quot;&gt;ErrorDocument&lt;/span&gt; 500 /500.shtml
&lt;span class=&quot;c&quot;&gt;# 503 - Service Unavailable&lt;/span&gt;
&lt;span class=&quot;nc&quot;&gt;ErrorDocument&lt;/span&gt; 503 /503.shtml&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;HTTPD&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;h2&gt;Apache Tomcat: Die worker.properties konfigurieren&lt;/h2&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-apache&quot; data-lang=&quot;apache&quot;&gt;worker.ajp13_worker.ping_mode=A
worker.ajp13_worker.ping_timeout=10000
worker.ajp13_worker.fail_on_status=500,503&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;p&gt;Dazu liest man die Apache &lt;span class=&quot;caps&quot;&gt;HTTPD&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;service apache2 reload
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;service tomcat6 stop&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;</content>
 </entry>
 
 <entry>
   <title>Tiny Tiny RSS als Standard-Feedreader in Firefox einrichten</title>
   <link href="http://groovy-skills.com/allgemein/2011/01/19/tiny-tiny-rss-als-standard-feedreader-in-firefox-einrichten"/>
   <updated>2011-01-19T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/allgemein/2011/01/19/tiny-tiny-rss-als-standard-feedreader-in-firefox-einrichten</id>
   <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;RSS&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 &lt;a href=&quot;https://secure.wikimedia.org/wikipedia/de/wiki/Syndication#WWW&quot; title=&quot;Artikel &amp;#39;Content-Syndication&amp;#39; bei Wikipedia&quot;&gt;Content-Syndication&lt;/a&gt;&amp;quot;).&lt;/p&gt;
&lt;p&gt;Die folgenden Schritte erklären, wie man &lt;em&gt;Tiny Tiny &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; als Standard-Newsreader für &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;/Atom Feeds&lt;/em&gt; einrichtet.&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Website der &lt;strong&gt;Tiny Tiny &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; Installation aufrufen&lt;/strong&gt;&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;RSS&lt;/span&gt; auswählen&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;[&lt;span class=&quot;caps&quot;&gt;OPTIONAL&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;RSS&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;RSS&lt;/span&gt; zu abonnieren (optionaler Punkt 10.) kann man dies später wie folgt ändern.&lt;/p&gt;
&lt;h2&gt;Einstellung für Standard-Newsreader ändern&lt;/h2&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>
 </entry>
 
 <entry>
   <title>Sämtliche symbolische Links zu einer bestimmten Datei finden</title>
   <link href="http://groovy-skills.com/linux/2010/12/31/samtliche-symbolische-links-zu-einer-bestimmten-datei-finden"/>
   <updated>2010-12-31T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/linux/2010/12/31/samtliche-symbolische-links-zu-einer-bestimmten-datei-finden</id>
   <content type="html">&lt;ol&gt;
	&lt;li&gt;Index-Node (Inode) Nummer der Datei feststellen&lt;br /&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-di&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DATEI&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/li&gt;
	&lt;li&gt;Die gefundene Inode Nummer mittels &lt;code&gt;find&lt;/code&gt; suchen&lt;br /&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;find &lt;span class=&quot;nt&quot;&gt;-L&lt;/span&gt; / &lt;span class=&quot;nt&quot;&gt;-inum&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;INODE_NUMMER&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; 2&amp;gt;/dev/null&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;find &lt;span class=&quot;nt&quot;&gt;-L&lt;/span&gt; / &lt;span class=&quot;nt&quot;&gt;-inum&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-di&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DATEI&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; | awk &lt;span class=&quot;s1&quot;&gt;'{ print $1 }'&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt; 2&amp;gt;/dev/null&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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 title=&quot;Ubuntu Manpage zum Befehl 'ls - list directory contents'&quot; href=&quot;http://manpages.ubuntu.com/manpages/ls.1&quot;&gt;ls(1)&lt;/a&gt;, &lt;a title=&quot;Ubuntu Manpage zum Befehl 'find - search for files in a directory hierarchy'&quot; href=&quot;http://manpages.ubuntu.com/manpages/find.1&quot;&gt;find(1)&lt;/a&gt;, &lt;a title=&quot;Ubuntu Manpage zum Befehl 'awk - pattern scanning and processing language'&quot; href=&quot;http://manpages.ubuntu.com/manpages/awk.1&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>
 </entry>
 
 <entry>
   <title>Anzeigen wohin ein symbolischer Link verweist</title>
   <link href="http://groovy-skills.com/linux/2010/12/31/anzeigen-wohin-ein-symbolischer-link-verweist"/>
   <updated>2010-12-31T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/linux/2010/12/31/anzeigen-wohin-ein-symbolischer-link-verweist</id>
   <content type="html">&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;DATEINAME_DES_SYMLINK&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;symbolischer.link
readlink &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;DATEINAME_DES_SYMLINK&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</content>
 </entry>
 
 <entry>
   <title>Mittels Firefox Erweiterung Flagfox den Domainbesitzer bestimmen</title>
   <link href="http://groovy-skills.com/allgemein/2010/12/29/mittels-firefox-erweiterung-flagfox-den-domainbesitzer-bestimmen"/>
   <updated>2010-12-29T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/allgemein/2010/12/29/mittels-firefox-erweiterung-flagfox-den-domainbesitzer-bestimmen</id>
   <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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;whois GEWÜNSCHTEDOMAIN&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;ADMIN&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;ADMIN&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>
 </entry>
 
 <entry>
   <title>Apache HTTPD &amp; Apache Tomcat 6 per AJP Connector verbinden (Ubuntu 10.04.1)</title>
   <link href="http://groovy-skills.com/grails/2010/09/21/apache_httpd_und_apache_tomcat_6_per_ajp_connector_verbinden_ubuntu_10-04"/>
   <updated>2010-09-21T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/grails/2010/09/21/apache_httpd_und_apache_tomcat_6_per_ajp_connector_verbinden_ubuntu_10-04</id>
   <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;HTTP&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;AJP&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;AJP&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;HTTP&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;AJP&lt;/span&gt; connector will provide faster performance than  proxied &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;. &lt;span class=&quot;caps&quot;&gt;AJP&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;HTTP&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;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;h2&gt;Voraussetzungen&lt;/h2&gt;
&lt;ul&gt;
	&lt;li&gt;Apache 2.2 (&lt;code&gt;sudo apt-get install apache2.2-bin&lt;/code&gt;)&lt;/li&gt;
	&lt;li&gt;Apache Tomcat 6 (&lt;code&gt;sudo apt-get install tomcat6&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Apache 2 Connector installieren&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-get install libapache2-mod-jk&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Apache &lt;span class=&quot;caps&quot;&gt;HTTP&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-apache&quot; data-lang=&quot;apache&quot;&gt;JkMount /NAME_DER_TOMCAT_APPLIKATION/* ajp13_worker&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-apache&quot; data-lang=&quot;apache&quot;&gt;&lt;span class=&quot;nc&quot;&gt;LoadModule&lt;/span&gt; jk_module /usr/lib/apache2/modules/mod_jk.so
JkWorkersFile   /etc/libapache2-mod-jk/workers.properties
JkLogFile       /var/log/apache2/mod_jk.log
JkLogLevel      &lt;span class=&quot;ss&quot;&gt;error&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;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;HTTP&lt;/span&gt; zu ermöglichen, muss die folgende Zeile aktiviert werden, indem man die Kommentarzeichen entfernt:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-xml&quot; data-lang=&quot;xml&quot;&gt; &lt;span class=&quot;nt&quot;&gt;&amp;lt;Connector&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;port=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;8009&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;protocol=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;AJP/1.3&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;redirectPort=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;8443&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h3&gt;[&lt;span class=&quot;caps&quot;&gt;OPTIONAL&lt;/span&gt;] Direkten Zugriff zu Apache Tomcat deaktivieren&lt;/h3&gt;
&lt;p&gt;Möchte man ausschließlich Zugriffe via Apache &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; erlauben, kann man den Connector-Block für das &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;-Protokoll in Tomcat auskommentieren:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-xml&quot; data-lang=&quot;xml&quot;&gt;&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- commented out to disable direct access to Tomcat
&amp;lt;Connector port=&quot;8080&quot; protocol=&quot;HTTP/1.1&quot;
connectionTimeout=&quot;20000&quot;
URIEncoding=&quot;UTF-8&quot;
redirectPort=&quot;8443&quot; /&amp;gt;
--&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Apache &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; und Apache Tomcat neu laden / starten&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;service apache2 reload
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;service tomcat6 restart&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Siehe auch&lt;/h2&gt;
&lt;ul&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;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>rdesktop Patch: Mittels Alt-Tab aus rdesktop-Session weg wechseln</title>
   <link href="http://groovy-skills.com/linux/2009/12/09/rdesktop-patch-mittels-alt-tab-aus-rdesktop-session-weg-wechseln"/>
   <updated>2009-12-09T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/linux/2009/12/09/rdesktop-patch-mittels-alt-tab-aus-rdesktop-session-weg-wechseln</id>
   <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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-diff&quot; data-lang=&quot;diff&quot;&gt;&lt;span class=&quot;gd&quot;&gt;--- rdesktop-1.6.0/xkeymap.c	2007-10-08 14:34:05.000000000 +0200
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+++ rdesktop-1.6.0vle/xkeymap.c	2009-12-09 16:25:32.000000000 +0100
&lt;/span&gt;&lt;span class=&quot;gu&quot;&gt;@@ -597,6 +597,23 @@
&lt;/span&gt; 				ui_seamless_toggle();
 			break;

&lt;span class=&quot;gi&quot;&gt;+		/* Added to allow ALT(left only)+TAB with local machines' windows
+		* note that no keyboard-shortcut relying on ALT_L will work within the RDP-session! */
+		case XK_Alt_L:
+			XUngrabKeyboard(g_display, CurrentTime);
+
+		/* alternatively switch Windows on Alt-Tab-Tab */
+/*		case XK_Tab:
+			if (get_key_state(state, XK_Alt_L))
+			{
+*/
+				/* Alt-Tab:
+				* Ungrab the keyboard so that user can use Windows manager's hot keys */
+/*
+				XUngrabKeyboard(g_display, CurrentTime);
+			}
+*/
+			break;
&lt;/span&gt; 	}
 	return False;
 }&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Befehl 'rdesktop - Remote Desktop Protocol client'&quot; href=&quot;http://manpages.ubuntu.com/manpages/rdesktop.1&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>
 </entry>
 
 <entry>
   <title>Windows XP nach Mainboard- oder Plattentausch lauffähig machen</title>
   <link href="http://groovy-skills.com/allgemein/2009/09/02/windows-xp-nach-mainboard-oder-festplattentausch-lauffahig-machen"/>
   <updated>2009-09-02T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/allgemein/2009/09/02/windows-xp-nach-mainboard--oder-festplattentausch-lauffahig-machen</id>
   <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>
 </entry>
 
 <entry>
   <title>Exif-Information über die Erstellungszeit eines Fotos korrigieren</title>
   <link href="http://groovy-skills.com/linux/2009/06/08/exif-information-uber-die-erstellungszeit-eines-fotos-korrigieren"/>
   <updated>2009-06-08T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2009/06/08/exif-information-uber-die-erstellungszeit-eines-fotos-korrigieren</id>
   <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;JPEG&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# jhead installieren&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-get install jhead
&lt;span class=&quot;c&quot;&gt;# &quot;Time-adjust&quot; um minus 6 Stunden&lt;/span&gt;
jhead &lt;span class=&quot;nt&quot;&gt;-ta-6&lt;/span&gt;:00 &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;JPEG_BILD&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Befehl 'jhead - Digicam JPEG Exif header manipulation tool'&quot; href=&quot;http://manpages.ubuntu.com/manpages/jhead.1&quot;&gt;jhead(1)&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>T Mobile web'n'walk Card compact III in Ubuntu 8.04 einrichten</title>
   <link href="http://groovy-skills.com/linux/2008/07/14/t-mobile-webnwalk-card-compact-iii-in-ubuntu-8-04-einrichten"/>
   <updated>2008-07-14T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2008/07/14/t-mobile-webnwalk-card-compact-iii-in-ubuntu-8-04-einrichten</id>
   <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;III&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;HSO&lt;/span&gt; Treiber installieren&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;tar &lt;/span&gt;zxf hso-1.2.tar.gz
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;hso
make
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;make install&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Rezero installieren&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;tar &lt;/span&gt;xzvf rezero_hso-udev.tar.gz
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;rezero_hso-udev
&lt;span class=&quot;c&quot;&gt;# Direkt installieren, statt, wie in manchen Anleitungen beschrieben, neu kompilieren (make)&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;make install&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;HSO&lt;/span&gt; in Konflikt steht, muss er per Blacklisting deaktiviert werden.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;blacklist option&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/modprobe.d/blacklist&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;HSOLink installieren&lt;/h2&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;dpkg &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--force-architecture&lt;/span&gt; hsolink_1.0.46-1_i386.deb&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Der Benutzer muss Mitglied der Gruppe &lt;strong&gt;dialout&lt;/strong&gt; sein:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;usermod &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-G&lt;/span&gt; dialout &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;BENUTZERNAME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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>
 </entry>
 
 <entry>
   <title>Audiodatei per Cuesheet aufteilen</title>
   <link href="http://groovy-skills.com/linux/2007/03/22/audiodatei-per-cuesheet-aufteilen"/>
   <updated>2007-03-22T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/linux/2007/03/22/audiodatei-per-cuesheet-aufteilen</id>
   <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;WAVE&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# audiodump.wav erzeugen&lt;/span&gt;
mplayer audiodatei.flac &lt;span class=&quot;nt&quot;&gt;-ao&lt;/span&gt; pcm&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Befehl 'mplayer - movie player'&quot; href=&quot;http://manpages.ubuntu.com/manpages/mplayer.1&quot;&gt;mplayer(1)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Anschließend wird die &lt;span class=&quot;caps&quot;&gt;WAV&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;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;bchunk audiodump.wav cuesheet.cue &lt;span class=&quot;nt&quot;&gt;-w&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;BELIEBIGER_PRAEFIX&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Befehl 'bchunk - CD image format conversion from bin/cue to iso/cdr'&quot; href=&quot;http://manpages.ubuntu.com/manpages/bchunk.1&quot;&gt;bchunk(1)&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Dateien in Verzeichnis zählen</title>
   <link href="http://groovy-skills.com/linux/2006/05/10/dateien-in-verzeichnis-zahlen"/>
   <updated>2006-05-10T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2006/05/10/dateien-in-verzeichnis-zahlen</id>
   <content type="html">&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;find ./ &lt;span class=&quot;nt&quot;&gt;-type&lt;/span&gt; f | wc &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Befehl 'find - search for files in a directory hierarchy'&quot; href=&quot;http://manpages.ubuntu.com/manpages/find.1&quot;&gt;find(1)&lt;/a&gt;, &lt;a title=&quot;Ubuntu Manpage zum Befehl 'wc - print newline, word, and byte counts for each file'&quot; href=&quot;http://manpages.ubuntu.com/manpages/wc.1&quot;&gt;wc(1)&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>KDE Version ausgeben</title>
   <link href="http://groovy-skills.com/linux/2005/11/17/kde-version-ausgeben"/>
   <updated>2005-11-17T00:00:00+01:00</updated>
   <id>http://groovy-skills.com/linux/2005/11/17/kde-version-ausgeben</id>
   <content type="html">&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# in KDE3&lt;/span&gt;
kde-config &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# in KDE4&lt;/span&gt;
kde4-config &lt;span class=&quot;nt&quot;&gt;-v&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;&lt;a title=&quot;Ubuntu Manpage zum Befehl 'kde-config - A little program to output installation paths'&quot; href=&quot;http://manpages.ubuntu.com/manpages/kde-config.1&quot;&gt;kde-config(1)&lt;/a&gt;, &lt;a title=&quot;Ubuntu Manpage zum Befehl 'kde4-config - Prints KDE installation paths'&quot; href=&quot;http://manpages.ubuntu.com/manpages/kde4-config.1&quot;&gt;kde4-config(1)&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Webinhalte mittels wget leechen</title>
   <link href="http://groovy-skills.com/linux/2005/10/24/webinhalte-mittels-wget-leechen"/>
   <updated>2005-10-24T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2005/10/24/webinhalte-mittels-wget-leechen</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;Beispiel: Sämtliche &lt;span class=&quot;caps&quot;&gt;PNG&lt;/span&gt;-Dateien herunterladen&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;wget &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;robots&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;off &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-l1&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-A&lt;/span&gt;.png http://example.org&lt;/code&gt;&lt;/pre&gt;&lt;/figure&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;ACHTUNG&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 title=&quot;Ubuntu Manpage zum Befehl 'wget - the non-interactive network downloader'&quot; href=&quot;http://manpages.ubuntu.com/manpages/wget.1&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>
 </entry>
 
 <entry>
   <title>Mittels awk Leerzeilen aus einer Textdatei entfernen</title>
   <link href="http://groovy-skills.com/linux/2005/10/24/mittels-awk-leerzeilen-aus-einer-textdatei-entfernen"/>
   <updated>2005-10-24T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2005/10/24/mittels-awk-leerzeilen-aus-einer-textdatei-entfernen</id>
   <content type="html">&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;INFILE&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; | awk &lt;span class=&quot;s1&quot;&gt;'{ if ($0) print }'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;OUTFILE&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</content>
 </entry>
 
 <entry>
   <title>Browser-Cache von Konqueror in KDE 3.5 auf RAM-Disk auslagern</title>
   <link href="http://groovy-skills.com/linux/2005/10/24/browser-cache-von-konqueror-in-kde-3-5-auf-ram-disk-auslagern"/>
   <updated>2005-10-24T00:00:00+02:00</updated>
   <id>http://groovy-skills.com/linux/2005/10/24/browser-cache-von-konqueror-in-kde-3-5-auf-ram-disk-auslagern</id>
   <content type="html">&lt;p&gt;Die &lt;b&gt;&lt;span class=&quot;caps&quot;&gt;RAM&lt;/span&gt;-Disk&lt;/b&gt; selbst kann rasch erstellt werden, indem man die Gerätedatei &lt;b&gt;/dev/ram0&lt;/b&gt; ähnlich einer gewöhnlichen Festplatte behandelt.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;GROESSE_IN_KB&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;200000
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;mkdir /ramdisk
mke2fs /dev/ram0 &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;GROESSE_IN_KB&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;mount /dev/ram0 /ramdisk&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;h2&gt;Dateien und Verzeichnisse in die &lt;span class=&quot;caps&quot;&gt;RAM&lt;/span&gt;-Disk auslagern&lt;/h2&gt;
&lt;p&gt;Mit Hilfe symbolischer Verknüpfungen können diverse Verzeichnisse in die erzeugte &lt;span class=&quot;caps&quot;&gt;RAM&lt;/span&gt;-Disk ausgelagert werden.&lt;/p&gt;
&lt;p&gt;Folgende Beispiele beziehen sich auf den Browser-Cache und die Cookies in &lt;b&gt;Konqueror von &lt;span class=&quot;caps&quot;&gt;KDE&lt;/span&gt; 3.5&lt;/b&gt;.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;c&quot;&gt;# HTTP-Cache in die RAM-Disk verlegen&lt;/span&gt;
mv &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;KDEHOME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/share/cache/http/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; /ramdisk &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
rmdir &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;KDEHOME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/share/cache/http &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
ln &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; /ramdisk &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;KDEHOME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/share/cache/http

&lt;span class=&quot;c&quot;&gt;# Cookies in die RAM-Disk verlegen&lt;/span&gt;
mv &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;KDEHOME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/share/apps/kcookiejar/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; /ramdisk &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
rmdir &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;KDEHOME&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/share/apps/kcookiejar &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
ln &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; /ramdisk &lt;span class=&quot;nv&quot;&gt;$KDEHOME&lt;/span&gt;/share/apps/kcookiejar&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;p&gt;Weitere interessante Ansätze finden sich im &lt;a href=&quot;http://wiki.ubuntuusers.de/RAM-Disk_erstellen&quot; class=&quot;nocb&quot; title=&quot;Beitrag &amp;#39;RAM-Disk erstellen&amp;#39; auf wiki.ubuntuusers.de&quot;&gt;Wiki von ubuntuusers.de&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 
</feed>
