<?xml version="1.0" encoding="ISO-8859-1" ?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">

    <channel>
        <title>Raischblog.de</title>
        <link>http://raischblog.de/</link>
        <description>Ein Blog als Ausbildungstagebuch und Erfahrungsbericht eines Fachinformatikers, Anwendungsentwicklers in der Ausbildung.</description>
        <language>de-de</language>
        <copyright>Copyright 2018 by Rainer Schulz</copyright>
        <lastBuildDate>Mon, 02 Jan 2012 14:53:56 +0100</lastBuildDate>
        <docs>http://blogs.law.harvard.edu/tech/rss</docs>


        <item>
            <title>PHP Design Patterns: Das Registry Pattern</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/PHP-Design-Patterns-Das-Registry-Pattern/</link>
            <guid isPermaLink="true">http://raischblog.de/PHP-Design-Patterns-Das-Registry-Pattern/</guid>
            <comments>http://raischblog.de/PHP-Design-Patterns-Das-Registry-Pattern/#commentList</comments>
            <category>php</category>
            <category>oop</category>
            <category>objektorientiert</category>
            <category>design pattern</category>
            <category>registry pattern</category>
            <category>registry</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/PHP-logo.png" alt="PHP" width="200" height="106" />&#160;</p>

<h3 class="firstH">Vorwort</h3>

<p>Ich besch&auml;ftige mich schon seit einiger Zeit mit <span lang="en">Design Patterns</span> im
<span lang="en">Softwaredesign</span>, vor allem mit der Umsetzung in PHP. Aus diesem Grund m&ouml;chte ich
euch heute das <span lang="en">Registry Pattern</span> beziehungsweise meine <span lang="en">Registry</span>klasse vorstellen.</p>

<h3>Wozu eine <span lang="en">Registry</span>klasse?</h3>

<p>Da meine Projekte, in der Regel, alle objektorientiert geschrieben sind, habe
ich mir &uuml;berlegt, wie ich eine Globalisierung von Variablen, Konstanten und
Funktionen erreichen kann.</p>

<h3>Die <span lang="en">Registry</span>klasse</h3>

<p>In einem meiner B&uuml;cher, &uuml;ber <span lang="en">Design Patterns</span>, bin ich dann &uuml;ber ein
Intermezzo mit genau diesem Thema gesto&szlig;en. Dieses Intermezzo hat mich dazu
bewegt mir eine <span lang="en">Registry</span>klasse zu schreiben, welche dann nur noch in den anderen
Klassen bekannt gemacht werden muss (<em>beziehungsweise das Objekt der Klasse</em>).</p>

<h4>Eine kleine Info am Rande</h4>

<p>Meine <span lang="en">Registry</span>klasse benutzt das <span lang="en">Singleton Pattern</span> welches nur eine einmalige
Instanzierung der Klasse erlaubt.</p>

<p><strong><span lang="en">Registry</span>klasse:</strong><br />
<code class="block">/**<br />
&#160;*&#160;Registerklasse.<br />
&#160;*<br />
&#160;*&#160;@author&#160;Rainer&#160;Schulz&#160;&lt;&#8209;&#8209;&#8209;&#8209;&#8209;&#8209;@&#8209;&#8209;&#8209;&#8209;&#8209;&#8209;&#8209;&gt;<br />
&#160;*&#160;@link&#160;http://raischblog.de/<br />
&#160;*&#160;@copyright&#160;2011&#160;&#8209;&#160;Rainer&#160;Schulz<br />
&#160;*&#160;@license&#160;CC&#160;BY&#8209;NC&#8209;SA&#160;3.0&#160;&lt;http://creativecommons.org/licenses/by&#8209;nc&#8209;sa/3.0/&gt;<br />
&#160;*&#160;@version&#160;1.0&#160;29/11/2011&#160;18:41<br />
&#160;*/<br />
class&#160;RsRegistry<br />
{<br />
&#160;&#160;&#160;&#160;//&#160;Klasseneigenschaften&#160;====================================================<br />
<br />
&#160;&#160;&#160;&#160;private&#160;static&#160;&#036;instance&#160;=&#160;null;&#160;//&#160;Speichert&#160;die&#160;Instanz&#160;der&#160;Klasse<br />
<br />
&#160;&#160;&#160;&#160;//&#160;Objekteigenschaften&#160;=====================================================<br />
<br />
&#160;&#160;&#160;&#160;/**<br />
&#160;&#160;&#160;&#160;&#160;*&#160;Array&#160;fuer&#160;die&#160;Variablen.<br />
&#160;&#160;&#160;&#160;&#160;*&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@access&#160;private<br />
&#160;&#160;&#160;&#160;&#160;*/<br />
&#160;&#160;&#160;&#160;private&#160;&#036;register&#160;=&#160;array();<br />
<br />
&#160;&#160;&#160;&#160;/**<br />
&#160;&#160;&#160;&#160;&#160;*&#160;Array&#160;zum&#160;Markieren&#160;von&#160;Konstanten.<br />
&#160;&#160;&#160;&#160;&#160;*&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@access&#160;private<br />
&#160;&#160;&#160;&#160;&#160;*/<br />
&#160;&#160;&#160;&#160;private&#160;&#036;readOnly&#160;=&#160;array();<br />
<br />
&#160;&#160;&#160;&#160;//&#160;Konstruktor&#160;und&#160;Destruktor&#160;==============================================<br />
<br />
&#160;&#160;&#160;&#160;/**<br />
&#160;&#160;&#160;&#160;&#160;*&#160;Der&#160;Konstruktor.<br />
&#160;&#160;&#160;&#160;&#160;*&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@access&#160;private&#160;Instanzieren&#160;nur&#160;innerhalb&#160;dieser&#160;Klasse<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@return&#160;object&#160;gibt&#160;ein&#160;neues&#160;Objekt&#160;der&#160;Klasse&#160;zurueck<br />
&#160;&#160;&#160;&#160;&#160;*/<br />
&#160;&#160;&#160;&#160;private&#160;function&#160;__construct()&#160;{}<br />
<br />
&#160;&#160;&#160;&#160;/**<br />
&#160;&#160;&#160;&#160;&#160;*&#160;Der&#160;Destruktor.<br />
&#160;&#160;&#160;&#160;&#160;*&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@access&#160;public<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@return&#160;void&#160;gibt&#160;nichts&#160;zurueck<br />
&#160;&#160;&#160;&#160;&#160;*/<br />
&#160;&#160;&#160;&#160;public&#160;function&#160;__destruct()&#160;{}<br />
<br />
&#160;&#160;&#160;&#160;//&#160;Klassenmethoden&#160;=========================================================<br />
<br />
&#160;&#160;&#160;&#160;/**<br />
&#160;&#160;&#160;&#160;&#160;*&#160;Die&#160;getInstance&#8209;Methode&#160;des&#160;Singleton&#8209;Pattern.<br />
&#160;&#160;&#160;&#160;&#160;*&#160;Die&#160;Methode&#160;ist&#160;statisch&#160;(ohne&#160;Objekt&#160;aufrufbar).<br />
&#160;&#160;&#160;&#160;&#160;*&#160;Da&#160;der&#160;Konstruktor&#160;private&#160;ist,&#160;kann&#160;nur&#160;hier&#160;ein<br />
&#160;&#160;&#160;&#160;&#160;*&#160;Objekt&#160;der&#160;Klasse&#160;erstellt&#160;oder,&#160;wenn&#160;schon&#160;ein&#160;Objekt&#160;existiert,<br />
&#160;&#160;&#160;&#160;&#160;*&#160;geladen&#160;werden.<br />
&#160;&#160;&#160;&#160;&#160;*&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@access&#160;public<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@return&#160;object&#160;gibt&#160;das&#160;Objekt&#160;der&#160;Klasse&#160;zurueck<br />
&#160;&#160;&#160;&#160;&#160;*/<br />
&#160;&#160;&#160;&#160;public&#160;static&#160;function&#160;getInstance()<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//&#160;wenn&#160;'&#036;instance'&#160;noch&#160;auf&#160;'null'&#160;steht<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if&#160;(&#160;self::&#036;instance&#160;===&#160;null&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//&#160;wird&#160;einmalig&#160;ein&#160;Objekt&#160;dieser&#160;Klasse&#160;erzeugt<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;self::&#036;instance&#160;=&#160;new&#160;self();<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//&#160;gibt&#160;das&#160;Objekt&#160;der&#160;Klasse&#160;zurueck<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;self::&#036;instance;<br />
&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;//&#160;Objektmethoden&#160;==========================================================<br />
<br />
&#160;&#160;&#160;&#160;/**<br />
&#160;&#160;&#160;&#160;&#160;*&#160;Methode&#160;zum&#160;setzen&#160;einer&#160;Konstanten.<br />
&#160;&#160;&#160;&#160;&#160;*&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@access&#160;public<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@param&#160;string&#160;&#036;key&#160;Name&#160;der&#160;Konstante<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@param&#160;mixed&#160;&#036;value&#160;Inhalt&#160;der&#160;Konstante<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@return&#160;void&#160;gibt&#160;nichts&#160;zurueck<br />
&#160;&#160;&#160;&#160;&#160;*/<br />
&#160;&#160;&#160;&#160;public&#160;function&#160;define(&#160;&#036;key,&#160;&#036;value&#160;)<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if&#160;(&#160;!&#036;this&#8209;&gt;exists(&#160;&#036;key&#160;)&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;this&#8209;&gt;register[&#036;key]&#160;=&#160;&#036;value;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;this&#8209;&gt;readOnly[&#036;key]&#160;=&#160;true;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//return&#160;&#036;this;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;else&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;die(<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;'&lt;h1&gt;Error:&#160;Constant&#160;'&lt;em&gt;'.&#036;key.'&lt;/em&gt;'&#160;is&#160;already&#160;created&#160;'.<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;'in&#160;Registry!&lt;/h1&gt;'<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />
&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;/**<br />
&#160;&#160;&#160;&#160;&#160;*&#160;'Magische'&#160;Methode&#160;zum&#160;setzen&#160;einer&#160;Variable.<br />
&#160;&#160;&#160;&#160;&#160;*&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@access&#160;public<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@param&#160;string&#160;&#036;key&#160;Name&#160;der&#160;Variable<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@param&#160;mixed&#160;&#036;value&#160;Inhalt&#160;der&#160;Variable<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@return&#160;void&#160;gibt&#160;nichts&#160;zurueck<br />
&#160;&#160;&#160;&#160;&#160;*/<br />
&#160;&#160;&#160;&#160;public&#160;function&#160;__set(&#160;&#036;key,&#160;&#036;value&#160;)<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if&#160;(&#160;&#036;this&#8209;&gt;isConstant(&#160;&#036;key&#160;)&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;die(<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;'&lt;h1&gt;Error:&#160;Cannot&#160;override&#160;Constant&#160;'&lt;em&gt;'.&#036;key.<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;'&lt;/em&gt;'&#160;in&#160;Registry!&lt;/h1&gt;'<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;else&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;this&#8209;&gt;register[&#036;key]&#160;=&#160;&#036;value;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />
&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;/**<br />
&#160;&#160;&#160;&#160;&#160;*&#160;'Magische'&#160;Methode&#160;zum&#160;holen&#160;einer&#160;Variable.<br />
&#160;&#160;&#160;&#160;&#160;*&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@access&#160;public<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@param&#160;string&#160;&#036;key&#160;Name&#160;der&#160;Variable<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@return&#160;mixed&#160;gibt&#160;die&#160;Variable&#160;zurueck<br />
&#160;&#160;&#160;&#160;&#160;*/<br />
&#160;&#160;&#160;&#160;public&#160;function&#160;__get(&#160;&#036;key&#160;)<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;&#036;this&#8209;&gt;exists(&#160;&#036;key&#160;)&#160;?<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;this&#8209;&gt;register[&#036;key]&#160;:<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;die(<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;'&lt;h1&gt;Error:&#160;Key&#160;'&lt;em&gt;'.&#036;key.<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;'&lt;/em&gt;'&#160;not&#160;found&#160;in&#160;Registry!&lt;/h1&gt;'<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;);<br />
&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;/**<br />
&#160;&#160;&#160;&#160;&#160;*&#160;'Magische'&#160;Methode&#160;zum&#160;aufrufen&#160;einer&#160;Funktion.<br />
&#160;&#160;&#160;&#160;&#160;*&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;Lambdafunktionen&#160;bzw&#160;anonyme&#160;Funktionen&#160;stehen&#160;ab&#160;PHP&#160;5.3&#160;zur&#160;Verfuegung.<br />
&#160;&#160;&#160;&#160;&#160;*&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@access&#160;public<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@param&#160;string&#160;&#036;key&#160;Name&#160;der&#160;Funktion<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@param&#160;mixed&#160;&#036;args&#160;Parameter&#160;der&#160;Funktion<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@return&#160;function&#160;gibt&#160;die&#160;Funktion&#160;zurueck<br />
&#160;&#160;&#160;&#160;&#160;*/<br />
&#160;&#160;&#160;&#160;public&#160;function&#160;__call(&#160;&#036;key,&#160;&#036;args&#160;)<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if&#160;(&#160;&#036;this&#8209;&gt;exists(&#160;&#036;key&#160;)&#160;&amp;&amp;&#160;is_callable(&#160;&#036;this&#8209;&gt;register[&#036;key]&#160;)&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;call_user_func_array(&#160;&#036;this&#8209;&gt;register[&#036;key],&#160;&#036;args&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trigger_error(&#160;&#036;key.'&#160;is&#160;not&#160;callable.',&#160;E_USER_ERROR&#160;);<br />
&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;/**<br />
&#160;&#160;&#160;&#160;&#160;*&#160;Methode&#160;entfernt&#160;eine&#160;gesetzte&#160;Variable.<br />
&#160;&#160;&#160;&#160;&#160;*&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@access&#160;public<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@param&#160;string&#160;&#036;key&#160;Name&#160;der&#160;zu&#160;entfernenden&#160;Variable<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@return&#160;bool&#160;gibt&#160;einen&#160;Wahrheitswert&#160;zurueck<br />
&#160;&#160;&#160;&#160;&#160;*/<br />
&#160;&#160;&#160;&#160;public&#160;function&#160;remove(&#160;&#036;key&#160;)<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if&#160;(&#160;&#036;this&#8209;&gt;isConstant(&#160;&#036;key&#160;)&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;die(<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;'&lt;h1&gt;Error:&#160;Cannot&#160;remove&#160;Constant&#160;'&lt;em&gt;'.&#036;key.<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;'&lt;/em&gt;'&#160;in&#160;Registry!&lt;/h1&gt;'<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;elseif&#160;(&#160;&#036;this&#8209;&gt;exists(&#160;&#036;key&#160;)&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;unset(&#160;&#036;this&#8209;&gt;register[&#036;key]&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;true;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;false;<br />
&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;/**<br />
&#160;&#160;&#160;&#160;&#160;*&#160;Methode&#160;prueft,&#160;ob&#160;eine&#160;Variable/Konstante&#160;gesetzt&#160;ist.<br />
&#160;&#160;&#160;&#160;&#160;*&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@access&#160;public<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@param&#160;string&#160;&#036;key&#160;Name&#160;der&#160;zu&#160;pruefenden&#160;Variable/Konstante<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@return&#160;bool&#160;gibt&#160;einen&#160;Wahrheitswert&#160;zurueck<br />
&#160;&#160;&#160;&#160;&#160;*/<br />
&#160;&#160;&#160;&#160;public&#160;function&#160;exists(&#160;&#036;key&#160;)<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;array_key_exists(&#160;&#036;key,&#160;&#036;this&#8209;&gt;register&#160;);<br />
&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;/**<br />
&#160;&#160;&#160;&#160;&#160;*&#160;Methode&#160;prueft,&#160;ob&#160;&#036;key&#160;eine&#160;Konstante&#160;ist.<br />
&#160;&#160;&#160;&#160;&#160;*&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@access&#160;public<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@param&#160;string&#160;&#036;key&#160;Name&#160;der&#160;zu&#160;pruefenden&#160;Variable/Konstante<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@return&#160;bool&#160;gibt&#160;einen&#160;Wahrheitswert&#160;zurueck<br />
&#160;&#160;&#160;&#160;&#160;*/<br />
&#160;&#160;&#160;&#160;public&#160;function&#160;isConstant(&#160;&#036;key&#160;)<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;array_key_exists(&#160;&#036;key,&#160;&#036;this&#8209;&gt;readOnly&#160;)&#160;&amp;&amp;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;this&#8209;&gt;readOnly[&#036;key]&#160;===&#160;true&#160;?&#160;true&#160;:&#160;false;<br />
&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;/**<br />
&#160;&#160;&#160;&#160;&#160;*&#160;Ueberschiebene&#160;Methode&#160;__clone()&#160;verhindert&#160;das&#160;Klonen&#160;des&#160;Objektes.<br />
&#160;&#160;&#160;&#160;&#160;*&#160;<br />
&#160;&#160;&#160;&#160;&#160;*&#160;@access&#160;public<br />
&#160;&#160;&#160;&#160;&#160;*/<br />
&#160;&#160;&#160;&#160;public&#160;function&#160;__clone()<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;trigger_error(&#160;'Cloning&#160;of&#160;this&#160;object&#160;is&#160;not&#160;allowed.',&#160;E_USER_ERROR&#160;);<br />
&#160;&#160;&#160;&#160;}<br />
}</code></p>

<h3>Arbeiten mit der <span lang="en">Registryklasse</span></h3>

<h4>Objekt erzeugen/holen</h4>

<p>Ein Objekt der Klasse bekommt man nur &uuml;ber die <code class="inp">getInstance()</code>-Methode des
Singleton Pattern.<br />
<code class="block">&#036;reg&#160;=&#160;RsRegistry::getInstance();</code></p>

<h4>Variablen</h4>

<h5>Variablen speichern</h5>

<p>Variablen k&ouml;nnen mit der magischen Methode <code class="inp">__set()</code>, wie folgt, gespeichert
werden.<br />
<code class="block">&#036;reg&#8209;&gt;varName1&#160;=&#160;'String';<br />
&#036;reg&#8209;&gt;varName2&#160;=&#160;123;<br />
&#036;reg&#8209;&gt;varName3&#160;=&#160;1.23;<br />
&#036;reg&#8209;&gt;varName4&#160;=&#160;array(&#160;'eins'&#160;=&gt;&#160;'one',&#160;'zwei'&#160;=&gt;&#160;'two'&#160;);<br />
&#036;reg&#8209;&gt;varName5&#160;=&#160;&#036;var;</code></p>

<h5>Variablen holen</h5>

<p>Variablen k&ouml;nnen mit der magischen Methode <code class="inp">__get()</code>, wie folgt, geholt
werden.<br />
<code class="block">&#036;int&#160;=&#160;&#036;reg&#8209;&gt;varName2;<br />
echo&#160;&#036;reg&#8209;&gt;varName1;<br />
print_r(&#160;&#036;reg&#8209;&gt;varName4&#160;);</code></p>

<h5>Variablen l&ouml;schen</h5>

<p>Variablen k&ouml;nnen mit der Methode <code class="inp">remove()</code>, wie folgt, gel&ouml;scht werden.<br />
<code class="block">&#036;reg&#8209;&gt;remove(&#160;'varName3'&#160;);<br />
&#036;reg&#8209;&gt;remove(&#160;'varName5'&#160;);</code></p>

<h4>Konstanten</h4>

<h5>Konstanten speichern</h5>

<p>Konstanten k&ouml;nnen mit der Methode <code class="inp">define()</code>, wie folgt, gespeichert werden.<br />
<code class="block">&#036;reg&#8209;&gt;define(&#160;'BASE',&#160;'http://raischblog.de'&#160;);<br />
&#036;reg&#8209;&gt;define(&#160;'V2',&#160;'http://v2.raischblog.de'&#160;);</code></p>

<h5>Konstanten holen</h5>

<p>Konstanten k&ouml;nnen mit der magischen Methode <code class="inp">__get()</code>, wie folgt, geholt
werden.<br />
<code class="block">&#036;root&#160;=&#160;&#036;reg&#8209;&gt;BASE;<br />
echo&#160;&#036;reg&#8209;&gt;V2;</code></p>

<h5>Konstanten l&ouml;schen</h5>

<p>Konstanten k&ouml;nnen nicht gel&ouml;scht werden.</p>

<h4>Funktionen</h4>

<h5>Funktionen speichern</h5>

<p>Funktionen k&ouml;nnen mit der magischen Methode <code class="inp">__set()</code>, wie folgt, gespeichert
werden.<br />
<code class="block">&#036;reg&#8209;&gt;getFullDateString&#160;=&#160;function&#160;(&#160;&#036;timestamp&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;return&#160;date(&#160;'F&#160;d,&#160;Y&#160;&#8209;&#160;H:i',&#160;&#036;timestamp&#160;);<br />
}</code></p>

<h5>Funktionen holen</h5>

<p>Funktionen k&ouml;nnen mit der magischen Methode <code class="inp">__call()</code>, wie folgt, aufgerufen
werden.<br />
<code class="block">echo&#160;&#036;reg&#8209;&gt;getFullDateString(&#160;time()&#160;);</code></p>

<h5>Funktionen l&ouml;schen</h5>

<p>Funktionen k&ouml;nnen mit der Methode <code class="inp">remove()</code>, wie folgt, gel&ouml;scht werden.<br />
<code class="block">&#036;reg&#8209;&gt;remove(&#160;'getFullDateString'&#160;);</code></p>

<h3>Abschlie&szlig;endes</h3>

<p>Bei Anregungen oder Fragen zur Klasse benutzt, wie immer, einfach die Kommentarfunktion.</p>

<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Mon, 02 Jan 2012 14:53:56 +0100</pubDate>
        </item>


        <item>
            <title>Ausnahmebehandlung mit PHP</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Ausnahmebehandlung-mit-PHP/</link>
            <guid isPermaLink="true">http://raischblog.de/Ausnahmebehandlung-mit-PHP/</guid>
            <comments>http://raischblog.de/Ausnahmebehandlung-mit-PHP/#commentList</comments>
            <category>php</category>
            <category>oop</category>
            <category>objektorientiert</category>
            <category>klasse</category>
            <category>methode</category>
            <category>exception</category>
            <category>exceptionhandling</category>
            <category>fehlerbehandlung</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/PHP-logo.png" alt="PHP" width="200" height="106" />&#160;</p>

<h3 class="firstH">Vorwort</h3>

<p>In den letzten Wochen habe wieder etwas mehr Zeit gefunden mich mit PHP zu
besch&auml;ftigen. Daher werde ich in den n&auml;chsten Wochen ein paar von mir erstellte
PHP-Klassen vorstellen. Welche das im Einzelnen sein werden, kann ich noch nicht
sagen. In meinem heutigen Beitrag werde ich eine <span lang="en">Exceptionhandler</span>klasse vorstellen.</p>

<h3>Die <span lang="en">Exceptionhandler</span>klasse</h3>

<p>Die <span lang="en">Exceptionhandler</span>klasse ist daf&uuml;r gedacht,
unbehandelte <span lang="en">Exceptions</span> (<em>Ausnahmen</em>) abzufangen
und auszugeben. Bei Projekten, welche schon online sind, w&uuml;rde ich aber
dazu raten, die <span lang="en">Exceptions</span> nicht auszugeben, sondern
lieber in einer Datei zu loggen.</p>

<p><strong><span lang="en">Exceptionhandler</span>klasse:</strong><br />
<code class="block">/**<br />
&#160;*&#160;Klasse&#160;zum&#160;abfangen&#160;von&#160;unbehandelten&#160;Exceptions.<br />
&#160;*&#160;<br />
&#160;*&#160;@abstract<br />
&#160;*&#160;@author&#160;Rainer&#160;Schulz&#160;&lt;&#8209;&#8209;&#8209;&#8209;&#8209;&#8209;@&#8209;&#8209;&#8209;&#8209;&#8209;&#8209;&#8209;&gt;<br />
&#160;*&#160;@link&#160;http://raischblog.de/<br />
&#160;*&#160;@copyright&#160;2011&#160;&#8209;&#160;Rainer&#160;Schulz<br />
&#160;*&#160;@license&#160;CC&#160;BY&#8209;NC&#8209;SA&#160;3.0&#160;&lt;http://creativecommons.org/licenses/by&#8209;nc&#8209;sa/3.0/&gt;<br />
&#160;*&#160;@version&#160;1.0&#160;31/12/2011&#160;18:06<br />
&#160;*/<br />
abstract&#160;class&#160;RsExceptionHandling<br />
{<br />
&#160;&#160;&#160;&#160;private&#160;static&#160;&#036;fullPath;<br />
<br />
&#160;&#160;&#160;&#160;public&#160;static&#160;function&#160;init(&#160;&#036;trace&#160;=&#160;null,&#160;&#036;fullPath&#160;=&#160;null&#160;)<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;self::&#036;fullPath&#160;=&#160;&#036;fullPath&#160;===&#160;false&#160;?&#160;false&#160;:&#160;null;<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;set_exception_handler(&#160;array(<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;'RsExceptionHandling',<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;trace&#160;===&#160;true&#160;?&#160;'exceptionHandlerWithTrace'&#160;:&#160;'exceptionHandler'<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;)&#160;);<br />
&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;public&#160;static&#160;function&#160;exceptionHandler(&#160;&#036;e&#160;)<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;echo&#160;self::exceptionGetInfos(&#160;&#036;e&#160;);<br />
&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;public&#160;static&#160;function&#160;exceptionHandlerWithTrace(&#160;&#036;e&#160;)<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;echo&#160;self::exceptionGetInfos(&#160;&#036;e&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;echo&#160;self::exceptionGetTrace(&#160;&#036;e&#160;);<br />
&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;private&#160;static&#160;function&#160;exceptionGetInfos(&#160;&#036;e&#160;)<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;file&#160;&#160;=&#160;self::&#036;fullPath&#160;===&#160;false&#160;?<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;basename(&#160;&#036;e&#8209;&gt;getFile()&#160;)&#160;:<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;e&#8209;&gt;getFile();<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;class&#160;=&#160;get_class(&#160;&#036;e&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;nl&#160;&#160;&#160;&#160;=&#160;&quot;rn&quot;;<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;&quot;&lt;h1&gt;Caught&#160;exception&#160;=&amp;gt;&#160;&#036;class&lt;/h1&gt;&#036;nl&lt;p&gt;Thrown&#160;in&#160;&lt;strong&quot;.<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&quot;&gt;&#036;file&lt;/strong&gt;&#160;on&#160;line&#160;&lt;strong&gt;{&#036;e&#8209;&gt;getLine()}&lt;/strong&gt;.&lt;/p&gt;&quot;.<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&quot;&#036;nl&lt;p&gt;&lt;strong&gt;Message:&lt;/strong&gt;&#160;{&#036;e&#8209;&gt;getMessage()}&lt;br&#160;/&gt;&lt;stro&quot;.<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&quot;ng&gt;Code:&lt;/strong&gt;&#160;{&#036;e&#8209;&gt;getCode()}&lt;/p&gt;&quot;;<br />
&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;private&#160;static&#160;function&#160;exceptionGetTrace(&#160;&#036;e&#160;)<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;traceArray&#160;=&#160;&#036;e&#8209;&gt;getTrace();<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;nl&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;=&#160;&quot;rn&quot;;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;trace&#160;&#160;&#160;&#160;&#160;&#160;=&#160;&#036;nl;<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;foreach&#160;(&#160;&#036;traceArray&#160;as&#160;&#036;key&#160;=&gt;&#160;&#036;content&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;class&#160;&#160;&#160;&#160;=&#160;'';<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;function&#160;=&#160;'';<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if&#160;(&#160;!empty(&#160;&#036;content['class']&#160;)&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;class&#160;=&#160;&quot;&#160;at&#160;class&#160;&lt;strong&gt;{&#036;content['class']}&lt;/strong&gt;&quot;;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if&#160;(&#160;!empty(&#160;&#036;content['function']&#160;)&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;function&#160;=&#160;&quot;&#160;in&#160;function&#160;&lt;strong&gt;{&#036;content['function']}()&quot;.<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;'&lt;/strong&gt;';<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;file&#160;=&#160;self::&#036;fullPath&#160;===&#160;false&#160;?<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;basename(&#160;&#036;content['file']&#160;)&#160;:<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;content['file'];<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;trace&#160;.=&#160;&quot;&lt;p&gt;#&#036;key&#160;in&#160;&lt;strong&gt;&#036;file&lt;/strong&gt;&#160;on&#160;line&#160;&lt;strong&gt;&quot;.<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;content['line'].&quot;&lt;/strong&gt;&#036;class&#036;function&lt;/p&gt;&#036;nl&quot;;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;&#036;trace;<br />
&#160;&#160;&#160;&#160;}<br />
}</code></p>

<h4>Initialisieren der Klasse</h4>

<p>Die Klasse wird &uuml;ber die Methode <code class="inp">init()</code>
initialisiert. Diese Methode kann man mit verschiedenen Parametern aufrufen.</p>

<p>Der parameterlose Aufruf der Methode bewirkt, dass nur die Datei, die
Fehlermeldung und die Fehlernummer ausgegeben werden.<br />
<code class="block">RsExceptionHandling::init();</code></p>

<p>Der Aufruf mit dem einzelnen Parameter <code class="inp">true</code> bewirkt,
dass die Datei, die Fehlermeldung, die Fehlernummer und der komplette
<em>Pfad</em> der <span lang="en">Exception</span> ausgegeben werden.<br />
<code class="block">RsExceptionHandling::init(&#160;true&#160;);</code></p>

<p>Beim Aufruf der Methode mit <code class="inp">false</code> als zweiten Parameter
bewirkt, dass keine kompletten Dateipfade, sondern nur der Dateiname ausgegeben wird.<br />
<code class="block">RsExceptionHandling::init(&#160;true/null,&#160;false&#160;);</code></p>

<h3>Abschlie&szlig;endes</h3>

<p>Bei Anregungen oder Fragen zur Klasse benutzt einfach die Kommentarfunktion.</p>

<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Sun, 01 Jan 2012 23:49:43 +0100</pubDate>
        </item>


        <item>
            <title>Alter eines Zeitstempels mit PHP ermitteln</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Alter-eines-Zeitstempels-mit-PHP-ermitteln/</link>
            <guid isPermaLink="true">http://raischblog.de/Alter-eines-Zeitstempels-mit-PHP-ermitteln/</guid>
            <comments>http://raischblog.de/Alter-eines-Zeitstempels-mit-PHP-ermitteln/#commentList</comments>
            <category>php</category>
            <category>funktion</category>
            <category>zeitstempel</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/PHP-logo.png" alt="PHP" width="200" height="106" />&#160;</p>

<h3 class="firstH">Vorwort</h3>

<p>Ich schreibe schon einige Zeit das Backend f&uuml;r den Blog neu, dabei habe ich auch ein paar kleinere Funktionen geschrieben.
Von diesen Funktionen m&ouml;chte ich euch heute eine vorstellen von der ich denke, dass viele Webentwickler diese gebrauchen k&ouml;nnen.</p>

<h3>Die PHP Funktion</h3>

<p>Die folgende Funktion ben&ouml;tigt einen <a href="http://de.wikipedia.org/wiki/Unixzeit" title="Wikipedia: Unixzeit">UNIX-Zeitstempel</a>,
welcher in der Vergangenheit liegt, als &Uuml;bergabeparameter. Der &uuml;bergebene Zeitstempel wird mit dem aktuellen Zeitstempel
(<em><code class="inp">time()</code></em>) verglichen und das Alter berechnet. Ich benutze diese Funktion in der
<a href="http://v2.raischblog.de/" title="Vorschau auf Version 2">Version 2 dieses Blogs</a>, zum Beispiel um zu zeigen, wie alt ein Artikel oder ein Kommentar ist.</p>

<p><strong>Funktion zum Ermitteln des Alters eines Zeitstempels:</strong><br />
<code class="block">function&#160;getSince(&#160;&#036;timestamp&#160;)<br />
{<br />
&#160;&#160;&#160;&#160;if&#160;(&#160;!is_numeric(&#160;&#036;timestamp&#160;)&#160;)&#160;{&#160;return&#160;null;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;&#036;away&#160;=&#160;time()&#160;&#8209;&#160;&#036;timestamp;<br />
<br />
&#160;&#160;&#160;&#160;if&#160;(&#160;&#036;away&#160;&lt;&#160;60&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;since&#160;=&#160;&#036;away.'&#160;Sekunde'.(&#160;(&#160;&#036;away&#160;==&#160;1&#160;)&#160;?&#160;''&#160;:&#160;'n'&#160;);<br />
&#160;&#160;&#160;&#160;}&#160;elseif&#160;(&#160;&#036;away&#160;&lt;&#160;3600&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;tsp&#160;=&#160;floor(&#160;&#036;away&#160;/&#160;60&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;since&#160;=&#160;&#036;tsp.'&#160;Minute'.(&#160;(&#160;&#036;tsp&#160;==&#160;1&#160;)&#160;?&#160;''&#160;:&#160;'n'&#160;);<br />
&#160;&#160;&#160;&#160;}&#160;elseif(&#160;&#036;away&#160;&lt;&#160;86400&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;tsp&#160;=&#160;floor(&#160;&#036;away&#160;/&#160;60&#160;/&#160;60&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;since&#160;=&#160;&#036;tsp.'&#160;Stunde'.(&#160;(&#160;&#036;tsp&#160;==&#160;1&#160;)&#160;?&#160;''&#160;:&#160;'n'&#160;);<br />
&#160;&#160;&#160;&#160;}&#160;elseif(&#160;&#036;away&#160;&lt;&#160;604800&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;tsp&#160;=&#160;floor(&#160;&#036;away&#160;/&#160;60&#160;/&#160;60&#160;/&#160;24&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;since&#160;=&#160;&#036;tsp.'&#160;Tag'.(&#160;(&#160;&#036;tsp&#160;==&#160;1&#160;)&#160;?&#160;''&#160;:&#160;'en'&#160;);<br />
&#160;&#160;&#160;&#160;}&#160;elseif(&#160;&#036;away&#160;&lt;&#160;2592000&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;tsp&#160;=&#160;floor(&#160;&#036;away&#160;/&#160;60&#160;/&#160;60&#160;/&#160;24&#160;/&#160;7&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;since&#160;=&#160;&#036;tsp.'&#160;Woche'.(&#160;(&#160;&#036;tsp&#160;==&#160;1&#160;)&#160;?&#160;''&#160;:&#160;'n'&#160;);<br />
&#160;&#160;&#160;&#160;}&#160;elseif(&#160;&#036;away&#160;&lt;&#160;31104000&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;tsp&#160;=&#160;floor(&#160;&#036;away&#160;/&#160;60&#160;/&#160;60&#160;/&#160;24&#160;/&#160;30&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;since&#160;=&#160;&#036;tsp.'&#160;Monat'.(&#160;(&#160;&#036;tsp&#160;==&#160;1&#160;)&#160;?&#160;''&#160;:&#160;'en'&#160;);<br />
&#160;&#160;&#160;&#160;}&#160;elseif(&#160;&#036;away&#160;&lt;&#160;155520000&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;tsp&#160;=&#160;floor(&#160;&#036;away&#160;/&#160;60&#160;/&#160;60&#160;/&#160;24&#160;/&#160;30&#160;/&#160;12&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;since&#160;=&#160;&#036;tsp.'&#160;Jahr'.(&#160;(&#160;&#036;tsp&#160;==&#160;1&#160;)&#160;?&#160;''&#160;:&#160;'en'&#160;);<br />
&#160;&#160;&#160;&#160;}&#160;else&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;since&#160;=&#160;'Ewigkeiten';<br />
&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;return&#160;'vor&#160;'.&#036;since;<br />
}</code></p>

<h3>Abschlie&szlig;endes</h3>

<p>F&uuml;r wen diese Funktion noch nicht das Richtige ist, der kann auf
<a href="http://php.net/manual/de/function.time.php" title="time()-Funktion auf PHP.net">PHP.net die Kommentare bei der <code class="inp">time()</code>-Funktion</a>
durchst&ouml;bern und schauen ob er dort f&uuml;ndig wird.</p>

<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Wed, 04 May 2011 11:33:01 +0200</pubDate>
        </item>


        <item>
            <title>Optimierung des Blogs mit PHP</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Optimierung-des-Blogs-mit-PHP/</link>
            <guid isPermaLink="true">http://raischblog.de/Optimierung-des-Blogs-mit-PHP/</guid>
            <comments>http://raischblog.de/Optimierung-des-Blogs-mit-PHP/#commentList</comments>
            <category>php</category>
            <category>funktion</category>
            <category>apache</category>
            <category>optimierung</category>
            <category>header</category>
            <category>komprimierung</category>
            <category>autoload</category>
            <category>oop</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/PHP-logo.png" alt="PHP" width="200" height="106" />&#160;</p>

<h3 class="firstH">Vorwort</h3>

<p>Wie ich vor Kurzem berichtet habe, arbeite ich momentan an der
<a href="http://raischblog.de/Raischblog-Version-2-in-Arbeit/" title="http://raischblog.de/Raischblog-Version-2-in-Arbeit/">zweiten Version</a>
dieses Blogs. Nicht nur das Design, sondern auch das komplette Backend des Blogs schreibe ich neu (<em>in PHP</em>). Im Zusammenhang
damit habe ich mich ein wenig &uuml;ber Optimierungsm&ouml;glichkeiten informiert und m&ouml;chte euch ein paar hier vorstellen.</p>

<h3>Autoload von Klassen in PHP</h3>

<p>Wenn man, so wie ich, in seinem Webprojekt alles in Klassen schreibt
(<em><a href="http://raischblog.de/Objektorientierte-Programmierung/" title="http://raischblog.de/Objektorientierte-Programmierung/">objektorientierte Programmierung</a></em>),
dann hat man mehrere M&ouml;glichkeiten diese Klassen einzubinden. Fr&uuml;her habe ich zum Beispiel alle Klassen global via <code class="inp">include</code>
oder <code class="inp">request</code> in meiner Konfigurationsdatei geladen. Man kann die Klassen aber auch immer nur an den
Stellen laden an welchen man sie braucht, dass kann wiederum eine menge Schreibarbeit bedeuten.</p>

<p>Ab der PHP-Version 5 kann man dies nun bedeutend einfacher regeln. Die PHP-Version 5 bietet uns die M&ouml;glichkeit eine
<code class="inp">__autoload</code>-Funktion zu definieren, welche automatisch aufgerufen wird sobald eine Klasse initialisiert werden soll
(<em><code class="inp">new&#160;Klassenname();</code></em>).</p>

<p><strong>Anmerkung:</strong> diese Funktion l&auml;d auch abgeleitete Klassen und implementierte Interfaces!</p>

<p>Nun habe ich, statt alle Klassen immer global zu laden, in meiner Konfigurationsdatei diese Funktion definiert:<br />
<code class="block">function&#160;__autoload(&#160;&#036;class&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;if&#160;(&#160;!class_exists(&#160;&#036;class&#160;)&#160;&amp;&amp;&#160;!interface_exists(&#160;&#036;class&#160;)&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;paths&#160;=&#160;array(<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;'/Pfad/zu/den/Klassen/class.'.&#036;class.'.php',<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;'/Pfad/zu/den/Interfaces/interface.'.&#036;class.'.php',<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;'/Pfad/zu/den/abstrakten/Klassen/abstract.'.&#036;class.'.php'<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;);<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;foreach&#160;(&#160;&#036;paths&#160;as&#160;&#036;file&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if&#160;(&#160;file_exists(&#160;&#036;file&#160;)&#160;&amp;&amp;&#160;is_file(&#160;&#036;file&#160;)&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;require_once&#160;&#036;file;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;true;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;die(&#160;&quot;&lt;h1&gt;Error:&#160;Class&#160;'&lt;em&gt;&#036;class&lt;/em&gt;'&#160;not&#160;found!&lt;/h1&gt;&quot;&#160;);<br />
&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;return&#160;true;<br />
}</code></p>

<h3>GZIP-Komprimierung mit PHP</h3>

<p>F&uuml;r Webmaster auf deren Servern die Module f&uuml;r die GZIP-Komprimierung (<em>mod_deflate und mod_gzip bei Apache</em>) nicht installiert
oder aktiviert sind, bietet es sich an die in PHP eingebaute GZIP-Komprimierung zumindest f&uuml;r die PHP-Dateien zu verwenden. Damit l&auml;sst
sich der Datentransfer von PHP-Dateien um bis zu 80% reduzieren.</p>

<p>Am Anfang einer PHP-Datei f&uuml;gt man einfach folgenden Code hinzu:<br />
<code class="block">if&#160;(&#160;substr_count(&#160;&#036;_SERVER['HTTP_ACCEPT_ENCODING'],&#160;'gzip'&#160;)&#160;)&#160;{<br />
&#160;&#160;&#160;&#160;ob_start(&#160;'ob_gzhandler'&#160;);<br />
}&#160;else&#160;{<br />
&#160;&#160;&#160;&#160;ob_start();<br />
}</code></p>

<p>Und am Ende einfach folgenden:<br />
<code class="block">ob_end_flush();</code></p>

<h3>Content Type und Charset via PHP-Header</h3>

<p>Um das Rendern der Seite im Browser zu beschleunigen, kann man vorab via PHP einen Header &uuml;bergeben. Dieser Header wird von den
meisten Browsern ausgelesen, diese Browser brauchen dann nicht erst die Metadaten im HTML-Quelltext auslesen um das Rendern der Seite zu starten.
Dieser Header sollte am Anfang der PHP-Datei gesetzt werden.</p>

<p>In meinem Blog benutze ich zum Beispiel diesen Header:<br />
<code class="block">header(&#160;'Content&#8209;type:&#160;text/html;&#160;charset=ISO&#8209;8859&#8209;1'&#160;);</code></p>

<h3>Abschlie&szlig;endes</h3>

<p>Ich hoffe, dieser kleine Einblick war verst&auml;ndlich. Sollte ich noch weitere n&uuml;tzliche Optimierungen finden, werde ich diese hier wieder vorstellen.</p>

<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Mon, 18 Apr 2011 15:33:24 +0200</pubDate>
        </item>


        <item>
            <title>Firefox 4 unter Ubuntu 10.10 installieren</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Firefox-4-unter-Ubuntu-1010-installieren/</link>
            <guid isPermaLink="true">http://raischblog.de/Firefox-4-unter-Ubuntu-1010-installieren/</guid>
            <comments>http://raischblog.de/Firefox-4-unter-Ubuntu-1010-installieren/#commentList</comments>
            <category>firefox</category>
            <category>linux</category>
            <category>ubuntu</category>
            <category>terminal</category>
            <category>kommandozeile</category>
            <category>tutorial</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/ubuntu-firefox.png" alt="Ubuntu und Firefox" width="200" height="200" />&#160;</p>

<h3 class="firstH">Installation bzw. Upgrade</h3>

<p>Da ich einige Probleme hatte den Firefox 4 Download von Mozilla unter Ubuntu zu installieren,
habe ich mich etwas informiert wie man es am besten anstellt. Und auf
<a href="http://forum.ubuntuusers.de/topic/einsteigerhilfe-firefox-4-auf-ubuntu-10-10-ins/" title="Ubuntuusers.de - Firefox 4 auf Ubuntu 10.10 installieren">Ubuntuusers.de</a>
bin ich sehr schnell f&uuml;ndig geworden. Durch meine gescheiterten Versuche mit dem Download von Mozilla
hatte ich erwartet, dass die Installation bzw. das Upgrade auf Firefox 4 ein steiniger Weg wird. Aber
siehe da, am Ende war es dann doch sehr einfach.</p>

<p>Es reicht die Eingabe einer Zeile in das Komandozeilentool von Ubuntu (<em>Terminal</em>) welche mit Enter und der Eingabe des Benutzerpasswortes
best&auml;tigt wird:</p>

<p><code class="block">sudo&#160;add&#8209;apt&#8209;repository&#160;ppa:mozillateam/firefox&#8209;stable&#160;&amp;&amp;&#160;sudo&#160;apt&#8209;get&#160;update&#160;&amp;&amp;&#160;sudo&#160;apt&#8209;get&#160;upgrade</code></p>

<p>Nach dem Best&auml;tigen l&auml;uft der Rest v&ouml;llig automatisch im Terminal ab und man braucht nur zu warten, bis die Installation bzw. das Upgrade abgeschlossen ist.</p>

<p>Handelt es sich um ein Upgrade, wird beim ersten Start von Firefox 4 gepr&uuml;ft ob die vorhandenen Addons von Firefox mit der Version 4 kompatibel sind.
Ist ein Addon nicht kompatibel wird es deaktiviert und ist in der Addonverwaltung ausgegraut. In den meisten F&auml;llen existiert von diesen Addons bereits eine
neuere Version die mit Firefox 4 kompatibel ist, dieses installiert man dann einfach und die alte Version des Addons verschwindet aus der Verwaltung.</p>

<h3>Abschlie&szlig;endes</h3>

<p>Ich hoffe dieses kleine Tutorial war verst&auml;ndlich und konnte euch bei der Installation von Firefox 4 helfen. Ich w&uuml;nsche allen einen guten Start in die Woche.</p>

<div class="newRow">&#160;</div>
 ]]></description>
            <pubDate>Mon, 11 Apr 2011 18:14:32 +0200</pubDate>
        </item>


        <item>
            <title>Raischblog Version 2 in Arbeit</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Raischblog-Version-2-in-Arbeit/</link>
            <guid isPermaLink="true">http://raischblog.de/Raischblog-Version-2-in-Arbeit/</guid>
            <comments>http://raischblog.de/Raischblog-Version-2-in-Arbeit/#commentList</comments>
            <category>raischblog</category>
            <category>design</category>
            <category>css</category>
            <description><![CDATA[ <p class="floatLeft"><a href="http://raischblog.de/v2/" title="Raischblog Version 2 Vorschau"><img src="http://raischblog.de/img/v2.png" alt="Screenshot" width="250" height="135" /></a>&#160;</p>

<h3 class="firstH">Design</h3>

<p>Momentan arbeite ich an einer Neuauflage meines Blogs. Ich habe mich entschlossen, dass der Quelltext
und vor allem die Optik meines Blogs aufbereitet werden m&uuml;ssen, hierzu z&auml;hlt vor allem  eine Neuerarbeitung
des Stylesheets (<em><abbr title="Cascading Style Sheets">css</abbr></em>) welches haupts&auml;chlich f&uuml;r das
Aussehen des Blogs verantwortlich ist. Mir ist aufgefallen, dass mein derzeitiges Stylesheet doch eher suboptimal
aufgebaut ist, dies m&ouml;chte ich bei dem neuen Design vorzugsweise verhindern.</p>

<p>Das neue Design wird sich stark vom derzeitigen Design unterscheiden, dennoch habe ich mich wieder f&uuml;r ein
Design mit dunklen Farbt&ouml;nen entschieden. Wer sich das neue Design vorab schon einmal anschauen m&ouml;chte, kann
dies <a href="http://raischblog.de/v2/" title="Raischblog Version 2 Vorschau">hier</a> tun. Ich w&uuml;rde mich freuen, wenn ihr mir
eure Meinung und konstruktive Kritik &uuml;ber die Kommentarfunktion in diesem Beitrag zukommen lasst.</p>

<h3>Programmierung</h3>

<p>Des weiteren habe ich mich dazu entschlossen den Quellcode der serverseitigen Programmiersprache, im Fall
dieses Blogs ist das <abbr title="PHP: Hypertext Preprocessor">PHP</abbr>, zu optimieren. Dies wird aber eher
unauff&auml;llig immer mal zwischendurch geschehen. Momentan arbeite ich an einer neuen Datenbankverbindungsklasse
welche ich hier sp&auml;ter auch zum Download anbieten werde.</p>

<h3>Abschlie�endes</h3>

<p>Sommerliche Temperaturen, strahlender Sonnenschein und gute Laune, ich w&uuml;nsche allen einen guten Start in die Woche.</p>

<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Mon, 04 Apr 2011 18:04:39 +0200</pubDate>
        </item>


        <item>
            <title>Japan im Gedanken sind wir bei dir</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Japan-im-Gedanken-sind-wir-bei-dir/</link>
            <guid isPermaLink="true">http://raischblog.de/Japan-im-Gedanken-sind-wir-bei-dir/</guid>
            <comments>http://raischblog.de/Japan-im-Gedanken-sind-wir-bei-dir/#commentList</comments>
            <category>japan</category>
            <category>it08</category>
            <category>raischblog</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/Japan.png" alt="Japanische Flagge" width="200" height="133" />&#160;</p>

<h3 class="firstH">Als kleine Initiative der IT08</h3>

<p>Es regiert zurzeit s&auml;mtliche Medien, das Erdbeben in Japan und der darauf folgende Tsunami,
es ist wohl das schlimmste Ungl&uuml;ck Japans seit 65 Jahren.</p>

<p>Aus diesem Anlass m&ouml;chten wir drauf aufmerksam machen, dass der Internet-Konzern Google eine
Personen-Suche in Japanisch und Englisch gestartet hat, wo unter anderem gespendet werden kann,
aber auch eine Suche nach vermissten Personen ist m&ouml;glich.</p>

<p>Zu finden ist der Dienst von Google unter folgender Adresse:<br />
<a href="http://www.google.com/crisisresponse/japanquake2011.html" title="Google Personenfinder">http://www.google.com/crisisresponse/japanquake2011.html</a></p>

<p>Eigentlich brauchen wir dazu gar nicht viel sagen da dieses schlimme Ereignis die Medien seit dem 11.03.2011 anf&uuml;hrt.</p>

<p>Aber eines k&ouml;nnen wir tun, wozu wir auch alle Anderen aufrufen:</p>

<ul class="reallist">
    <li><p><strong>spendet Mitgef&uuml;hl f&uuml;r Japan</strong></p></li>
    <li><p><strong>spendet Ehrfurcht f&uuml;r Japan</strong></p></li>
    <li><p><strong>hofft das Japan diese Trag&ouml;die gut &uuml;bersteht</strong></p></li>
</ul>

<h3>Japan im Gedanken sind wir bei dir</h3>

<p>Unser herzliches Beileid nach Japan.</p>

<p class="center"><img src="http://raischblog.de/img/Cael_We-pray-for-Japan.jpg" alt="We Pray For Japan by Ceal" width="262" height="512" /><br />by: Cael - <a href="http://davidcael.blogg.org">http://davidcael.blogg.org</a></p>

<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Mon, 14 Mar 2011 19:51:19 +0100</pubDate>
        </item>


        <item>
            <title>LibreOffice unter Ubuntu 10.10 installieren</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/LibreOffice-unter-Ubuntu-1010-installieren/</link>
            <guid isPermaLink="true">http://raischblog.de/LibreOffice-unter-Ubuntu-1010-installieren/</guid>
            <comments>http://raischblog.de/LibreOffice-unter-Ubuntu-1010-installieren/#commentList</comments>
            <category>libreoffice</category>
            <category>linux</category>
            <category>ubuntu</category>
            <category>terminal</category>
            <category>deb</category>
            <category>kommandozeile</category>
            <category>tutorial</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/ubuntu-logo.png" alt="Ubuntu OS" width="200" height="200" />&#160;</p>

<h3 class="firstH">Vorwort</h3>

<p>Da die Installation von LibreOffice nicht so einfach zu sein scheint, habe ich nun schon ein paar Bekannten geholfen
LibreOffice zu installieren. Das ist auch der Grund, warum ich hier ein kleinen Tutorial daf&uuml;r schreibe.</p>

<p>LibreOffice wird von der Firma &quot;<strong>The Document Foundation</strong>&quot; angeboten und ist der Nachfolger bzw. die Entwickler-
und Communityweiterenwicklung von OpenOffice. LibreOffice liegt momentan in der Version 3.3.1 vor welche am 23. Februar
2011 ver&ouml;ffentlicht wurde und steht unter der Creative Commons Lizenz &quot;<strong>Attribution-ShareAlike 3.0 Unported</strong>&quot;
(<em><a href="http://creativecommons.org/licenses/by-sa/3.0/" title="Creative Commons Lizenz: Attribution-ShareAlike 3.0 Unported">CC BY-SA 3.0</a></em>).</p>

<h3>LibreOffice installieren</h3>

<h4>Download</h4>

<p>Als ersten Schritt laden wir uns das Installationspaket und die Sprachpakete von
<a href="http://de.libreoffice.org/download/" title="libreoffice.org - Downloads">libreoffice.org</a> herunter. Bei den Einstellungen
auf der Downloadseite stellen das Betriebssystem auf &quot;<strong>linux x86 (<em>deb</em>)</strong>&quot; oder &quot;<strong>linux x64 (<em>deb</em>)</strong>&quot; und die
Sprache auf &quot;<strong>de-Deutsch</strong>&quot;, danach stehen bei x86 diese 3 Dateien zum Download bereit:</p>

<ul class="reallist">
    <li><p><strong>LibO_3.3.1_Linux_x86_install-deb_en-US.tar.gz</strong></p></li>
    <li><p><strong>LibO_3.3.1_Linux_x86_langpack-deb_de.tar.gz</strong></p></li>
    <li><p><strong>LibO_3.3.1_Linux_x86_helppack-deb_de.tar.gz</strong></p></li>
</ul>

<p>Diese Dateien laden wir in den Ordner &quot;<strong>Downloads</strong>&quot; herunter und entpacken sie. In jedem der 3 entpackten Ordner
liegt ein Ordner &quot;<strong>DEBS</strong>&quot; zus&auml;tzlich liegt in der &quot;<strong>...install-deb_en-US</strong>&quot; im Ordner &quot;<strong>DEBS</strong>&quot;
noch der Ordner &quot;<strong>desktop-integration</strong>&quot;, diese sind nun f&uuml;r die Installation wichtig.</p>

<h4>Installation</h4>

<p>Nachdem nun die 3 Archive entpackt sind m&uuml;ssen wir das Kommandozeilentool &quot;<strong>Terminal</strong>&quot; von Ubuntu starten. Als
erstes wechseln wir im Terminal in den Ordner &quot;<strong>DEBS</strong>&quot; der &quot;<strong>...install-deb_en-US</strong>&quot;.</p>

<p><code>cd&#160;/home/&#036;USER/Downloads/LibO_3.3.1rc2_Linux_x86_install&#8209;deb_en&#8209;US/DEBS</code></p>

<p>Dort f&uuml;hren wir folgendes Kommando aus:</p>

<p><code>sudo&#160;dpkg&#160;&#8209;i&#160;*.deb</code></p>

<p>Die Installation muss mit dem Benutzerpasswort best&auml;tigt werden. Ist die Installation der .deb-Dateien beendet, wechseln
wir in den Unterordner &quot;<strong>desktop-integration</strong>&quot; (<em>dieser ist f&uuml;r die Startmen&uuml;eintr&auml;ge verantwortlich</em>):</p>

<p><code>cd&#160;/home/&#036;USER/Downloads/LibO_3.3.1rc2_Linux_x86_install&#8209;deb_en&#8209;US/DEBS/desktop&#8209;integration</code></p>

<p>Befindet man sich noch im DEBS-Ordner, kann man stattdessen auch dies schreiben:</p>

<p><code>cd&#160;desktop&#8209;integrations</code></p>

<p>Dort f&uuml;hren wir wieder das selbe Kommando aus:</p>

<p><code>sudo&#160;dpkg&#160;&#8209;i&#160;*.deb</code></p>

<p>Ist die Installation dort ebenfalls beendet, k&ouml;nnen wir nun die Sprachdateien installieren. Dazu wechseln wir in den Ordner &quot;<strong>...langpack-deb_de</strong>&quot;:</p>

<p><code>cd&#160;/home/&#036;USER/Downloads/LibO_3.3.1rc2_Linux_x86_langpack&#8209;deb_de/DEBS</code></p>

<p>Hier f&uuml;hren wir nun wieder das Kommando aus:</p>

<p><code>sudo&#160;dpkg&#160;&#8209;i&#160;*.deb</code></p>

<p>Zu guter Letzt wechseln wir in den Ordner mit den Hilfedateien:</p>

<p><code>cd&#160;/home/&#036;USER/Downloads/LibO_3.3.1rc2_Linux_x86_helppack&#8209;deb_de/DEBS</code></p>

<p>Und, wie h&auml;tte es auch anders sein k&ouml;nnen, f&uuml;hren dort wieder dieses Kommando aus:</p>

<p><code>sudo&#160;dpkg&#160;&#8209;i&#160;*.deb</code></p>

<p>Nun k&ouml;nnen wir die LibreOffice Programme &uuml;ber Anwendungen &raquo; B&uuml;ro aufrufen.</p>

<p class="center"><img src="http://raischblog.de/img/libre-office-im-menue.png" alt="LibreOffice im Men&uuml;" width="564" height="461" /></p>

<h3>Abschlie&szlig;endes</h3>

<p>Ich hoffe dieses kleine Tutorial war verst&auml;ndlich und konnte euch bei der Installation von LibreOffice helfen. Ab der
Ubuntuversion 11.04 Alpha, welche wohl im April erscheint, soll das LibreOffice-Paket &uuml;ber das Software-Center installierbar sein.</p>

<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Sun, 13 Mar 2011 19:05:24 +0100</pubDate>
        </item>


        <item>
            <title>Die Textdatentypen in SQL</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Die-Textdatentypen-in-SQL/</link>
            <guid isPermaLink="true">http://raischblog.de/Die-Textdatentypen-in-SQL/</guid>
            <comments>http://raischblog.de/Die-Textdatentypen-in-SQL/#commentList</comments>
            <category>sql</category>
            <category>datenbank</category>
            <category>tabelle</category>
            <category>datentyp</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/SQL-Icon.neu.200x219.png" alt="SQL" width="200" height="219" />&#160;</p>

<h3 class="firstH">Vorwort</h3>

<p>Wie ich in meinem letzten Beitrag schon erw&auml;hnt habe, werden Textdatentypen als Zeichenketten in der Datenbank gespeichert.
In Zeichenketten k&ouml;nnen Buchstaben, Zahlen, Sonder- und Steuerzeichen gespeichert werden. Zeichenketten kann man mit fester,
variabler oder sehr gro&szlig;er L&auml;nge in eine Datenbank aufnehmen.</p>

<h3>Die Textdatentypen laut SQL-Standard</h3>

<p>Der SQL-Standard kennt 3 Textdatentypen auf die ich hier eingehen m&ouml;chte:</p>

<ul class="reallist">
    <li><p><code class="inp">CHARACTER</code> bzw. <code class="inp">CHAR</code></p></li>
    <li><p><code class="inp">CHARACTER&#160;VARYING</code> bzw. <code class="inp">VARCHAR</code></p></li>
    <li><p><code class="inp">CHARACTER&#160;LARGE&#160;OBJECT</code></p></li>
</ul>

<h4>CHARACTER, CHAR</h4>

<p>Mit dem Datentyp <code class="inp">CHARACTER(n)</code> bzw. <code class="inp">CHAR(n)</code> wird einer Spalte in der Tabelle eine Zeichenkette mit fester L&auml;nge als Datentyp
festgelegt. F&uuml;r jeden Wert der hier gespeichert wird, wird also immer <code class="inp">n</code>-L&auml;nge als Speicherplatz zugewiesen. M&ouml;chte man nur ein
Zeichen in der Spalte speichern braucht man <code class="inp">n</code> nicht angeben.</p>

<p>Dieser Datentyp eignet sich also gut f&uuml;r Werte bei denen man schon im Voraus wei&szlig;, dass sie immer die selbe L&auml;nge haben wie
zum Beispiel (<em>deutsche</em>) Postleitzahlen.</p>

<p>Ich habe diesen Datentyp, zu meiner eigenen Schande, noch nie in einer meiner Datenbanken benutzt. Jedenfalls werde ich
demn&auml;chst einmal die Datenbank meines Blogs durchforsten und schauen wo dieser Datentyp Sinn macht.</p>

<h4>CHARACTER VARYING, VARCHAR</h4>

<p>Mit dem Datentyp <code class="inp">CHARACTER&#160;VARYING(n)</code> bzw. <code class="inp">VARCHAR(n)</code> wird einer Spalte in der
Tabelle eine Zeichenkette mit maximal <code class="inp">n</code>-L&auml;nge als Datentyp festgelegt. Es wird also immer nur soviel
Speicherplatz verbraucht wie auch tats&auml;chlich Daten vorhanden sind.</p>

<p>Diesen Datentyp kann man also f&uuml;r Spalten nutzen, bei denen man im Voraus nicht genau wei&szlig; wie lang die Daten sein werden.
Verwenden kann man diesen Datentyp zum Beispiel f&uuml;r Namen, Bezeichnungen oder auch Kommentare.</p>

<h4>CHARACTER LARGE OBJECT</h4>

<p>Mit dem Datentyp <code class="inp">CHARACTER&#160;LARGE&#160;OBJECT</code> lassen sich, wie der Name schon vermuten l&auml;sst, gro&szlig;e Zeichenketten abspeichern.</p>

<p>Ich benutze diesen Datentyp in der Datenbank meines Blogs zum Beispiel f&uuml;r die Beitr&auml;ge und die Kommentare. In meiner
MySQL-Datenbank hei&szlig;t dieser Datentyp &uuml;brigens TEXT.</p>

<h3>Maximale L&auml;ngen von Textdatentypen</h3>

<p><code class="inp">CHARACTER</code>, <code class="inp">CHAR</code>, <code class="inp">CHARACTER&#160;VARYING</code> und <code class="inp">VARCHAR</code>
haben in &auml;lteren Datenbankmanagementsystemen (DBMS) meist eine maximale L&auml;nge von 255 Zeichen, in neueren DBMS dagegen meist 32767 Zeichen.</p>

<p>F&uuml;r den <code class="inp">CHARACTER&#160;LARGE&#160;OBJECT</code> Datentyp konnte ich bei meinen Recherchen leider keinen genauen Wert ermitteln. Ich habe
lediglich gelesen, dass dieser Datentyp mehrere Gigabyte an Daten aufnehmen kann.</p>

<h3>Zahlen als Zeichenkette abspeichern?</h3>

<p>Da die meisten Programmiersprachen welche mit Zahlendatentypen arbeiten keine f&uuml;hrende Null in diesen Datentypen akzeptieren,
kann es sinnvoll sein, bestimmte Zahlenfolgen als Zeichenkette zu speichern. Sinnvoll ist dies zum Beispiel bei Postleitzahlen oder Telefonnummern.</p>

<h3>Abschlie&szlig;endes</h3>

<p>Ich hoffe dieser Beitrag war aufschlussreich und konnte euch diese 3 Datentypen n&auml;her bringen. Meinen n&auml;chsten Beitrag werde
ich den Zahlendatentypen widmen. Bis dahin w&uuml;nsche ich noch eine sch&ouml;ne Woche.</p>

<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Mon, 07 Mar 2011 21:47:16 +0100</pubDate>
        </item>


        <item>
            <title>Datentypen in SQL</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Datentypen-in-SQL/</link>
            <guid isPermaLink="true">http://raischblog.de/Datentypen-in-SQL/</guid>
            <comments>http://raischblog.de/Datentypen-in-SQL/#commentList</comments>
            <category>sql</category>
            <category>datenbank</category>
            <category>tabelle</category>
            <category>datentyp</category>
            <category>grundlagen</category>
            <category>boolean</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/SQL-Icon.neu.200x219.png" alt="SQL" width="200" height="219" />&#160;</p>

<h3 class="firstH">Vorwort</h3>

<p>Beim Erstellen und Arbeiten mit SQL-Datenbanken kommen wir nicht daran vorbei uns mit Datentypen zu besch&auml;ftigen.
Deswegen m&ouml;chte ich hier eine kleine &Uuml;bersicht &uuml;ber die Datentypen, die in SQL Verwendung finden, geben.</p>

<h3>Wo werden uns Datentypen begegnen?</h3>

<p>Prinzipiell werden uns Datentypen bei der Arbeit mit SQL h&auml;ufig begegnen, dennoch brauchen wir die Datentypen nur
an wenigen Stellen explizit angeben. Signifikant ist die Angabe von Datentypen beim Erstellen von Datenbanken/Tabellen
bzw. den Feldern da sich die Datenbank dort &quot;<em>merkt</em>&quot; in welcher Form (<em>und L&auml;nge</em>) sie Daten annehmen darf.</p>

<p>Beim Einf&uuml;gen oder Bearbeiten von Datens&auml;tzen brauchen wir die Datentypen dagegen nicht angeben. Wir m&uuml;ssen aber
sicherstellen, dass die &uuml;bergebenen Daten konform zum Datentyp des Feldes, in welchem die Daten gespeichert werden sollen, sind.</p>

<h3>Grunddatentypen</h3>

<p>Die Grunddatentypen kann man grob in 5 Kategorien unterteilen:</p>

<ul class="reallist">
    <li><p>Text</p></li>
    <li><p>Zahlen</p></li>
    <li><p>Zeiten</p></li>
    <li><p>Bits</p></li>
    <li><p>logische Werte</p></li>
</ul>

<h4>Textdatentypen</h4>

<p>Textdatentypen werden als Zeichenketten in der Datenbank gespeichert. Ein Feld vom Textdatentyp mit festgelegter L&auml;nge
belegt immer soviel Speicherplatz, dass die voreingestellte L&auml;nge in den Eigenschaften des Feldes erreicht wird (<em>auch wenn
der Feldinhalt k&uuml;rzer ist</em>). Ein Feld vom Textdatentyp mit maximaler L&auml;nge belegt nur soviel Speicherplatz wie der Inhalt
des Feldes auch braucht.</p>

<h4>Zahlendatentypen</h4>

<p>Zahlendatentypen werden in 2 Kategorien unterteilt, in <strong>exakt numerische</strong> und <strong>ann&auml;hernd numerische</strong> Datentypen. Die exakt
numerischen sind ganze Zahlen und Zahlen mit einer festgelegten Anzahl von Nachkommastellen, zum Beispiel Primzahlen oder
Geldbetr&auml;ge. Bei ann&auml;hernd numerischen kann man zum Beispiel die Zahl <a href="http://www.pibel.de/" title="pibel.de/">PI</a> nennen.</p>

<p>Bei den Zahlendatentypen gilt das gleiche Prinzip wie bei Textdatentypen, ein Feld mit festgelegter L&auml;nge belegt auch
immer soviel Speicherplatz, wogegen ein Feld mit maximaler L&auml;nge nur soviel Speicherplatz belegt wie Inhalt vorhanden ist.</p>

<h4>Zeitdatentypen</h4>

<p>Oft ist es sinnvoll Daten als Zeitdatentyp zu speichern um damit Berechnungen anzustellen. Zeitdatentypen sind ein sehr
komplexes Thema, weswegen ich dieses sp&auml;ter genauer erl&auml;utere.</p>

<h4>Bits</h4>

<p>Mit diesem Datentyp kenne ich mich leider noch nicht aus, werde mich aber in der n&auml;chsten Zeit etwas in dieses Thema
einlesen um hier Auskunft geben zu k&ouml;nnen. Soviel will ich aber schon verraten, mit diesem Datentyp kann man ganze Dateien
in einer Datenbank speichern die Daten werden dabei bin&auml;r gespeichert.</p>

<h4>Logische Werte</h4>

<p>Logische Werte k&ouml;nnen nur einen von 3 Zust&auml;nden haben: <code class="inp">TRUE</code> (<em>wahr</em>),
<code class="inp">FALSE</code> (<em>falsch</em>) oder <code class="inp">UNKNOWN</code> (<em>unbekannt</em>). Es gibt nur
den Datentyp <code class="inp">BOOLEAN</code> welcher logische Werte speichert.</p>

<h3>Abschlie&szlig;endes</h3>

<p>In meinem n&auml;chsten Beitrag, welcher im Laufe der Woche erscheint, werde ich genauer auf die Textdatentypen eingehen. Bis
dahin w&uuml;nsche ich einen sch&ouml;nen Start in die Woche.</p>

<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Sun, 06 Mar 2011 23:54:02 +0100</pubDate>
        </item>


        <item>
            <title>Einstieg in die Datenbankverwaltung mit SQL</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Einstieg-in-die-Datenbankverwaltung-mit-SQL/</link>
            <guid isPermaLink="true">http://raischblog.de/Einstieg-in-die-Datenbankverwaltung-mit-SQL/</guid>
            <comments>http://raischblog.de/Einstieg-in-die-Datenbankverwaltung-mit-SQL/#commentList</comments>
            <category>sql</category>
            <category>dml</category>
            <category>ddl</category>
            <category>datenbank</category>
            <category>tabelle</category>
            <category>relational</category>
            <category>redundanz</category>
            <category>it08</category>
            <category>grundlagen</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/SQL-Icon.neu.200x219.png" alt="SQL" width="200" height="219" />&#160;</p>

<h3 class="firstH">Vorwort</h3>

<p>In der elektronischen Datenverarbeitung (<em>EDV</em>) der heutigen Zeit kann man sich Datenbanken
und SQL (<em>Structured Query Language</em>) kaum noch weg denken. Vieles in unserem t&auml;glichen Leben
behilft sich dieser Technologien und w&auml;re ohne diese (<em>fast</em>) nicht mehr realisierbar. Die
Konten- und Kundenverwaltung von Banken und Versicherungen kann man hier beispielshalber nennen.</p>

<p>Im Internet trifft man an jeder Ecke Plattformen welche diese Technologien einsetzen.
Nennen kann man hier zum Beispiel Google, Yahoo, Ebay und Amazon, kleinere Seiten wie
dieser Blog k&ouml;nnen aber auch von diesen Technologien profitieren.</p>

<h3>Datenbanken</h3>

<p>Die am h&auml;ufigsten verwendete Form von Datenbanken ist sicherlich die relationale Datenbank.
In relationalen Datenbanken werden Daten mittels Tabellen in Spalten und Feldern, m&ouml;glichst
<a href="http://de.wikipedia.org/wiki/Redundanz_%28Informationstheorie%29" title="Wikipedia: Redundanz">redundanzfrei</a>, gespeichert.
Da mein Mitstreiter Toni Blonske schon ein paar sch&ouml;ne Beitr&auml;ge zu diesem Thema verfasst hat,
werde ich hier (<em>vorerst</em>) nicht weiter auf dieses Thema eingehen:
<a href="http://it08.tb-world.de/blog/tantetoni2/Normalisierung-Teil-1/" title="Beitr&auml;ge zu Datenbanken">Link zu Toni's Betr&auml;gen</a>.</p>

<h3>SQL</h3>

<p>SQL ist eine Datenbanksprache f&uuml;r relationale Datenbanken und wird zur Speicherung, Abfrage
und Manipulation von Daten/Informationen verwendet. SQL ist von ANSI und ISO standardisiert
und findet in fast allen Datenbankmanagementsystemen (<em>DBMS</em>) Verwendung.</p>

<p>SQL-Befehle kann man grob in 2 Kommandoformen unterteilen, die Data Manipulation Language
(<em>DML</em>) und die Data Definition Language (<em>DDL</em>).</p>

<h4>DML</h4>

<p>Mit der DML kann man die Daten in den Tabellen der Datenbank direkt manipulieren. So kann
man die Daten zum Beispiel auslesen, bearbeiten oder auch neue Datens&auml;tze einf&uuml;gen.</p>

<h5>Beispiele f&uuml;r DML-Befehle</h5>

<ul class="reallist">
    <li><p><code class="inp">INSERT</code> - zum einf&uuml;gen von Datens&auml;tzen</p></li>
    <li><p><code class="inp">SELECT</code> - zum auslesen von Datens&auml;tzen</p></li>
    <li><p><code class="inp">UPDATE</code> - zum bearbeiten von Datens&auml;tzen</p></li>
</ul>

<h4>DDL</h4>

<p>Mit der DDL kann man Datenbanken und Tabellen erstellen, die Spalten und Felder einer
Tabelle festlegen und f&uuml;r diese auch Einstellungen vornehmen.</p>

<h5>Beispiele f&uuml;r DDL-Befehle</h5>

<ul class="reallist">
    <li><p><code class="inp">CREATE</code> - zum erstellen von Datenbanken und Tabellen</p></li>
    <li><p><code class="inp">ALTER</code> - zum ver&auml;ndern von Eigenschaften und zur Strukturierung</p></li>
    <li><p><code class="inp">DROP</code> - zum l&ouml;schen von Datenbanken und Tabellen</p></li>
</ul>

<h3>Abschlie&szlig;endes</h3>

<p>Das soll es f&uuml;r diesen Beitrag erst einmal gewesen sein. Ich werde mich in meinen n&auml;chsten
Beitr&auml;gen weiter mit dem Thema SQL befassen und versuchen etwas Licht in die Sache zu bringen.</p>

<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Wed, 02 Mar 2011 18:08:12 +0100</pubDate>
        </item>


        <item>
            <title>JAVA und Netbeans unter Ubuntu 10.10 installieren</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/JAVA-und-Netbeans-unter-Ubuntu-1010-installieren/</link>
            <guid isPermaLink="true">http://raischblog.de/JAVA-und-Netbeans-unter-Ubuntu-1010-installieren/</guid>
            <comments>http://raischblog.de/JAVA-und-Netbeans-unter-Ubuntu-1010-installieren/#commentList</comments>
            <category>java</category>
            <category>jdk</category>
            <category>netbeans</category>
            <category>ide</category>
            <category>linux</category>
            <category>ubuntu</category>
            <category>shellscript</category>
            <category>kommandozeile</category>
            <category>tutorial</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/ubuntu-logo.png" alt="Ubuntu OS" width="200" height="200" />&#160;</p>
<h3 class="firstH">JAVA Development Kit installieren</h3>

<p>JAVA unter Ubuntu 10.10 (32bit) zu installieren ist einfacher als man meinen m&ouml;chte. Alles
    was man braucht ist eine Verbindung zum Internet und das Kommandozeilentool "Terminal"
    von Ubuntu. Wenn das Kommandozeilentool gestartet ist braucht man nur folgende Zeile
    eingeben und mit Enter best&auml;tigen:</p>

<p><code class="inp">sudo&#160;apt&#8209;get&#160;install&#160;sun&#8209;java6&#8209;jdk</code></p>

<p>Alles weitere l&auml;uft voll automatisch und bedarf, je nach Internetleitung, mehr oder
    weniger Zeit.</p>

<h3>Netbeans installieren (JDK muss installiert sein)</h3>

<p>Als erstes gehen wir auf die <a href="http://netbeans.org/downloads/index.html" title="Netbeans.org">Netbeans Downloadseite</a>
    und stellen dort die IDE-Sprache auf Deutsch und die Plattform auf Linux (x86/x64).
    Danach den Downloadbutton bei dem gew&uuml;nschten Packet dr&uuml;cken. Es wird eine Datei
    mit der Endung .sh (z.B. netbeans-6.9.1-ml-javase-linux.sh) heruntergeladen, diese
    speichern wir auf dem Desktop oder im Rootverzeichniss.</p>

<p>Diese Datei ist ein Shellscript
    welches wir nicht ohne weiteres ausf&uuml;hren k&ouml;nnen. Um die Datei ausf&uuml;hrbar zu machen,
    machen wir einen Rechtsklick auf die Datei und w&auml;hlen ganz unten im Kontextmen&uuml; die
    Eigenschaften aus. Dort gehen wir in den Reiter "Zugriffsrechte" und setzen bei
    "Ausf&uuml;hren" ein H&auml;ckchen bei "Datei als Programm ausf&uuml;hren".</p>

<p class="center"><img src="http://raischblog.de/img/ubuntu-zugriffsrechte.png" alt="Zugriffsrechte unter Ubuntu einstellen." width="505" height="470" /></p>

<p>Jetzt k&ouml;nnen wir die Datei doppelklicken und folgen einfach den Installationsanweisungen.</p>

<p>Ich w&uuml;nsche allen ein sch&ouml;nes Wochenende.</p>

<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Sat, 19 Feb 2011 22:27:08 +0100</pubDate>
        </item>


        <item>
            <title>Wie geht es weiter mit Raischblog</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Wie-geht-es-weiter-mit-Raischblog/</link>
            <guid isPermaLink="true">http://raischblog.de/Wie-geht-es-weiter-mit-Raischblog/</guid>
            <comments>http://raischblog.de/Wie-geht-es-weiter-mit-Raischblog/#commentList</comments>
            <category>raischblog</category>
            <category>ide</category>
            <category>java</category>
            <category>netbeans</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/netbeans-logo.png" alt="Netbeans IDE" width="224" height="224" />&#160;</p>
<p>Aus zeitlichen Gr�nden und, zugegeben, meiner eigenen Faulheit hat sich auf
dieser Seite einige Zeit nichts getan, dass wird sich nun wieder �ndern.</p>

<h3>Aktuelle Situation</h3>

<p>Da die Hauptlast unserer Ausbildung Momentan bei der Programmiersprache JAVA
liegt, werden die meisten folgenden Beitr�ge sich mit eben diesem Thema besch�ftigen.
In der Schule codieren wir unsere JAVA-Projekte mit der Netbeans
<abbr title="integrated development environment - auf Deutsch: integrierte Entwicklungsumgebung">IDE</abbr>.
Ich werde hier einige Projekte vorstellen, die Aufgabenstellung erl�utern,
einige L�sungsans�tze erl�utern und den kompletten Netbeans-Projektordner als
ZIP-Datei bereitstellen.</p>

<h4>Netbeans IDE Links</h4>

<ul class="reallist">
	<li><p><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" title="JAVA Downloads auf Oracle.com">Java Development Kit (JDK) - ben�tigt f�r Netbeans IDE</a></p></li>
	<li><p><a href="http://netbeans.org/downloads/index.html" title="Downloads auf Netbeans.org">Netbeans IDE</a></p></li>
</ul>

<h3>Aufbau meiner Projekte</h3>

<p>Es gibt in jedem meiner Projekte immer nur eine Quelldatei welche die Main-Klasse
enth�lt. Diese Datei hei�t immer "Test.java" und ist einzig dazu da, die verschiedenen
Algorythmen des Projektes zu testen. Alle anderen .java Dateien enthalten die
eigentlichen Klassen und Methoden die zur L�sung der Aufgabenstellung ben�tigt werden.</p>

<h4>Weitere Informationen</h4>

<p>Manche meiner Projekte sind etwas Umfangreicher als es in der Aufgabenstellung gefordert ist.
Dies kann passieren, wenn ich die Aufgabe interessant finde und mich etwas tiefer
in die Materie einlese oder mehrere L�sungsans�tze verfolge. Ich werde in meinen
Beitr�gen dann darauf hinweisen.</p>

<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Sun, 13 Feb 2011 12:33:58 +0100</pubDate>
        </item>


        <item>
            <title>Objektorientierte Programmierung</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Objektorientierte-Programmierung/</link>
            <guid isPermaLink="true">http://raischblog.de/Objektorientierte-Programmierung/</guid>
            <comments>http://raischblog.de/Objektorientierte-Programmierung/#commentList</comments>
            <category>oop</category>
            <category>objektorientiert</category>
            <category>java</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/oop.png" alt="oop" width="200" height="140" />&#160;</p>


<p>Da unsere Klasse haupts&auml;chlich mit JAVA programmieren wird und JAVA eine objektorientierte Programmiersprache

ist, m&ouml;chte ich den Begriff &quot;Objektorientierte Programmierung&quot; (<em>kurz OOP</em>) etwas unter die Lupe nehmen und versuchen

diesen verst&auml;ndlich zu erl&auml;utern.</p>


<h3>Vorwort</h3>


<p>Vorweg ist zu sagen, dass OOP zum Standard geworden ist. In der Ausbildung zum Anwendungsentwickler wird i.d.R.

von Anfang an nur dieser Ansatz der Programmierung unterrichtet. Die Entwicklung komplexer Softwaresysteme ohne OOP

ist heutzutage eher eine Ausnahme.</p>


<h3>Grundlegendes</h3>


<p>Der Grundgedanke der OOP ist, Daten und Funktionen, die auf diese Daten zugreifen oder sie manipulieren, eng

beieinander in sogenannten Objekten zu halten. Diese Objekte haben den Vorteil, dass die Daten innerhalb dieser

nicht versehentlich von anderen Objekten bzw. Methoden manipuliert werden k&ouml;nnen.</p>


<h3>Beispiel</h3>


<p>Software an sich abstrahiert Arbeitsschritte die der Mensch in der realen Welt ausf&uuml;hrt. Wenn wir uns jetzt

z.B. ein Warenlager anschauen, dann erkennen wir, dass die einzelnen Schritte wie Wareneingang, Warenerfassung,

Warenlagerung und Warenausgang in einem direkten Zusammenhang zueinander stehen. Jetzt stellen wir uns mal vor,

dass das Lager direkt im B&uuml;ro der Firma ist und alle zusammen in einem Raum arbeiten... w&auml;re das nicht ein sch&ouml;nes Chaos?</p>


<h4>Das Beispiel in OOP</h4>


<p>Mit der OOP werden wir nun versuchen dieses Chaos zu optimieren. Der erste Schritt den wir machen, ist das B&uuml;ro

und das Lager zu trennen. Wir erstellen also zwei Klassen (<em>wie es in der OOP genannt wird</em>), die Klasse &quot;B&uuml;ro&quot; und

die Klasse &quot;Lager&quot;. Die B&uuml;roklasse besch&auml;ftigt sich nun in einem separaten Raum ausschlie&szlig;lich mir der B&uuml;roarbeit,

die Lagerklasse mit der Lagerarbeit.</p>


<p>Im Objekt Lagerklasse legen wir Methoden f&uuml;r den Wareneingang, die Warenerfassung, die Warenlagerung und den

Warenausgang an. Diese stehen dann nur im Lagerklassenobjekt zur Verf&uuml;gung und werden von der B&uuml;roarbeit nicht

mehr behindert bzw. behindern diese auch nicht mehr.</p>


<h3>Abschlie&szlig;endes</h3>


<p>Ich hoffe ich konnte euch die Idee die hinter der OOP steht etwas n&auml;her bringen und w&uuml;nsche euch eine geruhsame Nacht.</p>


<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Fri, 29 Oct 2010 22:03:30 +0200</pubDate>
        </item>


        <item>
            <title>Grundlagen der Programmierung</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Grundlagen-der-Programmierung/</link>
            <guid isPermaLink="true">http://raischblog.de/Grundlagen-der-Programmierung/</guid>
            <comments>http://raischblog.de/Grundlagen-der-Programmierung/#commentList</comments>
            <category>oop</category>
            <category>objektorientiert</category>
            <category>struktogramm</category>
            <category>algorithmus</category>
            <category>grundlagen</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/Programmierung.png" alt="Programmierung" width="200" height="140" />&#160;</p>
<h3 class="firstH">Programme und Programmiersprachen</h3>
<h4>Was ist ein Programm?</h4>
<p>Ein Programm ist eine Folge von Anweisungen zur L�sung einer Aufgabe durch den Computer.</p>
<h4>Was ist ein Algorithmus?</h4>
<p>Ein Algorithmus ist eine <strong>endliche</strong> Folge von Anweisungen. Die Anweisungen eines Algorithmus m�ssen <strong>eindeutig</strong> und <strong>ausf�hrbar</strong> sein.
Bei Anwendung der gleichen Eingangsdaten in den Algorithmus liefert dieser <strong>immer</strong> das gleiche Ergebnis.</p>
<h4>Was ist eine Programmiersprache?</h4>
<p>Eine Programmiersprache ist eine <strong>k�nstliche</strong> Sprache zur Kommunikation mit dem Computer. Mit dieser Sprache werden Computerprogramme geschrieben.</p>
<p>Der <em>Sprachtext</em> nennt sich Quellcode. Dieser Quellcode muss in einen Maschinencode (1001 0011) �bersetzt werden. Das �bersetzen erfolgt durch Compiler-Programme.</p>
<h4>Beispiele f�r Programmiersprachen</h4>
<ul class="reallist">
	<li><p>C, C++, C#</p></li>
	<li><p>JAVA</p></li>
	<li><p>Visual Basic</p></li>
	<li><p>BASIC</p></li>
	<li><p>PHP</p></li>
	<li><p>JavaScript</p></li>
</ul>
<h3>Begriffe in der Programmierung</h3>
<h4>Strukturierte/Objektorientierte Programmierung</h4>
<p>Bezeichnen eine Methodik des Programmierens.</p>
<h5>Strukturiertes programmieren</h5>
<p>Hei�t Daten und Funktionen <strong>getrennt</strong> zu behandeln. Beim Programmentwurf werden vor allem Struktogramme und Entity-Relationship-Diagramme (ER-Diagramm) genutzt.</p>
<h6>Struktogramme</h6>
<p>Ein Nassi-Shneiderman-Diagramm oder Struktogramm (<em>genormt in der DIN 66261</em>) ist eine Darstellung von Programmentw�rfen im Rahmen der Methode der strukturierten Programmierung.</p>
<p><img src="http://raischblog.de/img/struktogramm.png" alt="Schema eines Struktogramms" width="630" height="336" /></p>
<h5>Objektorientiertes programmieren</h5>
<p>Hei�t Daten und Funktionen <strong>gemeinsam</strong> zu betrachten. Diese werden als Eigenschaften und Methoden in einer Klasse festgelegt. Diese Klasse beschreibt das Verhalten von Objekten.</p>
<h3>Softwareentwicklung</h3>
<ul class="reallist">
	<li><p><strong>Anforderungsanalyse</strong></p><p> &raquo; Aufgabenstellung erarbeiten</p></li>
	<li><p><strong>Programmentwurf</strong></p><p> &raquo; Skizzen und Modelle anfertigen</p></li>
	<li><p><strong>Codieren</strong></p><p> &raquo; Quellcode aufschreiben, ausf�hrbare Datei erstellen</p></li>
	<li><p><strong>Test</strong></p><p> &raquo; Funktionsf�higkeit nachweisen, Fehler beseitigen</p></li>
	<li><p><strong>Dokumentation</strong></p><p> &raquo; technische Beschreibung das fertigen Programms</p></li>
</ul>
<h4>Top Down, Bottom Up, Forward Engineering</h4>
<p>Diese Begriffe beschreiben Prinzipien des methodischen Herangehens an die Entwicklung von Software.</p>
<ul class="reallist">
	<li><p><strong>Top Down</strong></p><p> &raquo; Entwicklung von der allgemeinen Aufgabenstellung bis zum detaillierten Modul.</p></li>
	<li><p><strong>Bottom Up</strong></p><p> &raquo; Entwicklung vom einzelnen Modul bis zum komplexen System.</p></li>
	<li><p><strong>Forward Engineering</strong></p><p> &raquo; Entwicklung vom abstrakten Modell bis zum konkreten Programm.</p></li>
</ul>
<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Tue, 26 Oct 2010 17:21:05 +0200</pubDate>
        </item>


        <item>
            <title>Aus gegebenem Anlass - start des IT08 Portals</title>
            <dc:creator>Toni Blonske</dc:creator>
            <link>http://raischblog.de/Aus-gegebenem-Anlass-start-des-IT08-Portals/</link>
            <guid isPermaLink="true">http://raischblog.de/Aus-gegebenem-Anlass-start-des-IT08-Portals/</guid>
            <comments>http://raischblog.de/Aus-gegebenem-Anlass-start-des-IT08-Portals/#commentList</comments>
            <category>it08</category>
            <category>sonstiges</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/it08screen.png" alt="Screenshot" width="200" height="135" />&#160;</p>
<p>Erstmal stelle ich mich vor: mein Name ist Toni ich bin 26 Jahre alt und in der Klasse von Rainer, wie der Rainer bin ich schon seit Jahren in der Webprogrammierung t�tig, angefangen mit dem Programmieren habe ich mit ca 9 Jahren damals Basic auf dem C64.</p>
<p>Ich habe Tischler gelernt, dennoch war programmieren immer mein Traum und durch die Umschulung habe ich endlich die M�glichkeit, mein Hobby zum Beruf zu machen, was mir damals nicht m�glich war.</p>
<p>An dieser Stelle m�chte ich auf das <a href="http://it08.tb-world.de">IT08 Portal</a> eingehen, ich hatte mir gedacht f�r unsere Klasse ein kleines Portal zu basteln, welches eine Blogfunktion beinhaltet, einen Multiple Choice Test zum testen des eigenen Wissenstandes, der Rest der folgenen Dinge sind noch nicht integriert: ein Forum, ein Nachrichten System fuer die Verst�ndigung untereinander, ein Eventplaner der einen �ber Events und Vorkommnisse informiert und noch so einiges mehr; siehe <a href="http://it08.tb-world.de/blog/tantetoni2/Der-erste-Beitrag/">Der erste Beitrag</a>.</p>
<p>So das war es erstmal von mir, ich denke ich werde ab und zu auch mal hier einen Beitrag schreiben.</p>
<p>Mit freundlichen Gr��en Toni.</p>
<div class="newRow">&#160;</div>
 ]]></description>
            <pubDate>Tue, 19 Oct 2010 20:53:17 +0200</pubDate>
        </item>


        <item>
            <title>Meine PHP Templateklasse.</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Meine-PHP-Templateklasse/</link>
            <guid isPermaLink="true">http://raischblog.de/Meine-PHP-Templateklasse/</guid>
            <comments>http://raischblog.de/Meine-PHP-Templateklasse/#commentList</comments>
            <category>oop</category>
            <category>objektorientiert</category>
            <category>php</category>
            <category>template</category>
            <category>klasse</category>
            <category>download</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/screenshot.tplclass.png" alt="Screenshot" width="200" height="140" />&#160;</p>
<p>Ich habe seit einiger Zeit immer mal wieder an meiner PHP-Templateklasse gearbeitet und diese meinen Bed&uuml;rfnissen angepasst.
Gestern habe ich die Klasse etwas Dokumentiert und zusammen mit einer PHP-Testdatei und einem kleinen Testtemplate in ein Ziparchiv gepackt um es euch zur Verf&uuml;gung zu stellen.</p>
<p>Da ich mich nicht f&uuml;r Unfehlbar halte, kann es sicherlich sein, dass kleinere Fehler oder Bugs im Script existieren.
Wenn Ihr einen Fehler findet, bitte ich euch diesen hier als Kommentar zu melden.</p>
<p><strong>Die PHP-Templateklasse kann:</strong></p>
<ul class="reallist">
    <li><p>Platzhalter ersetzen</p></li>
    <li><p>Schleifen verarbeiten</p></li>
    <li><p>IF-Bereiche je nach &Uuml;bergabeparameter anzeigen oder ausblenden</p></li>
</ul>
<p><strong>Hier nun die Details der Datei und der Downloadlink:</strong></p>
<ul class="reallist">
    <li><p>Format: ZIP</p></li>
    <li><p>md5 Checksumme: 00ef2c46079d647852dd803c46e49cc5</p></li>
    <li><p><a href="http://raischblog.de/file.rsTPL.zip" title="Meine PHP-Template-Klasse als ZIP-Datei.">rsTPL.zip</a> <img src="http://raischblog.de/img/ico.save.png" alt="" width="11" height="11" /> 1,9kB &raquo; <strong>320</strong> Downloads</p></li>
    <li><p><a href="http://raischblog.de/Downloads/PHP-Templateklasse/" title="Detailseite der PHP-Template-Klasse.">Detailseite der Klasse</a></p></li>
</ul>
<p><strong>Hier die Klasse ohne Dokumentation:</strong></p>
<p><code class="block">class&#160;rsTPL<br />
{<br />
&#160;&#160;&#160;&#160;public&#160;&#036;file&#160;=&#160;null;<br />
&#160;&#160;&#160;&#160;public&#160;&#036;tpl&#160;=&#160;null;<br />
&#160;&#160;&#160;&#160;public&#160;&#036;preg&#160;=&#160;null;<br />
&#160;&#160;&#160;&#160;public&#160;&#036;each&#160;=&#160;null;<br />
&#160;&#160;&#160;&#160;private&#160;&#036;dat&#160;=&#160;null;<br />
<br />
&#160;&#160;&#160;&#160;public&#160;function&#160;outputPrint()<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;this&#8209;&gt;dat&#160;=&#160;file_get_contents(&#160;&#036;this&#8209;&gt;file&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;this&#8209;&gt;dat&#160;=&#160;&#036;this&#8209;&gt;parsePreg(&#160;&#036;this&#8209;&gt;dat&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;this&#8209;&gt;dat&#160;=&#160;&#036;this&#8209;&gt;parseForeach(&#160;&#036;this&#8209;&gt;dat&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;this&#8209;&gt;dat&#160;=&#160;&#036;this&#8209;&gt;parseTpl(&#160;&#036;this&#8209;&gt;dat&#160;);<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;print(&#160;&#036;this&#8209;&gt;dat&#160;);<br />
&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;public&#160;function&#160;outputString()<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;this&#8209;&gt;dat&#160;=&#160;file_get_contents(&#160;&#036;this&#8209;&gt;file&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;this&#8209;&gt;dat&#160;=&#160;&#036;this&#8209;&gt;parsePreg(&#160;&#036;this&#8209;&gt;dat&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;this&#8209;&gt;dat&#160;=&#160;&#036;this&#8209;&gt;parseForeach(&#160;&#036;this&#8209;&gt;dat&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;this&#8209;&gt;dat&#160;=&#160;&#036;this&#8209;&gt;parseTpl(&#160;&#036;this&#8209;&gt;dat&#160;);<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;&#036;this&#8209;&gt;dat;<br />
&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;private&#160;function&#160;parseForeach(&#160;&#036;result&#160;)<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(isset(&#160;&#036;this&#8209;&gt;each&#160;)&#160;)<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;foreach(&#160;&#036;this&#8209;&gt;each&#160;as&#160;&#036;key&#160;=&gt;&#160;&#036;value&#160;)<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;preg_match(&#160;&quot;#{FOREACH|&quot;.&#036;key.&quot;}(.*?){ENDFOREACH|&quot;.&#036;key.&quot;}#si&quot;,&#160;&#036;result,&#160;&#036;matches&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;res&#160;=&#160;&quot;&quot;;<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;foreach(&#160;&#036;this&#8209;&gt;each[&#036;key]&#160;as&#160;&#036;layerkey&#160;=&gt;&#160;&#036;layervalue&#160;)<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;push&#160;=&#160;&#036;matches[1];<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;foreach(&#160;&#036;this&#8209;&gt;each[&#036;key][&#036;layerkey]&#160;as&#160;&#036;detailkey&#160;=&gt;&#160;&#036;detailvalue&#160;)<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;push&#160;=&#160;&#036;this&#8209;&gt;replaceKeys(&#160;&#036;detailkey,&#160;&#036;detailvalue,&#160;&#036;push&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;res.=&#160;&#036;push.&quot;n&quot;;<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;result&#160;=&#160;preg_replace(&#160;&quot;#{FOREACH|&quot;.&#036;key.&quot;}(.*?){ENDFOREACH|&quot;.&#036;key.&quot;}#si&quot;,&#160;&#036;res,&#160;&#036;result&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;&#036;result;<br />
&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;private&#160;function&#160;parsePreg(&#160;&#036;result&#160;)<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(isset(&#160;&#036;this&#8209;&gt;preg&#160;)&#160;)<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;foreach(&#160;&#036;this&#8209;&gt;preg&#160;as&#160;&#036;key&#160;=&gt;&#160;&#036;value&#160;)<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(&#160;&#036;value&#160;){&#160;&#036;value&#160;=&#160;&quot;&#036;1&quot;;&#160;}else{&#160;&#036;value&#160;=&#160;&quot;&quot;;&#160;}<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;result&#160;=&#160;preg_replace(&#160;&quot;#{IF|&quot;.&#160;&#036;key.&quot;}(.*?){ENDIF|&quot;.&#036;key.&quot;}#si&quot;,&#160;&#036;value,&#160;&#036;result&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(&#160;!&#036;value&#160;){&#160;&#036;value&#160;=&#160;&quot;&#036;1&quot;;&#160;}else{&#160;&#036;value&#160;=&#160;&quot;&quot;;&#160;}<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;result&#160;=&#160;preg_replace(&#160;&quot;#{IF|!&quot;.&#160;&#036;key.&quot;}(.*?){ENDIF|!&quot;.&#036;key.&quot;}#si&quot;,&#160;&#036;value,&#160;&#036;result&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;&#036;result;<br />
&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;private&#160;function&#160;parseTpl(&#160;&#036;result&#160;)<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(isset(&#160;&#036;this&#8209;&gt;tpl&#160;)&#160;)<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;foreach(&#160;&#036;this&#8209;&gt;tpl&#160;as&#160;&#036;key&#160;=&gt;&#160;&#036;value&#160;)<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;result&#160;=&#160;&#036;this&#8209;&gt;replaceKeys(&#160;&#036;key,&#160;&#036;value,&#160;&#036;result&#160;);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;&#036;result;<br />
&#160;&#160;&#160;&#160;}<br />
<br />
&#160;&#160;&#160;&#160;private&#160;function&#160;replaceKeys(&#160;&#036;key,&#160;&#036;value,&#160;&#036;result&#160;)<br />
&#160;&#160;&#160;&#160;{<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#036;result&#160;=&#160;str_replace(&#160;&quot;{&quot;.&#036;key.&quot;}&quot;,&#160;&#036;value,&#160;&#036;result&#160;);<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;&#036;result;<br />
&#160;&#160;&#160;&#160;}<br />
}</code></p>
<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Mon, 18 Oct 2010 13:21:04 +0200</pubDate>
        </item>


        <item>
            <title>Serverumzug!</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Serverumzug/</link>
            <guid isPermaLink="true">http://raischblog.de/Serverumzug/</guid>
            <comments>http://raischblog.de/Serverumzug/#commentList</comments>
            <category>raischblog</category>
            <category>server</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/ok.png" alt="ok" width="48" height="48" />&#160;</p>
<p>Ich bin mit meinem Blog nun zu einer anderen Domain umgezogen. Der Weg war lang und beschwerlich, doch letztendlich haben wir es geschafft.</p>
<p>Der Blog ist ab jetzt �ber <strong>http://raischblog.de</strong> erreichbar. Ich habe auf der alten Domain eine 301-Umleitung <em>(permanent)</em> eingerichtet damit Besucher keine Fehlermeldung bekommen.</p>
<p>In der Hoffnung, endlich einmal Zeit zu finden, einen Beitrag schreiben zu k�nnen der etwas mit dem Blogthema zu tun hat, verabschiede ich mich und w�nsche eine geruhsame Nacht.</p>
<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Mon, 18 Oct 2010 02:46:48 +0200</pubDate>
        </item>


        <item>
            <title>Schutz gegen Spambots!</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Schutz-gegen-Spambots/</link>
            <guid isPermaLink="true">http://raischblog.de/Schutz-gegen-Spambots/</guid>
            <comments>http://raischblog.de/Schutz-gegen-Spambots/#commentList</comments>
            <category>raischblog</category>
            <category>bots</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/screenshot.botprot.png" alt="Screenshot" width="200" height="140" />&#160;</p>
<p>Da diese Seite nun schon von einigen Spambots heimgesucht wurde, sah ich mich gezwungen einen kleinen Schutz gegen eben diese einzurichten.</p>
<p>Bei den Kommentaren und dem Gaestebuch muss beim Eintragen ab jetzt eine kleine mathematische Textaufgabe geloest werden.
Diese Aufgabe ist nicht schwer, aber leider eine kleine Unannehmlichkeit fuer euch normale Seitenbesucher.</p>
<p>Desweiteren habe ich einen Schutz eingebaut der verhindern soll, dass wenn man nach dem Eintragen eines Kommentars die Seite neu laedt <em>(F5)</em>
der Kommentar ein zweites mal in die Datenbank geschrieben wird.</p>
<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Thu, 14 Oct 2010 18:56:07 +0200</pubDate>
        </item>


        <item>
            <title>Neues Hintergrundbild! Meinungen?</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Neues-Hintergrundbild-Meinungen/</link>
            <guid isPermaLink="true">http://raischblog.de/Neues-Hintergrundbild-Meinungen/</guid>
            <comments>http://raischblog.de/Neues-Hintergrundbild-Meinungen/#commentList</comments>
            <category>raischblog</category>
            <category>hintergrundbild</category>
            <category>design</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/screenshot.bgneu.png" alt="Screenshot" width="200" height="140" />&#160;</p>
<p>Ich habe gerade noch ein neues Hintergrundbild f�r die Seite gemacht, und w�rde jetzt gern eure Meinung dazu wissen.
Wenn Ihr eure Meinung los werden wollt, dann benutzt daf�r bitte die Kommentarfunktion.</p>
<p>Falls es euch nicht gef�llt, dann sagt mir bitte was genau euch daran st�rt und wie ich das evtl. �ndern kann.
Habt Ihr eine Idee f�r ein anderes Hintergrundbild, w�rde mich das auch brennend interessieren. Eigene Hintergrundbilder
k�nnt ihr mir auch gerne zukommen lassen, nutzt daf�r einfach einen der vielen kostenlosen Imagehoster.</p>
<p>Konstruktive Kritik und Anregungen sind bei mir immer willkommen. Also immer ran an den Speck, die Datenbank m�chte gef�llt werden :).</p>
<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Mon, 11 Oct 2010 22:12:29 +0200</pubDate>
        </item>


        <item>
            <title>Designanpassung in den n�chsten Stunden!</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Designanpassung-in-den-nchsten-Stunden/</link>
            <guid isPermaLink="true">http://raischblog.de/Designanpassung-in-den-nchsten-Stunden/</guid>
            <comments>http://raischblog.de/Designanpassung-in-den-nchsten-Stunden/#commentList</comments>
            <category>raischblog</category>
            <category>design</category>
            <description><![CDATA[ <p class="floatLeft"><a href="http://raischblog.de/?dpTheme=switch" title="Zwischen dem alten und neuen Thema wechseln."><img src="http://raischblog.de/img/screenshot.png" alt="Screenshot" width="200" height="140" /></a>&#160;</p>
<p>In den naechsten Stunden kann es dazu kommen, dass das Design der Seite etwas wirr wirkt.</p>
<p>Ich werde noch ein paar Farbkombinationen testen und schauen was mir am besten gefaellt. Falls also etwas verrutscht ist
oder die Sidebar komplett fehlt, wundert euch nicht, dann habe ich totalen Mist gebaut...</p>
<p>Wenn ihr Farbideen oder Aenderungsvorschlaege fuer die Seite habt, dann immer raus damit. Wozu gibt es denn die Kommentarfunktion ? :)</p>
<p>Wer Schreibfehler findet, darf diese behalten!</p>
<p><strong>Edit//</strong></p>
<p>Zwischen dem alten und neuen Thema koennt Ihr hin und her wechseln, wenn Ihr
<a href="http://raischblog.de/?dpTheme=switch" title="Zwischen dem alten und neuen Thema wechseln.">hier</a> oder auf das Bild in diesem Beitrag klickt.</p>
<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Sun, 10 Oct 2010 15:14:36 +0200</pubDate>
        </item>


        <item>
            <title>Lustiges IT-Fundst�ck fuer zwischendurch.</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Lustiges-IT-Fundstck-fuer-zwischendurch/</link>
            <guid isPermaLink="true">http://raischblog.de/Lustiges-IT-Fundstck-fuer-zwischendurch/</guid>
            <comments>http://raischblog.de/Lustiges-IT-Fundstck-fuer-zwischendurch/#commentList</comments>
            <category>sonstiges</category>
            <category>lustig</category>
            <category>fun</category>
            <description><![CDATA[ <p class="floatLeft"><img src="http://raischblog.de/img/fun.png" alt="Fun" width="74" height="81" />&#160;</p>
<p>Diese Erlaeuterung, was ein IT&#39;ler ist, hat heute einer meiner Mitstreiter in der Schule auf
<a href="http://www.stupidedia.org" title="stupidedia.org">stupidedia.org</a> gefunden. Dieses
wollte ich euch nicht vorenthalten.</p>
<p>Viel Spass!</p>
<h3>Der IT&#39;ler</h3>
<p>Ein IT&#39;ler ist eine Weiterentwicklung des normalen Menschen, der Koffein zu Computer-Schwachsinn
verarbeitet. Das Gegenstueck zu ihm ist der <abbr title="duemmster anzunehmenden User">DAU</abbr> mit
einem <abbr title="problem exists between Keyboard and chair">PEBKAC</abbr>. IT&#39;ler lieben Abkuerzungen.</p>
<p>Fuer franzoesischsprachige Menschen ist IT&#39;ler die Bezeichnung fuer einen ehemaligen deutschen Diktator.</p>
<h4>Funktionsweise</h4>
<p>IT&#39;ler leben nicht. Sie sind Wesen die halb aus Computer und halb aus Mensch bestehen. Allerdings
gibt es vier bis f�nf Sachen, die ein IT&#39;ler benoetigt um zu funktionieren:</p>
<ul class="reallist">
	<li><p>Strom</p></li>
	<li><p>Internet</p></li>
	<li><p>Kaffee</p></li>
	<li><p>Zigaretten (Alternativ dazu kann auch eine stark erhoehte Dosis Koffein verabreicht werden.)</p></li>
	<li><p>Pizza</p></li>
</ul>
<h4>Lebenszweck</h4>
<p>IT&#39;ler haben das unersaettliche Bestreben die Computerwelt zu revolutionieren, wobei sie gnadenlos
alles und jeden aus dem Weg raeumen welche sich ihnen in den Weg stellen. Ihre sogenannten Revolutionen
haben entweder der Menschheit geschadet (siehe Windoof) oder fast vernichtet (siehe ebenfalls Windoof)
Sehr selten haben sie auch Positives vollbracht, z.B. die Stupidedia, deren Diktatoren mit an Sicherheit
grenzender Wahrscheinlichkeit zu den IT&#39;lern gehoeren.</p>
<h4>Vorkommen</h4>
<p>Der natuerliche Lebensraum eines IT&#39;lers ist der Serverraum. Gewoehnlich ist er umgeben von unzaehligen
Pizzaschachteln, einem Dutzend Rechnern und ganz vielen Servern. Einige Exemplare des IT&#39;lers, die es
geschafft haben sich im Ansatz zumindest soziale Kompetenzen anzueignen, verfuegen darueber hinaus ueber
ein Telefon was zumindest ans Nerdnetz angeschlossen ist. In seltenen Faellen kann es passieren, dass das
Telefon auch ans oeffentliche Telefonnetz angeschlossen ist.</p>
<p>Bei Tageslicht und auf offener Strasse wurde noch kein IT&#39;ler gesehen.</p>
<h4>Bezahlung</h4>
<p>IT&#39;ler welche sich in einem Anstellungsverhaeltnis zum Herrgott befinden (in der Regel Firmen wie
Microsuck, Goeoegle oder eBucht) werden mit Gadgets bezahlt. Meist handelt es sich dabei um uebergrosse
<abbr title="Thin-film transistor">TFT</abbr>&#39;s am Arbeitsplatz, aufgemotzte Quadcore Rechner
und ganz viel Spielzeug fuer den <abbr title="Universal Serial Bus">USB</abbr> Port. Zudem
bekommen einige auch Verpflegungsgutscheine von ihrem Arbeitgeber. Einige Glueckliche kriegen auch
zudem noch einen Hungerlohn.</p>
<h4>Was tue ich wenn ich einen IT&#39;ler sehe?</h4>
<p>In dem Falle einer Begegnung mit einem IT&#39;ler helfen diese Dinge:</p>
<ul class="reallist">
	<li><p>Kruzifix, viel Knoblauch und Holzpfloecke.</p></li>
	<li><p>Das Bild eines Programmes, welches er selbst vehunzt hat; dies wird den boesartigen IT&#39;ler garantiert in den Selbstmord treiben!</p></li>
	<li><p>Ein zerschnittenes Netzwerk oder Computer-Stromkabel bzw. zerstoerte Hardware, welche den IT&#39;ler zu manischen Depressionen und der unloesbaren Frage nach dem Sinn und somit in den Selbstmord treiben wird!</p></li>
	<li><p>Eine Atombombe (besser mehrere).</p></li>
	<li><p>Wasser und Seife.</p></li>
</ul>
<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Thu, 07 Oct 2010 17:30:46 +0200</pubDate>
        </item>


        <item>
            <title>Mein Feed ist ab jetzt ueber Feedburner erreichbar!</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Mein-Feed-ist-ab-jetzt-ueber-Feedburner-erreichbar/</link>
            <guid isPermaLink="true">http://raischblog.de/Mein-Feed-ist-ab-jetzt-ueber-Feedburner-erreichbar/</guid>
            <comments>http://raischblog.de/Mein-Feed-ist-ab-jetzt-ueber-Feedburner-erreichbar/#commentList</comments>
            <category>raischblog</category>
            <category>feed</category>
            <category>xml</category>
            <description><![CDATA[ <p class="floatLeft"><a href="http://feeds.feedburner.com/Raisch" title="Abonnieren Sie meinen Feed." rel="alternate" type="application/rss+xml"><img src="http://raischblog.de/img/feed-icon-128x128.png" alt="Feed" width="128" height="128" /></a>&#160;</p>
<p>Ich habe meinen Feed jetzt bei <a href="http://feedburner.com" title="feedburner.com">feedburner.com</a> eingerichtet.
Meine dynamische XML-Datei fuer den Feed existiert weiterhin, ist aber nicht mehr oeffentlich zugaenglich.</p>
<p>Falls euch auf der Seite ein Fehler oder ein Bug auffaellt, dann schreibt mir das bitte hier als Kommentar oder ins
<a href="http://raischblog.de/Gaestebuch/" title="Mein Gaestebuch.">Gaestebuch</a>. Auch ueber konstruktive Kritik an der Seite wuerde ich mich freuen</p>
<p>Nur mal so am Rande eine Frage an euch: Warum ist Wirtschaftlehre so ein oedes Fach? :)</p>
<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Wed, 06 Oct 2010 23:35:00 +0200</pubDate>
        </item>


        <item>
            <title>Willkommen auf raisch.tb-world.de!</title>
            <dc:creator>Rainer Schulz</dc:creator>
            <link>http://raischblog.de/Willkommen-auf-raischtb-worldde/</link>
            <guid isPermaLink="true">http://raischblog.de/Willkommen-auf-raischtb-worldde/</guid>
            <comments>http://raischblog.de/Willkommen-auf-raischtb-worldde/#commentList</comments>
            <category>raischblog</category>
            <description><![CDATA[ <p class="floatLeft"><a href="http://twitter.com/Raischblog" title="Follow me on Twitter."><img src="http://raischblog.de/img/break_the_egg_128px.png" alt="Twitterlogo" width="128" height="128" />&#160;</a></p>
<h3 class="firstH">Ueber mich.</h3>
<p>Mein Name ist Rainer Schulz, ich bin 27 Jahre alt und wohne im Stadtteil Lichtenberg des schoenen Berlin.</p>
<p>Ich bin Fachinformatiker/Anwendungsentwickler in der Ausbildung. Privat programmiere ich jetzt schon
circa 7 Jahre, habe Erfahrungen in PHP, XHTML, XML, CSS und etwas C++. Wie man sieht, liegt mein privates
Interesse im Bereich der Webentwicklung, dennoch freue ich mich darauf mehr mit C++ und JAVA zu arbeiten.</p>
<h3>Sinn dieser Webseite.</h3>
<p>Diese Webseite wird mein Ausbildungstagebuch/Erfahrungsbericht. Sicherlich werde ich hier nicht jeden Tag
schreiben was wir so gelernt haben, aber ab und an werde ich hier ueber interessante Sachen berichten.</p>
<div class="newRow">&#160;</div> ]]></description>
            <pubDate>Tue, 05 Oct 2010 17:04:26 +0200</pubDate>
        </item>

    </channel>

</rss>