<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Open MES</title>
	<atom:link href="http://openmes.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://openmes.wordpress.com</link>
	<description>Ekklektisch, pragmatisch, persönlich</description>
	<lastBuildDate>Thu, 10 Nov 2011 17:33:29 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='openmes.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Open MES</title>
		<link>http://openmes.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://openmes.wordpress.com/osd.xml" title="Open MES" />
	<atom:link rel='hub' href='http://openmes.wordpress.com/?pushpress=hub'/>
		<item>
		<title>&#8222;Isotopp&#8220; zu Zeitreihendaten</title>
		<link>http://openmes.wordpress.com/2009/10/28/isotopp-zu-zeireihendaten/</link>
		<comments>http://openmes.wordpress.com/2009/10/28/isotopp-zu-zeireihendaten/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 18:57:12 +0000</pubDate>
		<dc:creator>kaembe</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Produktionsdaten]]></category>

		<guid isPermaLink="false">http://openmes.wordpress.com/?p=225</guid>
		<description><![CDATA[Kristian Köhntopp hat ein paar Gedanken zu Zeitreihendaten niedergeschrieben, besonders für die Verwendung von MySQL, wie hier ja auch beschrieben. Veröffentlicht in MySQL Tagged: MySQL, Produktionsdaten<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=225&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Kristian Köhntopp hat <a href="http://blog.koehntopp.de/comment.php?type=trackback&amp;entry_id=2660">ein paar Gedanken zu Zeitreihendaten</a> niedergeschrieben, besonders für die Verwendung von MySQL, wie hier ja auch beschrieben.</p>
<br />Veröffentlicht in MySQL Tagged: MySQL, Produktionsdaten <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/openmes.wordpress.com/225/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/openmes.wordpress.com/225/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/openmes.wordpress.com/225/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/openmes.wordpress.com/225/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/openmes.wordpress.com/225/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/openmes.wordpress.com/225/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/openmes.wordpress.com/225/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/openmes.wordpress.com/225/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/openmes.wordpress.com/225/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/openmes.wordpress.com/225/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/openmes.wordpress.com/225/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/openmes.wordpress.com/225/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/openmes.wordpress.com/225/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/openmes.wordpress.com/225/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=225&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://openmes.wordpress.com/2009/10/28/isotopp-zu-zeireihendaten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">kaembe</media:title>
		</media:content>
	</item>
		<item>
		<title>MS-SQL, PHP &#8211; und Umlaute</title>
		<link>http://openmes.wordpress.com/2009/06/03/ms-sql-php-und-umlaute/</link>
		<comments>http://openmes.wordpress.com/2009/06/03/ms-sql-php-und-umlaute/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 22:32:07 +0000</pubDate>
		<dc:creator>kaembe</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://openmes.wordpress.com/?p=218</guid>
		<description><![CDATA[Nachdem ich alle verfügbaren Funktionen in PHP life mit einem MS-SQL-Server durchprobiert habe, um Umlaute und Sonderzeichen in eine Tabelle zu prügeln, also Unicode-Zeichenketten einzufügen, war die Lösung eine ganz unerwartete: Im Startmenü: MS SQL Server -&#62; Client Network Utility -&#62; Registerkarte &#8222;DB-Library Options&#8220; und dann &#8222;Automatic Ansi to OEM conversation&#8220; das Häkchen entfernen. MS-SQL [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=218&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Nachdem ich alle verfügbaren Funktionen in PHP life mit einem MS-SQL-Server durchprobiert habe, um Umlaute und Sonderzeichen in eine Tabelle zu prügeln, also Unicode-Zeichenketten einzufügen, war die Lösung eine ganz unerwartete:</p>
<blockquote><p>Im Startmenü: MS SQL Server -&gt; Client Network Utility -&gt; Registerkarte &#8222;DB-Library Options&#8220; und dann &#8222;Automatic Ansi to OEM conversation&#8220; das Häkchen entfernen.</p></blockquote>
<p>MS-SQL speichert im UCS-2 bzw. UTF-16 Zeichensatz, aber alle Konvertierungen innerhalb PHP wurden durch die Einstellung in den Netzwerk-Parametern zunichte gemacht.</p>
<p>Zusätzlich müssen nach meinen Experimenten folgende Voraussetzungen gegeben sein:</p>
<ol>
<li>PHPs interne Zeichendarstellung sollte 8bit sein. Falls jemand mit Iconv herumspielt, sollte er probieren, ob es auch mit anderen Einstellungen geht.</li>
<li>Die Spalten in der SQL-Server Datenbanktabelle müssen vom Typ NVARCHAR statt VARCHAR sein. Analog NTEXT statt TEXT, etc.</li>
<li>Bei mir seltsamerweise nicht notwendig, aber sauberer: Die Strings für die Unicode-Spalten bei INSERT und UPDATE sollten mit N&#8217;xxxx&#8217; statt sonst &#8216;xxxx&#8217; geschrieben werden.</li>
</ol>
<p>Kaum war das Häkchen weg und die Spaltendefinition umgestellt, funktionierte das Skript ohne Änderungen und insbesondere ohne Konvertierungen mit mb_convert_encoding() oder iconv().</p>
<p>Danke an <a href="http://entwickler-forum.de/member.php?s=5461a3c8694f6d8ade0bf1e7610fc0d9&amp;u=1286">Michael Bieri</a> in <a href="http://entwickler-forum.de/showthread.php?p=31808#post31808">Problem mit Umlauten mit MS-SQL und PHP</a>.</p>
<br />Veröffentlicht in Allgemein  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/openmes.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/openmes.wordpress.com/218/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/openmes.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/openmes.wordpress.com/218/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/openmes.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/openmes.wordpress.com/218/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/openmes.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/openmes.wordpress.com/218/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/openmes.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/openmes.wordpress.com/218/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/openmes.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/openmes.wordpress.com/218/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/openmes.wordpress.com/218/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/openmes.wordpress.com/218/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=218&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://openmes.wordpress.com/2009/06/03/ms-sql-php-und-umlaute/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">kaembe</media:title>
		</media:content>
	</item>
		<item>
		<title>Berichte im Web-Portal, als PDF und per E-Mail (BIRT)</title>
		<link>http://openmes.wordpress.com/2009/04/14/berichte-im-web-portal-als-pdf-und-per-e-mail-birt/</link>
		<comments>http://openmes.wordpress.com/2009/04/14/berichte-im-web-portal-als-pdf-und-per-e-mail-birt/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 14:00:57 +0000</pubDate>
		<dc:creator>kaembe</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Reporting]]></category>
		<category><![CDATA[Web-Portal]]></category>
		<category><![CDATA[BIRT]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://openmes.wordpress.com/?p=201</guid>
		<description><![CDATA[Nachdem wir lokal Berichte mit BIRT erzeugen können, sollten sie auch über ein Webportal abrufbar sein und wir wollen sie automatisch erzeugen und verschicken. Zu BIRT gehört eine Web-Applikation, die die Report-Dateien aus dem Designer im Webbrowser darstellen und als PDF, Excel und so weiter exportieren kann. Diese Engine läuft in einem Applikationsserver wie Apache [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=201&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Nachdem wir lokal Berichte mit BIRT erzeugen können, sollten sie auch über ein Webportal abrufbar sein und wir wollen sie automatisch erzeugen und verschicken.</p>
<p>Zu BIRT gehört eine Web-Applikation, die die Report-Dateien aus dem Designer im Webbrowser darstellen und als PDF, Excel und so weiter exportieren kann. Diese Engine läuft in einem Applikationsserver wie Apache Tomcat oder JBoss. Im BIRT-Projekt wird dies beschrieben unter <a href="http://www.eclipse.org/birt/phoenix/deploy/viewerSetup.php" target="_new">[1]</a></p>
<p>Um diese Applikation zu nutzen sind folgende Schritte erforderlich:</p>
<ol>
<li>Tomcat installieren</li>
<li>BIRT Engine in Tomcat installieren und testen</li>
<li>BIRT Engine mit einem Report aus einer Webseite aufrufen</li>
<li>Reports als aus einem Skript heraus erzeugen</li>
<li>PDF-Dateien per Mail verschicken</li>
</ol>
<h3>Tomcat installieren</h3>
<p>Die aktuelle Version BIRT 2.3.2 läuft mit Tomcat 5.5, obwohl es schon die Tomcat 6 gibt. Meine Versuche mit Tomcat 6 waren nicht sehr erfolgreich, also bleibe ich erst mal bei 5.5.</p>
<p>Tomcat wiederum läuft auf JRE 6. Zuerst stellen wir also sicher, dass JRE6 SE betriebsbereit ist. Falls nicht vorhanden, kann man JRE 6 SE von <a href="http://java.sun.com/javase/downloads/" target="_new">[2]</a> laden.</p>
<p>Das Windows Binary von Tomcat 5.5 liegt auf <a href="http://tomcat.apache.org/" target="_new">[3]</a> Am einfachsten ist das Binary mit Installer. Nach der Installation muss der Tomcat manuell gestartet werden; entweder mit der Frage am Ende der Installation oder über das Startmenü.</p>
<p>Tomcat nistet sich im Tray mit einem Symbol ein. Das Systemmenü von Tomcat kann man dort mit der rechten Maustaste erreichen.</p>
<p><a href="http://openmes.files.wordpress.com/2009/04/tomcat_05.jpg"><img class="alignnone size-full wp-image-216" title="tomcat_05" src="http://openmes.files.wordpress.com/2009/04/tomcat_05.jpg?w=256&#038;h=274" alt="tomcat_05" width="256" height="274" /></a></p>
<p>Achtung: Tomcat läuft, einmal gestartet, als Dienst, das heisst auch ohne das Tray-Symbol.</p>
<p>Mit dem Webbrowser kann man unter <a href="http://127.0.0.1:8080" target="_new">http://127.0.0.1:8080</a> nachsehen, ob alles funktioniert.</p>
<p><a href="http://openmes.files.wordpress.com/2009/04/tomcat_01.jpg"><img class="alignnone size-medium wp-image-210" title="tomcat_01" src="http://openmes.files.wordpress.com/2009/04/tomcat_01.jpg?w=300&#038;h=290" alt="tomcat_01" width="300" height="290" /></a></p>
<h3>BIRT-Viewer in Tomcat installieren</h3>
<p>Viele Details dazu stehen auf <a href="http://www.eclipse.org/birt/phoenix/deploy/viewerSetup.php" target="_new">[4]</a> Hier kommt die Kurzfassung.</p>
<p>Zuerst brauchen wir das BIRT-Binary. Das steht auf <a href="http://download.eclipse.org/birt/downloads/" target="_new">[5]</a> Wir brauchen die Datei &#8222;Runtime&#8220; unter Deployment. Das Zip-File packen wir erst mal in ein temporäres Verzeichnis aus.</p>
<p>Als nächstes suchen wir das Tomcat-Installationsverzeichnis. Unter Windows dürfte das &#8222;c:\Programme\Apache Software Foundation\Tomcat 5.5&#8243; sein. Darin findet sich das Verzeichnis webapps, in dem alle Tomcat-Applikationen installiert werden, jede Applikation in einem eigenen Unterverzeichnis. In dieses Unterverzeichnis webapps kopieren wir aus dem temporären Auspackverzeichnis der BIRT-Runtime  das Unterverzeichnis WebViewerExample. Schliesslich benennen wir das kopierte Verzeichnis um in birt-viewer.</p>
<p>Um die Applikation zu aktivieren müssen wir den Tomcat einmal stoppen und wieder starten; am einfachsten mit der rechten Maustaste auf das Tomcat-Tray-Icon. Im Browser rufen wir wieder die Startseite von Tomcat auf &#8211; <a href="http://127.0.0.1:8080/" target="_new">http://127.0.0.1:8080/</a> &#8211; und klicken auf &#8222;Tomcat Manager&#8220;. In der Liste der Anwendungen muss birt-viewer auftauchen.</p>
<p><a href="http://openmes.files.wordpress.com/2009/04/tomcat_02.jpg"><img class="alignnone size-medium wp-image-212" title="tomcat_02" src="http://openmes.files.wordpress.com/2009/04/tomcat_02.jpg?w=257&#038;h=300" alt="tomcat_02" width="257" height="300" /></a></p>
<p>Für einen ersten Funktionstest der Web-Applikation klicken wir auf &#8222;birt-viewer&#8220; in der Tomcat-Liste. Das Eclipse-Symbol und die Bemerkung &#8222;BIRT viewer has been installed&#8220; sollte angezeigt werden.</p>
<p><a href="http://openmes.files.wordpress.com/2009/04/tomcat_03.jpg"><img class="alignnone size-medium wp-image-213" title="tomcat_03" src="http://openmes.files.wordpress.com/2009/04/tomcat_03.jpg?w=300&#038;h=176" alt="tomcat_03" width="300" height="176" /></a></p>
<p>Mit einem Klick auf &#8222;View Example&#8220; sollte der Report Viewer angezeigt werden und uns zur korrekten Installation beglückwünschen.</p>
<p><a href="http://openmes.files.wordpress.com/2009/04/tomcat_04.jpg"><img class="alignnone size-medium wp-image-214" title="tomcat_04" src="http://openmes.files.wordpress.com/2009/04/tomcat_04.jpg?w=300&#038;h=140" alt="tomcat_04" width="300" height="140" /></a></p>
<h3>MySQL-Treiber installieren und eigenen Report testen</h3>
<p>Auch in der Web-Applikation muss der MySQL-Treiber installiert werden, bevor wir den Test-Report abrufen können. Der Treiber ist wieder die Jar-Datei aus dem <a href="http://openmes.wordpress.com/2009/04/09/berichte-fuer-lau/" target="_new">vorherigen Beitrag</a>. Diesmal muss sie in das Verzeichnis &#8222;WEB-INF\platform\plugins\org.eclipse.birt.report.data.oda.jdbc_2.3.2.r232_v20090212\drivers\&#8220; im birt-viewer-Verzeichnis kopiert werden.</p>
<p>Dann muss der Test-Report in Reichweite der Engine gebracht werden. Es ist die Datei kpi-report1.rptdesign aus dem Workspace des Report-Designer, die nach birt-viewer\Report kopieren.</p>
<p>Im Browser können wir jetzt den Report im BIRT-Viewer direkt aufrufen: <a href="http://localhost:8080/birt-viewer/frameset?__report=Report\kpi-report1.rptdesign" target="_new">http://localhost:8080/birt-viewer/frameset?__report=Report\kpi-report1.rptdesign</a>. Gezeigt wird der komfortable Webviewer mit Frames und Export-Möglichkeiten. Die Engine bietet auch eine web-only, report-only Ansicht, wenn man sie mit run statt frameset aufruft: <a href="http://localhost:8080/birt-viewer/run?__report=Report\kpi-report1.rptdesign" target="_new">http://localhost:8080/birt-viewer/run?__report=Report\kpi-report1.rptdesign</a></p>
<p>Insgesamt kennt die Engine folgende Parameter:</p>
<ul>
<li>__format: Output format. &#8222;html&#8220; oder &#8222;pdf&#8220;.</li>
<li>__isnull: Definiert einen reportParameter als Null</li>
<li>__locale: Setzt die Java Sprachvorwahl (locale), wie en, de, en-us oder ch-zh. Default: Java-Default</li>
<li>__report: Pfad zur Report-Datei</li>
<li>__document: Pfad zum erzeugten Dokument, wenn run und frameset getrennt benutzt werden.</li>
<li>reportParameter: Ein Parameter, wie im Report design definiert.</li>
</ul>
<p>Zulässig sind&#8230;</p>
<ul>
<li>&#8230; in frameset: __locale, __report, __document, reportParam</li>
<li>&#8230; in run: __format, __isnull, __locale, __report, reportParam</li>
</ul>
<p>Beispiel: http://localhost:8080/birt-viewer/run?__format=pdf&amp;__report=Report\kpi-report1.rptdesign&amp;mypara=17</p>
<p>Wichtig bei Parametern und Pfaden: Alles muss URL-kompatibel sein. Bei Leerzeichen oder Umlauten muss gegebenenfalls <code>urlencode()</code> verwendet werden.</p>
<p>Eine vollständige Beschreibung aller Argumente für die Engine steht unter <a href="http://www.eclipse.org/birt/phoenix/deploy/viewerUsage.php" target="_new">[6]</a>.</p>
<p>Der Pfad zur Report-Datei kann absolut oder relativ angegeben werden. Für relative Pfade sucht die Engine mit Hilfe der beiden Settings BIRT_VIEWER_DOCUMENT_FOLDER und BIRT_VIEWER_WORKING_FOLDER in der Datei web.xml im birt-viewer. Wenn die Datei darüber nicht gefunden werden kann, wird das Verzeichnis birt-viewer als Basis genommen.</p>
<p>In der web.xml können auch verschiedene andere Einstellungen gesetzt werden.</p>
<h3>Reports aus PHP heraus erzeugen und an den Browser ausliefern</h3>
<p>Natürlich können wir die Reports einfach als Link auf die Engine anbieten. Damit liefern wir den Anwendern aber zum einen viele Informationen über unsere Installation und die Reports. Zum anderen ist offen, ob er überhaupt auf den Report-Server und die Portnummer des Tomcat zugreifen kann.</p>
<p>Wir können aber den Aufruf der BIRT-Engine in einem PHP-Skript verbergen und so tun, als ob dieses Skript den Report ausliefert:</p>
<blockquote><p><code>&lt;?php<br />
$r = fopen('http://127.0.0.1:8080/birt-viewer/run?__report=Report\kpi-report1.rptdesign&amp;__format=pdf', 'r');<br />
if(!$r) { print "Kann Report nicht öffnen!"; exit; }<br />
header('Content-Type: application/pdf');<br />
fpassthru($r); // gesamte Datei an den Browser liefern<br />
?&gt;</code></p></blockquote>
<p>Dieses Skript benutzt die Wrapper-Funktionen, durch man eine URL wie eine Datei öffnen kann. Hier geht natürlich nur die run-Methode der Engine und sämtliche Parameter für den Report müssen bereits beim Aufruf in der URL übergeben werden.</p>
<p>Je nach Laufzeit muss hier unter Umständen ein <code>set_time_limit()</code> eingefügt werden, wenn die Engine länger braucht.</p>
<p>Etwas ähnliches steht unter <a href="http://www.eclipse.org/birt/phoenix/deploy/usingPHP.php" target="_new">[7]</a> beschrieben, aber die dortige bewirkt eine Umleitung des Browsers, womit die Original-URL der Engine wieder dem Empfänger bekannt gegeben würde; siehe oben.</p>
<h3>Report als PDF erzeugen und abspeichern</h3>
<p>Zum Schluss sollen Reports automatisch erzeugt und per Mail verschickt werden. Mit PHP sieht das so aus:</p>
<blockquote><p><code>&lt;?php<br />
$rname = 'kpi-report1';<br />
$wname = $rname . '_' . date('Ymd_Hi') . '.pdf';<br />
$pdf = file_get_contents("http://127.0.0.1:8080/birt-viewer/run?__report=Report\\" . $rname . ".rptdesign&amp;__format=pdf");<br />
file_put_contents($wname, $pdf);<br />
?&gt;</code></p></blockquote>
<p>Wieder wird der Wrapper benutzt. Der Report wird als PDF komplett geladen und dann in die Zieldatei gespeichert. Als Komfort-Add-on hängen wir einen Zeitstempel und die Dateiendung an den Namen an.</p>
<p>Dieses Skript kann aus einem Batchfile heraus aufgerufen werden, das wiederum zyklisch durch den Windows Scheduler (&#8222;Geplante Tasks&#8230;&#8220;) oder unter Linux per cron gestartet werden kann.</p>
<p>Die andere Methode für den Aufruf der Engine führt über Java. Das ist beschrieben in <a href="http://www.theserverside.com/tt/articles/article.tss?l=IntegratingBIRTwithPHP" target="_new">[8]</a> und <a href="http://www.birt-exchange.com/devshare/deploying-birt-reports/743-calling-birt-from-php/" target="_new">[9]</a>. Da dies aber für unsere bisherigen Zwecke keine Vorteile bietet, belasse ich es bei den Links.</p>
<p>Oh, Mailversand! PDFs sollten wir als ordentlichen Anhang verschicken. Das geht mit mail() in PHP nicht so einfach. Ich habe gute Erfahrungen mit der SMTP-Klasse von <a href="http://www.phpclasses.org/browse/package/1044.html" target="_new">[10]</a> gemacht, aber auf phpclasses.org finden sich verschiedene andere Lösungen, zum Beispiel <a href="http://www.phpclasses.org/browse/package/2822.html" target="_new">[11]</a>. Damit sieht der Versand der PDF-Datei oben so aus:</p>
<blockquote><p><code>&lt;?php<br />
$mail = new attach_mailer<br />
(  $name = "Mein Name",<br />
$from = "me@mymail.com",<br />
$to = "you@gmail.com",<br />
$cc = "kopie@provider.org",<br />
$bcc = "blind@copy.org",<br />
$subject = "Report", $body = "Was zum Report zu sagen ist"<br />
);<br />
$mail-&gt;create_attachment_part($wname);<br />
$mail-&gt;process_mail();<br />
?&gt;</code></p></blockquote>
<h3>Links</h3>
<p>[1] http://www.eclipse.org/birt/phoenix/deploy/viewerSetup.php<br />
[2] http://java.sun.com/javase/downloads/<br />
[3] http://tomcat.apache.org/<br />
[4] http://www.eclipse.org/birt/phoenix/deploy/viewerSetup.php<br />
[5] http://download.eclipse.org/birt/downloads/<br />
[6] http://www.eclipse.org/birt/phoenix/deploy/viewerUsage.php<br />
[7] http://www.eclipse.org/birt/phoenix/deploy/usingPHP.php<br />
[8] http://www.theserverside.com/tt/articles/article.tss?l=IntegratingBIRTwithPHP<br />
[9] http://www.birt-exchange.com/devshare/deploying-birt-reports/743-calling-birt-from-php/<br />
[10] http://www.phpclasses.org/browse/package/1044.html<br />
[11] http://www.phpclasses.org/browse/package/2822.html</p>
<br />Veröffentlicht in Allgemein, Reporting, Web-Portal Tagged: BIRT, Reporting, Tomcat <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/openmes.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/openmes.wordpress.com/201/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/openmes.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/openmes.wordpress.com/201/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/openmes.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/openmes.wordpress.com/201/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/openmes.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/openmes.wordpress.com/201/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/openmes.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/openmes.wordpress.com/201/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/openmes.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/openmes.wordpress.com/201/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/openmes.wordpress.com/201/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/openmes.wordpress.com/201/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=201&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://openmes.wordpress.com/2009/04/14/berichte-im-web-portal-als-pdf-und-per-e-mail-birt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">kaembe</media:title>
		</media:content>

		<media:content url="http://openmes.files.wordpress.com/2009/04/tomcat_05.jpg" medium="image">
			<media:title type="html">tomcat_05</media:title>
		</media:content>

		<media:content url="http://openmes.files.wordpress.com/2009/04/tomcat_01.jpg?w=300" medium="image">
			<media:title type="html">tomcat_01</media:title>
		</media:content>

		<media:content url="http://openmes.files.wordpress.com/2009/04/tomcat_02.jpg?w=257" medium="image">
			<media:title type="html">tomcat_02</media:title>
		</media:content>

		<media:content url="http://openmes.files.wordpress.com/2009/04/tomcat_03.jpg?w=300" medium="image">
			<media:title type="html">tomcat_03</media:title>
		</media:content>

		<media:content url="http://openmes.files.wordpress.com/2009/04/tomcat_04.jpg?w=300" medium="image">
			<media:title type="html">tomcat_04</media:title>
		</media:content>
	</item>
		<item>
		<title>Berichte für lau</title>
		<link>http://openmes.wordpress.com/2009/04/09/berichte-fuer-lau/</link>
		<comments>http://openmes.wordpress.com/2009/04/09/berichte-fuer-lau/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 09:16:54 +0000</pubDate>
		<dc:creator>kaembe</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Reporting]]></category>
		<category><![CDATA[BIRT]]></category>
		<category><![CDATA[Eclipse]]></category>

		<guid isPermaLink="false">http://openmes.wordpress.com/?p=154</guid>
		<description><![CDATA[Freie Report-Tools gibt es einige, aber die meisten können nur einfache tabellarische Darstellungen. Excel-Anwender sind aber verwöhnt und möchten schicke Tabellen und dazu passende Grafiken schön seitenweise angeordnet haben. Warum auch nicht. Ob die Zahlen dau aus einer handgepflegten Tabelle kommen oder einer Datenbank sollte ja keinen Unterschied machen. Unser Tool sollte ausserdem eine einigermassen [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=154&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Freie Report-Tools gibt es einige, aber die meisten können nur einfache tabellarische Darstellungen. Excel-Anwender sind aber verwöhnt und möchten schicke Tabellen und dazu passende Grafiken schön seitenweise angeordnet haben. Warum auch nicht. Ob die Zahlen dau aus einer handgepflegten Tabelle kommen oder einer Datenbank sollte ja keinen Unterschied machen.</p>
<p>Unser Tool sollte ausserdem eine einigermassen zuverlässige Entwicklerbasis haben. Bei Open Source Software achte ich normalerweise darauf, ob noch regelmässig am Projekt gearbeitet wird und wie groß die Gruppe ist. Wenn es dann noch Teil eines größeren, aktiven Projekts ist, stehen die Chancen gut, dass es weiter gepflegt wird.</p>
<p>Für mich ist derzeit Eclipse BIRT das Reporting-Tool der Wahl. Eclipse ist ein sehr großes Open Source Projekt für eine Software-Entwicklungsumgebung. Es besteht aus einer Basis-Oberfläche, die mit Plug-Ins und Add-Ons erweitert werden kann. Man kann nicht nur in Java, C/C++ oder PHP programmieren, sondern eben auch mit dem BIRT-Plug-In Reports erstellen oder mit dem BPEL-Plug-In Business-Prozesse modellieren.</p>
<p>Eclipse läuft auf allen gängigen Plattformen, die eine Java Runtime-Umgebung bieten. Es besteht zum einen aus dem Report-Designer, mit dem man Reports erstellen, testen und drucken kann, inklusive Export nach PDF, Excel und so weiter. Das reicht schon mal für Einzelanwender, die lokal für sich Berichte erstellen wollen.</p>
<p>Die zweite Komponente ist die Report-Engine, die in einem Java-Applikationsserver installiert wird. Damit kann man lokal erstellte Reports in einem Web-Portal bereitstellen. Beim Aufruf können sogar Parameter abgefragt werden. Den Abruf kann man natürlich auch automatisieren. Das werden wir uns zunutze machen, um zeitgesteuert Berichte zu erzeugen und zu versenden.</p>
<h3>Eclipse/BIRT installieren</h3>
<p>Für Windows-Anwender ist die einfachste Art der direkte Download von der Projektseite http://download.eclipse.org/birt/downloads/ und dort den Button &#8222;All-In-One&#8220;. Die Zip-Datei packt man in ein neues Verzeichnis irgendwo auf der Platte aus. Das ist alles. Die Datei eclipse.exe kann direkt gestartet werden.</p>
<p>Wer nicht auf Windows arbeitet findet unter &#8222;More Downloads&#8220; auch eine Version für Linux und den BIRT Report-Designer als Plug-In für eine vorhandene Eclipse-Umgebung. Wie man das Plug-In installiert steht unter <a href="http://www.eclipse.org/birt/phoenix/build/#updating" target="_blank">http://www.eclipse.org/birt/phoenix/build/#updating</a></p>
<h3>Kontakt zur Datenbank</h3>
<p>Für die Verbindung zu unserer MySQL-Datenbank benötigen wir noch einen JDBC-Treiber. Den gibt es bei MySQL.com unter dem Namen &#8222;MySQL Connector/J&#8220; auf der <a href="http://dev.mysql.com/downloads/" target="_blank">MySQL-Downloadseite</a>. Windows-User laden am besten die Zip-Version. Aus diesem Archiv kopieren wir die Datei mysql-connector-java-5.1.6-bin.jar (oder die gerade aktuelle Version) erst mal in das Eclipse-Verzeichnis. Sie wird später bei unserem ersten Report integriert.</p>
<h3>Erststart, Datenquelle und erster Report</h3>
<p>Ziel des ersten Berichts ist eine Wochenübersicht ausgewählter Messwerte als Kreuztabelle und Grafik. Die Kreuztabelle soll die Namen der Messstellen zeilenweise auflisten und das Tagesdatum als Spalten. Zeilen- und Spaltensummen sind selbstverständlich. Die Grafik soll für jeden Tag der Woche die Tageswerte der Messstellen übereinander gestapelt anzeigen. Los geht&#8217;s:</p>
<ul>
<li>Eclipse.exe starten</li>
<li>Workspace auswählen, optional: Neuen Ordner anlegen (empfohlen)</li>
<li>Für Erstanwender ist es auch empfehelnswert, den &#8222;Overview&#8220; anzugucken</li>
<li>Danach &#8222;To Workbench&#8220; &#8211; Zur Arbeitsumgebung</li>
<li>Zuerst ein neues Projekt anlegen: File / New / Project&#8230; / Business Intelligence and Reporting Tools / Report Project. Name &#8222;KPI&#8220;.</li>
<li>Eclipse fragt, ob es die Oberfläche entsprechend anpassen soll: &#8222;Open Perspective?&#8220;; ja, das ist eine gute Idee.</li>
<li>Im neuen Projekt einen neuen Report anlegen: File / New / Report;Parent Folder: KPI;File name: &#8222;kpi-report1.rptdesign&#8220;;Type of Report: &#8222;Blank Report&#8220;</li>
</ul>
<h3>Datenquellen</h3>
<p>Um echte Daten in den Report einzufügen brauchen wir mindestens eine Datenquelle (Data Source). Das ist bei uns unsere MES-Datenbank. Das Hinzufügen geht so: Data / New Data Source / Create from a data source in the following list / JDBC Data Source. Data source name: &#8222;KPI&#8220;. Der Name ist willkürlich.</p>
<p>Jetzt wird einmalig der MySQL-Datenbank-Treiber mit BIRT verbunden: &#8222;Manage Drivers&#8230;&#8220; / Tab &#8222;JAR Files&#8220; / &#8222;Add&#8230;&#8220;. Wenn der mysql-driver im Eclipse-Verzeichnis liegt, steht er in der Liste. Einfach auswählen und Okay klicken.</p>
<p>Weiter mit der Definition der Datenquelle:</p>
<ul>
<li> Zurück in &#8222;Create a new data source. Driver class: &#8222;com.mysql.jdbc.Driver (v5.1)&#8220; wählen, das ist der eben hinzugefügte Treiber</li>
<li> Die Driver URL enthält Verbindungstyp, Datenbanktyp und die Verbindungsparameter nach dem Schema: &#8222;jdbc:mysql://[host][,failoverhost...][:port]/[database]&#8222;. Bei lokaler Datenbank kann man das meiste weglassen: &#8222;jdbc:mysql:///mes&#8220;, wobei &#8222;mes&#8220; der Datenbankname in MySQL ist. Näheres steht in der <a href="http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-configuration-properties.html" target="_blank">Dokumentation zum Treiber</a> unter http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-configuration-properties.html</li>
<li> Zum Schluss: Username und Passwort eingeben und Finish klicken</li>
</ul>
<h3>Data Set</h3>
<p>Zur Datenquelle können wir jetzt Data Sets anlegen. Data Sets sind entweder einzelne Abfragen aus genau einer Datenquelle oder ein &#8222;Joint Data Set&#8220; aus zwei verschiedenen Datenquellen.</p>
<ul>
<li> Data / New Data Set / New Data Set.</li>
<li> Data Source Selection: &#8222;KPI&#8220;.</li>
<li> Data Set Type: &#8222;SQL Select Query&#8220;.</li>
<li> Data Set Name: &#8222;Wasser&#8220;.</li>
<li> Als Query nehmen wir die &#8222;Daten der letzten Woche&#8220;:<br />
<blockquote><p><code>select * from tagvalues v<br />
join tagequipment e on v.tagname = e.tagname<br />
where e.eqpath = 'Wasser/STW/Verbraucher/Sekundär'<br />
and v.time like '____-__-__'<br />
and v.time between from_days(to_days(now()) - (7 + weekday(now()))) and from_days(to_days(now()) - (1 + weekday(now())))</code></p></blockquote>
</li>
<li>Weil Zeitangaben und Messwerte als Strings aus der Datenbank kommen, legen wir Computed Columns an, die in den passenden Datentyp wandeln:<br />
Column Name: Datum; Data Type: Date; Expression: row["time"]<br />
Column Name: Wert; Data Type: Float; Expression: Math.round(new Number(row["value"]))<br />
<a href="http://openmes.files.wordpress.com/2009/04/crosstab-reports_10.jpg"><img class="alignnone size-medium wp-image-190" title="crosstab-reports_10" src="http://openmes.files.wordpress.com/2009/04/crosstab-reports_10.jpg?w=300&#038;h=113" alt="crosstab-reports_10" width="300" height="113" /></a></li>
<li>Preview Results</li>
</ul>
<p>Statt der Computed Columns hätten wir auch in der SQL-Abfrage selbst die passenden Typen durch MySQL-Funktionen herstellen können. Das ist weitgehend Geschmackssache. Geschwindigkeitsunterschiede habe ich noch nicht getestet.</p>
<h3>Daten für Kreuztabelle anlegen</h3>
<p>Für die Kreuztabelle benötigen wir einen Data Cube. Cube deshalb, weil er im Gegensatz zu einer einfachen Tabelle, wie sie aus der SQL-Abfrage kommt, die Werte (&#8222;measures&#8220;) über mehrere sogenannte Dimensions in Beziehung setzt. Dimensions spannen sozusagen Koordinatensysteme auf, in deren Kreuzungspunkten die jeweiligen Werte stehen. Bei zwei Dimensions &#8211; Name der Messstelle und Tagesdatum &#8211; ist der Cube eine Kreuztabelle. Näheres zu Data Cubes steht zum Beispiel in der Wikipedia unter <a href="http://de.wikipedia.org/wiki/Cube_(OLAP)" target="_blank">Cube_(OLAP)</a>.</p>
<ul>
<li>Im Outline oder Data Explorer bei Data Cubes rechts klicken und &#8222;New Data Cube&#8220; wählen.<br />
Der Name soll &#8222;WasserCube&#8220; sein.<br />
Mit Rechtsklick auf &#8222;WasserCube&#8220; und &#8222;Edit&#8220; die Einstellungen öffnen</li>
<li> Als Dataset &#8222;Wasser&#8220; wählen.</li>
<li> Bei Groups and Summaries werden die Dimensionen und Measures festgelegt</li>
<li> Feld &#8222;Datum&#8220; in die Groups ziehen (&#8222;Drop a field here to create a group&#8220;), um eine Group bzw. Dimension zu erzeugen</li>
<li> Feld &#8222;eqproperty&#8220; ebenso erzeugt eine zweite Gruppe mit den Namen der Messstellen</li>
<li> Feld &#8222;Wert&#8220; in die Summaries ziehen</li>
</ul>
<p>Der Data Explorer (linke Spalte) sollte so aussehen: <img src="http://openmes.files.wordpress.com/2009/04/crosstab-reports_15.jpg?w=450" alt="" /></p>
<h3>Crosstab (Pivot-Tabelle) anlegen</h3>
<p>Jetzt kann die eigentliche Kreuztabelle angelegt werden.</p>
<ul>
<li> Im Hauptfenster den Tab Layout anwählen. Hier wird der Bericht entworfen</li>
<li>Aus der Palette eine Crosstab auf die Fläche ziehen</li>
<li> Im Data Explorer den WasserCube ausklappen und die Group mit eqproperty in die linke Zelle ziehen (&#8222;&#8230; to define rows here&#8220;).</li>
<li> Desgleichen die Group mit time in die obere Zelle ziehen (&#8222;&#8230; to define columns here&#8220;).</li>
<li> Summary Field1 aus WasserCube in das Summenfeld ziehen (&#8222;&#8230; to be summarized here&#8220;).</li>
</ul>
<p>Das Ergebnis können wir sofort testen durch einen Klick auf den Tab Preview oder über das Menü mit Run / View Report / as PDF<br />
Im Detail können noch sehr viele Einstellungen optimiert werden.</p>
<h3>Chart anlegen</h3>
<p>Charts zu erzeugen funktioniert ebenso wie bei der Kreuztabelle. Das Tagesdatum &#8211; Spalte &#8222;Datum&#8220; &#8211; wird auf die X-Achse gestellt, die Messwerte auf die Y-Achse. Die Stapelung der Werte pro Tag wird durch Gruppierung nach den Namen der Messstellen erreicht.</p>
<ul>
<li>Layout anklicken und aus der Palette ein Chart auf die Fläche ziehen.</li>
<li>Rechtsklick auf das Chart im Layout für die Einstellung der Parameter.</li>
<li> Chart-Typ: Gestapelt</li>
</ul>
<p><a href="http://openmes.files.wordpress.com/2009/04/crosstab-reports_111.jpg"><img class="alignnone size-medium wp-image-166" title="crosstab-reports_111" src="http://openmes.files.wordpress.com/2009/04/crosstab-reports_111.jpg?w=289&#038;h=300" alt="crosstab-reports_111" width="289" height="300" /></a></p>
<ul>
<li> Select Data:</li>
<li> Use Data from: &#8222;Data Source Wasser&#8220;</li>
<li> Value Series: Spalte &#8222;Wert&#8220; ins Feld ziehen</li>
<li> Category Series: Spalte &#8222;Datum&#8220; ins Feld ziehen</li>
<li> Y Series Grouping: Spalte &#8222;eqproperty&#8220; ins Feld ziehen</li>
</ul>
<p><a href="http://openmes.files.wordpress.com/2009/04/crosstab-reports_12.jpg"><img class="alignnone size-medium wp-image-164" title="crosstab-reports_12" src="http://openmes.files.wordpress.com/2009/04/crosstab-reports_12.jpg?w=300&#038;h=275" alt="crosstab-reports_12" width="300" height="275" /></a></p>
<ul>
<li> Format Chart: Achsenbeschriftungen einstellen, X-Axis, Format Datum</li>
</ul>
<p><a href="http://openmes.files.wordpress.com/2009/04/crosstab-reports_09.jpg"><img class="alignnone size-medium wp-image-168" title="crosstab-reports_09" src="http://openmes.files.wordpress.com/2009/04/crosstab-reports_09.jpg?w=300&#038;h=277" alt="crosstab-reports_09" width="300" height="277" /></a></p>
<p>Fertig. Den ganzen Report mit Tabelle und Grafik sehen wir durch einen Klick auf Preview oder Run / View Report / as PDF. Meinen habe ich hier etwas unkenntlich gemacht, weil ja Originaldaten drin sind.</p>
<p><a href="http://openmes.files.wordpress.com/2009/04/crosstab-reports_141.jpg"><img class="alignnone size-medium wp-image-199" title="crosstab-reports_141" src="http://openmes.files.wordpress.com/2009/04/crosstab-reports_141.jpg?w=364&#038;h=758" alt="crosstab-reports_141" width="364" height="758" /></a></p>
<br />Veröffentlicht in Allgemein, Reporting Tagged: BIRT, Eclipse, Reporting <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/openmes.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/openmes.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/openmes.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/openmes.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/openmes.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/openmes.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/openmes.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/openmes.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/openmes.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/openmes.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/openmes.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/openmes.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/openmes.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/openmes.wordpress.com/154/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=154&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://openmes.wordpress.com/2009/04/09/berichte-fuer-lau/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">kaembe</media:title>
		</media:content>

		<media:content url="http://openmes.files.wordpress.com/2009/04/crosstab-reports_10.jpg?w=300" medium="image">
			<media:title type="html">crosstab-reports_10</media:title>
		</media:content>

		<media:content url="http://openmes.files.wordpress.com/2009/04/crosstab-reports_15.jpg" medium="image" />

		<media:content url="http://openmes.files.wordpress.com/2009/04/crosstab-reports_111.jpg?w=289" medium="image">
			<media:title type="html">crosstab-reports_111</media:title>
		</media:content>

		<media:content url="http://openmes.files.wordpress.com/2009/04/crosstab-reports_12.jpg?w=300" medium="image">
			<media:title type="html">crosstab-reports_12</media:title>
		</media:content>

		<media:content url="http://openmes.files.wordpress.com/2009/04/crosstab-reports_09.jpg?w=300" medium="image">
			<media:title type="html">crosstab-reports_09</media:title>
		</media:content>

		<media:content url="http://openmes.files.wordpress.com/2009/04/crosstab-reports_141.jpg?w=144" medium="image">
			<media:title type="html">crosstab-reports_141</media:title>
		</media:content>
	</item>
		<item>
		<title>Datenpunkt-Tabellen und SQL für das KPI- und Verbrauchsdatenarchiv</title>
		<link>http://openmes.wordpress.com/2009/04/07/datenpunkt-tabellen-und-sql-fur-das-kpi-und-verbrauchsdatenarchiv/</link>
		<comments>http://openmes.wordpress.com/2009/04/07/datenpunkt-tabellen-und-sql-fur-das-kpi-und-verbrauchsdatenarchiv/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 09:12:20 +0000</pubDate>
		<dc:creator>kaembe</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Reporting]]></category>
		<category><![CDATA[KPI]]></category>
		<category><![CDATA[Produktionsdaten]]></category>

		<guid isPermaLink="false">http://openmes.wordpress.com/?p=174</guid>
		<description><![CDATA[Wie sieht die Datenbank für das Verbrauchszahlen-Archiv aus? Zuerst die Tabelle mit den eigentlichen Werten. CREATE TABLE  TagValues ( tagname varchar(128) NOT NULL, -- Name des Datenpunktes time varchar(20) NOT NULL, -- Zeit als String timetype varchar(10),  -- Zeitliche Auflösung value varchar(50) NOT NULL, -- Wert PRIMARY KEY  (tagname,time,timetype), KEY tagvalue_time (time,timetype) ); Alles Strings? [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=174&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Wie sieht die Datenbank für das Verbrauchszahlen-Archiv aus? Zuerst die Tabelle mit den eigentlichen Werten.</p>
<blockquote><p><code>CREATE TABLE  TagValues<br />
(<br />
tagname varchar(128) NOT NULL, -- Name des Datenpunktes<br />
time varchar(20) NOT NULL, -- Zeit als String<br />
timetype varchar(10),  -- Zeitliche Auflösung<br />
value varchar(50) NOT NULL, -- Wert<br />
PRIMARY KEY  (tagname,time,timetype),<br />
KEY tagvalue_time (time,timetype)<br />
);</code></p></blockquote>
<p>Alles Strings? Bei MySQL als Datenbank und PHP als Skriptsprache ja, denn da ist die Konvertierung einfach. Der Speicherplatz stellt bei der Anzahl der Zeilen auch kein gravierendes Problem dar. Man gewinnt aber eine Menge Komfort bei den Abfragen aus dem Report-Tool. Der Trick steckt ausserdem in der Kodierung der Zeit als ISO-8601-String, siehe <a href="http://openmes.wordpress.com/2009/03/04/111/" target="_blank">[ISO-Zeitkodierung]</a>.</p>
<p>Die Felder im Einzelnen:</p>
<ul>
<li>tagname &#8211; der Name des Datenpunktes. Wir genehmigen uns ausreichend Platz für sprechende Namen, auch wenn wir gleich noch weitere Ordnungsmerkmale einführen.</li>
<li>time &#8211; Zeitstempel in ISO-8601-Schreibweise.</li>
<li>timetype &#8211; Zeitintervall des Werts. Ich verwende einfach die Buchstaben der PHP date()-Funktion, also zum Beispiel d = Tageswert, m = Monatswert, H = Stundenwert, usw. Man braucht dieses Feld nicht unbedingt, wenn man einen Mustervergleich mit like auf das Feld time einfügt. Aber die Abfrage auf &#8222;timetype=&#8217;d'&#8220; ist schneller und übersichtlicher.</li>
<li>value &#8211; der eigentliche Wert. Bei Fliesskommawerten muss auf Punkt statt Komma für die Dezimalstellen geachtet werden, dann kann MySQL mit den Werten sofort rechnen. Genauer: Ein Komma in einer Zahl beendet die Zahl. Für MySQL ist &#8217;2,5&#8242; = 2, aber &#8217;2.5&#8242; bleibt beim Rechnen zweieinhalb.</li>
</ul>
<p>Wie groß kann die Wertetabelle werden? Das wurde in <a href="http://openmes.wordpress.com/2008/12/18/wieviel-reporting-braucht-der-mensch-teil-ii/" target="_blank">http://openmes.wordpress.com/2008/12/18/wieviel-reporting-braucht-der-mensch-teil-ii/</a> schon mal ausgerechnet: Bei 400 Datenpunkten mit den Auflösungen Tag, Woche, Monat, Jahr insgesamt 172.800 Werte pro Jahr. Für meine Experimente nehme ich fast das 40-fache: 1000 Datenpunkte, 3 Jahre. Macht: 432*1000*3 = 1.296.000 Zeilen. Durchschnittliche Zeilenlänge ist 52 Byte, also ist eine Gesamtgröße der Tabelle von ungefähr 67,4MB zu erwarten.</p>
<p>Die größten Kosten der Abfragen werden in der Selektion der gewünschten Werte liegen, weil wir ja die Werte aller Datenpunkte und ihrer Intervalle in eine Tabelle packen. Die Wochenwerte des vergangenen Jahres für 10 bestimmte Datenpunkte sind 53*10 = 530 Werte aus 1,3 Mio. Zeilen. Daher der Index, der timetype und time kombinieren.</p>
<p>Kritisierbar ist natürlich, bei jedem Wert den Tagname als String abzuspeichern, weil er meistens mehrfach mehr Speicherplatz benötigen wird als der eigentliche Wert. Normalerweise würde man eine Beschreibungstabelle für Datenpunkte erstellen und jedem Datenpunkt eine eindeutige ID zuordnen. Kann man machen, wenn man das will. Vorteil der String-Methode ist jedoch, dass die Tabelle auch für sich alleine funktioniert, zum Beispiel auch nach dem Export nach Excel oder CSV. Die Definitionstabelle machen wir jedoch trotzdem.</p>
<blockquote><p><code>CREATE TABLE  TagDefs<br />
(<br />
tagid int(10) unsigned NOT NULL auto_increment,<br />
tagname varchar(128) NOT NULL,<br />
physunit varchar(25),<br />
description varchar(25),<br />
label varchar(128),<br />
PRIMARY KEY  USING BTREE (tagid,tagname)<br />
);</code></p></blockquote>
<p>Hier spendieren wir eine Unique ID, schaden kann&#8217;s nicht. Ausserdem hinterlegen wir die physikalische Einheit der Messwerte und einen Beschreibungstext, der zum Beispiel den Ort des Messgebers enthält oder eine innerbetriebliche Referenznummer. Das Label hingegen soll der Text sein, der zu diesem Datenpunkt in Reports angezeigt wird.</p>
<p>Für kleinere Anwendungen dürften diese zusätzlichen Attribute zu Tags ausreichend sein. Wenn man aber die gleichen Messwerte aus unterschiedlichen Perspektiven zusammenstellen möchte braucht es meist mehr Ordnungskriterien, die man in den Berichten zur Selektion benutzen kann.</p>
<p>Exkurs:<br />
<blockquote>Equipment und Properties. Die meisten MES-Pakete lehnen sich an die ISA-S95 an, die eine Produktionslandschaft in eine bestimmte Hierarchie aufteilt, genannt Enterprise / Site / Area / Cell / Unit. Eine vollständige Angabe von Enterprise bis Unit nennt sich Equipmentpath und bezeichnet eine einzelne Produktionseinheit. Equipmentpfade werden in der Regel durch &#8216;/&#8217; oder &#8216;.&#8217; getrennt. &#8222;Hummel-Honig/Werk_Hintersen/Bereich_Hinten/Abfüllung_1/Füller_3&#8243; wäre ein vollständiger Equipmentpfad zu einem Objekt &#8222;Füller 3&#8243;.</p>
<p>Jedem so beschriebenen Objekt können Properties &#8211; Eigenschaften bzw Attribute &#8211; zugeordnet werden. Das gilt auch für Zwischenebenen wie eine Area oder Site. Properties werden dann mit realen Datenpunkten verknüpft. Zum Beispiel wäre die aktuelle Auftragsnummer am &#8222;Füller 3&#8243; eine Property dieser Unit.</p></blockquote>
<p>Ende Exkurs.</p>
<p>Energie- und Verbrauchsdaten stehen allerdings etwas quer zur S95-Struktur, weil viele ihrer Elemente nicht direkt Teil der Produktion sondern der Infrastruktur sind: Trafos, Lüfter, Brauchwasserleitungen, usw. Deshalb erlauben wir, dass jedem Datenpunkt mehrere Equipmentpfade und Properties zugeordnet werden können. Nur die Kombination Pfad+Property muss unique sein.</p>
<blockquote><p><code>CREATE TABLE  TagEquipment<br />
(<br />
tagname varchar(128) NOT NULL,<br />
eqpath varchar(255) NOT NULL,<br />
eqproperty varchar(128) NOT NULL,<br />
description varchar(255),<br />
label varchar(128),<br />
PRIMARY KEY  (eqpath,eqproperty)<br />
);</code></p></blockquote>
<p>Wie bei der Tagdefinition erlauben wir pro Satz je einen beschreibenden Text und ein Label für die Anzeige.</p>
<p>Jetzt können wir zusätzlich zu den durch die Produktion definierten Equipmentpfaden zusätzliche Ordnungen über unsere Fabrik legen. Zum Beispiel könnte &#8222;Hummel-Honig/Werk_Hintersen/Wasser/Entsorgung/Abwasser&#8220; das Selektionskriterium für alle Abwassermessungen sein. Wir sind aber nicht an die Site/Area/Cell/Unit-Struktur gebunden, sondern können den Pfad beliebig verkürzen oder erweitern. Beispiel: &#8222;Wasser/Entsorgung/Abwasser&#8220; wird als Prefix in allen Pfaden verwendet, die Abwasser messen. Beim Füller 3 von oben wird auch Abwasser gemessen. Der Equipmentpfad könnte also zum Beispiel &#8222;Wasser/Entsorgung/Abwasser/Abfüllung_1&#8243; sein und die Property &#8222;Füller_3&#8243;. Ob man Enterprise und Site vorschaltet hängt davon ab, ob man tatsächlich Werte aus mehreren Werken in der gleichen Datenbank hat.</p>
<p>Welche Abfragen sind dadurch möglich?</p>
<p>Zum Beispiel &#8222;alle Abwasser-Messwerte im ganzen Werk&#8220;:<br />
<blockquote><code>"select * from tagequipment where eqpath like 'Wasser/Entsorgung/Abwasser/%'"</code></p></blockquote>
<p>Oder &#8222;alle Wasser-Messwerte von Füller 3&#8243;:<br />
<blockquote><code>"select * from tagequipment where eqpath like 'Wasser/%' and property = 'Füller_3'"</code></p></blockquote>
<p>Wie man sieht, muss man nur aufpassen, Füller 3 auch jedes Mal gleich zu benennen. Die Definitionen, Bezeichnungen, Pfade und so weiter für ein paar hundert Datenpunkte konsistent zu halten ist eine friemelige Arbeit, die häufig in großen Excel-Tabellen endet.</p>
<p>Wir können aber auch Konsistenzprüfungen auf unserer Datenbank durchführen. Zum Beispiel: Sind für alle Tags Definitionen verfügbar? <code>"select distinct tagname from tagvalues where tagname not in (select tagname from tagdefs)"</code></p></blockquote>
<p> Das geht genauso für Equipments.</p>
<p>Mit diesen Definitionen erzeugen wir eine Datenbank mit Testdaten. Ich nehme mir einfach meine echten Kundendaten, aber genauso gut kann man Zufallszahlen durch ein Skript erzeugen lassen.</p>
<p>Im nächsten Teil geht es dann endlich ums das Reporting selbst: <a href="http://openmes.wordpress.com/2009/04/04/berichte-fuer-lau/" target="_blank">Berichte für lau</a> &#8211; Reporting mit BIRT</p>
<br />Veröffentlicht in Allgemein, Reporting Tagged: KPI, Produktionsdaten, Reporting <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/openmes.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/openmes.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/openmes.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/openmes.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/openmes.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/openmes.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/openmes.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/openmes.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/openmes.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/openmes.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/openmes.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/openmes.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/openmes.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/openmes.wordpress.com/174/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=174&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://openmes.wordpress.com/2009/04/07/datenpunkt-tabellen-und-sql-fur-das-kpi-und-verbrauchsdatenarchiv/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">kaembe</media:title>
		</media:content>
	</item>
		<item>
		<title>KPI- und Verbrauchsdaten-Archiv, eine Alternativlösung</title>
		<link>http://openmes.wordpress.com/2009/04/04/kpi-und-verbrauchsdaten-archiv-eine-alternativlosung/</link>
		<comments>http://openmes.wordpress.com/2009/04/04/kpi-und-verbrauchsdaten-archiv-eine-alternativlosung/#comments</comments>
		<pubDate>Sat, 04 Apr 2009 16:11:35 +0000</pubDate>
		<dc:creator>kaembe</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Reporting]]></category>
		<category><![CDATA[KPI]]></category>
		<category><![CDATA[Produktionsdaten]]></category>

		<guid isPermaLink="false">http://openmes.wordpress.com/?p=171</guid>
		<description><![CDATA[Nachdem ein größeres Historian/Reporting-Projekt mit Energie- und Verbrauchsdaten weitgehend abgeschlossen ist, sind doch einige Knackpunkte überdenkenswert. Zunächst: In dem Projekt werden aus einer kompletten Fabrik ca. 400 Datenpunkte aufgezeichnet aus den Bereichen Strom, Wasser, (Erd)Gas, daraus erzeugter Dampf, Kondensat, Druckluft und CO2. Die Rohdaten &#8211; minütliche Aufzeichnung &#8211; werden täglich zu Tages-, Wochen- und Monatssummen [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=171&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Nachdem ein größeres Historian/Reporting-Projekt mit Energie- und Verbrauchsdaten weitgehend abgeschlossen ist, sind doch einige Knackpunkte überdenkenswert.<br />
Zunächst: In dem Projekt werden aus einer kompletten Fabrik ca. 400 Datenpunkte aufgezeichnet aus den Bereichen Strom, Wasser, (Erd)Gas, daraus erzeugter Dampf, Kondensat, Druckluft und CO2. Die Rohdaten &#8211; minütliche Aufzeichnung &#8211; werden täglich zu Tages-, Wochen- und Monatssummen verdichtet. Aus den Summen werden täglich / wöchentlich / monatlich Berichte erzeugt und als PDFs verschickt.<br />
Das ganze wurde mit einem recht hochpreisigen, proprietären Produkt realisiert, wobei man ehrlicherweise sagen muss, dass für den Kunden nur ein &#8222;Markenprodukt&#8220; mit entsprechend breitem und tiefem Support in Frage kam. Konzerne denken so.<br />
Abgesehen davon, dass die Aufgabe natürlich mit dem &#8222;Markenprodukt&#8220; gelöst werden konnte, gab es schon einige Probleme damit, namentlich:</p>
<ul>
<li>Die Installation war aufwändig, kompliziert und ohne spezielle &#8222;unter der Hand&#8220;-Doku nicht zu bewerkstelligen.</li>
<li>Das Webportal läuft nur mit IIS, der wirklich nicht easy zu administrieren ist.</li>
<li>Die Software kann sehr viel mehr als was benötigt wurde. Diese Über-Features erzeugten zusätzlichen Arbeitsaufwand.</li>
<li>Das Reporting ist eigentlich sehr komfortabel (Abfragen aus Objektbaum zusammenklicken), aber die Implementation des Objektverzeichnisses (SQL-Makro-Ersetzung) führt zu sehr langwierigen Abfragen (bis über 10 Minuten Laufzeit).</li>
<li>Alle Daten (Rohdaten und verdichtete) sind in einem Topf, der damit sehr groß und unübersichtlich wird.</li>
<li>Die Datenaufzeichnung und das Reporting haben unterschiedliche Vorstellung von Zeitstempeln und UTC, was bei Sommerzeit und Jahreswechseln zu Problemen führte, die in der Zwischenschicht gelöst werden mussten.</li>
</ul>
<p>Aber kann man die Aufgabe auch anders lösen? Mit freier Software, weniger Aufwand und weniger Problemen mit den riesigen Paketen? Ich wünsche mir:</p>
<ul>
<li>Ein schlankes System, das einfach zu installieren und zu administrieren ist.</li>
<li>Möglichst große Unabhängigkeit von Betriebssystem-Features oder bestimmten Releases eines Betriebssystems</li>
<li>Schnelle Abfragen und Auswertungen</li>
<li>Trennung zwischen Rohdatenaufzeichnung und verdichteten Daten</li>
<li>Sinnvolle Datums- und Zeitstempel, die für Abfragen in den Reports geeignet sind.</li>
</ul>
<p>Lassen wir die Datenaufzeichnung erst mal weg und gehen auf das Reporting. Diese Teilaufgabe lautet: Aus einer Datenbank mit Tages/Wochen/Monatssummen werden automatisch und per Abfrage im Webportal Berichte erzeugt. Die automatisch erzeugten Berichte werden per Mail an verschiedene Empfänger verschickt. Wir brauchen also:</p>
<ul>
<li>Datenbank-Tabellen mit Definitionen der Datenpunkte und den Werten.</li>
<li>Reporting-Engine, webfähig</li>
<li>Report-Designer</li>
<li>Automatische Report-Erzeugung als PDF, zeitgesteuert</li>
<li>Mailversand für die erzeugten PDFs an verschiedene Adressen</li>
<li>Archiv für die erzeugten PDFs mit Auflistung und Ansicht/Download</li>
<li>Web-Portal für Report-Auswahl und Konfiguration des Mailversands</li>
</ul>
<p>Und eben mit freier Software, möglichst portabel und einfach zu realisieren.</p>
<p>Nächster Teil: <a href="http://openmes.wordpress.com/2009/04/07/datenpunkt-tabellen-und-sql-fur-das-kpi-und-verbrauchsdatenarchiv/">Datenpunkt-Tabellen und SQL für das KPI- und Verbrauchsdatenarchiv</a></p>
<br />Veröffentlicht in Allgemein, Reporting Tagged: KPI, Produktionsdaten, Reporting <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/openmes.wordpress.com/171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/openmes.wordpress.com/171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/openmes.wordpress.com/171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/openmes.wordpress.com/171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/openmes.wordpress.com/171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/openmes.wordpress.com/171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/openmes.wordpress.com/171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/openmes.wordpress.com/171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/openmes.wordpress.com/171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/openmes.wordpress.com/171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/openmes.wordpress.com/171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/openmes.wordpress.com/171/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/openmes.wordpress.com/171/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/openmes.wordpress.com/171/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=171&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://openmes.wordpress.com/2009/04/04/kpi-und-verbrauchsdaten-archiv-eine-alternativlosung/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">kaembe</media:title>
		</media:content>
	</item>
		<item>
		<title>The Cult of Done Manifesto</title>
		<link>http://openmes.wordpress.com/2009/03/05/the-cult-of-done-manifesto/</link>
		<comments>http://openmes.wordpress.com/2009/03/05/the-cult-of-done-manifesto/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 21:51:25 +0000</pubDate>
		<dc:creator>kaembe</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://openmes.wordpress.com/?p=142</guid>
		<description><![CDATA[Mal was leichtes zwischendurch. Nicht ganz ernst zu nehmen, wie ich finde, aber ein Erinnerle, wenn in ständig wiedergekäuten Besprechungen ausser noch mehr Powerpoints, noch mehr Papier und noch mehr heisser Luft nichts passiert, jedenfalls nichts produktives, zielführendes. Gefunden bei http://www.ikiw.org/2009/03/04/the-cult-of-done-manifesto/ The Cult of Done Manifesto by Bre Pettis and Kio Stark. They wrote it [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=142&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Mal was leichtes zwischendurch. Nicht ganz ernst zu nehmen, wie ich finde, aber ein Erinnerle, wenn in ständig wiedergekäuten Besprechungen ausser noch mehr Powerpoints, noch mehr Papier und noch mehr heisser Luft nichts passiert, jedenfalls nichts produktives, zielführendes. Gefunden bei <a href="http://www.ikiw.org/2009/03/04/the-cult-of-done-manifesto/">http://www.ikiw.org/2009/03/04/the-cult-of-done-manifesto/</a></p>
<hr />
The Cult of Done Manifesto by Bre Pettis and Kio Stark. They wrote it in 20 minutes, “because we only had 20 minutes to get it done.”</p>
<ol>
<li>There are three states of being. Not knowing, action and completion.</li>
<li>Accept that everything is a draft. It helps to get it done.</li>
<li>There is no editing stage.</li>
<li>Pretending you know what you’re doing is almost the same as knowing what you are doing, so just accept that you know what you’re doing even if you don’t and do it.</li>
<li>Banish procrastination. If you wait more than a week to get an idea done, abandon it.</li>
<li>The point of being done is not to finish but to get other things done.</li>
<li>Once you’re done you can throw it away.</li>
<li>Laugh at perfection. It’s boring and keeps you from being done.</li>
<li>People without dirty hands are wrong. Doing something makes you right.</li>
<li>Failure counts as done. So do mistakes.</li>
<li>Destruction is a variant of done.</li>
<li>If you have an idea and publish it on the internet, that counts as a ghost of done.</li>
<li>Done is the engine of more.</li>
</ol>
<hr />
Die symbolische Darstellung dazu versteht man meiner Ansicht nach nur, wenn man den jeweiligen Satz daneben legt.<br />
<img width="90%" height="90%" src="http://www.ikiw.org/wp-content/uploads/2009/03/3278109-2614641-thumbnail.jpg" alt="Cult of Done Manifesto" /></p>
<br />Veröffentlicht in Allgemein  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/openmes.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/openmes.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/openmes.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/openmes.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/openmes.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/openmes.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/openmes.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/openmes.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/openmes.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/openmes.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/openmes.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/openmes.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/openmes.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/openmes.wordpress.com/142/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=142&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://openmes.wordpress.com/2009/03/05/the-cult-of-done-manifesto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">kaembe</media:title>
		</media:content>

		<media:content url="http://www.ikiw.org/wp-content/uploads/2009/03/3278109-2614641-thumbnail.jpg" medium="image">
			<media:title type="html">Cult of Done Manifesto</media:title>
		</media:content>
	</item>
		<item>
		<title>Ein Hoch auf die ISO 8601</title>
		<link>http://openmes.wordpress.com/2009/03/04/111/</link>
		<comments>http://openmes.wordpress.com/2009/03/04/111/#comments</comments>
		<pubDate>Wed, 04 Mar 2009 19:55:15 +0000</pubDate>
		<dc:creator>kaembe</dc:creator>
				<category><![CDATA[Reporting]]></category>
		<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[Datumsformat]]></category>
		<category><![CDATA[Produktionsdaten]]></category>

		<guid isPermaLink="false">http://openmes.wordpress.com/?p=111</guid>
		<description><![CDATA[Immer Ärger mit der Zeit Immer wieder sollen Produktionsdaten zeitlich eingeordnet und in Berichten zusammengestellt werden. Das sind Verbrauchswerte oder erzeugte Produkte. Und immer wieder ist wenigstens für mich der Aufwand ärgerlich, mit Datum, Uhrzeit, Schichtmodellen, Sommer/Winterzeit und so weiter rumzurechnen, bzw. die Daten per SQL irgendwo herauszufischen. Die Ursache des Aufwands liegt für mich [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=111&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h3>Immer Ärger mit der Zeit</h3>
<p>Immer wieder sollen Produktionsdaten zeitlich eingeordnet und in Berichten zusammengestellt werden. Das sind Verbrauchswerte oder erzeugte Produkte. Und immer wieder ist wenigstens für mich der Aufwand ärgerlich, mit Datum, Uhrzeit, Schichtmodellen, Sommer/Winterzeit und so weiter rumzurechnen, bzw. die Daten per SQL irgendwo herauszufischen.</p>
<p>Die Ursache des Aufwands liegt für mich in der Genauigkeit. Der Datentyp Datetime oder auch die Unix time() ist immer bis auf die Sekunde genau. Aber welcher Zeitpunkt gilt für eine ganze Woche? 23:59:59 am Sonntag? 00:00:00 am Montag? Und wenn, wie beim Beispielkunden, die Woche von Sonntag bis Samstag geht und die Daten vom Werk in die Konzernzentrale in einer anderen Zeitzone berichtet werden? Gleiches gilt für Tage (Sommerzeit, Zeitzonen) und Monate.</p>
<p>Wenn ich einen Wochenwert abspeichern möchte, dann mit der Angabe Jahr-Woche. Schichtwerte mit der Angabe Jahr-Monat-Tag-Schicht, usw. Dann kann ich sie auch per SQL einfach selektieren.</p>
<p>Also wie geht das? Dafür gibt es die Schreibweisen der ISO-8601. Ausführliche Beschreibungen gibt es hinter den unten angegebenen Links. Für unsere Zwecke &#8211; Produktionsdaten mit Zeitangaben &#8211; reichen folgende Konventionen:</p>
<p><b>Tagesdatum: <code>&rsquo;YYYY-MM-DD&rsquo;</code></b> &#8211; Eigentlich <code>&rsquo;[YY]YY[-]MM[-]DD&rsquo;</code>, aber wenn man die &rsquo;-&rsquo; und oder das Jahrhundert weglässt, kann das in einem SQL-Query missverständlich werden. Also: <code>Jahr-Monat-Tag</code> immer mit 4-stelligem Jahr und &rsquo;-&rsquo; als Trenner.</p>
<p>Die Angaben können von rechts weggelassen werden: <code>YYYY-MM</code> = Monatswert, <code>YYYY</code> = Jahreswert.</p>
<p>Eine Erweiterung der ISO möchte ich mir herausnehmen: <code>&rsquo;YYYY-MM-DD"S"S&rsquo;</code> für die Schicht, zum Beispiel <code>2009-02-05S2</code> = Zweite Schicht am 5.2.2009. Richtig nett wird es nämlich, wenn man sekundengenaue Zeitstempel bei Schichtmodellen verwendet. Dann muss man sämtliche Schichtmodelle archivieren, um vor der eigentlichen Abfrage herauszufinden, welches Schichtmodell an welchem Tag gültig war. Die Beantwortung der Frage, wie hoch die Ausschussrate in allen ersten Schichten der vergangenen 12 Monate war ist damit nicht mehr trivial: Sonderschichten,  Sommer/Winterzeit, ausgefallene Schichten (&#8222;Montags fangen wir immer erst zur Spätschicht an&#8220;), usw.</p>
<p><b>Wochendatum <code>&rsquo;YYYY-"W"WW[-D]&rsquo;</code></b> &#8211; Das ist eine Kalenderwoche mit optionalem Tag in der Woche. Beispiel: <code>2009-W07</code> = Kalenderwoche 7 in 2009 oder <code>2009-W07-3</code> = Der dritte Tag in KW7 in 2009. Dabei ist die ISO-Kalenderwoche sehr genau definiert; Montag &#8211; Sonntag, erste Kalenderwoche ist die mit mindestens 4 Tagen. Das kollidiert allerdings manchmal mit der Arbeitswoche einiger Firmen.</p>
<p>Die Wochentagskodierung mit angehängtem -D zu verwenden sollte man sich gut überlegen. Hier ist die Umrechnung oder der Vergleich mit den anderen Tages-Kodierungen wie <code>YYYY-MM-DD</code> oder <code>YYYY-DDD</code> nicht so einfach. Am besten verwendet man so häufig wie möglich die gleiche Kodierung, um sich Umrechnungen und kombinierte Abfragen (UNION) zu sparen.</p>
<p><b>Uhrzeiten <code>&rsquo;HH[:MM[:SS]]&rsquo;</code></b> &#8211; Uhrzeiten können laut ISO mit einem Leerzeichen oder &#8222;T&#8220;  dazwischen an jedes Tagesdatum angehängt werden. Wieder kann von rechts weggelassen werden: <code>HH:MM</code> = Minute, <code>HH</code> = Stunde.</p>
<p><b>Zeitspannen, &#8222;P&#8220;</b> &#8211; Zwei Datum/Zeitangaben können laut ISO mit einem &#8222;P&#8220; kombiniert werden, um die Zeitspanne zwischen ihnen zu kodieren. Beispiele: <code>2000P2008</code> = Jahre 2000 bis 2008, <code>2007-01P2007-03</code> = Erstes Quartal 2007, <code>2008-W10P2008-W19</code> = Wochen 10-19 in 2008 komplett.</p>
<p>Als Zeitangabe in einer Datenbank ist mir das noch nicht begegnet. Ich würde es auf den ersten Blick auch ungern verwenden, weil ungeschickte Abfragen mit Mustervergleichen versehentlich auch diese Werte liefern könnten.</p>
<h3>SQL-Abfragen für ISO-8601 Datums- und Zeitangaben</h3>
<p>Wenn wir jetzt eine große Tabelle mit gemischten Datumswerten haben, zum Beispiel meine geliebten Energie- und Verbrauchszahlen als Tages-, Wochen- und Monatssummen; wie kriegen wir dann die gewünschten Daten heraus? Das hängt von der verwendeten Datenbank ab.</p>
<p>Am komfortabelsten ist MySQL, weil es automatisch von String in Datum umrechnet. Wir nehmen eine Tabelle mit den Spalten tagname, zeit und wert. Zeit ist als <code>varchar()</code> definiert und kann alle oben angegebene Datumsformate enthalten.</p>
<p><strong>Beispiele:</strong></p>
<p>(1) Alle Tageswerte der letzten sieben Tage:<br />
<blockquote><code>select * from isozeit<br />
where zeit like &rsquo;____-__-__&rsquo;<br />
and zeit &gt; subdate(now(), interval 7 day)<br />
</code></p></blockquote>
<p>Der Mustervergleich <code>&rsquo;____-__-__&rsquo;</code> selektiert das Tagesformat, das nach obigen Konventionen eindeutig ist. Deshalb die Pflicht, den &rsquo;-&rsquo; zwischen die Felder zu schreiben.</p>
<p>(2) Wochenwerte dieses Jahres:<br />
<blockquote><code>select * from isozeit<br />
where zeit like concat(year(now()), &rsquo;-W__&rsquo;)</code></p></blockquote>
<p> Die Abfrage ist sicher, weil sie optional angehängte Wochentage (&rsquo;-D&rsquo;) ausblendet.</p>
<p>(3) Werte mehrerer Wochen, z.B. Woche 10-19, wie oben erwähnt:<br />
<blockquote><code>select * from isozeit<br />
where time like &rsquo;____-W__&rsquo;<br />
and zeit between concat(year(now()), &rsquo;-W10&rsquo;) and concat(year(now()), &rsquo;-W19&rsquo;)</code></p></blockquote>
<p> Die Wochennummern kann man natürlich auch relativ berechnen. Leider ist das &#8222;-W&#8220; im between-Teil allein nicht ausreichend, um angehängte Wochentage auszuschliessen, daher das zusätzliche <code>like &rsquo;____-W__&rsquo;</code>.</p>
<p>(4) Wochenwerte der vergangenen Woche:<br />
<blockquote><code>select * from isozeit<br />
where zeit = date_format(subdate(now(), interval 1 week), &rsquo;%x-W%v&rsquo;)</code></p></blockquote>
<p> Hier glänzt MySQL richtig. Date_format() kann nämlich verschiedene Wochenzählweisen und liefert dann Jahr und Woche entsprechend.</p>
<p>Beispiel:<br />
<blockquote><code>select date_format(&rsquo;2008-12-31&rsquo;, &rsquo;%x-W%v&rsquo;), date_format(&rsquo;2009-01-01&rsquo;, &rsquo;%x-W%v&rsquo;),<br />
date_format(&rsquo;2008-12-31&rsquo;, &rsquo;%X-W%V&rsquo;), date_format(&rsquo;2009-01-01&rsquo;, &rsquo;%X-W%V&rsquo;)</code></p></blockquote>
<p> liefert:<br />
<blockquote><code>&rsquo;2009-W01&rsquo;, &rsquo;2009-W01&rsquo;, &rsquo;2008-W52&rsquo;, &rsquo;2008-W52&rsquo;</code></p></blockquote>
<p> <code>&rsquo;%x-W%v&rsquo;</code> ist also die europäische (und ISO-)Zählung; <code>&rsquo;%X-W%V&rsquo;</code> die US-/UK-Zählung.</p>
<p>Bei anderen DBs wird es etwas komplizierter. MS-SQL kennt datepart(), aber die Art der Wochenzählung kann nur global eingestellt werden. Könnte man den Wochencode auch aus year() und week() zusammensetzen, zum Beispiel mit<br />
<blockquote><code>concat(year(subdate(now(), interval 1 week)), &rsquo;-W&rsquo;, week(subdate(now(), interval 1 week)))</code></p></blockquote>
<p> Leider nicht. Wenn die Woche 1 des aktuellen Jahres im vergangenen Jahr beginnt, liefert year() möglicherweise bereits das aktuelle Jahr und week() 0. Beweis:<br />
<blockquote><code>select yearweek(&rsquo;2009-01-01&rsquo;), year(&rsquo;2009-01-01&rsquo;), week(&rsquo;2009-01-01&rsquo;)</code></p></blockquote>
<p>(5) Tageswerte der vergangenen Woche, z.B. für einen Wochenreport:<br />
<blockquote><code>select * from isozeit<br />
where zeit like &rsquo;____-__-__&rsquo;<br />
and zeit<br />
between from_days(to_days(now()) - (7 + weekday(now())))<br />
and from_days(to_days(now()) - (1 + weekday(now())))</code></p></blockquote>
<p> Uff. Das ist nicht ganz einfach, aber die scheinbar einfachere Lösung,<br />
<blockquote><code>where date_format(zeit, &rsquo;%x%v&rsquo;) = date_format(subdate(now(), interval 1 week), &rsquo;%x%v&rsquo;)</code></p></blockquote>
<p> würde bewirken, dass der erste date_format()-Term für jeden Datensatz durchgeführt würde.</p>
<p>Noch etwas flinker wäre vielleicht<br />
<blockquote><code>zeit between date_format(from_days(to_days(now()) - (7 + weekday(now()))), &rsquo;%Y-%m-%d&rsquo;) and date_format(from_days(to_days(now()) - weekday(now())), &rsquo;%Y-%m-%d&rsquo;)</code></p></blockquote>
<p> aber wahrscheinlich wandelt MySQL die from_days()-Terme schon gleich vor dem ersten Vergleich zu Strings. Ich konnte jedenfalls keinen Unterschied messen.</p>
<p>(6) Monatssummen aus Tageswerten bilden:<br />
<blockquote><code>select tagname, year(zeit), month(zeit), sum(wert) from isozeit<br />
where time like &rsquo;____-__-__&rsquo;<br />
group by 1,2,3<br />
order by 1,2,3</code></p></blockquote>
<p>Das ist einfach.</p>
<p>Allerdings weiss man noch nicht, ob auch für alle Tage des jeweiligen Monats Daten vorliegen, die Summe also korrekt ist. Das kann man durch eine zusätzliche Spalte<br />
<blockquote><code>count(wert) = day(last_day(zeit))</code></p></blockquote>
<p> ermitteln. Hier steht 1 für korrekt und 0 für fehlerhaft. <code>Last_day()</code> ist wieder ein Pluspunkt für MySQL. Es liefert das Datum des letzten Tages im angegebenen Monat.</p>
<p>(7) Wochensumme aus Tageswerten? Okay.<br />
<blockquote><code>select tagname, date_format(zeit, &rsquo;%x-W%v&rsquo;), sum(wert), count(wert) = 7 from isozeit<br />
where zeit like &rsquo;____-__-__&rsquo;<br />
group by 1,2<br />
order by 1,2</code></p></blockquote>
<p> Gut, dass Wochen immer sieben Tage haben.</p>
<p>(8) und zum Schluss: Sind die Wochenwerte gleich der Summe der Tagswerte der Woche? Das sieht zunächst einfach aus:</p>
<blockquote><p><code>select a.tagname, a.woche, a.summe, b.summe, a.korrekt, a.summe=b.summe<br />
from<br />
( select tagname, date_format(zeit, &rsquo;%x-W%v&rsquo;) as woche, sum(wert) as summe, (count(wert) = 7) as korrekt<br />
  from isozeit where zeit like &rsquo;____-__-__&rsquo; group by 1,2 order by 1,2<br />
) a<br />
join<br />
( select tagname, zeit as woche, wert as summe, 1 as korrekt<br />
  from isozeit where zeit like &rsquo;____-W__&rsquo; group by 1,2 order by 1,2<br />
) b<br />
on a.tagname=b.tagname and a.woche=b.woche</code></p></blockquote>
<p>Subselect a kennen wir aus (7). Subselect b sind die Wochenwerte. Nur macht mir auf meinem Rechner MySQL einen Strich durch die Richtung, weil es zwar bei Typen tolerant ist, aber nicht bei Zeichensätzen. Die stimmen bei den Subselects wegen der Berechnung nicht überein, deshalb musste ich bei mir folgendes schreiben:</p>
<blockquote><p><code>select a.tagname, a.woche, a.summe, b.summe, a.korrekt, a.summe=b.summe<br />
from<br />
( select<br />
    convert(tagname using latin1) as tagname,<br />
    convert(date_format(zeit, &rsquo;%x-W%v&rsquo;) using latin1) as woche,<br />
    convert(sum(wert) using latin1) as summe,<br />
    convert((count(wert) = 7) using latin1) as korrekt<br />
  from isozeit where zeit like &rsquo;____-__-__&rsquo; group by 1,2 order by 1,2<br />
) a<br />
join<br />
( select<br />
    convert(tagname using latin1) as tagname,<br />
    convert(zeit using latin1) as woche,<br />
    convert(wert using latin1) as summe,<br />
    convert(1 using latin1) as korrekt<br />
  from isozeit where zeit like &rsquo;____-W__&rsquo; group by 1,2 order by 1,2<br />
) b<br />
on a.tagname=b.tagname and a.woche=b.woche</code></p></blockquote>
<p>Das soll an Beispielen reichen. Ähnliche Abfragen für die anderen Formate können ziemlich direkt abgeleitet werden.</p>
<h3>Links</h3>
<p><a href="http://de.wikipedia.org/wiki/ISO_8601">Wikipedia (dt): ISO-8601</a><br />
<a href="http://en.wikipedia.org/wiki/ISO_8601">Wikipedia (en): ISO-8601</a><br />
<a href="http://www.phys.uu.nl/~vgent/calendar/isocalendar.htm">The Mathematics of the ISO 8601 Calendar</a><br />
<a href="http://www.dmoz.org/Science/Reference/Standards/Individual_Standards/ISO/ISO_8601/">http://www.dmoz.org/Science/Reference/Standards/Individual_Standards/ISO/ISO_8601/</a></p>
<br />Veröffentlicht in Reporting Tagged: Datenbank, Datumsformat, Produktionsdaten, Reporting <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/openmes.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/openmes.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/openmes.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/openmes.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/openmes.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/openmes.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/openmes.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/openmes.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/openmes.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/openmes.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/openmes.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/openmes.wordpress.com/111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/openmes.wordpress.com/111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/openmes.wordpress.com/111/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=111&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://openmes.wordpress.com/2009/03/04/111/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">kaembe</media:title>
		</media:content>
	</item>
		<item>
		<title>Ubuntu Pocket Guide zum freien Download</title>
		<link>http://openmes.wordpress.com/2009/01/28/ubuntu-pocket-guide-zum-freien-download/</link>
		<comments>http://openmes.wordpress.com/2009/01/28/ubuntu-pocket-guide-zum-freien-download/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 19:58:10 +0000</pubDate>
		<dc:creator>kaembe</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://openmes.wordpress.com/?p=107</guid>
		<description><![CDATA[Keir Thomas, der Autor von Ubuntu Kung Fu, hat jetzt Ubuntu Pocket Guide and Reference herausgegeben; eine Taschenreferenz für die Alltagsfragen von der Installation und Netzwerkkonfiguration bis zum Dateihandling und Paketverwaltung. Ganz dem Ubuntu-Gedanken folgend, gibt es das Buch zum freien Download als PDF und als gedruckte Ausgabe. Veröffentlicht in Allgemein, Ubuntu Tagged: Ubuntu<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=107&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Keir Thomas, der Autor von <em><a href="http://www.amazon.com/exec/obidos/ASIN/1934356220" target="_blank">Ubuntu Kung Fu</a>,</em> hat jetzt <em>Ubuntu Pocket Guide and Reference</em> herausgegeben; eine Taschenreferenz für die Alltagsfragen von der Installation und Netzwerkkonfiguration bis zum Dateihandling und Paketverwaltung.</p>
<p>Ganz dem Ubuntu-Gedanken folgend, gibt es das Buch zum freien <a href="http://www.ubuntupocketguide.com/download.html">Download als PDF</a> und als <a href="http://www.amazon.com/gp/product/1440478295">gedruckte Ausgabe</a>.</p>
<br />Veröffentlicht in Allgemein, Ubuntu Tagged: Ubuntu <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/openmes.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/openmes.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/openmes.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/openmes.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/openmes.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/openmes.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/openmes.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/openmes.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/openmes.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/openmes.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/openmes.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/openmes.wordpress.com/107/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/openmes.wordpress.com/107/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/openmes.wordpress.com/107/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=107&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://openmes.wordpress.com/2009/01/28/ubuntu-pocket-guide-zum-freien-download/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">kaembe</media:title>
		</media:content>
	</item>
		<item>
		<title>Neues Spielzeug (XAMPP installieren)</title>
		<link>http://openmes.wordpress.com/2009/01/26/neues-spielzeug-xampp-installieren/</link>
		<comments>http://openmes.wordpress.com/2009/01/26/neues-spielzeug-xampp-installieren/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 22:07:21 +0000</pubDate>
		<dc:creator>kaembe</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Virtualisierung]]></category>
		<category><![CDATA[Web-Portal]]></category>
		<category><![CDATA[LAMPP]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[portable VM]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[XAMPP]]></category>

		<guid isPermaLink="false">http://openmes.wordpress.com/?p=92</guid>
		<description><![CDATA[In diesem Teil werden die Werkzeuge installiert, die unsere Ubuntu-VM zur Web-Applikations-Spielwiese machen: Teil 3: XAMPP installieren Profis würden jetzt die Pakete einzeln installieren; Apache, MySQL, PHP, Perl. Kann man auch, aber es dauert eine Weile und man muss an vielen Stellen Einstellungen ändern, Dateien verschieben und so weiter. Deshalb holen wir uns das Komplettpaket [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=92&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In diesem Teil werden die Werkzeuge installiert, die unsere Ubuntu-VM zur Web-Applikations-Spielwiese machen:</p>
<h2>Teil 3: XAMPP installieren</h2>
<p>Profis würden jetzt die Pakete einzeln installieren; Apache, MySQL, PHP, Perl. Kann man auch, aber es dauert eine Weile und man muss an vielen Stellen Einstellungen ändern, Dateien verschieben und so weiter.</p>
<p>Deshalb holen wir uns das Komplettpaket XAMPP von Apachefriends.org. Das gibt es für Linux, Windows und Mac, und es ist gerade auf Linux sehr einfach zu installieren.</p>
<h3>Download und Installation</h3>
<ul>
<li>In der VM den Firefox-Browser öffnen, entweder oben in der Mitte des Bildschirms oder über Anwendungen / Internet.</li>
<li>apachefriends.org im Browser aufrufen und XAMPP für Linux anwählen. Die Seite am besten mal kurz durchlesen.</li>
<li>XAMPP Linux runterladen. Normalerweise speichert Firefox ins Desktop-Verzeichnis, in unserem Fall /home/mes/Desktop.</li>
<li>Terminal-Fenster (Shell) öffnen (Anwendungen / Zubehör / Terminal) und ins Download-Verzeichnis wechseln: &#8222;cd Desktop&#8220;</li>
<li>Prüfen, dass das XAMPP-Paket hier liegt: &#8222;ls -l&#8220;<br />
Es sollte xampp-linux-1.7.tar.gz oder ähnlich heissen</li>
<li>Jetzt folgt der Zauberspruch für die Installation: &#8222;sudo tar xvfz xampp-linux-1.7.tar.gz -C /opt&#8220;<br />
Dabei wird das User-Passwort abgefragt; siehe Teil 2.</li>
</ul>
<p>Das war&#8217;s schon. Was ist passiert? Der Inhalt des Pakets wurde in das System-Verzeichnis opt entpackt. Mehr muss man nicht tun, um XAMPP lauffähig zu installieren.</p>
<p>Im einzelnen:<br />
&#8222;sudo&#8220; &#8211; den folgenden Befehl im &#8222;super user&#8220;-Modus ausführen, deshalb die Passwortabfrage.<br />
&#8222;tar&#8220; &#8211; ist ein Standard-Unix Pack/Entpackprogramm. Dateien mit der Endung tar sind seine.<br />
&#8222;xvfz&#8220; &#8211; sind die Parameter für tar: x = entpacken; v = verbose, viel Ausgabe; f = es folgt ein tar-Dateiname; z = es ist ein komprimiertes tar (.gz).<br />
&#8222;xampp-linux-1.7.tar.gz&#8220; &#8211; der Paketname<br />
&#8222;-C /opt&#8220; &#8211; eine Option von tar, bedeutet Auspacken in das folgende Verzeichnis (/opt).</p>
<p>Warum &#8222;/opt&#8220;? Das ist Konvention. Technisch könnten wir XAMPP und jedes andere Programm in jedem Verzeichnis abspeichern und starten. Aber opt ist das traditionelle Systemverzeichnis für optionale Pakete.</p>
<h3>Erststart</h3>
<p>Im schon geöffneten Terminal tippen wir: &#8222;sudo /opt/lampp/lampp start&#8220;</p>
<p>&#8222;sudo&#8220; kennen wir schon. &#8222;/opt/lampp/lampp&#8220; ist das Startprogramm für XAMPP im Verzeichnis /opt/lampp und &#8222;start&#8220; heisst genau das: XAMPP starten. Die anderen Optionen für das Startprogramm sind &#8222;stop&#8220; und &#8222;restart&#8220;.</p>
<p>Es sollte &#8222;XAMPP fuer Linux gestartet&#8220; ausgegeben werden. Wenn ja, dann laufen jetzt Apache (Webserver), MySQL (Datenbank) und PHP sollte auch verfügbar sein. Das testen wir im Firefox, indem wir localhost oder 127.0.0.1 aufrufen. Der Splash-Screen von XAMPP sollte erscheinen. Wir klicken auf &#8222;Deutsch&#8220; &#8211; die Hauptseite von XAMPP erscheint &#8211; und danach links auf &#8222;Status&#8220;.</p>
<p>So sollte es dann auf dem Bildschirm aussehen:<br />
<a href="http://openmes.files.wordpress.com/2009/01/xampp_install_01.png"><img class="alignnone size-medium wp-image-93" title="xampp_install_01" src="http://openmes.files.wordpress.com/2009/01/xampp_install_01.png?w=300&#038;h=248" alt="xampp_install_01" width="300" height="248" /></a></p>
<h3>Wo ist was?</h3>
<p>Das wichtigste Verzeichnis auf unserer VM ist jetzt /opt/lampp/htdocs. Das ist das Web-Hauptverzeichnis. Zum Test erstellen wir eine erste PHP-Seite.</p>
<ul>
<li>Im Terminalfenster ins Web-Verzeichnis wechseln: &#8222;cd /opt/lampp/htdocs&#8220;</li>
<li>Mit einem Editor eine neue Datei anlegen: &#8222;sudo gedit info.php&#8220;</li>
<li>In diese Datei die Zeile &#8222;&lt;?php phpinfo(); ?&gt;&#8220; eintippen</li>
<li>Abspeichern, und</li>
<li>im Firefox &#8222;localhost/info.php&#8220; aufrufen.</li>
</ul>
<p>Wenn alles geklappt hat, sollte folgendes zu sehen sein:</p>
<p><a href="http://openmes.files.wordpress.com/2009/01/xampp_install_02.png"><img class="alignnone size-medium wp-image-97" title="xampp_install_02" src="http://openmes.files.wordpress.com/2009/01/xampp_install_02.png?w=300&#038;h=199" alt="xampp_install_02" width="300" height="199" /></a></p>
<h3>Gruppenarbeit (Berechtigungen)</h3>
<p>Warum schon wieder sudo bei einem simplen Editor? Weil /opt ein Systemverzeichnis ist, in dem wir als Benutzer mes eigentlich nicht schreiben dürfen. Andererseits muss der Webserver die Dateien auch lesen dürfen. Das heisst: Bei allen Dateien, die wir über den Webserver verarbeiten wollen, müssen wir darauf achten, dass die Leserechte ausreichen.</p>
<p>Der Webserver läuft unter dem User nobody. Wir sind normalerweise als mes angemeldet und mit sudo sind wir plötzlich root, also Systemadministrator.</p>
<p>Welche Berechtigungen bei einer Datei gesetzt sind, sieht man mit &#8222;ls -l&#8220;.</p>
<p><a href="http://openmes.files.wordpress.com/2009/01/xampp_install_032.png"><img class="alignnone size-medium wp-image-101" title="xampp_install_032" src="http://openmes.files.wordpress.com/2009/01/xampp_install_032.png?w=300&#038;h=113" alt="xampp_install_032" width="300" height="113" /></a></p>
<p>Wichtig für uns: Vor jeder Datei, die der Webserver verarbeiten soll, müssen links in der ls-Liste drei &#8222;r&#8220; stehen. Drei, weil es die Lese-Berechtigungen (&#8222;read&#8220;) für den Besitzer, die Gruppe des Besitzers und &#8222;other&#8220; sind. Sollten keine drei &#8222;r&#8220; dort stehen, kann man sie mit &#8222;sudo chmod ugo+r dateiname&#8220; setzen. Alles weitere erklärt die man page für chmod, die man im Terminalfenster mit &#8222;man chmod&#8220; ansehen kann. Die Kurzfassung gibt es mit &#8222;chmod &#8211;help&#8220;.</p>
<h3>Automatischer Start</h3>
<p>Leider müssen wir XAMPP bei jedem Start der VM neu starten (&#8222;sudo /opt/lampp/lampp start&#8220;). Das ist hinderlich, deshalb benutzen wir die immer noch geöffnete Shell (das Terminalfenster), um XAMPP automatisch mit Ubuntu zu starten:</p>
<ul>
<li>Wechseln ins Verzeichnis /etc: &#8222;cd /etc&#8220;</li>
<li>Die Datei rc.local in einen Editor laden: &#8222;sudo nano rc.local&#8220;</li>
<li>vor &#8222;exit 0&#8243; die Zeile &#8222;sudo /opt/lampp/lampp start&#8220; einfügen</li>
<li>Beenden mit Strg-X, speichern bestätigen mit J</li>
</ul>
<p>Jetzt die VM neu starten, um den Autostart zu testen.</p>
<p>Was haben wir getan? Die Datei &#8222;/etc/rc.local&#8220; enthält Befehle, die beim Start von Ubuntu ausgeführt werden. Normalerweise ist sie leer, aber aufgerufen wird sie trotzdem. Wir haben einfach die Zeile eingefügt, die wir sonst per Hand eintippen müssten.</p>
<p>Linux-Profis werden hier möglicherweise die Nase rümpfen; wenn sie diese Anleitung überhaupt lesen. Ja, es gibt andere Wege, Programme beziehungsweise &#8222;Dienste&#8220; beim Systemstart zu starten. Aber wir bauen eine Spielwiese und beschränken uns auf die einfachste Methode.</p>
<h3>Und nu?</h3>
<p>Well, die Spielwiese läuft. Am besten jetzt eine Kopie der VM erstellen, denn so rein und frisch kriegen wir sie nie wieder zusammen. Der nächste Teil, <a href="http://dokuhotline.de/2009/01/drupal-installieren-ubuntu-vm/">Installation von Drupal in der VM</a>, erscheint nicht hier, sondern im Blog <a title="Doku-Hotline" href="http://www.dokuhotline.de/">Doku-Hotline</a> meiner Frau, für die ich diese kleine Anleitung eigentlich geschrieben habe.</p>
<br />Veröffentlicht in Allgemein, Virtualisierung, Web-Portal Tagged: LAMPP, Linux, php, portable VM, Ubuntu, XAMPP <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/openmes.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/openmes.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/openmes.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/openmes.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/openmes.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/openmes.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/openmes.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/openmes.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/openmes.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/openmes.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/openmes.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/openmes.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/openmes.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/openmes.wordpress.com/92/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=openmes.wordpress.com&amp;blog=5837809&amp;post=92&amp;subd=openmes&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://openmes.wordpress.com/2009/01/26/neues-spielzeug-xampp-installieren/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">kaembe</media:title>
		</media:content>

		<media:content url="http://openmes.files.wordpress.com/2009/01/xampp_install_01.png?w=300" medium="image">
			<media:title type="html">xampp_install_01</media:title>
		</media:content>

		<media:content url="http://openmes.files.wordpress.com/2009/01/xampp_install_02.png?w=300" medium="image">
			<media:title type="html">xampp_install_02</media:title>
		</media:content>

		<media:content url="http://openmes.files.wordpress.com/2009/01/xampp_install_032.png?w=300" medium="image">
			<media:title type="html">xampp_install_032</media:title>
		</media:content>
	</item>
	</channel>
</rss>
