<?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 &#187; Programmierung</title>
	<atom:link href="http://nerdcenter.de/category/programmierung/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 " 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>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>PHP: Bit Flags</title>
		<link>http://nerdcenter.de/php-bit-flags/</link>
		<comments>http://nerdcenter.de/php-bit-flags/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 16:02:53 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[bit]]></category>
		<category><![CDATA[flags]]></category>

		<guid isPermaLink="false">http://nerdcenter.de/php-bit-flags/</guid>
		<description><![CDATA[

In manchen Fällen können Bit Flags in PHP-Skripten sehr nützlich sein. Etwa wenn es darum geht,
anhand eines &#8220;action&#8221;-Parameters zu entscheiden, welche Objekte instanziiert werden sollen. U.a. auf diese Weise kann
- sonst redundanter &#8211; Code gesparrt werden.
Kennern des binären Zahlensystems sollten also mal einen Blick darauf werfen. Alle anderen sollten dringend zu
diesen Kennern werden &#8211; das [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>In manchen Fällen können Bit Flags in PHP-Skripten sehr nützlich sein. Etwa wenn es darum geht,<br />
anhand eines &#8220;action&#8221;-Parameters zu entscheiden, welche Objekte instanziiert werden sollen. U.a. auf diese Weise kann<br />
- sonst redundanter &#8211; Code gesparrt werden.</p>
<p>Kennern des binären Zahlensystems sollten also mal einen Blick darauf werfen. Alle anderen sollten dringend zu<br />
diesen Kennern werden &#8211; das macht nicht nur das Verständniss des folgenden Codesnippets sondern das ganze (IT-) Leben einfacher <img src='http://nerdcenter.de/wp-includes/images/smilies/icon_wink.gif' alt="Icon Wink in " class='wp-smiley' /> </p>
<p>Das Prinzip ist eigentlich ganz einfach: Es werden einzelne Bits einer Integer Variablen gesetzt. Mit einer<br />
logisch AND Verknüpfung kann dann geprüft werden, ob einzelne Bits gesetzt wurden. Mit AND können Bits gelöscht werden,<br />
mit OR werden sie hinzu addiert. Jedes Bit stellt ein Flag dar. Ist ein Flag gesetzt werden entsprechende Aktionen ausgeführt.</p>
<p>Ein kleines Beispiel zu Bit Flags in PHP5:</p>
<pre>class example_controller {
	/**
	 * Flags set by $this-&gt;setFlags()
	 *
	 * @var int
	 */
	private		$flags			=	0;
	/**
	 * Instantiate the renderer object if this flag is set
	 *
	 * @var int
	 */
	const		FLAG_RENDERER		=	1;
	/**
	 * Do something cool if this flag is set
	 *
	 * @var int
	 */
	const		FLAG_DO_COOL_STUFF	=	2;
	/**
	 * Do even more cool stuff if this flag is set
	 *
	 * @var int
	 */
	const		FLAG_EVEN_MORE_STUFF	=	4;

	/**
	 * Initializes this object
	 *
	 */
	public function init() {
		$this-&gt;setFlags();
		$this-&gt;processFlags();
	}

	/**
	 * Setting the flags according to parameters
	 *
	 */
	private function setFlags() {
		if(!empty($_GET['action'])) {
			switch($_GET['action']) {
				case 'createFoo':
					$this-&gt;flags |= self::FLAG_RENDERER;
					break;
				case 'saveFoo':
					$this-&gt;flags |= self::FLAG_RENDERER;
					$this-&gt;flags |= self::FLAG_DO_COOL_STUFF;
					break;
			}
		}
	}

	/**
	 * Instantiates objects by flags
	 *
	 */
	private function processFlags() {
		// instantiate renderer
		if(($this-&gt;flags &#038; self::FLAG_RENDERER) > 0) {
			require_once(EXTENSION_LIBPATH . 'class.example_renderer.php');
			$this-&gt;renderer = example_renderer::getInstance();
			$this-&gt;renderer-&gt;init();
		}
		// do cool stuff
		if(($this-&gt;flags &#038; self::FLAG_DO_COOL_STUFF) > 0) {
			require_once('./lib/class.cool_stuff_factory.php');
			$myCoolStuff = cool_stuff_factory::makeInstance();
			$myCoolStuff-&gt;save();
		}
		// do even more cool stuff
		if(($this-&gt;flags &#038; self::FLAG_EVEN_MORE_STUFF) > 0) {
			require_once('./lib/class.even_more_stuff.php');
		}
	}
}</pre>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/php-bit-flags/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TYPO3: Frontend Renderer als Singleton</title>
		<link>http://nerdcenter.de/typo3-frontend-renderer-als-singleton/</link>
		<comments>http://nerdcenter.de/typo3-frontend-renderer-als-singleton/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 22:18:13 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[TYPO3]]></category>
		<category><![CDATA[Frontend]]></category>
		<category><![CDATA[Pattern]]></category>
		<category><![CDATA[PHP5]]></category>
		<category><![CDATA[Renderer]]></category>
		<category><![CDATA[Singleton]]></category>

		<guid isPermaLink="false">http://nerdcenter.de/typo3-frontend-renderer-als-singleton/</guid>
		<description><![CDATA[

Renderer sind stets einmalig. Das Singleton Design Pattern bilded genau dies ab: Es wird lediglich eine einzige Instanz der Klasse erzeugt und zurückgegeben. Die folgende Klasse kann als Basis für die View-Schicht der eigenen TYPO3 Extension verwendet werden. Sie ist von pi_base abgeleitet und bietet so den gewohnten Funktionsumfang. Der Codeschnipsel stammt aus einer mini [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Renderer sind stets einmalig. Das Singleton Design Pattern bilded genau dies ab: Es wird lediglich eine einzige Instanz der Klasse erzeugt und zurückgegeben. Die folgende Klasse kann als Basis für die View-Schicht der eigenen TYPO3 Extension verwendet werden. Sie ist von pi_base abgeleitet und bietet so den gewohnten Funktionsumfang. Der Codeschnipsel stammt aus einer mini TYPO3 Extension, an der ich gerade privat bastel.</p>
<pre>&lt;?php
/***************************************************************
*  Copyright notice
*
*  (c) 2009 Thorsten Boock &lt;thorsten (at) nerdcenter.de&gt;
*  All rights reserved
*
*  This script is part of the TYPO3 project. The TYPO3 project is
*  free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 2 of the License, or
*  (at your option) any later version.
*
*  The GNU General Public License can be found at
*  http://www.gnu.org/copyleft/gpl.html.
*
*  This script is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/

require_once(PATH_tslib . 'class.tslib_pibase.php');

/**
 * Frontend Renderer
 * Till PHP 5.3 this class has to be declared as final because
 * we don't know the names of the classes extending this one.
 *
 * @author Thorsten Boock &lt;thorsten (at) nerdcenter.de&gt;
 */
final class tx_tbwhoisonline_renderer_fe extends tslib_pibase {
	/**
	 * Instance of this class (Singleton Design Pattern)
	 *
	 * @var tx_whoisonline_renderer_fe
	 */
	private static		$instance					=	null;
	/**
	 * Path to the template file used for rendering
	 *
	 * @var string
	 */
	private				$templateFile				=	'';
	/**
	 * The contents of the file $this-&gt;templateFile
	 *
	 * @var string
	 */
	private				$templateHTML				=	'';

	/**
	 * Empty constructor (Singleton Design Pattern)
	 *
	 */
	private function __construct() {

	}

	/**
	 * Empty clone function (Singleton Design Pattern)
	 *
	 */
	private function __clone() {

	}

	/**
	 * Instantiating this object (Singleton Design Pattern)
	 *
	 * @return tx_tbwhoisonline_renderer_fe
	 */
	public static function getInstance() {
		if(self::$instance == null) {
			self::$instance = new tx_tbwhoisonline_renderer_fe();
		}
		return self::$instance;
	}

	/**
	 * Initializing this object
	 *
	 * @param array $conf
	 */
	public function init($conf) {
		// init tslib_pibase
		$this-&gt;conf = $conf;
		$this-&gt;pi_setPiVarDefaults();
		$this-&gt;pi_loadLL();
		// get cObj instance and load template
 		$this-&gt;cObj = t3lib_div::makeInstance('tslib_cObj');
 		$this-&gt;templateHTML = $this-&gt;cObj-&gt;fileResource($this-&gt;templateFile);
		// override defaults with typoscript configuration
		foreach($this-&gt;conf as $key =&gt; $value) {
			$key = str_replace('.', '', $key);
			if(isset($this-&gt;$key)) {
				$this-&gt;$key = $value;
			}
		}
	}
}
?&gt;</pre>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/typo3-frontend-renderer-als-singleton/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Actionscript 3: var_dump</title>
		<link>http://nerdcenter.de/actionscript-3-var_dump/</link>
		<comments>http://nerdcenter.de/actionscript-3-var_dump/#comments</comments>
		<pubDate>Mon, 02 Feb 2009 15:53:57 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[Actionscript 3]]></category>
		<category><![CDATA[Programmierung]]></category>

		<guid isPermaLink="false">http://www.nerdcenter.de/actionscript-3-var_dump/</guid>
		<description><![CDATA[

Vielleicht ganz interessant für PHP-Entwickler die sich nun mit Flash 9 konfrontiert sehen:
In Actionscript 3 gibt es nach meinem Wissen nur die Funktion trace. So etwas wie var_dump sucht man vergebens. Aber natürlich kann man die einzelnen Objekt-Eigenschaften einfach rekursiv durchlaufen und nach für nach tracen:
package helpers
{
	public class ObjectTracer
	{
		public function ObjectTracer()
		{
		}

		public static function traceRecursive(_obj: *, [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Vielleicht ganz interessant für PHP-Entwickler die sich nun mit Flash 9 konfrontiert sehen:<br />
In Actionscript 3 gibt es nach meinem Wissen nur die Funktion trace. So etwas wie var_dump sucht man vergebens. Aber natürlich kann man die einzelnen Objekt-Eigenschaften einfach rekursiv durchlaufen und nach für nach tracen:</p>
<pre>package helpers
{
	public class ObjectTracer
	{
		public function ObjectTracer()
		{
		}

		public static function traceRecursive(_obj: *, index: String = ''): void {
			var item: Object;
			switch (typeof(_obj)){
				case 'object':
					trace('&lt;object&gt; ' + _obj.toString());
					for(var i: String in _obj){
						ObjectTracer.traceRecursive(_obj[i], i);
					};
					trace('&lt;/object&gt;');
				break;
				case 'xml':
					trace('&lt;xml&gt;');
					trace(_obj);
					trace('&lt;/xml&gt;');
				break;
				default:
					trace(index + ': ' + _obj + ' (' + typeof(_obj) + ')');
				break;
			};
		}
	}
}</pre>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/actionscript-3-var_dump/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>pdftk statisch linken (kompilieren)</title>
		<link>http://nerdcenter.de/pdftk-statisch-linken-kompilieren/</link>
		<comments>http://nerdcenter.de/pdftk-statisch-linken-kompilieren/#comments</comments>
		<pubDate>Wed, 02 Apr 2008 22:16:10 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[Linux / Unix]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[lgcj]]></category>
		<category><![CDATA[libgcj]]></category>
		<category><![CDATA[linking]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[pdftk]]></category>
		<category><![CDATA[statically]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://www.nerdcenter.de/pdftk-statisch-linken-kompilieren/</guid>
		<description><![CDATA[

pdftk
pdftk ist eine Open Source Software, die es ermöglicht, PDF-Dateien per Kommandozeile zu bearbeiten. Zu den vielfältigen Features von pdftk gehört etwa die Möglichkeit PDFs übereinander zu legen.
pdftk statisch kompilieren
Einleitung
Möchte man pdftk statisch kompilieren, um es etwa auf einem Hetzner Managed Server betreiben zu können, müssen die mitgelieferten Java Bibliotheken statisch kompiliert werden. Um dies [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p><strong>pdftk</strong><br />
<a href="http://www.pdfhacks.com/pdftk/">pdftk</a> ist eine Open Source Software, die es ermöglicht, PDF-Dateien per Kommandozeile zu bearbeiten. Zu den vielfältigen Features von pdftk gehört etwa die Möglichkeit PDFs übereinander zu legen.</p>
<p><strong>pdftk statisch kompilieren</strong></p>
<p><b>Einleitung</b><br />
Möchte man pdftk statisch kompilieren, um es etwa auf einem Hetzner Managed Server betreiben zu können, müssen die mitgelieferten Java Bibliotheken statisch kompiliert werden. Um dies zu erreich genügt es sowohl bei pdftk 1.21 als auch bei pdftk 1.41, die Makefiles<br />
anzupassen &#8211; von Änderungen am Quelltext bleibt man verschont. Es ist übrigens durchaus sinnvoll, pdftk als 32bit Applikation zu kompilieren, denn nur so läuft es auf nahezu jedem Linuxsystem &#8211; ohne dass man sich auch noch mit Cross-Compiling herumschlagen muss.</p>
<p><strong>Makefiles anpassen</strong><br />
Nachdem man pdftk heruntergeladen hat, das Archiv entpackt hat und in das neue Verzeichnis gewechselt hat, gilt es die Dateien Makefile.Base und Makefile.DEINE-DISTRIBUTION bzw. Makefile.Generic anzupassen. Diese befinden sich im Unterverzeichnis pdftk.</p>
<p><strong>Makefile.Generic / Makefile.DEINE-DISTRIBUTION </strong><br />
In der Datei Makefile.Generic (bzw. in der Datei, die make mit dem Parameter -f übergeben wird, z.B. make -f Makefile.RedHat) werden die Flags für den Gnu Java Compiler GCJ gesetzt:</p>
<p><code># itext compiler flags<br />
export GCJFLAGS=</code></p>
<p>Um GCJ anzuweisen, die (mitgelieferten) Java Bibliotheken statisch zu kompilieren, müssen die GCJFLAGS wie folgt geändert werden:<br />
<code>export GCJFLAGS= -static</code></p>
<p>In diesem Makefile werden auch die Flags für den C++-Compiler g++ gesetzt.<br />
Default hat die Entsprechende Konstante in dem Makefile Makefile.RedHat folgenden Wert:<br />
<code>CXXFLAGS= -lrt -ldl -lgcj</code></p>
<p>Auch diese Flags müssen angepasst werden:<br />
<code>CXXFLAGS= -W1,-v -static -W1,-Bstatic -lgcj -lpthread -lm -lz -ldl -lrt -W1,-Bdynamic -lsupc++ -lstdc++ -lc</code></p>
<p>Die Flags, die mit &#8220;-W1,&#8221; beginnen, werden an den Linker ld übergeben. Abgesehen von libc, libsupc++ und libstdc++ werden alle Bibliotheken statisch gelinkt, um deren dynamische Versionen auf dem Zielsystem nicht erforderlich zu machen (auf den Managed Servern von<br />
Hetzner ist beispielsweise keine (dynamische) libgcj installiert).</p>
<p><strong>Makefile.Base</strong><br />
In der Datei Makefile.Base werden Konfigurationen vorgenommen, die weniger Distributionsabhängig sind, als jene in den anderen Makefiles. Der Entwickler von pdftk hielt sie offenbar sogar für komplett Distributionsabhängig, deshalb wird dieses Makefile von allen anderen<br />
eingebunden. Für das Vorhaben pdftk statisch zu kompilieren ist sie eigentlich uninteressant &#8211; es sei denn man erhält (wie bei mir während des Linkens von pdftk 1.41 passiert) eine Fehlermeldung im Stil von &#8220;multiple definition of `convert&#8217;&#8221;.<br />
pdftk liefert nämlich selbst alte Java Bibliotheken mit. Im Beispiel von Convert reicht es die betreffende Zeile im Makefile auszukommentieren, um das Problem zu beheben:</p>
<p><code>libgcj_local_libs = \<br />
$(java_libs_root)/java_local/security/security.a \<br />
$(java_libs_root)/gnu_local/java/security/provider/provider.a \<br />
$(java_libs_root)/gnu_local/java/security/security.a# \<br />
#$(java_libs_root)/gnu/gcj/convert/convert.a</code></p>
<p><strong>Tücken</strong><br />
<strong>GCC Versionen</strong><br />
Die aktuelle Version von pdftk stammt vom 28. November 2006 &#8211; anders ausgedrückt: pdftk wird nicht mehr aktualisiert. Da sich die GNU Compiler Collection jedoch mit jeder neuen Version ändert und beispielsweise strikter wird, was Syntax angeht, lassen sich pdftk Version 1.21 sowie pdftk 1.41 am besten mit alten Compilern kompilieren. Ich habe pdftk 1.21 erfolgreich mit GCC 3.4.5 kompiliert sowie pdftk 1.41 mit GCC 4.0.4. Statt sein System hierfür vollzumüllen<br />
kann ich die Installation von Fedora Core 2 in einer VM (z.B. der kostenlose VMWare Server) empfehlen.</p>
<p><strong>Statische Libraries mit &#8220;falschen&#8221; (unerwarteten) Dateinamen</strong><br />
Während des Kompilierens von pdftk werden u.a. die statischen Bibliotheken libgcj.a und libgcc_s.a erwartet. Sind die entsprechenden Pakete (meist libgcc-devel, libgcj-devel o.ä.) installiert, kann es trotzdem sein, dass die entsprechenden Dateien nicht vom Linker ld<br />
gefunden werden können. In meinem Fall hat sich libgcj.a unter dem Dateinamen libgcj_bc.so versteckt, libgcc_s.a hieß libgcc_s.so.1. Ein Symlink (ls -s) auf den richtigen Dateinamen behebt dieses Problem.<br />
Die GCC Bibliotheken befinden sich bei Linuxdistributionen standardmäßig im Verzeichnis /usr/lib/gcc/*/.</p>
<p><strong>GCC 4.0.4 auf Fedora Core 2 kompilieren</strong><br />
GCC 3.4 ist auf Fedora Core 2 bereits installiert. GCC 4.0.4 kann auf einem der zahlreichen GCC Mirrors heruntergeladen werden.</p>
<p>GCC 4.0.4 habe ich wie folgt konfiguriert / kompiliert / installiert:<br />
<code>tar jxf gcc*.tar.bz2<br />
cd gcc-*<br />
mkdir objdir &#038;&#038; cd objdir<br />
../configure --enable-languages=c,c++,java --prefix=/opt --enable-threads=posix &#038;&#038; make &#038;&#038; make -k check<br />
make install</code></p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/pdftk-statisch-linken-kompilieren/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Mit FFmpeg Videos ins FLV Format konvertieren (PHP)</title>
		<link>http://nerdcenter.de/mit-ffmpeg-videos-ins-flv-format-konvertieren-php/</link>
		<comments>http://nerdcenter.de/mit-ffmpeg-videos-ins-flv-format-konvertieren-php/#comments</comments>
		<pubDate>Wed, 09 Jan 2008 18:27:37 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[Linux / Unix]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programmierung]]></category>

		<guid isPermaLink="false">http://www.nerdcenter.de/mit-ffmpeg-videos-ins-flv-format-konvertieren-php/</guid>
		<description><![CDATA[

Wer seinen Usern die Möglichkeit geben möchte Videos hochzuladen und beim Abspielen Kompabilitäts-Probleme vermeiden möchte kommt um FLV (Flash Video) nicht vorbei, denn den Flash-Player hat eigentlich jeder installiert und aktiviert. Der Download eines extra Players bzw. Codecs entfällt so auch bei exotischeren Betriebssystemen.
Mit FFmpeg lassen sich diverse Videotypen in das FLV Format konvertieren. Da [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Wer seinen Usern die Möglichkeit geben möchte Videos hochzuladen und beim Abspielen Kompabilitäts-Probleme vermeiden möchte kommt um <strong>FLV</strong> (Flash Video) nicht vorbei, denn den Flash-Player hat eigentlich jeder installiert und aktiviert. Der Download eines extra Players bzw. Codecs entfällt so auch bei exotischeren Betriebssystemen.</p>
<p>Mit <strong>FFmpeg</strong> lassen sich diverse Videotypen in das FLV Format konvertieren. Da man aus PHP Skripten heraus beliebige Prozesse mit den Rechten des Benutzers, der <strong>PHP</strong> ausführt, starten kann, lässt sich FFmpeg auch sehr gut in einem PHP Skript verwenden um Videos direkt nach dem Upload automatisch zu <strong>konvertieren</strong>.</p>
<p><strong>1. Download, Kompilieren und Installation von LAME:</strong><br />
Auf <a href="http://sourceforge.net/project/showfiles.php?group_id=290&#038;package_id=309">Sourceforge</a> gehen und aktuellste Version auswählen, Download URL kopieren und per wget auf dem Server herunterladen, also z.B. <em>wget http://surfnet.dl.sourceforge.net/sourceforge/lame/lame-3.97.tar.gz</em><br />
Nach dem Download den Tarball mit <em>tar zxf lame-3.97.tar.gz</em> entpacken und mit <em>cd lame-3.97</em> in das Verzeichnis wechseln. Nun das Configure-Skript durchlaufen lassen, kompilieren und installieren: <em>./configure &#038;&#038; make &#038;&#038; sudo make install</em></p>
<p><strong>2. Download, Kompilieren und Installation von FFmpeg:</strong><br />
<a href="http://ffmpeg.mplayerhq.hu/ffmpeg-export-snapshot.tar.bz2">FFmpeg Sources runterladen</a>: <em>wget http://ffmpeg.mplayerhq.hu/ffmpeg-export-snapshot.tar.bz2</em> , mit <em>tar jxf ffmpeg-export*</em> entpacken. Jetzt das Configure-Skript durchlaufen lassen, kompilieren und installieren: <em>./configure &#8211;enable-libmp3lame &#038;&#038; make &#038;&#038; sudo make install</em></p>
<p><strong>3. FFmpeg von PHP aus starten:</strong><br />
<em>&lt;?php<br />
system(&#8221;/usr/local/bin/ffmpeg  -i input.mov -ar 22050 -ab 56 -aspect 4:3 -b 200 -r 12 -f flv -s 320&#215;240 -acodec mp3 -ac 1 output.flv&#8221;);<br />
?&gt;</em></p>
<p>Tipp: Wenn FFmpeg den Start verweigert weil es libmp3lame.so.0 nicht finden konnte muss das Configure-Skript von LAME mit &#8211;prefix=/usr aufgerufen werden.</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/mit-ffmpeg-videos-ins-flv-format-konvertieren-php/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Relaiskarte ansteuern: Kostenlose Software</title>
		<link>http://nerdcenter.de/relaiskarte-ansteuern-kostenlose-software/</link>
		<comments>http://nerdcenter.de/relaiskarte-ansteuern-kostenlose-software/#comments</comments>
		<pubDate>Sun, 18 Feb 2007 11:58:23 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[Programmierung]]></category>

		<guid isPermaLink="false">http://www.nerdcenter.de/relaiskarte-ansteuern-kostenlose-software/</guid>
		<description><![CDATA[

Ich habe mich dieses Wochenende endlich erfolgreich dazu zwingen können, an meinem Projekt für das Fach Techniklehre zu arbeiten. Meine Zielsetzung war es eine Software für das Ansteuern einer Relaiskarte in Delphi zu entwickeln. Nach zwei Tagen Arbeit bietet die Relaiskarten Software mit dem hübschen Namen &#8220;LPT Master&#8221; folgende Features:
-  Relais können manuell ein/aus-geschaltet [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Ich habe mich dieses Wochenende endlich erfolgreich dazu zwingen können, an meinem Projekt für das Fach Techniklehre zu arbeiten. Meine Zielsetzung war es eine <strong>Software</strong> für das Ansteuern einer <strong>Relaiskarte</strong> in Delphi zu entwickeln. Nach zwei Tagen Arbeit bietet die <strong>Relaiskarten Software</strong> mit dem hübschen Namen &#8220;LPT Master&#8221; folgende Features:</p>
<p>-  Relais können manuell ein/aus-geschaltet werden.</p>
<p>- Relais können automatisiert per Timer ein/aus-geschaltet werden. Trotz Ablaufs des Timers ist Jederzeit ein manueller Eingriff möglich!</p>
<p>- Timer-Konfigurationen können gespeichert und eingelesen werden</p>
<p>- Alle wechselnden, ausgehenden Werte werden geloggt und übersichtlich dargestellt &#8211; so versteht auch jeder die Funktionsweise</p>
<p>- Auf Wunsch setzt das <strong>Relaiskarten Programm</strong> bei seinem Start den LPT-Port auf den Wert 0</p>
<p>- Die zu benutzende Schnittstelle kann im GUI gewechselt werden</p>
<p>Das Relaiskarten Programm ist in englischer Sprache kommentiert, grundsätzlich aber  selbsterklärend.</p>
<p>Die Benutzung des Programms ist kostenlos für den privaten Gebrauch. Wer die Relaiskarten Software kommerziell nutzen möchte, schickt mir bitte eine Mail an thorsten [AT] nerdcenter [DOT] de um sich über Lizenzkosten zu informieren.</p>
<p><a href="/stuff/lptmaster_setup.exe">Download: LPT Master</a></p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/relaiskarte-ansteuern-kostenlose-software/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>LPT Programmierung mit Delphi: inpout32.dll Beispiel</title>
		<link>http://nerdcenter.de/lpt-programmierung-mit-delphi-inpout32dll-beispiel/</link>
		<comments>http://nerdcenter.de/lpt-programmierung-mit-delphi-inpout32dll-beispiel/#comments</comments>
		<pubDate>Sat, 27 Jan 2007 22:28:39 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[Programmierung]]></category>

		<guid isPermaLink="false">http://www.nerdcenter.de/lpt-programmierung-mit-delphi-inpout32dll-beispiel/</guid>
		<description><![CDATA[

Das Ansteuern des LPT-Ports gestaltet sich mit Delphi sehr einfach &#8211; selbst für Einsteiger. Das folgende Programm zeigt, wie mit den Prozeduren der DLL-Datei inpout32.dll auf simple Weise Werte gesetzt werden können. Der Computer schaltet die Pins des LPT-Ports dann je nach Wert mit 5V TTL.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Das Ansteuern des LPT-Ports gestaltet sich mit Delphi sehr einfach &#8211; selbst für Einsteiger. Das folgende Programm zeigt, wie mit den Prozeduren der DLL-Datei inpout32.dll auf simple Weise Werte gesetzt werden können. Der Computer schaltet die Pins des LPT-Ports dann je nach Wert mit 5V TTL.</p>
<p>unit Unit1;</p>
<p>interface</p>
<p>uses<br />
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br />
Dialogs, StdCtrls;</p>
<p>type<br />
TForm1 = class(TForm)<br />
Button1: TButton;<br />
Button2: TButton;<br />
Button3: TButton;<br />
Button4: TButton;<br />
Button5: TButton;<br />
Button6: TButton;<br />
Button7: TButton;<br />
Button8: TButton;<br />
Button9: TButton;<br />
Button10: TButton;<br />
Button11: TButton;<br />
Button12: TButton;<br />
Button13: TButton;<br />
Button14: TButton;<br />
Button15: TButton;<br />
Button16: TButton;<br />
procedure FormCreate(Sender: TObject);<br />
procedure Button1Click(Sender: TObject);<br />
procedure Button9Click(Sender: TObject);<br />
private<br />
{ Private-Deklarationen }<br />
public<br />
{ Public-Deklarationen }<br />
end;</p>
<p>var<br />
Form1: TForm1;<br />
value: Byte;</p>
<p>procedure Out32(wAddr:word;bOut:byte); stdcall; external &#8216;inpout32.dll&#8217;<br />
function Inp32(wAddr:word):integer; stdcall; external &#8216;inpout32.dll&#8217;</p>
<p>implementation</p>
<p>{$R *.dfm}</p>
<p>procedure TForm1.FormCreate(Sender: TObject);<br />
begin<br />
value:=$00;<br />
end;</p>
<p>procedure TForm1.Button1Click(Sender: TObject);<br />
begin<br />
value:=value OR (StrToInt((Sender AS TButton).Caption));<br />
Out32($378,value);<br />
end;</p>
<p>procedure TForm1.Button9Click(Sender: TObject);<br />
begin<br />
value:=value AND (255-(StrToInt((Sender AS TButton).Caption)));<br />
Out32($378,value)<br />
end;</p>
<p>end.</p>
<p>Zum Verständniss:</p>
<p>Wird der Binärwert 0000 0001 (was Hex $01 entspricht) an den LPT-Port gesendet, so wird der erste Pin geschaltet. Wird der Binärwert 0000 1000 (was Hex $08 entspricht), so wird der 4. Pin geschaltet.</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/lpt-programmierung-mit-delphi-inpout32dll-beispiel/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Relaiskarte über LPT ansteuern (Delphi)</title>
		<link>http://nerdcenter.de/relaiskarte-uber-lpt-ansteuern-delphi/</link>
		<comments>http://nerdcenter.de/relaiskarte-uber-lpt-ansteuern-delphi/#comments</comments>
		<pubDate>Sat, 09 Sep 2006 18:46:30 +0000</pubDate>
		<dc:creator>kcore</dc:creator>
				<category><![CDATA[Programmierung]]></category>

		<guid isPermaLink="false">http://www.nerdcenter.de/relaiskarte-uber-lpt-ansteuern-delphi/</guid>
		<description><![CDATA[

Wer eine günstige Möglichkeit sucht um Geräte mit dem PC ein- und ausschalten zu können, wird sich für Relaiskarten interessieren. Sie sind bereits für 25 Euro als Bausatz zu haben und reichen für viele kleine Aufgaben, etwa dem zeitgesteuerten Einschalten verschiedener Lichtquellen oder gar Wasserpumpen während des Urlaubs, vollkommen aus.
Ich habe mich für eine Relaiskarte [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Wer eine günstige Möglichkeit sucht um Geräte mit dem PC ein- und ausschalten zu können, wird sich für <strong>Relaiskarten</strong> interessieren. Sie sind bereits für 25 Euro als Bausatz zu haben und reichen für viele kleine Aufgaben, etwa dem zeitgesteuerten Einschalten verschiedener Lichtquellen oder gar Wasserpumpen während des Urlaubs, vollkommen aus.</p>
<p>Ich habe mich für eine <strong>Relaiskarte</strong> von Kemo entschieden. Diese wird via <strong>LPT</strong> mit dem PC verbunden und kann anschließend mit der mitgelieferten Software (DOS &#8211; Windows XP) bzw einer Eigenentwicklung angesteuert werden.</p>
<p>Da mir die <strong>Software</strong>, die der <strong>Relaiskarte</strong> beilag, für meine Zwecke ungeeignet erschien, entschloss ich mich für letzeres. Besonders einfach lässt sich der <strong>LPT-Port</strong>, an dem die <strong>Relaiskarte</strong> hängt, mit <strong>Delphi</strong> ansteuern. Am leichtesten geht dies mit der DLL <strong>inpout32.dll</strong>, die auf <a target="_blank" href="http://www.logix4u.net/inpout32.htm">logix4u.net</a> zum Download bereitsteht. Der folgende Code binded <strong>inpout32.dll</strong> in ein <strong>Delphi Programm</strong> ein:</p>
<blockquote><p><em>procedure Out32(wAddr:word;bOut:byte); stdcall; external &#8216;inpout32.dll&#8217;<br />
function Inp32(wAddr:word):integer; stdcall; external &#8216;inpout32.dll&#8217;</em></p></blockquote>
<p>Um anschließend einen Wert an den <strong>LPT-Port</strong> zu senden genügt <em>Out32($378,$02);</em> &#8211; mit diesen Parametern wird z.B. eine 2 an den 1. <strong>LPT-Port</strong> gesendet. Um von dem <strong>LPT</strong> zu lesen benutzt man <em>Inp32($378)</em>.</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdcenter.de/relaiskarte-uber-lpt-ansteuern-delphi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
