<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>Phpmonkeys &#187; Allgemein</title>
	<atom:link href="http://www.phpmonkeys.de/category/allgemein/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.phpmonkeys.de</link>
	<description>Software Development in PHP</description>
	<lastBuildDate>Thu, 02 Feb 2012 08:42:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Review: Virtual GIT Summit</title>
		<link>http://www.phpmonkeys.de/2012/02/02/review-virtual-git-summit/</link>
		<comments>http://www.phpmonkeys.de/2012/02/02/review-virtual-git-summit/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 08:42:14 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[php|architect]]></category>
		<category><![CDATA[summit]]></category>
		<category><![CDATA[virtual Git Summit]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=1748</guid>
		<description><![CDATA[Gestern Abend fand das Virtual GIT Summit statt und dazu gibt es hier ein kleines Review.
Technik
Da es "Virtual" heißt, kann man schon erraten, dass es sich nicht um eine normale Konferenz handelt. Vielmehr wurde alles über das Netz gestreamt ...]]></description>
			<content:encoded><![CDATA[<p>Gestern Abend fand das <a href="http://www.phparch.com/phparchitect-live-presents-the-virtual-git-summit/" target="_blank">Virtual GIT Summit</a> statt und dazu gibt es hier ein kleines Review.<br />
<span id="more-1748"></span></p>
<h2>Technik</h2>
<p>Da es &#8220;Virtual&#8221; heißt, kann man schon erraten, dass es sich nicht um eine normale Konferenz handelt. Vielmehr wurde alles über das Netz gestreamt und somit konnte man weltweit aus dem trauten Heim der Veranstaltung folgen. Als Basis diente die Vuze Meeting Seite. Über einen Link gelangte man in den entsprechenden Raum und über eine Skype Verbindung zu Vuze Meeting wurde die Tonspur bereitgestellt. Somit wurde eine bewährte Technik für den Audio-Stream genutzt, was ich recht schick finde. Es bestand auch die Möglichkeit den Stream über die Webseite zu beziehen aber laut den anderen Teilnehmern war die Skype-Lösung tendenziell besser. Die Einwahl per telefon wäre auch möglich gewesen, aber von Deutschland her wenig sinnvoll. Support wurde über einen IRC-Channel im freenode-Netz geleistet. Hierüber konnte man auch Fragen an die Referenten weitergeben.</p>
<h2>Speaker</h2>
<p>Es gab 4 Referenten, die jeweils ca. eine Stunde Sprechzeit hatten. Genutzt wurde zumeist für den Vortrag zwischen 45 und 50 Minuten. Danach gab es noch die Möglichkeit Fragen zu stellen. </p>
<h4><em>David Collier</em> &#8211; &#8220;Basics of Git&#8221;</h4>
<p>Der Vortrag von David war eine sehr gute Einführung zu den Grundlagen von Git. Vergleiche zu Subversion wurden gezogen und die Befehle vorgestellt, die einen Entwickler bei der täglichen Arbeit begleiten. Auf der Tonspur gab es sehr viele Informationen zu den recht übersichtlichen Folien. Leider gab es beim Screensharing ein paar technische Probleme und so musste eine Alternative gefunden werden. Diese war recht suboptimal und hat die Live-Vorführung etwas überflüssig gemacht. Der Bildaufbau war einfach zu langsam, oder David zu schnell. Aber die Grundlagen kann man natürlich auch leicht selbst ausprobieren.<br />
Folien: <a href="http://speakerdeck.com/u/davidcoallier/p/git-basics" target="_blank">http://speakerdeck.com/u/davidcoallier/p/git-basics</a></p>
<h4><em>John Mertic</em> &#8211; &#8220;Subversion to Git: A Sugar Story&#8221;</h4>
<p>Hier ging es schon ein bisschen weiter und John hat einige Anekdoten aus seiner Entwickler-Zeit erzählt. Wie man von Subversion zu Git migriert und welche Herausforderungen dadurch an ein Entwicklerteam gestellt werden. Insgesamt sehr spannend und unterhaltsam. Leider gab es einige Aussetzer im Audio Stream.<br />
Folien: <a href="http://www.slideshare.net/jmertic/the-virtual-git-summit-subversion-to-git-a-sugar-story" target="_blank">http://www.slideshare.net/jmertic/the-virtual-git-summit-subversion-to-git-a-sugar-story</a></p>
<h4><em>Chris Hartjes</em> &#8211; &#8220;You’ve Decided to Use Git as Your VCS for Your Team…So Now What?&#8221;</h4>
<p>Chris Vortrag ging noch einen Schritt weiter und das Thema war im Großen, wie man mit Git Branches organisiert. Dabei ging es um Feature-, Bugfix-, Staging-Branches und den Master. Er hat somit aus dem Leben eines Entwicklers berichtet der <a href="http://nvie.com/posts/a-successful-git-branching-model/" target="_blank">nach diesem Muster</a> branched. Diesmal gab es keine technischen Schwierigkeiten und der Vortrag war ebenfalls sehr gut und auch recht locker gehalten.<br />
Folien: <a href="http://speakerdeck.com/u/grumpycanuck/p/youve-decided-to-use-git-as-your-vcs-for-your-teamso-now-what" target="_blank">http://speakerdeck.com/u/grumpycanuck/p/youve-decided-to-use-git-as-your-vcs-for-your-teamso-now-what</a></p>
<h4><em>Travis Swicegood</em> &#8211; &#8220;Git’s Meat Cleavers&#8221;</h4>
<p>Travis hat schon auf einer höheren Ebene begonnen und hat mich als Git Laien nach ca. 15-20 Minuten vollkommen abgehängt. Es ging um die Themen Rebase und Bisect. Wer mit Git arbeitet wird in den Folien sicher wertvolle Informationen finden, ich werde diese wohl erst zu einem späteren Zeitpunkt zu schätzen wissen. Der Vortrag an sich war sehr strukturiert und nach jedem Abschnitt gab es die Möglichkeit für das Publikum Fragen zu stellen. Die Technik spielte auch diesmal mit und somit war der Vortrag ein gelungener Abschluß.<br />
Folien: <a href="http://speakerdeck.com/u/tswicegood/p/gits-meat-cleavers" target="_blank">http://speakerdeck.com/u/tswicegood/p/gits-meat-cleavers</a></p>
<h2>Fazit</h2>
<p>Das &#8220;Virtual Git Summit&#8221; hat wirklich Spaß gemacht und einen guten Motivations-Schub gegeben, sich mehr mit Git zu beschäftigen. Interessant war die Tatsache, dass die ersten 3 Referenten Github sehr gelobt haben und im Chat auch eine ähnliche Meinung vorherrschte. Nicht nur wegen der Opensource-Projekte, sondern vor allem im Firmenumfeld als Ersatz für ein Inhouse-Repository. Wenn Zeit und Themen passen, werde ich sicher bei weiteren virtuellen Summits dabei sein.  </p>
<p class="wp-flattr-button"></p>]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2012/02/02/review-virtual-git-summit/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>QR-Codes erstellen</title>
		<link>http://www.phpmonkeys.de/2012/01/26/qr-codes-erstellen/</link>
		<comments>http://www.phpmonkeys.de/2012/01/26/qr-codes-erstellen/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 09:07:40 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[qr code]]></category>
		<category><![CDATA[qrcode]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=1705</guid>
		<description><![CDATA[Seit ein paar Jahren gibt es die QR-Codes zu sehen. Mit der Verbreitung der Smartphones hat sich die Verbreitung stark erhöht und überall stößt man auf die Quadrate, die an durcheinander gewürfelte Schachbretter erinnern. Sehr beliebt sind diese Muster ...]]></description>
			<content:encoded><![CDATA[<p>Seit ein paar Jahren gibt es die QR-Codes zu sehen. Mit der Verbreitung der Smartphones hat sich die Verbreitung stark erhöht und überall stößt man auf die Quadrate, die an durcheinander gewürfelte Schachbretter erinnern. Sehr beliebt sind diese Muster im Zusammenhang mit den vielen Android-Seiten.<br />
<span id="more-1705"></span></p>
<h2>Was ist der QR-Code eigentlich?</h2>
<p>Der Begriff QR-Code steht für Quick Response Code und es handelt sich um einen 2-dimensionalen Code, der von Denso Wave im Jahre 1994 entwickelt wurde. Die Größe ist abhängig von der Datenmenge und von der Güte der Fehlerkorrektur. Die kleineren Quadrate werden von der Erkennungssoftware zur Bestimmung der Ausrichtung genutzt. Im Code selbst werden Daten transportiert. Smartphones haben die Software zur Erkennung schon installiert oder aber sie lässt sich im jeweiligen AppStore/Market finden. Ich persönlich nutze Google Goggles unter Android. </p>
<h2>Welche Daten werden hinterlegt</h2>
<p>QR-Codes findet man inzwischen an vielen Stellen, an denen man eine Brücke zwischen einem Offline- und einem Online-Medium schlagen möchte oder muss. Werbung in Zeitschriften bspw. verweist auf die entsprechende Internetseite des Herstellers. Es können aber auch Telefonnummern, vCards oder speziellere Daten hinterlegt werden. Wlan-Zugangsdaten werden u.a. gerne in einem QR-Code für die Gäste eines Cafes hinterlegt.<br />
Die Erkennungssoftware ist normalerweise so programmiert, dass sie bestimmte Muster in den Daten erkennt und davon abhängig eine entsprechende Software startet. Solche Muster sehen bspw so aus:</p>
<h4>Webseiten</h4>
<ul>
<li>http://www.phpmonkeys.de</li>
<li>market://details?id=com.google.android.apps.unveil</li>
</ul>
<h4>Email</h4>
<ul>
<li>mailto:user@example.com</li>
<li>mailto:user@example.com?subject=Readme</li>
</ul>
<h4>Telefon</h4>
<ul>
<li>tel:012345678</li>
</ul>
<h4>Kontaktdaten (vCard)</h4>
<ul>
<li><a href="http://www.ietf.org/rfc/rfc2426.txt" target="_blank">siehe vCard Spec</a></li>
<li><a href="http://de.wikipedia.org/wiki/VCard" target="_blank">Kurzübersicht (Wikipedia)</a></li>
</ul>
<h2>QR-Codes generieren im Netz</h2>
<p>Wie so ein Code aussieht ist rudimentär klar und welche Daten darin enthalten sein können haben wir auch gesehen. Jetzt geht es an die Generierung. Der einfachste Weg ist eine entsprechende Seite zu nutzen. Dies bietet sich vor allem dann an, wenn man nicht viele Codes benötigt oder wenn man die Generierung auslagern möchte.</p>
<h4>Kaywa</h4>
<p>Ein besonders einfaches Formular zum Erstellen solches Codes findet man bei Kaywa. Dies ist auch der Hersteller von entsprechender Software, die die Codes analysieren kann. Dort kann man ein paar Informationen angeben und schon wird ein QR-Code generiert. Einen statischen Link dazu gibt es auch. Besonders nett an dem Formular ist die Auswahl nach den verschiedenen Möglichkeit. Vorlagen für URL, Telefon und SMS sind bereits vorhanden und ein generelles Text-Eingabefeld gibt es auch noch. Leider gibt es aber einige Limitierungen und das Formular ist auch nur für die private Nutzung erlaubt. Für die ersten Tests reicht dies aber allemal aus.<br />
<em>Link</em>: <a href="http://qrcode.kaywa.com/" target="_blank">http://qrcode.kaywa.com/</a></p>
<h4>Google Chart API</h4>
<p>Möchte man QR-Codes dynamisch erzeugen so bietet Google eine entsprechende API an. Über den Generator für Charts kann man neben schönen Diagrammen auch die QR-Codes generieren. Hierbei muss man im Gegensatz zu kaywa aber wissen, welchen textlichen Inhalt man im Code unterbringen muss. Wie sieht ein Telefonnummer-QR-Code aus? Und dann ist die Google API ein gutes Stück interessanter.<br />
Der Aufruf ist sehr überschaubar:</p>
<pre class="brush: bash; title: ; notranslate">
https://chart.googleapis.com/chart?chs=150x150&#038;cht=qr&#038;chl=Hello%20world
</pre>
<p>Die Parameter ergeben sich folgendermaßen:</p>
<ul>
<li><code>chs</code>: Die Größe des Codes im Format <em>Breite</em>x<em>Höhe</em></li>
<li><code>cht</code>: Hier steht qr, weil das eben der Typ ist</li>
<li><code>chl</code>: Der Inhalt des QR-Codes in einem URL-Encoded Format</li>
</ul>
<p>Netterweise kann man statt der GET-Syntax auch die Daten per POST übermitteln. Hierbei wird dann natürlich ein Formular oder eine Zwischenschicht benötigt, die die Daten per POST übermitteln kann. Zum Beispiel mit cURL auf der Kommandozeile oder natürlich mit  PHP, wie man das Übermitteln von POST-Daten ja kennt.<br />
Dadurch ist man auch in der Lage komplexere Daten in einem QR-Code unterzubringen und die Menge der Daten erhöht sich ebenfalls. Denn üblicherweise ist eine GET-Anfrage auf ca 2k beschränkt, POST hingegen kann 16k übermitteln. Unter dem angegebenen Link finden sich einige Beispiele für die Benutzung.<br />
<em>Link</em>: <a href="http://code.google.com/intl/de-DE/apis/chart/infographics/" target="_blank">http://code.google.com/intl/de-DE/apis/chart/infographics/</a></p>
<h2>PHP QR Code Library</h2>
<p>Die vorgestellten Methoden benutzen beiden den Service eines Dritten. Wer nun seine Codes selbst erstellen möchte, muss auf eine entsprechende Bibliothek zurückgreifen. Als Beispiel dient hier <a href="http://phpqrcode.sourceforge.net/" target="_blank">PHPQRCode</a>. Um einen QR-Code zu generieren muss man nur qrlib inkludieren. Die Generierung geschieht dann über den Aufruf einer statischen Methode. Hierbei sind einige Parameter verfügbar. Beispielhaft sieht dies so aus:</p>
<pre class="brush: php; title: ; notranslate">
require 'qrlib.php';
QRcode::png('http://www.phpmonkeys.de', 'code.png', QR_ECLEVEL_H, 10);
</pre>
<p>Die Daten werden als erster Parameter übergeben, dann folgt der Dateiname, die Fehlerkorrektur und die Größe. Fehlerkorrektur und Größe sind optional.</p>
<h2>Fazit</h2>
<p>Das eigentliche Geheimnis der QR-Codes liegt in den Daten und in der Formatierung dieser. Wenn eine Software ein spezielles Format unterstützt, so kann man viele Eingaben vereinfachen.<br />
Eine kommende Alternative könnten die NFC-Tags sein. Diese Aufkleber lassen sich ebenso mit Daten befüllen. Jedoch sind QR-Codes sehr viel einfacher und günstiger herzustellen und können von jedem Gerät mit Kamera gelesen und ausgewertet werden.</p>
<p>Ergänzend für nk hier noch 4 Testdateien. Diese haben 1k bis 4k an Daten als Inhalt. Wobei als letztes Zeichen ein A angegeben ist und alle Zeichen zuvor eine 1 sind. Dadurch kann man einfach sicherstellen, dass alle Zeichen im QRCode vorhanden sind.  </p>
<ul>
<li><a href="http://www.phpmonkeys.de/wp-content/uploads/2012/01/code_large_1k.png" target="_blank">QR Code 1k</a></li>
<li><a href="http://www.phpmonkeys.de/wp-content/uploads/2012/01/code_large_2k.png" target="_blank">QR Code 2k</a></li>
<li><a href="http://www.phpmonkeys.de/wp-content/uploads/2012/01/code_large_3k.png" target="_blank">QR Code 3k</a></li>
<li><a href="http://www.phpmonkeys.de/wp-content/uploads/2012/01/code_large_4k.png" target="_blank">QR Code 4k</a></li>
</ul>
<p class="wp-flattr-button"></p>]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2012/01/26/qr-codes-erstellen/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Scrumwall &#8211; mit oder ohne digitale Hilfsmittel?</title>
		<link>http://www.phpmonkeys.de/2012/01/19/scrumwall-mit-oder-ohne-digitale-hilfsmittel/</link>
		<comments>http://www.phpmonkeys.de/2012/01/19/scrumwall-mit-oder-ohne-digitale-hilfsmittel/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 09:16:35 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[agile development]]></category>
		<category><![CDATA[agile Entwicklung]]></category>
		<category><![CDATA[Board]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Scrumboard]]></category>
		<category><![CDATA[Scrumwall]]></category>
		<category><![CDATA[Wall]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=1691</guid>
		<description><![CDATA[Heute gibt es wieder einen "Mitmach"-Beitrag. Es geht um das Thema Scrum und im Speziellen um die Scrumwall (oder Scrumboard). Auf dieser sind die aktuellen Aufgaben angeheftet und wandern durch die verschiedenen Status hindurch bis sie zur Übersicht abgenommen ...]]></description>
			<content:encoded><![CDATA[<p>Heute gibt es wieder einen &#8220;Mitmach&#8221;-Beitrag. Es geht um das Thema Scrum und im Speziellen um die Scrumwall (oder Scrumboard). Auf dieser sind die aktuellen Aufgaben angeheftet und wandern durch die verschiedenen Status hindurch bis sie zur Übersicht abgenommen werden können. Oftmals wird in der Literatur ein Whiteboard oder ähnliches Instrument beschrieben, das mit Papierkärtchen gefüllt ist. Wie sieht das bei euch aus? Gibt es ein digitales Pendant?<br />
<span id="more-1691"></span><br />
Doch bevor es Kommentare zu dem Thema zu lesen gibt, hier auch die Vorgehensweise die sich bei uns im Team etabliert hat und die bisher gut funktioniert. </p>
<p>Für unser Daily Scrum arbeiten wir mit einer herkömmlichen Scrumwall. Dort befinden sich dann auch die Karten aus Papier. Diese werden entsprechend des Zustandes verschoben und sind mit einer kurzen Beschreibung versehen und mit einer Referenz auf unseren Bugtracker. </p>
<p>Durch den Bugtracker haben wie die Möglichkeit Arbeitszeiten, zusätzliche Informationen, fachliche und technische Anmerkungen an der jeweiligen Aufgabe anzuhängen. Diese Aufgaben werden natürlich nicht als Bug erfasst, sondern haben einen eigenen Typ. Als Tool wird <a href="http://www.atlassian.com/software/jira/overview" target="_blank">Jira</a> benutzt. Wir nutzen die <a href="http://www.atlassian.com/software/greenhopper/overview" target="_blank">Greenhopper Erweiterung</a> nicht, sondern haben für die Aufgaben eigentlich in der digitalen Fassung nur <em>3</em> Zustände. </p>
<ol>
<li>Aufgabe liegt beim Product Owner und ist noch nicht bereit für die Entwicklung</li>
<li>Aufgabe wird von einem Entwickler bearbeitet und ist diesem zugeordnet</li>
<li>Aufgabe liegt beim PO ist aber als geschlossen markiert, d.h. die Aufgabe ist erledigt</li>
</ol>
<p>Ein großer Vorteil des Vorgehens ist für uns, dass man über die Jira-Referenznummern die Aufgaben schneller findet und so auch in weiteren Dokumenten verlinken kann.<br />
Mitarbeiter die nicht vor Ort arbeiten können so auch alle Informationen ihrer Aufgaben im Blick haben und der Verwaltungsoverhead wird möglichst gering gehalten.</p>
<p>Nun kommen wir aber zurück zur eingangs gestellten Frage. Wie sieht das bei euch aus? Benutzt ihr eine spezielle Software und wenn ja, welche? Benutzt ihr nur Papier und Whiteboard?</p>
<p class="wp-flattr-button"></p>]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2012/01/19/scrumwall-mit-oder-ohne-digitale-hilfsmittel/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>RESTful Webservices mit PHP</title>
		<link>http://www.phpmonkeys.de/2012/01/12/restful-webservices-mit-php/</link>
		<comments>http://www.phpmonkeys.de/2012/01/12/restful-webservices-mit-php/#comments</comments>
		<pubDate>Thu, 12 Jan 2012 08:46:48 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[slim framework]]></category>
		<category><![CDATA[webservice]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=1659</guid>
		<description><![CDATA[Webapplikationen bieten oftmals eine Schnittstelle an, über die auch Entwickler den angebotenen Service in ihren Applikationen nutzen können. Diese Webservices wurden gerne durch XML-RPC oder SOAP bereitgestellt. Doch der neue Trend ist REST.
Was ist REST?
REST steht für REpresentational State ...]]></description>
			<content:encoded><![CDATA[<p>Webapplikationen bieten oftmals eine Schnittstelle an, über die auch Entwickler den angebotenen Service in ihren Applikationen nutzen können. Diese Webservices wurden gerne durch XML-RPC oder SOAP bereitgestellt. Doch der neue Trend ist REST.<br />
<span id="more-1659"></span></p>
<h2>Was ist REST?</h2>
<p>REST steht für REpresentational State Transfer und wurde von Thomas Roy Fielding in seiner <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm" target="_blank">Dissertation</a> benannt. REST benutzt URLs um Ressourcen bereitzustellen und das Hypertext Transfer Protocol um Manipulationen an diesen Ressourcen durchzuführen. Die einzelnen HTTP-Methoden werden für verschiedene Operationen genutzt dabei entspricht GET Lesen, PUT Update, POST Create und DELETE Löschen.</p>
<h2>REST-Service in PHP &#8211; das Slim-Framework</h2>
<p>Möchte man einen solchen REST-Service erstellen bietet sich das <a href="http://www.slimframework.com/" target="_blank">Slim-Framework</a> an. Die Sourcen können bei <a href="https://github.com/codeguy/Slim" target="_blank">Github</a> gefunden werden. Der Aufbau eines Hello-World-Services ist denkbar einfach.</p>
<pre class="brush: php; title: ; notranslate">
require 'Slim/Slim.php';
$app = new Slim();
$app-&gt;get('/hello/:name', function ($name) {
   echo &quot;Hello $name&quot;;
});
$app-&gt;run();
</pre>
<p>Die interessante Zeile ist <code>$app->get()</code>. Hier wird ein Pfad und ein Parameter mit einer Funktion verknüpft. Das ganze verwendet die GET-Methode von HTTP.</p>
<p>Wenn man einen umfangreicheren Service anbieten will, werden weitere Methoden verwendet wie zum Beispiel PUT, DELETE, POST.</p>
<p>Als Beispiel sei ein Service für die Verwaltung einer Person zu nennen der so aussehen könnte:</p>
<pre class="brush: php; title: ; notranslate">
require 'Slim/Slim.php';
$app = new Slim();
$app-&gt;get('/person/:id', function ($id) {
   // retrieve person
});
$app-&gt;post('/person', function () {
   // create person
});
$app-&gt;put('/person/:id', function ($id) {
   // update data
});
$app-&gt;delete('/person/:id', function ($id) {
   // delete data
});
$app-&gt;run();
</pre>
<p>Das Framework bietet neben der REST-Funktionalität auch noch eine Logging Komponente und alles ist mit Unittest abgedeckt.</p>
<h2>Testen mit Chrome und FF</h2>
<p>Um den REST-Service zu nutzen benötigt man normal einen REST-Client. Für Tests ist es natürlich überaus praktisch, wenn man die einzelnen Funktionen manuell triggern kann. </p>
<p>Hierfür gibt es eine <a href="https://chrome.google.com/webstore/detail/hgmloofddffdnphfgcellkdfbfbjeloo" target="_blank">Chrome Erweiterung</a>, die den Entwickler die Methode, Header Information und Daten (bspw POST) setzen lässt. </p>
<p>Eine <a href="https://addons.mozilla.org/en-US/firefox/addon/restclient/" target="_blank">Firefox Extension</a> gibt es auch, die ich aber bisher nicht getestet habe. </p>
<h2>Webservice Tipp</h2>
<p>Beim Entwerfen eines REST-Webservices sollte man gleich die Versionierung der API bedenken. So sollten Ressourcen dann bspw. über URLS wie <code>/v1/person/1234</code> bereitgestellt werden. </p>
<p class="wp-flattr-button"></p>]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2012/01/12/restful-webservices-mit-php/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>GWT &#8211; den CI Build beschleunigen</title>
		<link>http://www.phpmonkeys.de/2012/01/05/gwt-den-ci-build-beschleunigen/</link>
		<comments>http://www.phpmonkeys.de/2012/01/05/gwt-den-ci-build-beschleunigen/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 09:55:03 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Build]]></category>
		<category><![CDATA[CI]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[Speed Up]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=1614</guid>
		<description><![CDATA[Um ein CI-System sinnvoll zu nutzen, muss der Build möglichst schnell laufen. Dazu gehören neben dem Unittests auch der GWT Compiler und an beiden Stellen gibt es einige Optimierungsmöglichkeiten die wir heute mal betrachten werden.
GWTTestCase auf gwt-unit-test migrieren
GWT bietet ...]]></description>
			<content:encoded><![CDATA[<p>Um ein CI-System sinnvoll zu nutzen, muss der Build möglichst schnell laufen. Dazu gehören neben dem Unittests auch der GWT Compiler und an beiden Stellen gibt es einige Optimierungsmöglichkeiten die wir heute mal betrachten werden.<br />
<more></p>
<p><em>GWTTestCase auf gwt-unit-test migrieren</em><br />
GWT bietet <a href="http://google-web-toolkit.googlecode.com/svn/javadoc/latest/com/google/gwt/junit/client/GWTTestCase.html" target="_blank"><code>GWTTestCase</code></a> um UnitTests zu programmieren. Der Nachteil an dieser Methode ist jedoch, dass so bei einem UnitTest extra ein TomCat Server gestartet werden muss. Dies ist relativ zeitaufwändig und kann durch die Benutzung der <a href="http://code.google.com/p/gwt-test-utils/" target="_blank">gwt-test-utils</a> verbessert werden. Die gwt-test-utils wurden bereits <a href="http://www.phpmonkeys.de/2010/09/08/gwt-unittests-mal-anders/" title="GWT-Unittests mal anders" target="_blank">vorgestellt</a>. Die Funktionsweise ist so, dass der Teil der möglichst dicht am Javascript liegt durch sogenannte Patcher überschrieben wird. Das heißt, dass für die Testdurchführung nur noch Java benutzt werden muss. Kritisch an diesem Verfahren ist, dass man so nicht dem compilierten Code testet. Man sollte aber in GWT soviel Vertrauen haben, dass der GWT-Compiler den Java Code ordnungsgemäß in JavaScript-Code transformiert. Auf der anderen Seite kann man so neben der von Google gepatchten Emma Version auch Cobertura nutzen, um die Testabdeckung zu bestimmen. Insbesondere die Auswertung im Hudson/Jenkins CI finde ich persönlich bei Cobertura übersichtlicher.</p>
<p><em>Junit-Test in einer VM ausführen &#8211; forkmode sinnvoll nutzen</em><br />
JUnit hält <a href="http://ant.apache.org/manual/Tasks/junit.html" target="_blank">3 Optionen</a> bereit wie die Erzeugung neuer VMs verwaltet wird. So kann in einem Batch, einem Test oder für den gesamten Testlauf eine neue VM erzeugt werden. Die Standard-Einstellung ist per Test, was bedeutet, dass jeder Test eine eigene VM nutzt. Diese muss als erzeugt und nach dem Test verworfen werden. Wenn man am Class-Loader keine größeren Manipulationen vornimmt, kann man aber auch mehr Test in einer VM durchführen. So spart man sich insbesondere bei vielen Test die Erzeugung und das Verwerfen von neuen VMs. Aus persönlicher Erfahrung kann ich sagen, dass dies wirklich sehr viel Zeit einsparen kann. So konnte ein Testdurchlauf nur durch diese Option von über 45 Minuten auf weniger als 5 Minuten reduziert werden. </p>
<p><em>SoftPermutations</em><br />
GWT compiliert für jede Sprache und für jeden Browser eine eigene JavaScript-Datei, sodass ein Benutzer nur den relevanten Code herunterladen muss. Lokal compilieren daher viele Entwickler eine spezialisierte Version, die nur in diesem lokalen Umfeld nutzbar sind. Zum Beispiel eine deutsche Version die für den Firefox optimiert ist. Auf dem CI-System ist dies aber zu speziell und man benötigt hier die Versionen für alle Browser. Es gibt aber die Option &#8220;<a href="http://code.google.com/p/google-web-toolkit/wiki/SoftPermutations" target="_blank">collapse-all-properties</a>&#8220;, welche für das CI-Sytem sehr gut geeigent ist. Dadurch wird statt vieler verschiedender JavaScript Dateien eine große Datei compiliert und die Optimierungen durch Factories realisiert. D.h. es wird eine spezialisierte Version benutzt, wenn dies vom Browser her erforderlich ist. So wird das Deferred Binding nun realisiert. Der Vorteil ist, dass auf diese Art die Build-Geschwindigkeit weiter verbessert wird. Von ca 30 Minuten konnten wir den GWT-Compiler so auf wenige Minuten reduzieren.</p>
<p><em>Fazit</em>:<br />
Mit diesen 3 Änderungen ist es möglich einen langlaufenden Build wieder in einen annehmbaren Zeitbereich zu überführen. In einem Projekt von ca 2,5 Stunden auf 15 Minuten.</p>
<p class="wp-flattr-button"></p>]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2012/01/05/gwt-den-ci-build-beschleunigen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Frohe Weihnachten</title>
		<link>http://www.phpmonkeys.de/2011/12/24/frohe-weihnachten/</link>
		<comments>http://www.phpmonkeys.de/2011/12/24/frohe-weihnachten/#comments</comments>
		<pubDate>Sat, 24 Dec 2011 14:55:40 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=1628</guid>
		<description><![CDATA[Diese Woche gab es den letzten Artikel für dieses Jahr. Im nächsten Jahr geht es dann wieder weiter und darum bleibt mir nur noch zu sagen:
Ich wünsche euch allen ein Frohes Fest und ein schönes, erfolgreiches und gutes neues ...]]></description>
			<content:encoded><![CDATA[<p>Diese Woche gab es den letzten Artikel für dieses Jahr. Im nächsten Jahr geht es dann wieder weiter und darum bleibt mir nur noch zu sagen:</p>
<blockquote><p>Ich wünsche euch allen ein Frohes Fest und ein schönes, erfolgreiches und gutes neues Jahr 2012.</p></blockquote>
<pre>
             *
            /.\
           /..'\
           /'.'\
          /.''.'\
          /.'.'.\
   "'""""/'.''.'.\""'"'"
     jgs ^^^[_]^^^
</pre>
<p class="wp-flattr-button"></p>]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2011/12/24/frohe-weihnachten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I18n Property-Dateien für GWT automatisch erzeugen</title>
		<link>http://www.phpmonkeys.de/2011/12/22/i18n-property-dateien-fur-gwt-automatisch-erzeugen/</link>
		<comments>http://www.phpmonkeys.de/2011/12/22/i18n-property-dateien-fur-gwt-automatisch-erzeugen/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 09:17:09 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[constants]]></category>
		<category><![CDATA[Generator]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[interfaces]]></category>
		<category><![CDATA[messages]]></category>
		<category><![CDATA[properties]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=1616</guid>
		<description><![CDATA[Internationalisierung ist bei Webanwendungen ein wichtiges Thema und so gibt es auch viele Ansätze die Mehrsprachigkeit in eine Anwendung zu bekommen. GWT nutzt einen Ansatz der zum Teil auf speziellen Interfaces beruht. Da man diesen Programmcode nicht an ein ...]]></description>
			<content:encoded><![CDATA[<p>Internationalisierung ist bei Webanwendungen ein wichtiges Thema und so gibt es auch viele Ansätze die Mehrsprachigkeit in eine Anwendung zu bekommen. GWT nutzt einen Ansatz der zum Teil auf speziellen Interfaces beruht. Da man diesen Programmcode nicht an ein Übersetzerbüro geben kann, muss man eine übersichtlichere Struktur generieren lassen.<br />
<span id="more-1616"></span><br />
Für GWT-Entwickler ist es ein alter Hut, aber alle anderen werden es sicher interessant finden, wie GWT mit i18n umgeht:<br />
Hierfür werden verschiedene Interfaces angeboten, von denen man dann sein spezielles INterface ableiten muss. Besonders häufig wird man auf <a href="http://google-web-toolkit.googlecode.com/svn/javadoc/2.4/com/google/gwt/i18n/client/Constants.html" target="_blank">Constants</a> und Messages treffen. Constants stellt nicht parametrisierbare Texte bereit, <a href="http://google-web-toolkit.googlecode.com/svn/javadoc/2.4/com/google/gwt/i18n/client/Messages.html" target="_blank">Messages</a> hingegen schon. Zum Beispiel &#8220;Montag&#8221; im Gegensatz zu &#8220;Hallo {0}&#8221;. Wobei &#8220;{0}&#8221; durch einen Eingabewert ersetzt wird.<br />
Die eigenen Interfaces bieten dann Methoden an, die man in seinem Code verwendet und die dann durch den jeweiligen Text ersetzt werden. Im Interface wird üblicherweise ein Defaultwert definiert und man kann die java-üblichen properties-Dateien neben das Interface legen, sodass eine Sprache je properties-Datei definiert ist. Beim endgültigen Kompilieren wird je Sprache und Browser-Kombination eine JavaScript-Datei erzeugt. So hat jeder Benutzer nur den Code, den er in diesem Moment benötigt. </p>
<p>Ein Interface sieht bspw so aus:</p>
<pre class="brush: java; title: ; notranslate">
import com.google.gwt.i18n.client.Constants;
public interface I18nMainPageConstants extends Constants {
    @DefaultStringValue(&quot;Alle&quot;)
    public String all();
    @DefaultStringValue(&quot;Einstellungen&quot;)
    public String settings();
}
</pre>
<p>Nun ist es aber so, dass man als Entwickler beim programmieren der Anwendung Konstanten über den Code hinzufügt. D.h. man ruft eine nicht existente Methode eines i18n-Interfaces auf und wird (hoffentlich) von der IDE darauf hingewiesen, dass die Methode nicht existiert. Diese kann man sich dann automatisch anlegen lassen und muss nur noch den Defaultwert definieren. Also wächst das Interface. Wenn man nun weitere Sprachen nutzen möchte, benötigt man eine properties-Datei. Zum einen, weil man neben der Defaultsprache auch andere anbieten möchte und weil diese Key-Value-Dateien gut an ein Übersetzungsbüro gegeben werden können.</p>
<p>Die Generierung kann man händig durchführen, oder man nutzt die Boardmittel von GWT. Es wird eine Annotation bereitgestellt, die man an das Interface schreibt und somit angibt, das eine properties-Datei erzeugt werden soll. Somit sieht das Interface so aus:</p>
<pre class="brush: java; title: ; notranslate">
import com.google.gwt.i18n.client.Constants;
import com.google.gwt.i18n.client.LocalizableResource.Generate;
@Generate(format = &quot;com.google.gwt.i18n.server.PropertyCatalogFactory&quot;)
public interface I18nMainPageConstants extends Constants {
    @DefaultStringValue(&quot;Alle&quot;)
    public String all();
    @DefaultStringValue(&quot;Einstellungen&quot;)
    public String settings();
}
</pre>
<p><em>Tipp</em>:<br />
Wenn man beim Aufruf des gwtc noch die Option -extra angibt mit einem entsprechenden Verzeichnis, bspw &#8220;extras&#8221;, dann werden in dieses Verzeichnis die properties Dateien generiert. Dies hilft insbesondere dann, wenn man viele solcher Dateien nutzt.</p>
<p class="wp-flattr-button"></p>]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2011/12/22/i18n-property-dateien-fur-gwt-automatisch-erzeugen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Das Kano-Modell</title>
		<link>http://www.phpmonkeys.de/2011/12/14/das-kano-modell/</link>
		<comments>http://www.phpmonkeys.de/2011/12/14/das-kano-modell/#comments</comments>
		<pubDate>Wed, 14 Dec 2011 11:42:01 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Kano]]></category>
		<category><![CDATA[Modell]]></category>
		<category><![CDATA[Requirements Engineering]]></category>
		<category><![CDATA[Vorgehen]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=1579</guid>
		<description><![CDATA[Bevor man als Entwickler tätig wird, muss man sich überlegen welche Features bei einem Produkt für den Benutzer interessant sind. Um diese Anforderungen zu erkennen gibt es das Kano-Modell.
Das Kano-Modell hat seinen Namen durch Dr. Noriaki Kano, der ...]]></description>
			<content:encoded><![CDATA[<p>Bevor man als Entwickler tätig wird, muss man sich überlegen welche Features bei einem Produkt für den Benutzer interessant sind. Um diese Anforderungen zu erkennen gibt es das Kano-Modell.<br />
<span id="more-1579"></span><br />
Das Kano-Modell hat seinen Namen durch Dr. Noriaki Kano, der aus der Analyse von Kundenwünschen ableitete, dass Kundenanforderungen von verschiedener Art sind. Diese Anforderungen beeinflussen das Qualitätsempfinden und die Zufriedenheit der Anwender. Das Kano-Modell wird üblicherweise während der Produktplanung genutzt und erlaubt es ein Produkt zu planen, das im Hinblick auf verschiedene Merkmalsalternativen möglichst optimal ist.</p>
<p>Normalerweise sind die Vorstellungen eines Kunden eher unstrukturiert und vor allem unvollständig. Wenn man ein Vorgehensmodell nutzt, dass die Vorstellungen systematisch plant und strukturiert, werden Kundenanforderungen gefunden, die bei der Planung berücksichtigt werden müssen.</p>
<p>Die Anforderungen werden in verschiedene Kategorien sortiert.<br />
<em>eindimensional</em>: Features die die Akzeptanz des Benutzers positiv beeinflußen, deren Nicht-Vorhandensein dann aber auch  negativ aufgefasst werden. Performance einer Anwendung kann man hier einordnen.<br />
<em>obligatorisch</em>: Wenn das Nicht-Vorhandensein eines Features den Benutzer unzufrieden macht, das Vorhandensein die Zufriedenheit aber nicht beeinflusst, so ist das Feature obligatorisch. Als Beispiel sei hier die Sicherheit erwähnt.<br />
<em>attraktiv</em>: Ein Feature, das auf den Benutzer positiv wirkt, dessen Nicht-Vorhandensein dagegen als neutral oder als wenig negativ angesehen wird. Ein Beispiel ist vielleicht die Möglichkeit eine Anwendung mit einem mobilen Endgerät zu nutzen, obwohl sie nicht augenscheinlich dafür gedacht ist.</p>
<p>Wie man die Features in diese Kategorien einordnet ist dann die spannende Frage. Hierfür wird ein spezieller Fragebogen benutzt, der durch seinen Aufbau die Informationen für die Zuordnung liefert.</p>
<p>In diesem Fragebogen werden alle Features in 2 Varianten abgefragt. Einmal funktional und einmal dysfunktional. Die Antworten sind in 5 Stufen gestaffelt und in beiden Fällen gleich. Beispielsweise fragt man funktional: &#8220;Wie würden sie sich fühlen, wenn das Produkt das Feature X hat&#8221;, dysfunktional heißt die Frage: &#8220;Wie würden sie sich fühlen, wenn das Produkt das Feature X nicht hat&#8221;. Die vordefinierten Antworten sind in etwa &#8220;Das finde ich sehr gut&#8221; (5), &#8220;Das ist okay&#8221; (4), &#8220;mir egal&#8221; (3), &#8220;damit kann ich leben&#8221; (2), &#8220;das mag ich nicht&#8221; (1).</p>
<p>Die Auswertung des Fragebogen erfolgt über eine spezielle Matrix, die wie folgt aufgebaut ist:</p>
<table>
<tr>
<th colspan="2" rowspan="2">Anforderung</th>
<th colspan="5">Dysfunktional</th>
</tr>
<tr>
<td>5</td>
<td>4</td>
<td>3</td>
<td>2</td>
<td>1</td>
</tr>
<tr>
<td rowspan="5">Funktional</td>
<td>5</td>
<td>F</td>
<td>A</td>
<td>A</td>
<td>A</td>
<td>E</td>
</tr>
<tr>
<td>4</td>
<td>G</td>
<td>N</td>
<td>N</td>
<td>N</td>
<td>O</td>
</tr>
<tr>
<td>3</td>
<td>G</td>
<td>N</td>
<td>N</td>
<td>N</td>
<td>O</td>
</tr>
<tr>
<td>2</td>
<td>G</td>
<td>N</td>
<td>N</td>
<td>N</td>
<td>O</td>
</tr>
<tr>
<td>1</td>
<td>G</td>
<td>G</td>
<td>G</td>
<td>G</td>
<td>F</td>
</tr>
</table>
<p>A: Attraktiv<br />
O: Obligatorisch<br />
E: Eindimensional<br />
N: Neutral<br />
F: Fragwürdig<br />
G: Gegenteilig</p>
<p>Beim Auswerten der Antworten entsteht so über die Anzahl der befragten Teilnehmer eine Statistik. Man sieht wie häufig ein Feature X ein A, O, E, N, F und G erhalten hat. Die Einordnung geschieht dann über den Wert, der am häufigsten ausgewählt wurde. Eine solche Liste könnte so aussehen:</p>
<table>
<tr>
<th>Anforderung</th>
<th>A</th>
<th>O</th>
<th>E</th>
<th>G</th>
<th>F</th>
<th>N</th>
<th>Total</th>
<th>Einordnung</th>
</tr>
<tr>
<td>Feature 1</td>
<td>9</td>
<td>1</td>
<td>4</td>
<td>2</td>
<td>0</td>
<td>14</td>
<td>30</td>
<td>N</td>
</tr>
<tr>
<td>Feature 2</td>
<td>17</td>
<td>0</td>
<td>3</td>
<td>2</td>
<td>3</td>
<td>5</td>
<td>30</td>
<td>A</td>
</tr>
<tr>
<td>Feature 3</td>
<td>8</td>
<td>1</td>
<td>21</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>30</td>
<td>E</td>
</tr>
</table>
<p>Die Anforderungen werden nun sortiert (O > E > A > N) und anhand dieser Informationen priorisiert. </p>
<p>Wenn befragt man, um an diese Daten zu kommen. Hierfür gibt es mehrere Varianten. Einerseits kann man Personen befragen, die einen guten Einblick in die Welt der Benutzer haben. Alternativ kann man auch eine Umfrage unter den Benutzern starten.</p>
<p class="wp-flattr-button"></p>]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2011/12/14/das-kano-modell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2-step verification mit dem Google Account</title>
		<link>http://www.phpmonkeys.de/2011/11/17/2-step-verification-mit-dem-google-account/</link>
		<comments>http://www.phpmonkeys.de/2011/11/17/2-step-verification-mit-dem-google-account/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 09:19:13 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[2-step-verification]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[pin]]></category>
		<category><![CDATA[two-factor]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=1565</guid>
		<description><![CDATA[Ja es gibt heute endlich wieder einen neuen Artikel und der hat dann auch gleich wieder mit Google zu tun, aber ich meine das Thema ist recht interessant. Leider hat die ganze Geschichte nicht mit PHP zu tun, dafür ...]]></description>
			<content:encoded><![CDATA[<p>Ja es gibt heute endlich wieder einen neuen Artikel und der hat dann auch gleich wieder mit Google zu tun, aber ich meine das Thema ist recht interessant. Leider hat die ganze Geschichte nicht mit PHP zu tun, dafür sind aber zum Teil die Androiden angesprochen.<br />
<span id="more-1565"></span><br />
Viele Leute haben einen Google Account. Einerseits für das recht beliebte Google Mail oder für einen der vielen anderen Dienste. Der Account umspannt einfach alle Google Dienste, da es eine Single-Sign On Lösung ist. Vor allem wenn man nun unterwegs ist benutzt man ganz gerne das Webinterface zum Schreiben von Mails. Ich persönlich lese oder besser überfliege die Mails auf dem Android-Smartphone und bearbeite und vor allem beantworte sie dann über das Webinterface. Die normale Tastatur ist doch irgendwie angenehmer und schneller zu benutzen als die Smartphone Tastatur. Selbst Swype und Swiftkey und wie sie alle heißen erlauben mir nicht so schnell zu schreiben, wie ich es auf der Tastatur kann. </p>
<p>Auf jeden Fall loggt man sich oftmals im Webinterface über eine teilweise sichere Verbindung ein. Man weiß nämlich nicht unbedingt, was auf dem Rechner alles läuft. Darum gibt es von Google die <a href="http://www.google.com/support/accounts/bin/static.py?page=guide.cs&#038;guide=1056283&#038;topic=1056284" target="_blank">2-Step-Verification</a>. Hierbei werden 2 &#8220;Geheimnisse&#8221; genutzt, die dem Benutzer auf 2 Wegen mitgeteilt werden. Bzw wird das Passwort um eine zweite Methode ergänzt. Wer OnlineBanking nutzt kennt die Geschichte von den TAN-Listen. Man benötigt neben der Online-PIN (was gleichzusetzen ist mit dem Passwort) ein zweites Geheimnis, das mir auf einem anderen Weg mitgeteilt wurde und am besten auch nur einmalig zu benutzen ist. Beim Onlinebanking gab/gibt es die TAN-Listen die auf Papier dem Kunden vorliegen und inzwischen sind auch die TAN per SMS oder TAN-Generatoren sehr beliebt.</p>
<p>Wenn man nun ein Handy besitzt kann man seinen Google Account so einstellen, dass nach Angabe von Login und Passwort eine 6-stellige Zahl per SMS zugestellt wird, die man dann zum eigentlichen Login angeben muss. Das funktioniert soweit ganz gut, ist aber immer etwas zeitaufwendig, da die SMS unter Umständen etwas Zeit benötigt, bis sie beim Handy ankommt.</p>
<p>Besitzer eines Smartphones haben hier einen Vorteil. Es gibt den Google Authenticator. Dies ist ein Generator für die 6-stelligen Schlüssel. Und da diese auch noch zeitbasiert sind, kann man hier auch gleich sehen, wann der Schlüssel abläuft. Die Einrichtung ist sehr einfach. Man aktiviert die Option in seinem Google Konto und scannt den angezeigten Barcode mit dem Google Authenticator. Somit ist dieser für den Account eingerichtet. Hat man mehrere Accounts, so kann man diese alle im Authenticator hinterlegen.</p>
<p>Das <a href="http://www.google.com/support/accounts/bin/static.py?page=guide.cs&#038;guide=1056283&#038;topic=1056285" target="_blank">Programm (oder App)</a> gibt es für iOS, Android und Blackberry. </p>
<p>Hat man sein Google Konto umgestellt auf diese Methode so hat man natürlich ein Problem mit Programmen, die damit nicht umgehen können. Zum Beispiel ein Mail-Programm, das über IMAP die Mails verwaltet, einen Jabber Client etc. Hierfür gibt es die <a href="http://www.google.com/support/accounts/bin/static.py?page=guide.cs&#038;guide=1056283&#038;topic=1056286" target="_blank">&#8220;anwendungsspezifischen Kennwörter&#8221;</a>. Das sind Kennwörter die man für eine spezielle Anwendung nutzt. Diese werden von Google generiert und sind um die 16 Zeichen lang. Nach der Generierung kann das Kennwort im Google Konto nicht mehr eingesehen werden. Für jedes gibt man einen kurzen Text an, der es beschreibt und man sieht, wann es zuletzt genutzt wurde. Ist man nun der Ansicht, dass ein Gerät kompromitiert wurde, so kann man es deaktivieren und der Zugang der Anwendung ist somit nicht mehr möglich.</p>
<p class="wp-flattr-button"></p>]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2011/11/17/2-step-verification-mit-dem-google-account/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wem die Stunde schlägt</title>
		<link>http://www.phpmonkeys.de/2011/10/19/wem-die-stunde-schlagt/</link>
		<comments>http://www.phpmonkeys.de/2011/10/19/wem-die-stunde-schlagt/#comments</comments>
		<pubDate>Wed, 19 Oct 2011 17:31:33 +0000</pubDate>
		<dc:creator>Norbert</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[itunes]]></category>
		<category><![CDATA[kimai]]></category>
		<category><![CDATA[ms project]]></category>
		<category><![CDATA[Zeiterfassung]]></category>
		<guid isPermaLink="false">http://www.phpmonkeys.de/?p=1548</guid>
		<description><![CDATA[Heute seid ihr als Leser gefragt: Wer seine Arbeitszeit protokollieren muss, kennt die Zeiterfassung. Es gibt hier verschiedene Systeme von Webapplikationen bis zu ausgefeilteren System mit Karten etc.
Welche Systeme werden von euch genutzt? Vielleicht die PHP-Opensource Lösung Kimai ...]]></description>
			<content:encoded><![CDATA[<p>Heute seid ihr als Leser gefragt: Wer seine Arbeitszeit protokollieren muss, kennt die Zeiterfassung. Es gibt hier verschiedene Systeme von Webapplikationen bis zu ausgefeilteren System mit Karten etc.<br />
<span id="more-1548"></span><br />
Welche Systeme werden von euch genutzt? Vielleicht die PHP-Opensource Lösung <a href="http://www.kimai.org/" target="_blank">Kimai</a> oder vielleicht <a href="http://de.wikipedia.org/wiki/Microsoft_Project" target="_blank">MS Project</a>? Oder &#8220;nur&#8221; eine Excel-Datei?</p>
<p>Unterstützt die genutzte Zeiterfassung einen mobilen Zugang oder gibt es eine eigene &#8220;<a href="http://itunes.apple.com/de/app/lexware-zeiterfassung/id465897099?mt=8" target="_blank">App</a>&#8220;?</p>
<p><em>Update (26. Oktober 2011):</em><br />
Da in den Kommentaren viele gute und interessante Links vorhanden sind, habe ich diese einfach mal hier gesammelt:</p>
<ul>
<li><a href="http://www.marketcircle.com/billings/" target="_blank">Billings</a></li>
<li><a href="http://www.marketcircle.com/billingspro/" target="_blank">Billings Pro</a></li>
<li><a href="http://mite.yo.lk/" target="_blank">Mite</a></li>
<li><a href="http://www.billomat.com/blog/billomat-integriert-mite-zur-einfachen-fakturierung-erfasster-zeiten/" target="_blank">Billomat</a></li>
<li><a href="http://www.atlassian.com/software/jira/overview" target="_blank">Jira</a> mit <a href="http://www.tempoplugin.com/" target="_blank">Tempo Plugin</a></li>
<li><a href="http://www.mdprojecttimer.de/" target="_blank">mdProjektTimer</a></li>
<li><a href="http://www.projektron.de/projektron-bcs/projektmanagement/" target="_blank">Projektron BCS</a></li>
<li><a href="http://letsfreckle.com/" target="_blank">Freckle</a></li>
<li><a href="http://eputime.com/" target="_blank">eputime</a></li>
<li><a href="http://www.activecollab.com/timer" target="_blank">activecollab mit Timer</a></li>
<li><a href="http://siwapp.org/" target="_blank">Siwapp</a></li>
<li><a href="https://market.android.com/details?id=com.dynamicg.timerecording" target="_blank">Android App Zeiterfassung</a></li>
<li><a href="http://www.allnetic.com/working-time-tracker/" target="_blank">Allnetic Time Tracker</a></li>
<li><a href="http://www.todoyu.com/" target="_blank">todoyu</a></li>
</ul>
<p class="wp-flattr-button"></p>]]></content:encoded>
			<wfw:commentRss>http://www.phpmonkeys.de/2011/10/19/wem-die-stunde-schlagt/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
	</channel>
</rss>

