<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5552537696441759305</id><updated>2011-04-21T13:12:12.163-07:00</updated><category term='Perl'/><category term='MySQL'/><category term='javascript'/><category term='ajax'/><category term='Catalyst'/><title type='text'>dapissarenko.com</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dapissarenko.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5552537696441759305/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dapissarenko.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dmitri Pissarenko</name><uri>http://www.blogger.com/profile/16192778056937297710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>1</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5552537696441759305.post-5496907986279707415</id><published>2007-05-17T08:32:00.000-07:00</published><updated>2007-05-17T09:51:18.450-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><title type='text'>Eine einfache Anwendung in Perl Catalyst</title><content type='html'>Hallo!&lt;br /&gt;&lt;br /&gt;Wie ich &lt;a href="http://www.gossamer-threads.com/lists/catalyst/users/13953?page=last"&gt;gelesen&lt;/a&gt; habe, gibt es nur wenige deutschsprachige Einführungen ins &lt;a href="http://www.catalystframework.org/"&gt;Catalyst&lt;/a&gt;-Framework.&lt;br /&gt;&lt;br /&gt;In diesem Beitrag werde ich Ihnen eine kleine Catalyst-Anwendung zeigen. Anhand dieser Anwendung können Catalyst-Anfänger besser verstehen, wie Catalyst funktioniert.&lt;br /&gt;&lt;br /&gt;Die Anwendung heißt &lt;span style="font-style: italic;"&gt;Time Tracking&lt;/span&gt; und ist mit Perl, Catalyst, JavaScript und MySQL entwickelt worden.&lt;br /&gt;&lt;br /&gt;In dieser Anwendung kann der Benutzer Angaben über Zeitverbrauch speichern und Kategorien bzw. Zielen zuordnen.&lt;br /&gt;&lt;br /&gt;Sehen wir uns das an einem Beispiel an:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx-F6UXNGI/AAAAAAAAAHs/QqL6Hz5mpO8/s1600-h/img01.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx-F6UXNGI/AAAAAAAAAHs/QqL6Hz5mpO8/s400/img01.png" alt="" id="BLOGGER_PHOTO_ID_5065562320904074338" border="0" /&gt;&lt;/a&gt;Hier gibt es eine Aktivität &lt;span style="font-style: italic;"&gt;Wrote documentation&lt;/span&gt;, die der Kategorie &lt;span style="font-style: italic;"&gt;Documentation&lt;/span&gt; und dem Ziel &lt;span style="font-style: italic;"&gt;Documentation (JavaScript spike solution)&lt;/span&gt; zugeordnet ist.&lt;br /&gt;&lt;br /&gt;Ziele sind hierarchisch gegliedert:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HxjW1V5E8vQ/Rkx9_qUXNFI/AAAAAAAAAHk/RSyiT2C5H0I/s1600-h/img02.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_HxjW1V5E8vQ/Rkx9_qUXNFI/AAAAAAAAAHk/RSyiT2C5H0I/s400/img02.png" alt="" id="BLOGGER_PHOTO_ID_5065562213529891922" border="0" /&gt;&lt;/a&gt;In diesem Fall dient die Aktivität dem Erreichen des Zieles &lt;span style="font-style: italic;"&gt;JavaScript spike solution&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Die Anwendung besteht aus drei Seiten:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx9UKUXNEI/AAAAAAAAAHc/OCgYhubj7z0/s1600-h/img03.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx9UKUXNEI/AAAAAAAAAHc/OCgYhubj7z0/s400/img03.png" alt="" id="BLOGGER_PHOTO_ID_5065561466205582402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Einstiegsseite&lt;/span&gt;&lt;br /&gt;Auf der Einstiegsseite befinden sich nur Links zu den anderen Seiten:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HxjW1V5E8vQ/Rkx9LqUXNDI/AAAAAAAAAHU/A6ljp2ObhFo/s1600-h/img04.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_HxjW1V5E8vQ/Rkx9LqUXNDI/AAAAAAAAAHU/A6ljp2ObhFo/s400/img04.png" alt="" id="BLOGGER_PHOTO_ID_5065561320176694322" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Kategorien-Seite&lt;/span&gt;&lt;br /&gt;Die Kategorien-Seite dient dem Erstellen und Löschen von Kategorien:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx886UXNCI/AAAAAAAAAHM/FBMZhwdVE6c/s1600-h/img05.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx886UXNCI/AAAAAAAAAHM/FBMZhwdVE6c/s400/img05.png" alt="" id="BLOGGER_PHOTO_ID_5065561066773623842" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Neue Kategorie erstellen&lt;/span&gt;&lt;br /&gt;Um eine neue Kategorie anzulegen, muss man zuerst den Link &lt;span style="font-style: italic;"&gt;New category&lt;/span&gt; anklicken.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx8jKUXNBI/AAAAAAAAAHE/I1_rQzZ8Ah4/s1600-h/img06.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx8jKUXNBI/AAAAAAAAAHE/I1_rQzZ8Ah4/s400/img06.png" alt="" id="BLOGGER_PHOTO_ID_5065560624391992338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Danach erscheint ein neues Fenster, wo man die Daten der neuen Kategorie eingeben kann:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx8W6UXNAI/AAAAAAAAAG8/HEI6RC7pxGw/s1600-h/img07.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx8W6UXNAI/AAAAAAAAAG8/HEI6RC7pxGw/s400/img07.png" alt="" id="BLOGGER_PHOTO_ID_5065560413938594818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Wenn man in diesem neuen Fester den Cancel-Link anklickt, wird das Fenster geschlossen und es passiert sonst nichts.&lt;br /&gt;&lt;br /&gt;Wenn man den OK-Link anklickt, ohne einen Text in das Textfield &lt;span style="font-style: italic;"&gt;Name&lt;/span&gt; einzugeben, kommt eine Fehlermeldung:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HxjW1V5E8vQ/Rkx8AqUXM_I/AAAAAAAAAG0/oW_qXgv3a7A/s1600-h/img08.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_HxjW1V5E8vQ/Rkx8AqUXM_I/AAAAAAAAAG0/oW_qXgv3a7A/s400/img08.png" alt="" id="BLOGGER_PHOTO_ID_5065560031686505458" border="0" /&gt;&lt;/a&gt;Wenn man den Namen und das Kommentar eingegeben hat und dann auf OK klickt, wird&lt;br /&gt;&lt;ol&gt;   &lt;li&gt;     &lt;p style="margin-bottom: 0cm;"&gt;das kleine Fenster geschlossen und&lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style="margin-bottom: 0cm;"&gt;die Liste im Hauptfenster  aktualisiert.&lt;/p&gt;   &lt;/li&gt; &lt;/ol&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HxjW1V5E8vQ/Rkx7oaUXM-I/AAAAAAAAAGs/Ysw15ZJMdzM/s1600-h/img09.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_HxjW1V5E8vQ/Rkx7oaUXM-I/AAAAAAAAAGs/Ysw15ZJMdzM/s400/img09.png" alt="" id="BLOGGER_PHOTO_ID_5065559615074677730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx7X6UXM9I/AAAAAAAAAGk/PNHxNQwlsZc/s1600-h/img10.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx7X6UXM9I/AAAAAAAAAGk/PNHxNQwlsZc/s400/img10.png" alt="" id="BLOGGER_PHOTO_ID_5065559331606836178" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Kategorien einzeln löschen&lt;/span&gt;&lt;br /&gt;Neben jeder Kategorie steht ein &lt;span style="font-style: italic;"&gt;Delete&lt;/span&gt;-Link.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HxjW1V5E8vQ/Rkx7KaUXM8I/AAAAAAAAAGc/EyEy9RcdS8k/s1600-h/img11.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_HxjW1V5E8vQ/Rkx7KaUXM8I/AAAAAAAAAGc/EyEy9RcdS8k/s400/img11.png" alt="" id="BLOGGER_PHOTO_ID_5065559099678602178" border="0" /&gt;&lt;/a&gt; &lt;p style="margin-bottom: 0cm;"&gt;Klickt man auf diesen, kommt eine Sicherheitsabfrage:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HxjW1V5E8vQ/Rkx6raUXM6I/AAAAAAAAAGM/agTAuZHQfnw/s1600-h/img12.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_HxjW1V5E8vQ/Rkx6raUXM6I/AAAAAAAAAGM/agTAuZHQfnw/s400/img12.png" alt="" id="BLOGGER_PHOTO_ID_5065558567102657442" border="0" /&gt;&lt;/a&gt;Klickt man auf &lt;i&gt;No&lt;/i&gt;, wird das kleine Fenster geschlossen und es passiert sonst nichts.&lt;br /&gt;&lt;br /&gt;Klickt man auf &lt;span style="font-style: italic;"&gt;Yes&lt;/span&gt;, wird das kleine Fenster geschlossen, die Kategorie gelöscht und im Hauptfenster wird die Liste aktualisiert.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Kategorien an- und abwählen&lt;/span&gt;&lt;br /&gt;Neben jeder Kategorie steht eine Checkbox. Über die Links Select all und Deselect all, kann man alle Kategorien an- bzw. abwählen:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx6i6UXM5I/AAAAAAAAAGE/kRL_8G_Hglc/s1600-h/img13.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx6i6UXM5I/AAAAAAAAAGE/kRL_8G_Hglc/s400/img13.png" alt="" id="BLOGGER_PHOTO_ID_5065558421073769362" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Mehrere Kategorien auf einmal löschen&lt;/span&gt;&lt;br /&gt;Wenn mehrere Kategorien ausgewählt sind, kann man sie alle auf einmal löschen, indem man auf&lt;span style="font-style: italic;"&gt; Delete selected categories&lt;/span&gt; klickt (wenn keine Kategorien ausgewählt sind, führt ein Klick auf diesen Link zu einer alert-Fehlermeldung):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx6T6UXM4I/AAAAAAAAAF8/NVDqryJNq2A/s1600-h/img14.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx6T6UXM4I/AAAAAAAAAF8/NVDqryJNq2A/s400/img14.png" alt="" id="BLOGGER_PHOTO_ID_5065558163375731586" border="0" /&gt;&lt;/a&gt; &lt;p style="margin-bottom: 0cm;"&gt;Es erscheint eine Sicherheitsabfrage:&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx6NKUXM3I/AAAAAAAAAF0/Ems8EUDLzJ0/s1600-h/img15.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx6NKUXM3I/AAAAAAAAAF0/Ems8EUDLzJ0/s400/img15.png" alt="" id="BLOGGER_PHOTO_ID_5065558047411614578" border="0" /&gt;&lt;/a&gt;Klickt man in diesem Fenster auf &lt;span style="font-style: italic;"&gt;Yes&lt;/span&gt;, wird es geschlossen, die Kategorien gelöscht und die Liste im Hauptfenster aktualisiert.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ziele-Seite&lt;/span&gt;&lt;br /&gt;Über die Zielseite (http://localhost:3000/goals) kann man die Zielhierarchie editieren.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx586UXM2I/AAAAAAAAAFs/B-P5pFOhg1s/s1600-h/img16.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx586UXM2I/AAAAAAAAAFs/B-P5pFOhg1s/s400/img16.png" alt="" id="BLOGGER_PHOTO_ID_5065557768238740322" border="0" /&gt;&lt;/a&gt;Der Baum wird von einem dtree-Skript von Geir Landrö (drop@destroydrop.com) gesteuert, man kann die Knoten auf- und zuklappen:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HxjW1V5E8vQ/Rkx5yaUXM1I/AAAAAAAAAFk/TfTHE8IV-SA/s1600-h/img17.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_HxjW1V5E8vQ/Rkx5yaUXM1I/AAAAAAAAAFk/TfTHE8IV-SA/s400/img17.png" alt="" id="BLOGGER_PHOTO_ID_5065557587850113874" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HxjW1V5E8vQ/Rkx5raUXM0I/AAAAAAAAAFc/DRMD36nTRHg/s1600-h/img18.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_HxjW1V5E8vQ/Rkx5raUXM0I/AAAAAAAAAFc/DRMD36nTRHg/s400/img18.png" alt="" id="BLOGGER_PHOTO_ID_5065557467591029570" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Erstellen von Zielen ohne Ober-Ziel&lt;/span&gt;&lt;br /&gt;Will man ein Ziel ohne Oberziel erstellen (d. h. Ziel ohne Eltern-Ziel), muß man auf den Link &lt;span style="font-style: italic;"&gt;Create new top-level goal&lt;/span&gt; klicken.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx5g6UXMzI/AAAAAAAAAFU/zIB-o8VvzFE/s1600-h/img19.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx5g6UXMzI/AAAAAAAAAFU/zIB-o8VvzFE/s400/img19.png" alt="" id="BLOGGER_PHOTO_ID_5065557287202403122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Wenn man den Namen und das Kommentar eingibt und auf OK klickt, wird das neue Ziel angelegt und im Baum dargestellt:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx5IKUXMxI/AAAAAAAAAFE/BkJdYtDt-vU/s1600-h/img21.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx5IKUXMxI/AAAAAAAAAFE/BkJdYtDt-vU/s400/img21.png" alt="" id="BLOGGER_PHOTO_ID_5065556862000640786" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Anlegen von Unterzielen&lt;/span&gt;&lt;br /&gt;Klickt man auf die Aufschrift des Ziels (rote Ellipse im letzten Screenshot), erscheint folgendes Fenster:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx466UXMvI/AAAAAAAAAE0/9nERQZX5K8Q/s1600-h/img23.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx466UXMvI/AAAAAAAAAE0/9nERQZX5K8Q/s400/img23.png" alt="" id="BLOGGER_PHOTO_ID_5065556634367374066" border="0" /&gt;&lt;/a&gt;  &lt;p style="margin-bottom: 0cm;"&gt;Um ein Unterziel von diesem Ziel zu erstellen, muß man auf den Link &lt;i&gt;Create Sub-Goal&lt;/i&gt; klicken.&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Danach verändert sich das Fenster:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx4x6UXMuI/AAAAAAAAAEs/tBmi34fwhAY/s1600-h/img24.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx4x6UXMuI/AAAAAAAAAEs/tBmi34fwhAY/s400/img24.png" alt="" id="BLOGGER_PHOTO_ID_5065556479748551394" border="0" /&gt;&lt;/a&gt;Gibt man den Namen und Kommentar ein, wird das kleine Fenster geschlossen und der Baum aktualisiert:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx4pKUXMtI/AAAAAAAAAEk/I9kp7FmBlFg/s1600-h/img25.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx4pKUXMtI/AAAAAAAAAEk/I9kp7FmBlFg/s400/img25.png" alt="" id="BLOGGER_PHOTO_ID_5065556329424696018" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Ziele löschen&lt;/span&gt;&lt;br /&gt;Um ein Ziel zu löschen, muß man es anklicken und im kleinen Fenster &lt;span style="font-style: italic;"&gt;Delete&lt;/span&gt; anklicken.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HxjW1V5E8vQ/Rkx4hqUXMsI/AAAAAAAAAEc/jmLJT2wPNXI/s1600-h/img26.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_HxjW1V5E8vQ/Rkx4hqUXMsI/AAAAAAAAAEc/jmLJT2wPNXI/s400/img26.png" alt="" id="BLOGGER_PHOTO_ID_5065556200575677122" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Zugeordnete Aktivitäten anzeigen&lt;/span&gt;&lt;br /&gt;Jede Aktivität wird einem Ziel zugeordnet. Über den Zielbaum kann man sich ansehen, welche Aktivitäten einem Ziel zugeordnet sind.&lt;br /&gt;&lt;br /&gt;Nehmen wir an, wir wollen ansehen, welche Aktivitäten dem Ziel &lt;span style="font-style: italic;"&gt;Basic knowledge of Catalyst&lt;/span&gt; zugeordnet sind.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx4Y6UXMrI/AAAAAAAAAEU/1J6UIxWQPQ4/s1600-h/img27.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx4Y6UXMrI/AAAAAAAAAEU/1J6UIxWQPQ4/s400/img27.png" alt="" id="BLOGGER_PHOTO_ID_5065556050251821746" border="0" /&gt;&lt;/a&gt;Es erscheint folgendes Fenster:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx4QKUXMqI/AAAAAAAAAEM/ha3JyFazZ-Q/s1600-h/img28.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx4QKUXMqI/AAAAAAAAAEM/ha3JyFazZ-Q/s400/img28.png" alt="" id="BLOGGER_PHOTO_ID_5065555899927966370" border="0" /&gt;&lt;/a&gt;Klickt man auf den Link &lt;i&gt;Show activities of this goal&lt;/i&gt;, erscheint im Hauptfenster folgende Tabelle:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx4GKUXMpI/AAAAAAAAAEE/kw2rS22M_B4/s1600-h/img29.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx4GKUXMpI/AAAAAAAAAEE/kw2rS22M_B4/s400/img29.png" alt="" id="BLOGGER_PHOTO_ID_5065555728129274514" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Aktivitäten-Seite&lt;/span&gt;&lt;br /&gt;Die Aktivitäten-Seite besteht aus mehreren Teilen.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx386UXMoI/AAAAAAAAAD8/MXyIthjtb8A/s1600-h/img30.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx386UXMoI/AAAAAAAAAD8/MXyIthjtb8A/s400/img30.png" alt="" id="BLOGGER_PHOTO_ID_5065555569215484546" border="0" /&gt;&lt;/a&gt;Im blau hervorgehobenen Teil werden alle vorhandenen Aktivitäten aufgelistet. Über den Link &lt;i&gt;New activity&lt;/i&gt; kann man eine neue Aktivitäten eingeben.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Neue Aktivität eingeben&lt;/span&gt;&lt;br /&gt;Die Seite zum Eingeben neuer Aktivitäten sieht folgendermaßen aus:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx3yKUXMnI/AAAAAAAAAD0/MeWldbG2W0M/s1600-h/img31.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx3yKUXMnI/AAAAAAAAAD0/MeWldbG2W0M/s400/img31.png" alt="" id="BLOGGER_PHOTO_ID_5065555384531890802" border="0" /&gt;&lt;/a&gt;Zunächst muß man das Datum eingeben. Das geschieht über einen Date-Picker, den über den rot hervorgehobenen Button aufgerufen wird (der Datepicker wurde von TengYong Ng, &lt;a href="http://www.rainforestnet.com/"&gt;http://www.rainforestnet.com&lt;/a&gt;, contact@rainforestnet.com entwickelt).&lt;br /&gt;&lt;p style="margin-bottom: 0cm; page-break-before: always;" align="left"&gt;Es erscheint folgendes Fenster:&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HxjW1V5E8vQ/Rkx3kqUXMmI/AAAAAAAAADs/-FFvHlqOdlY/s1600-h/img32.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_HxjW1V5E8vQ/Rkx3kqUXMmI/AAAAAAAAADs/-FFvHlqOdlY/s400/img32.png" alt="" id="BLOGGER_PHOTO_ID_5065555152603656802" border="0" /&gt;&lt;/a&gt;Wenn man einen Tag im Kalender anklickt, wird das kleine Fenster geschlossen und das Textfeld aktualisiert:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx3U6UXMlI/AAAAAAAAADk/NdXdfV_fpkI/s1600-h/img33.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx3U6UXMlI/AAAAAAAAADk/NdXdfV_fpkI/s400/img33.png" alt="" id="BLOGGER_PHOTO_ID_5065554882020717138" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Anschließend muß man die Kategorie aus der Liste auswählen und ein Ziel für diese Aktivität eingeben.&lt;br /&gt;&lt;br /&gt;Das geschieht über &lt;span style="font-style: italic;"&gt;Select goal&lt;/span&gt;-Link:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HxjW1V5E8vQ/Rkx3IaUXMkI/AAAAAAAAADc/TcbnqreVn3c/s1600-h/img34.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_HxjW1V5E8vQ/Rkx3IaUXMkI/AAAAAAAAADc/TcbnqreVn3c/s400/img34.png" alt="" id="BLOGGER_PHOTO_ID_5065554667272352322" border="0" /&gt;&lt;/a&gt;Wenn man einen Knoten im Baum anklickt (die Aufschrift), dann wird das kleine Fenster geschlossen und das Ziel in „input type=hidden“-Element gespeichert:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx2_KUXMjI/AAAAAAAAADU/j2d8g0jAp8k/s1600-h/img35.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx2_KUXMjI/AAAAAAAAADU/j2d8g0jAp8k/s400/img35.png" alt="" id="BLOGGER_PHOTO_ID_5065554508358562354" border="0" /&gt;&lt;/a&gt;Schließlich muß man noch die Dauer der Aktivität eingeben und auf &lt;i&gt;OK&lt;/i&gt; klicken.&lt;br /&gt;&lt;p style="margin-bottom: 0cm;" align="left"&gt;Folgender Inhalt erscheint:&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx216UXMiI/AAAAAAAAADM/7Z_96wxpN9Y/s1600-h/img36.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx216UXMiI/AAAAAAAAADM/7Z_96wxpN9Y/s400/img36.png" alt="" id="BLOGGER_PHOTO_ID_5065554349444772386" border="0" /&gt;&lt;/a&gt;Klickt man auf &lt;span style="font-style: italic;"&gt;Back to list&lt;/span&gt;, gelangt man zur Aktivitäten-Ansicht, wo die neue Aktivität zu sehen ist.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx2LKUXMhI/AAAAAAAAADE/emv3j1ViLG0/s1600-h/img37.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_HxjW1V5E8vQ/Rkx2LKUXMhI/AAAAAAAAADE/emv3j1ViLG0/s400/img37.png" alt="" id="BLOGGER_PHOTO_ID_5065553615005364754" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Summen nach Zielen und Kategorien&lt;/span&gt;&lt;br /&gt;Im unteren Teil des Fensters sind folgende zwei Tabellen zu sehen:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx146UXMgI/AAAAAAAAAC8/gmHSCsSPu4s/s1600-h/img38.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx146UXMgI/AAAAAAAAAC8/gmHSCsSPu4s/s400/img38.png" alt="" id="BLOGGER_PHOTO_ID_5065553301472752130" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In der linken sind Zeiten der Aktivitäten nach Zielen summiert, in der rechten – nach Kategorien.&lt;br /&gt;&lt;p style="margin-bottom: 0cm;"&gt;Die zugrundeliegenden SQL-Abfragen sehen so aus:&lt;/p&gt;   &lt;pre style=""&gt;SELECT SUM(duration), goals.name&lt;br /&gt;FROM activities, goals&lt;br /&gt;WHERE activities.goalId = goals.id&lt;br /&gt;GROUP BY activities.goalId&lt;br /&gt;ORDER BY goals.name&lt;br /&gt;&lt;br /&gt;SELECT SUM(duration), categories.name&lt;br /&gt;FROM activities, categories&lt;br /&gt;WHERE activities.categoryId = categories.id&lt;br /&gt;GROUP BY activities.categoryId&lt;br /&gt;ORDER BY categories.name&lt;/pre&gt; &lt;span style="font-weight: bold;"&gt;Datenbank-Tabellen&lt;br /&gt;&lt;/span&gt; &lt;p style="margin-bottom: 0cm;"&gt;Es gibt bei dieser Anwendung drei Datenbank-Tabellen – jeweils eine für Aktivitäten, Kategorien und Ziele:&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Die Tabellen habe ich manuell in phpMyAdmin angelegt, ein SQL-Skript (von phpMyAdmin generiert) sieht so aus:&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- phpMyAdmin SQL Dump&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- version 2.6.0-pl3&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- http://www.phpmyadmin.net&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- &lt;/span&gt; &lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- Host: localhost&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- Generation Time: May 08, 2007 at 12:19 AM&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- Server version: 4.1.8&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- PHP Version: 5.0.3&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- &lt;/span&gt; &lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- Database: `timetracking`&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- &lt;/span&gt; &lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- --------------------------------------------------------&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- &lt;/span&gt; &lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- Table structure for table `activities`&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- &lt;/span&gt; &lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;CREATE TABLE `activities` (&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;`id` int(11) NOT NULL auto_increment,&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;`date` date NOT NULL default '0000-00-00',&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;`categoryId` int(11) NOT NULL default '0',&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;`name` varchar(255) collate latin1_general_ci NOT NULL default '',&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;`comment` varchar(255) collate latin1_general_ci NOT NULL default '',&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;`goalId` int(11) NOT NULL default '0',&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;`duration` double NOT NULL default '0',&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;PRIMARY KEY  (`id`)&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=18 ;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- &lt;/span&gt; &lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- Dumping data for table `activities`&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- &lt;/span&gt; &lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `activities` (`id`, `date`, `categoryId`, `name`, `comment`, `goalId`, `duration`) VALUES (11, 0x323030372d30352d3032, 26, 'Learned how to use Catalyst', 'Tutorial "Catalyst::Manual::Tutorial::Authentication - Catalyst Tutorial - Part 4: Authentication", "Catalyst::Manual::Tutorial::Authorization - Catalyst Tutorial - Part 5: Authorization"', 17, 0.75);&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `activities` (`id`, `date`, `categoryId`, `name`, `comment`, `goalId`, `duration`) VALUES (10, 0x323030372d30352d3031, 26, 'Learned how to use Catalyst', '', 17, 6.73);&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `activities` (`id`, `date`, `categoryId`, `name`, `comment`, `goalId`, `duration`) VALUES (12, 0x323030372d30352d3033, 23, 'Created skeleton for the demo app', '', 19, 0.78);&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `activities` (`id`, `date`, `categoryId`, `name`, `comment`, `goalId`, `duration`) VALUES (13, 0x323030372d30352d3035, 23, 'Demo app "time tracking"', '', 19, 2.23);&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `activities` (`id`, `date`, `categoryId`, `name`, `comment`, `goalId`, `duration`) VALUES (14, 0x323030372d30352d3036, 23, 'Demo app "time tracking"', '', 19, 7.56);&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `activities` (`id`, `date`, `categoryId`, `name`, `comment`, `goalId`, `duration`) VALUES (15, 0x323030372d30352d3037, 23, 'Demo app "time tracking", debugging', '', 19, 8.08);&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `activities` (`id`, `date`, `categoryId`, `name`, `comment`, `goalId`, `duration`) VALUES (16, 0x323030372d30352d3037, 24, 'Wrote documentation', '', 18, 2);&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `activities` (`id`, `date`, `categoryId`, `name`, `comment`, `goalId`, `duration`) VALUES (17, 0x323030372d30352d3037, 26, 'Some activity', '', 19, 1);&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- --------------------------------------------------------&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- &lt;/span&gt; &lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- Table structure for table `categories`&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- &lt;/span&gt; &lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;CREATE TABLE `categories` (&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;`id` int(11) NOT NULL auto_increment,&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;`name` varchar(255) collate latin1_general_ci NOT NULL default '',&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;`comment` varchar(255) collate latin1_general_ci NOT NULL default '',&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;PRIMARY KEY  (`id`)&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=30 ;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- &lt;/span&gt; &lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- Dumping data for table `categories`&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- &lt;/span&gt; &lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `categories` (`id`, `name`, `comment`) VALUES (26, 'Learning', 'Learning how to use some new (for me) technology');&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `categories` (`id`, `name`, `comment`) VALUES (25, 'Reading (tech)', 'Reading technical books');&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `categories` (`id`, `name`, `comment`) VALUES (24, 'Documentation', 'Writing user and developers'' manual');&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `categories` (`id`, `name`, `comment`) VALUES (23, 'Programming', 'All programming activities');&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- --------------------------------------------------------&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- &lt;/span&gt; &lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- Table structure for table `goals`&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- &lt;/span&gt; &lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;CREATE TABLE `goals` (&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;`id` int(11) NOT NULL auto_increment,&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;`name` varchar(255) collate latin1_general_ci NOT NULL default '',&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;`comment` varchar(255) collate latin1_general_ci NOT NULL default '',&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;`superGoal` int(11) NOT NULL default '0',&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;`deadline` date NOT NULL default '0000-00-00',&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;`attained` binary(1) NOT NULL default '',&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;`whenAttained` date NOT NULL default '0000-00-00',&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;`cancelled` binary(1) NOT NULL default '',&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;`whenCancelled` date NOT NULL default '0000-00-00',&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Lucida Console,monospace;"&gt;PRIMARY KEY  (`id`)&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=22 ;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- &lt;/span&gt; &lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- Dumping data for table `goals`&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;-- &lt;/span&gt; &lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `goals` (`id`, `name`, `comment`, `superGoal`, `deadline`, `attained`, `whenAttained`, `cancelled`, `whenCancelled`) VALUES (12, 'Enterprise information system', 'ASP.NET project', 0, 0x303030302d30302d3030, '', 0x303030302d30302d3030, '', 0x303030302d30302d3030);&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `goals` (`id`, `name`, `comment`, `superGoal`, `deadline`, `attained`, `whenAttained`, `cancelled`, `whenCancelled`) VALUES (13, 'JavaScript spike solution', 'Program for testing my JavaScript skills', 0, 0x303030302d30302d3030, '', 0x303030302d30302d3030, '', 0x303030302d30302d3030);&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `goals` (`id`, `name`, `comment`, `superGoal`, `deadline`, `attained`, `whenAttained`, `cancelled`, `whenCancelled`) VALUES (14, 'User interface (EIS)', '', 12, 0x303030302d30302d3030, '', 0x303030302d30302d3030, '', 0x303030302d30302d3030);&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `goals` (`id`, `name`, `comment`, `superGoal`, `deadline`, `attained`, `whenAttained`, `cancelled`, `whenCancelled`) VALUES (15, 'Business logic (EIS)', '', 12, 0x303030302d30302d3030, '', 0x303030302d30302d3030, '', 0x303030302d30302d3030);&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `goals` (`id`, `name`, `comment`, `superGoal`, `deadline`, `attained`, `whenAttained`, `cancelled`, `whenCancelled`) VALUES (16, 'Documentation (EIS)', '', 12, 0x303030302d30302d3030, '', 0x303030302d30302d3030, '', 0x303030302d30302d3030);&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `goals` (`id`, `name`, `comment`, `superGoal`, `deadline`, `attained`, `whenAttained`, `cancelled`, `whenCancelled`) VALUES (17, 'Basic knowledge of Catalyst', '', 13, 0x303030302d30302d3030, '', 0x303030302d30302d3030, '', 0x303030302d30302d3030);&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `goals` (`id`, `name`, `comment`, `superGoal`, `deadline`, `attained`, `whenAttained`, `cancelled`, `whenCancelled`) VALUES (18, 'Documentation (JavaScript spike solution)', '', 13, 0x303030302d30302d3030, '', 0x303030302d30302d3030, '', 0x303030302d30302d3030);&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `goals` (`id`, `name`, `comment`, `superGoal`, `deadline`, `attained`, `whenAttained`, `cancelled`, `whenCancelled`) VALUES (19, 'Demo app works', '', 13, 0x303030302d30302d3030, '', 0x303030302d30302d3030, '', 0x303030302d30302d3030);&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Lucida Console,monospace;"&gt;INSERT INTO `goals` (`id`, `name`, `comment`, `superGoal`, `deadline`, `attained`, `whenAttained`, `cancelled`, `whenCancelled`) VALUES (20, 'My new goal', 'My new goal comment', 0, 0x303030302d30302d3030, '', 0x303030302d30302d3030, '', 0x303030302d30302d3030);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-weight: bold;"&gt;Abschlußworte&lt;br /&gt;&lt;/span&gt;Die Anwendung wird mit "script\timetrackingapp_server.pl"  gestartet. Parallel dazu muß &lt;a href="http://www.apachefriends.org/de/xampp.html"&gt;xampp&lt;/a&gt; laufen, denn die Anwendung benötig eine MySQL-Datenbank.&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span&gt;Den Source-Code der Anwendung können Sie &lt;a href="http://dapissarenko.com/resources/2007_05_17_timeTrackingApp/TimeTrackingApp.zip"&gt;hier&lt;/a&gt; herunterladen.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span&gt;Und falls Sie nur an JavaScript-Teilen der Anwendung interessiert sind, können Sie &lt;a href="http://dapissarenko.com/resources/2007_05_17_timeTrackingApp/timeTrackingStatic.zip"&gt;hier&lt;/a&gt; eine "statische" Version der Anwendung herunterladen, also einfach die HTML-Dateien, die Sie in jedem Browser ansehen können.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span&gt;In dieser statischen Version sind die serverseitigen Teile natürlich nicht funktionsfähig.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span&gt;Viel Spaß beim Erforschen von Catalyst!&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span&gt;Dmitri Pissarenko&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5552537696441759305-5496907986279707415?l=dapissarenko.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dapissarenko.blogspot.com/feeds/5496907986279707415/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5552537696441759305&amp;postID=5496907986279707415' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5552537696441759305/posts/default/5496907986279707415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5552537696441759305/posts/default/5496907986279707415'/><link rel='alternate' type='text/html' href='http://dapissarenko.blogspot.com/2007/05/eine-einfache-anwendung-in-perl_17.html' title='Eine einfache Anwendung in Perl Catalyst'/><author><name>Dmitri Pissarenko</name><uri>http://www.blogger.com/profile/16192778056937297710</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HxjW1V5E8vQ/Rkx-F6UXNGI/AAAAAAAAAHs/QqL6Hz5mpO8/s72-c/img01.png' height='72' width='72'/><thr:total>2</thr:total></entry></feed>
