<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>nerdcenter</title>
	<atom:link href="http://nerdcenter.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://nerdcenter.de</link>
	<description>IT-Kniffe eines Webentwicklers.</description>
	<lastBuildDate>Fri, 25 Jun 2010 15:11:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Java: Periodically check internet connection availability</title>
		<link>http://nerdcenter.de/java-periodically-check-internet-connection-availability/</link>
		<comments>http://nerdcenter.de/java-periodically-check-internet-connection-availability/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 12:27:14 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[internet connection]]></category>
		<category><![CDATA[observer]]></category>

		<guid isPermaLink="false">http://nerdcenter.de/?p=90</guid>
		<description><![CDATA[

A very simple example of how to periodically check the availability of an internet connection by using the observer design pattern.
InternetConnection.java
package net;

import java.net.*;
import java.io.*;

public class InternetConnection {
	/*	use at least one reliable host, in most cases you will want
 		to use the one you're working with later	*/
	private static final String CHECK_URL = "http://www.t-online.de/";
	public static InternetConnectionState isAvailable() [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>A very simple example of how to periodically check the availability of an internet connection by using the observer design pattern.</p>
<p><strong>InternetConnection.java</strong></p>
<pre>package net;

import java.net.*;
import java.io.*;

public class InternetConnection {
	/*	use at least one reliable host, in most cases you will want
 		to use the one you're working with later	*/
	private static final String CHECK_URL = "http://www.t-online.de/";
	public static InternetConnectionState isAvailable() {
		try {
			URL url = new URL(InternetConnection.CHECK_URL);
			HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
			Object objData = urlConnection.getContent();
		} catch(UnknownHostException exception) {
			return new InternetConnectionState(false);
		} catch(IOException exception) {
			return new InternetConnectionState(false);
		}
		return new InternetConnectionState(true);
	}
}</pre>
<p><strong>InternetConnectionState.java</strong></p>
<pre>package net;

public class InternetConnectionState {
	private boolean state = false;

	public InternetConnectionState(boolean state) {
		this.state = state;
	}

	public boolean getState() {
		return this.state;
	}

	public void setState(boolean state) {
		this.state = state;
	}
}</pre>
<p><strong>InternetConnectionObserver.java</strong></p>
<pre>package net;

import java.util.Observable;
import java.util.Observer;

public class InternetConnectionObserver implements Observer {
	public InternetConnectionObserver(ObservableInternetConnection internetConnection) {
		internetConnection.addObserver(this);
		new Thread(internetConnection).start();
	}

	public void update(Observable internetConnection, Object state) {
		InternetConnectionState connectionState = (InternetConnectionState)state;
		if(connectionState.getState() == true) {
			System.err.println("active internet connection detected");
		} else {
			System.err.println("lost internet connection");
		}
	}
}</pre>
<p><strong>ObservableInternetConnection.java</strong></p>
<pre>package net;

import java.util.*;
import net.InternetConnectionState;

public class ObservableInternetConnection extends Observable implements Runnable {
	private static final long CHECK_INTERVAL = 30000; // 30 sec
	private InternetConnectionState state;

	public void run() {
		this.state = InternetConnection.isAvailable();

		this.updateConnectionStatus();
	}

	public void updateConnectionStatus() {
		while(true) {
			InternetConnectionState newState = InternetConnection.isAvailable();
			if(newState.getState() != this.state.getState()) {
				this.state = newState;
				setChanged();
				notifyObservers(this.state);
			}
			try {
				Thread.sleep(ObservableInternetConnection.CHECK_INTERVAL);
			} catch(InterruptedException e) {
			}
		}
	}
}</pre>
<p><strong>Usage:</strong></p>
<pre>ObservableInternetConnection observableInternetConnection = new ObservableInternetConnection();
InternetConnectionObserver internetConnectionObserver = new InternetConnectionObserver(observableInternetConnection);</pre>
<p>&#8230;I just startet programming Java a few days ago so I&#8217;m pretty sure there&#8217;s a better way to do this but I didn&#8217;t find it, yet <img src='http://nerdcenter.de/wp-includes/images/smilies/icon_wink.gif' alt="Icon Wink in Java: Periodically check internet connection availability" class='wp-smiley' /> </p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/java-periodically-check-internet-connection-availability/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How-to: Debian: Automatically mounted loopback images with dm-crypt, LUKS, pam_mount</title>
		<link>http://nerdcenter.de/howto-debian-loopback-dm-crypt-luks-pam-mount/</link>
		<comments>http://nerdcenter.de/howto-debian-loopback-dm-crypt-luks-pam-mount/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 13:42:02 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Linux / Unix]]></category>
		<category><![CDATA[Sicherheit]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[dm-crypt]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[libpam-mount]]></category>
		<category><![CDATA[loop]]></category>
		<category><![CDATA[loopback]]></category>
		<category><![CDATA[LUKS]]></category>
		<category><![CDATA[pam_mount]]></category>
		<category><![CDATA[Squeeze]]></category>

		<guid isPermaLink="false">http://nerdcenter.de/?p=82</guid>
		<description><![CDATA[

How to create encrypted loopback images with dm-crypt and LUKS + automatically mounting them after login with pam_mount
I recommend using debian squeeze for this scenario as lenny includes a very old version of libpam-mount and I had lots of problems when I tried using it.
Using only the libpam-mount package and its dependencies from squeeze maybe [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<h3>How to create encrypted loopback images with dm-crypt and LUKS + automatically mounting them after login with pam_mount</h3>
<p>I recommend using debian squeeze for this scenario as lenny includes a very old version of libpam-mount and I had lots of problems when I tried using it.<br />
Using only the libpam-mount package and its dependencies from squeeze maybe (I didn&#8217;t try it and I wouldn&#8217;t recommend it either) does the job too, but at least has a very bitter after taste if you take a closer look at the dependencies.</p>
<p>1. Make sure you have the required kernel modules loaded. If you use the stock debian kernel, this will be the case. if you don&#8217;t, make sure you&#8217;ve set the following options:</p>
<ul>
<li>CONFIG_BLK_DEV_DM=y or CONFIG_BLK_DEV_DM=M</li>
<li>CONFIG_DM_CRYPT=y or CONFIG_DM_CRYPT=M</li>
<li>CONFIG_CRYPTO_CBC=y</li>
</ul>
<p>Additionally, you need to include support for at least one cipher.</p>
<p>In make menuconfig, you can find the required kernel modules at the following locations:</p>
<pre>
Device Drivers  --->
	Multi-device support (RAID and LVM)  --->
		<*> Device mapper support
		<*> Crypt target support

Cryptographic options  --->
	<M> SHA256 digest algorithm
	<M> AES cipher algorithms (x86_64)
</pre>
<p>To avoid a reboot, you can build all of these options as modules. If you chose to do so, you can later load the modules by using modprobe <MODULE_NAME>.</p>
<p>2. Install the required packages<br />
apt-get install cryptsetup libpam-mount<br />
&#8230;apt-get should take care of all dependencies</p>
<p>3. Generate a random key and assign it to a variable for later use</p>
<pre>KEY=`tr -cd [:graph:] < /dev/urandom | head -c 79`</pre>
<p>4. Encrypt the key and save it to a file</p>
<pre>echo $KEY | openssl aes-256-cbc > container.key</pre>
<p>5. Create the loopback file and fill it with random data</p>
<pre>dd if=/dev/urandom of=~/container.img bs=1G count=10</pre>
<p>This will create a 10GB file and fill it with random data taken from /dev/urandom.<br />
Another option (which will be much faster especially on older hardware) is using /dev/zero to fill the loopback file with zeros:</p>
<pre>dd if=/dev/zero of=~/container.img bs=1G count=10</pre>
<p>6. Set up a loop device</p>
<pre>losetup /dev/loop0 ~/container.img</pre>
<p>7. LuksFormat it</p>
<pre>echo $KEY | cryptsetup -v -c aes -s 256 luksFormat /dev/loop0</pre>
<p>8. Open it</p>
<pre>cryptsetup luksOpen /dev/loop0 container</pre>
<p>9. Make a filesystem of your choice</p>
<pre>mkfs.xfs /dev/mapper/container</pre>
<p>10. Close it and delete loop</p>
<pre>cryptsetup luksClose container &#038;&#038; losetup -d /dev/loop0</pre>
<p>11. Configure pam_mount<br />
Open /etc/security/pam_mount.conf.xml in your favorite text editor and change it to the following:</p>
<pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;&nbsp;?&gt;

&lt;!DOCTYPE pam_mount SYSTEM &quot;pam_mount.conf.xml.dtd&quot;&gt;
&lt;pam_mount&gt;
	&lt;debug enable=&quot;1&quot; /&gt;
	&lt;mkmountpoint enable=&quot;1&quot; remove=&quot;true&quot; /&gt;

	&lt;msg-sessionpw&gt;reenter password for pam_mount:&lt;/msg-sessionpw&gt;
	&lt;volume user=&quot;foobar&quot; path=&quot;/home/foobar/container.img&quot; mountpoint=&quot;/home/foobar/containercontents&quot;
		options=&quot;cipher=aes-cbc-essiv:sha256,hash=sha512,keysize=256&quot; fstype=&quot;crypt&quot; fskeycipher=&quot;aes-256-cbc&quot;

		fskeypath=&quot;/home/foobar/container.key&quot; fskeyhash=&quot;md5&quot; /&gt;
&lt;/pam_mount&gt;</pre>
<p>Using this configuration the image /home/foobar/container.img will get mounted into /home/foobar/containercontents when the user foobar logs in.<br />
Enabling debugging is pretty usefull if something isn't working as it should. In this case you can take a look at /var/log/auth.log.</p>
<p>12. Include /etc/pam.d/common-pammount in the PAM configuration files of the services that should use it (for example: SSHd)<br />
Open /etc/security/sshd in your favorite text editor. Look for the line "@include common-session" and add a new line after it:</p>
<pre>...
@include common-session
@include common-pammount
...</pre>
<p>13. If needed, change the configuration of the relevant services (for example: SSHd)<br />
Open /etc/ssh/sshd_config in your favority text editor and make sure you have the following lines in there:</p>
<pre># pam_mount
UsePAM yes
PasswordAuthentication yes
ChallengeResponseAuthentication no
UsePrivilegeSeparation no
PermitUserEnvironment yes</pre>
<p>If you disable PasswordAuthentication and use keys instead you have to enter the users password after connecting via SSH.</p>
<p>14. Test if anything works as expected<br />
Open a root session or use sudo and watch the auth log by using tail -f /var/log/auth.log. Then login as the user for which you have configured a volume earlier.<br />
If the encrypted loopback image gets mounted, also test if it gets unmounted again, when the user logs out.<br />
If anything works remove the debug line from /etc/security/pam_mount.conf.xml.</p>
<p>Many thanks go to the users tuxophil and pillgrim from the gentoo forums. Large parts of this howto were taken from their postings at <a href="http://forums.gentoo.org/viewtopic-t-274651.html">http://forums.gentoo.org/viewtopic-t-274651.html</a>.</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/howto-debian-loopback-dm-crypt-luks-pam-mount/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debian Lenny: pam_mount, files and loop devices</title>
		<link>http://nerdcenter.de/debian-lenny-pam-mount-files-loop-devices/</link>
		<comments>http://nerdcenter.de/debian-lenny-pam-mount-files-loop-devices/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 07:35:21 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[Administration]]></category>
		<category><![CDATA[Linux / Unix]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[devices]]></category>
		<category><![CDATA[Lenny]]></category>
		<category><![CDATA[libpam-mount]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[loop]]></category>
		<category><![CDATA[pam_mount]]></category>

		<guid isPermaLink="false">http://nerdcenter.de/?p=77</guid>
		<description><![CDATA[

When I was trying to automatically mount an encrypted image at login using pam_mount, I encountered a strange problem:
I wasn&#8217;t able to find any errors in my configuration (at least none connected to this behaviour), but mount.crypt was unable to mount the image.
Enabling debugging in pam_mount.conf.xml (&#60;debug enable=&#34;1&#34; /&#62;) revealed the command used for mounting:
pam_mount(misc.c:272) [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>When I was trying to automatically mount an encrypted image at login using pam_mount, I encountered a strange problem:<br />
I wasn&#8217;t able to find any errors in my configuration (at least none connected to this behaviour), but mount.crypt was unable to mount the image.<br />
Enabling debugging in pam_mount.conf.xml (&lt;debug enable=&quot;1&quot; /&gt;) revealed the command used for mounting:</p>
<p><b>pam_mount(misc.c:272) command: mount.crypt [-o loop] [/home/foobar/container] [/home/foobar/crypto]</b></p>
<p>In Debians libpam-mount 0.44-1+lenny3, /sbin/mount.crypt is a bash script that calls cryptsetup with parameters generated during its runtime.<br />
Debugging it (set -x), I stumpled upon the following command:</p>
<p><i>cryptsetup -c aes -h ripemd160 -s 256 create _home_foobar_container /home/foobar/container</i></p>
<p>&#8230;which returned the following error message:</p>
<p><b>Command failed: BLKROGET failed on device: Inappropriate ioctl for device</b></p>
<p>So mount.crypt has been passed the loop option but cryptsetup was told to mount the encrypted image instead of the associated loopback device (normally mount.crypt executes losetup to create this association in its function _losetup, but this apparently has never been called).</p>
<p>Long story short:<br />
There seems to be a bug in Debians libpam-mount 0.44-1+lenny3.<br />
The case statement at line 110 in /sbin/mount.crypt doesn&#8217;t work as expected because the variable $KEY used for option comparison has an ordinary space at its values beginning.<br />
To fix this, you can either change the way how passed options are saved in the OPTION variable (starting at line 60) or change line 110 to the following:</p>
<p><b>case ${KEY/ /} in</b></p>
<p>This will remove all spaces.</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/debian-lenny-pam-mount-files-loop-devices/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TYPO3 HTML save cropping</title>
		<link>http://nerdcenter.de/typo3-html-save-crop/</link>
		<comments>http://nerdcenter.de/typo3-html-save-crop/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 16:48:11 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[TYPO3]]></category>

		<guid isPermaLink="false">http://nerdcenter.de/?p=68</guid>
		<description><![CDATA[

Meistens reicht die Methode tslib_cObj::crop vollkommen aus, um Texte &#8211; etwa für eine Listenansicht &#8211; zu kürzen. Wenn jedoch RTE formatierte Texte im Spiel sind und die Formatierung in der gekürzten Version beibehalten werden soll, ist es reine Glückssache, kein invalides (X)HTML durch nicht geschlossene bzw. &#8220;verkrüppelte&#8221; Tags zu generieren. Abhilfe schafft die folgende crop-Methode, [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Meistens reicht die Methode tslib_cObj::crop vollkommen aus, um Texte &#8211; etwa für eine Listenansicht &#8211; zu kürzen. Wenn jedoch RTE formatierte Texte im Spiel sind und die Formatierung in der gekürzten Version beibehalten werden soll, ist es reine Glückssache, kein invalides (X)HTML durch nicht geschlossene bzw. &#8220;verkrüppelte&#8221; Tags zu generieren. Abhilfe schafft die folgende crop-Methode, die eine Portierung der Javascript-Version von <a href="http://blog.stevenlevithan.com/archives/get-html-summary">Steven Levithan</a> darstellt:</p>
<pre>public static function crop($input, $numMaxChars) {
	$output = '';
	$charCount = 0;
	$openTags = array();
	$matches = array();
	$htmlTags = '/\w+|[^\w&lt;]|&lt;(\/)?(\w+)[^&gt;]*(\/)?&gt;|&lt;/';
	$selfClosingHtmlTags = '/^(?:[hb]r|img)$/i';

	preg_match_all($htmlTags, $input, $matches);
	$i = 0;
	$numMatches = count($matches[0]);
	while(($i &lt; $numMatches) &#038;&#038; ($charCount &lt; $numMaxChars)) {
		// are we dealing with an html tag?
		if($matches[2][$i] != '') {
			$output .= $matches[0][$i];
			// if it isn't a self closing tag
			if(preg_match($selfClosingHtmlTags, $matches[2][$i]) == 0) {
				// if its a closing tag...
				if($matches[1][$i] == '/') {
					array_pop($openTags);
				} else {
					$openTags[] = $matches[2][$i];
				}
			}
		} else {
			$charCount += mb_strlen($matches[0][$i], $GLOBALS['TSFE']-&gt;renderCharset);
			if($charCount &lt;= $numMaxChars) {
				$output .= $matches[0][$i];
			}
		}

		$i++;
	}

	// closing open tags
	$i = count($openTags);
	while($i--) {
		$output .= '&lt;/' . $openTags[$i] . '&gt;';
	}

	return $output;
}</pre>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/typo3-html-save-crop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>suPHP und PHP Opcode Caches</title>
		<link>http://nerdcenter.de/suphp-php-opcode-cache/</link>
		<comments>http://nerdcenter.de/suphp-php-opcode-cache/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 11:02:37 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[Linux / Unix]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webserver]]></category>

		<guid isPermaLink="false">http://nerdcenter.de/?p=63</guid>
		<description><![CDATA[

Eigentlich ist suPHP eine nette Sache. Das Apache Modul mod_suphp sorgt in Kombination mit einem SetUID Binary dafür, dass PHP-Skripte mit den Berechtigungen des Benutzers, dem sie gehören, ausgeführt werden. Damit das funktioniert muss man in Binär-Distributionen wie etwa Debian Linux nicht mehr tun, als dass Modul zu installieren, einen Blick auf dessen Konfiguration zu [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Eigentlich ist suPHP eine nette Sache. Das Apache Modul mod_suphp sorgt in Kombination mit einem SetUID Binary dafür, dass PHP-Skripte mit den Berechtigungen des Benutzers, dem sie gehören, ausgeführt werden. Damit das funktioniert muss man in Binär-Distributionen wie etwa Debian Linux nicht mehr tun, als dass Modul zu installieren, einen Blick auf dessen Konfiguration zu werfen und es anschließend zu aktivieren. Vielleicht ist es gerade diese Einfachheit (deren Preis die Starrheit ist), die es so beliebt macht.</p>
<p>Ein großes Problem tut sich aber dann auf, wenn man PHP-Caches wie APC, TurckMM oder eAccelerator verwenden möchte. Denn all diese Caches funktionieren nicht im Zusammenspiel mit suPHP. Zwar lässt sich eine solche Kombination verwenden, doch ist sie leider nutzlos, da nichts gecached wird.</p>
<p>Eine wundervolle Alternative zu der Verwendung von suPHP ist eine Kombination aus Apache, SuExec, FCGID und PHP-CGI. Mit dieser Kombination funktioniert auch das Caching problemlos. Eine Anleitung zum Aufsetzen dieser Kombination findet sich bei <a href="http://wiki.hetzner.de/index.php/Apache_PHP5_fcgi_und_SuExec">Hetzner.de</a>.</p>
<p>Wer seine Websites nicht in dem von der jeweils genutzten Linux Distribution dafür vorgesehenen Verzeichnis ablegt sondern stattdessen beispielsweise in /home/*/public_html/ muss darauf achten, SuExec selbst zu kompilieren oder auf Debian-Systemen die gepatchte Version apache2-suexec-common zu verwenden. Aus Sicherheitsgründen erwartet SuExec bereits bei der Kompilierung den Pfad zum Docroot. Bei der Verwendung von apache2-suexec-common lässt sich das Docroot in der Datei /etc/apache2/suexec/www-data angeben.</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/suphp-php-opcode-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wordpress Update</title>
		<link>http://nerdcenter.de/wordpress-update/</link>
		<comments>http://nerdcenter.de/wordpress-update/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 10:21:35 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://nerdcenter.de/?p=61</guid>
		<description><![CDATA[

Lange Zeit habe ich davor gescheut, meine Wordpress-Installation zu aktualisieren. Hauptsächlich, weil ich Angst vor dem Aufwand hatte, schließlich habe ich noch Wordpress 2.1 benutzt (aktuell ist 2.8.4) und daher mit zahlreichen Inkompabilitäten gerechnet. Letzte Nacht habe ich es dann trotzdem gewagt und das Wordpress Update durchgeführt.
Und es geht doch&#8230;
&#8230;uralte Wordpress-Installationen problemlos zu aktualisieren. Sogar [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Lange Zeit habe ich davor gescheut, meine Wordpress-Installation zu aktualisieren. Hauptsächlich, weil ich Angst vor dem Aufwand hatte, schließlich habe ich noch Wordpress 2.1 benutzt (aktuell ist 2.8.4) und daher mit zahlreichen Inkompabilitäten gerechnet. Letzte Nacht habe ich es dann trotzdem gewagt und das Wordpress Update durchgeführt.</p>
<p><strong>Und es geht doch&#8230;</strong><br />
&#8230;uralte Wordpress-Installationen problemlos zu aktualisieren. Sogar ziemlich einfach. Orientiert habe ich mich dabei an <a href="http://www.wordpress-buch.de/2009/01/wordpress-ohne-risiko-auf-27-updaten/">diesem Artikel</a>. Mir persönlich erschien es dabei aber sauberer, die neue Version herunter zu laden und die paar Sachen (Bilder), die ich aus der der alten Installation benötigte in die neue hinein zu kopieren. Dies ermöglicht es einem, eine Subdomain anzulegen, auf der man die neue Installation erst einmal testen kann. Anschließend kann man mit einem Symlink einfach die verwendete Installation wechseln.</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/wordpress-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XEN Loop Disk Image vergrößern</title>
		<link>http://nerdcenter.de/xen-loop-disk-image-vergrosern/</link>
		<comments>http://nerdcenter.de/xen-loop-disk-image-vergrosern/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 11:47:13 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[Linux / Unix]]></category>
		<category><![CDATA[XEN]]></category>
		<category><![CDATA[disk]]></category>
		<category><![CDATA[domU]]></category>
		<category><![CDATA[grow]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[loop]]></category>
		<category><![CDATA[resize]]></category>
		<category><![CDATA[vergrößern]]></category>

		<guid isPermaLink="false">http://nerdcenter.de/xen-loop-disk-image-vergrosern/</guid>
		<description><![CDATA[

Das Loop Disk Image einer XEN DomU ist zu klein geworden? Solang die Festplatte des Hypervisors noch genügend Platzreserven hat, ist das glücklicherweise kein unlösbares Problem. Loop Disk Images können mit Bordmitteln vergrößert werden. Zwei kleine Beispiele für die Vorgehensweise bei EXT2, EXT3 und XFS Dateisystem:
EXT2 / EXT3 Dateisystem
VM herunterfahren:
xm shutdown domu.blub.local
Image um 30GB vergrößern:
dd [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Das Loop Disk Image einer XEN DomU ist zu klein geworden? Solang die Festplatte des Hypervisors noch genügend Platzreserven hat, ist das glücklicherweise kein unlösbares Problem. Loop Disk Images können mit Bordmitteln vergrößert werden. Zwei kleine Beispiele für die Vorgehensweise bei EXT2, EXT3 und XFS Dateisystem:</p>
<p><strong>EXT2 / EXT3 Dateisystem</strong><br />
VM herunterfahren:</p>
<pre>xm shutdown domu.blub.local</pre>
<p>Image um 30GB vergrößern:</p>
<pre>dd if=/dev/zero bs=1024k count=30720 >> disk.img</pre>
<p>Fehler im Dateisystem korrigieren:</p>
<pre>e2fsck -f disk.img</pre>
<p>Dateisystem auf die Größe des Images vergrößern:</p>
<pre>resize2fs disk.img</pre>
<p><strong>XFS Dateisystem</strong><br />
VM herunterfahren:</p>
<pre>xm shutdown domu.blub.local</pre>
<p>Image um 30GB vergrößern:</p>
<pre>dd if=/dev/zero bs=1024k count=30720 >> disk.img</pre>
<p>Fehler im Dateisystem korrigieren:</p>
<pre>xfs_repair -f disk.img</pre>
<p>Dateisystem auf die Größe des Images vergrößern:</p>
<pre>mount disk.img /mnt/tmp/ -o loop
xfs_growfs -d /mnt/tmp/</pre>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/xen-loop-disk-image-vergrosern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Webdesign-Kunden im Alltag</title>
		<link>http://nerdcenter.de/webdesign-kunden-im-alltag/</link>
		<comments>http://nerdcenter.de/webdesign-kunden-im-alltag/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 14:22:21 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[Fun]]></category>
		<category><![CDATA[Alltag]]></category>
		<category><![CDATA[Kunden]]></category>
		<category><![CDATA[Video]]></category>
		<category><![CDATA[Webdesign]]></category>

		<guid isPermaLink="false">http://nerdcenter.de/webdesign-kunden-im-alltag/</guid>
		<description><![CDATA[

Einfach nur herrlich dieser Clip. Es trifft zwar glücklicher Weise nur auf wenige potentielle Auftraggeber zu aber dennoch begegnet einem diese Spezies immer wieder: Menschen mit dem Wunsch die perfekte Website innerhalb kürzester Zeit zu erhalten &#8211; selbstverständlich zum Ramschpreis. Das Video zeigt, wie sie außerhalb ihrer geschäftlichen Tätigkeit agieren.


]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Einfach nur herrlich dieser Clip. Es trifft zwar glücklicher Weise nur auf wenige potentielle Auftraggeber zu aber dennoch begegnet einem diese Spezies immer wieder: Menschen mit dem Wunsch die perfekte Website innerhalb kürzester Zeit zu erhalten &#8211; selbstverständlich zum Ramschpreis. Das Video zeigt, wie sie außerhalb ihrer geschäftlichen Tätigkeit agieren.</p>
<p><object width="560" height="340"><param name="movie" value="http://www.youtube.com/v/JI3Df7-KFtw&#038;hl=de&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/JI3Df7-KFtw&#038;hl=de&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object></p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/webdesign-kunden-im-alltag/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MacBook iSight Kamera funktioniert nicht</title>
		<link>http://nerdcenter.de/macbook-isight-kamera-funktioniert-nicht/</link>
		<comments>http://nerdcenter.de/macbook-isight-kamera-funktioniert-nicht/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 11:56:55 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[MacBook]]></category>
		<category><![CDATA[defekt]]></category>
		<category><![CDATA[funktioniert nicht]]></category>
		<category><![CDATA[geht nicht]]></category>
		<category><![CDATA[iSight]]></category>
		<category><![CDATA[Kamera]]></category>

		<guid isPermaLink="false">http://nerdcenter.de/macbook-isight-kamera-funktioniert-nicht/</guid>
		<description><![CDATA[

Mein MacBook hat sich heute morgen geweigert zu starten. Fünf Anläufe waren nötig, damit das Teil endlich lief. Als es dann endlich geklappt hat, konnte ich mir erst einmal die Schweißperlen von der Stirn wischen, die bei dem Gedanken an meine Abschlussarbeit auf dem Gerät entstanden. Aber etwas war anders als sonst: Die Grüne LED [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Mein MacBook hat sich heute morgen geweigert zu starten. Fünf Anläufe waren nötig, damit das Teil endlich lief. Als es dann endlich geklappt hat, konnte ich mir erst einmal die Schweißperlen von der Stirn wischen, die bei dem Gedanken an meine Abschlussarbeit auf dem Gerät entstanden. Aber etwas war anders als sonst: Die Grüne LED neben der iSight Kamera leuchtete plötzlich permanent auf. Eigentlich zeigt diese an, dass die Kamera aktiv ist, was aber nicht der Fall war. In Photo Booth blieb das Bild schwarz. Neustart &amp; co brachten keine Besserung. Folgendes hingegen schon:</p>
<ul>
<li>MacBook ausschalten</li>
<li>Netzteil-Kabel entfernen und Batterie herausnehmen</li>
<li>5 Sekunden auf den Einschalter drücken</li>
<li>Batterie wieder einlegen, Netzteil-Kabel wieder ran und tata &#8211; alles funktioniert wieder wie gewünscht</li>
</ul>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/macbook-isight-kamera-funktioniert-nicht/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Magento Serverumzug</title>
		<link>http://nerdcenter.de/magento-server-wechseln-umziehen/</link>
		<comments>http://nerdcenter.de/magento-server-wechseln-umziehen/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 14:15:04 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[Magento]]></category>

		<guid isPermaLink="false">http://nerdcenter.de/magento-server-wechseln-umziehen/</guid>
		<description><![CDATA[

Magento gestaltet einen Serverumzug leider schwieriger, als er sein müsste. Die Entwickler haben zahlreiche Stolpersteine versteckt, die es eigentlich gar nicht geben müsste (etwa das speichern vollständiger URLs in der Datenbank). Dennoch ist ein Serverwechsel einfacher, als man mancherorts liest:
1. Im Magento Backend unbedingt den Cache deaktivieren, zumindest den Konfigurations-Cache, denn auch die MySQL Zugangsdaten [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p><strong>Magento</strong> gestaltet einen <strong>Serverumzug</strong> leider schwieriger, als er sein müsste. Die Entwickler haben zahlreiche Stolpersteine versteckt, die es eigentlich gar nicht geben müsste (etwa das speichern vollständiger URLs in der Datenbank). Dennoch ist ein Serverwechsel einfacher, als man mancherorts liest:</p>
<p>1. Im Magento Backend unbedingt den Cache deaktivieren, zumindest den Konfigurations-Cache, denn auch die MySQL Zugangsdaten werden gecached, was dazu führt, dass nach dem Umzug nichts funktioniert und keine Möglichkeit dazu besteht, mit akzeptablen Aufwand den Cache zu leeren &#8211; der Login im Adminbereich geht dann nämlich auch nicht mehr.</p>
<p>2. SQL-Dump erzeugen:</p>
<pre>mysqldump -uBENUTZER -pPASSWORT DATENBANK &gt; magento.sql</pre>
<p>3. Leider speichert Magento Komplette URLs in der Datenbank, etwa die Base URL und die Secure Base URL.<br />
Daher ist es notwendig, die verwendeten IPs / Domains in dem Dump zu suchen und zu ersetzen, sofern sich diese geändert haben.<br />
Den Dump dazu einfach in mit dem Lieblings-Texteditor (z.B. nano) öffnen oder alternativ mit reichlich Kommandozeilen-Magic (grep, sed). Ersteres geht in diesem Fall ausnahmsweise schneller <img src='http://nerdcenter.de/wp-includes/images/smilies/icon_wink.gif' alt="Icon Wink in Magento Serverumzug" class='wp-smiley' /> </p>
<p>4. GZIP-komprimiertes Tararchiv aus dem Magento-Rootverzeichnis und dem SQLdump erzeugen: </p>
<pre>tar cfz magento.tgz ~/public_html/magento magento.sql</pre>
<p>5. Das Archiv per SCP oder FTP auf den neuen Server schieben, z.B.:</p>
<pre>scp magento.tgz user@host:/absoluter_verzeichnis_pfad/</pre>
<p>6. Das Archiv auf dem neuen Server entpacken:</p>
<pre>tar xfz magento.tgz</pre>
<p>7. Falls notwendig die entpackten Dateien / Verzeichnisse via <em>mv</em> ins neue htdocs verschieben&#8230;</p>
<p>8. Den entpackten Dump in die neue Datenbank einspielen:</p>
<pre>mysql -uBENUTZER -pPASSWORT DATENBANK &lt; magento.sql</pre>
<p>9. Leider speichert Magento absolute Pfade, die für die Installation von Erweiterungen via Pear (bzw. Magento Connect als Frontend) verwendet werden.<br />
Um diese Pfade zu aktualisieren muss man ins neue Magento-Wurzelverzeichnis wechseln und dort folgenden befehl ausführen:</p>
<pre>./pear mage-setup</pre>
<p>Ansonsten ist es nicht möglich Erweiterungen via Magento Connect einzuspielen!</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/magento-server-wechseln-umziehen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
