Agiles Projektmanagement am Beispiel von Scrum

Sie haben schon von agiler Softwareentwicklung gehört und möchten gerne wissen, um was es dabei geht? Sie möchten Projektmanagement betreiben, doch die reguläre Art ist Ihnen zu umfangreich? Sie möchten den für Ihr Unternehmen optimalen Weg zur Softwareentwicklung herausfinden?

Der Kurs „Agiles Projektmanagement am Beispiel von Scrum“, durchgeführt von der VHS Wiesbaden, begleitet Sie durch die Welt der agilen Softwareentwicklung am Beispiel von Scrum und dessen Verbindung zum agilen Projektmanagement. Sie werden eine Reihe von Verfahren und Methoden kennenlernen, die sich im Rahmen von agiler Softwareentwicklung, aber auch bei herkömmlichen Projektmanagement anwenden lassen. Ziel ist nicht das Wissen der Theorie, sondern die Erkenntnis der Flexibilität, um agiles Projektmanagement erfolgreich im Unternehmen umsetzen zu können.

Inhalt des Seminars:

  • Agile Softwareentwicklung: Begriffe und Methoden
  • Definition von Scrum, dem Scrum Flow und den Rollen in Scrum
  • Scrum-Meetings (Daily Scrum, Sprint Planning 1 und 2, Sprint Retrospective, Sprint Review)
  • Die Auswirkung von Scrum auf Team-Zusammenhalt, Interaktion mit Vorgesetzten und Kunden, gemeinsame Planung und transparente Umsetzung von Aufgaben
  • Agiler Werkzeugkasten (Praktiken und Methoden)
  • Agiles Projektmanagement: Rolle des Projektleiters, Meilensteine, Stakeholder, Aufgabenplanung und Fortschrittsvisualisierung

Das Seminar findet sowohl im Frühjahr, als auch im Herbst 2014 statt.

Frühjar 2014
Mo. 19.05.2014 – Fr. 23.05.2014 http://www.vhs-wiesbaden.de/index.php?id=19&kathaupt=11&knr=G54850BU

Herbst 2014
Mo. 17.11.2014 – Fr. 21.11.2014 http://www.vhs-wiesbaden.de/index.php?id=19&kathaupt=11&knr=H54850BU

Hier befinden sich weitere Informationen zum Vorgehensmodell Scrum.

REST-Webservice mit PHP ansprechen

REST-Webservice mit PHP ansprechen

In diesem Beitrag geht es um das Ansprechen eines REST-Webservices mittels PHP, wobei der REST-Webservice die Ergebnisse mit Hilfe von JSON zurückliefert. REST steht für Representational State Transfer und stellt eine Möglichkeit zur Implementierung einer Schnittstelle dar. Rückgaben können auf verschiedene Arten erfolgen, z.B. durch XML oder JSON. Das Ansprechen eines SOAP-Webservices ist mit Hilfe der in PHP eingebauten Soap-Klasse möglich (SoapClient). Für das Arbeiten mit einem REST-Webservice kann beispielsweise auf cURL zurückgegriffen werden, was auch Inhalt dieses Beitrags sein wird.

Methode zum Aufruf des Services

public function callAPI($data = false)
{
	$curl = curl_init();
	curl_setopt($curl, CURLOPT_POST, 1);
	curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
	curl_setopt($curl, CURLOPT_URL, $this->serviceUrl);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
	$ret = curl_exec($curl);
	if ($ret === false) {
		$ret = null;
	}
	curl_close($curl);
	return $ret;
}

Zunächst wird mit curl_init(); eine neue cURL-Instanz erzeugt. Post-Daten können eingesetzt werden (curl_setopt($curl, CURLOPT_POSTFIELDS, $data);) und die URL zum Webservice wird gesetzt (curl_setopt($curl, CURLOPT_URL, $this->serviceUrl);). Anschließend wird der Service aufgerufen und der Rückgabewert zurückgegeben ($ret = curl_exec($curl);). Wichtig ist, dass vor der Rückgabe die cURL-Verbindung geschlossen wird (curl_close($curl);).

Methode zum Auslesen der JSON-Rückgabe

Angenommen, in der Rückgabe stecken Benutzerinformationen als JSON-Objekt, kann das Auslesen mit folgende Methode vorgenommen werden:

public function getUserEntityFromInfo($userInfo) {
	$obj = json_decode($userInfo);
	if ($obj && isset($obj->{'username'})) {
		$user = new UserEntity();
		$user->setuserName($obj->{'username'});
		$user->setemail($obj->{'useremail'});
		return $user;
	}
	return null;
}

Dabei wird zunächst das JSON-Objekt anhand des Strings erzeugt ($obj = json_decode($userInfo);). Beinhaltet das Objekt username, so werden username und useremail ausgelesen. Die Klasse UserEntity besteht in diesem Beispiel lediglich aus Getter- und Setter-Methoden.

Die komplette Klasse

class RestExample {
	
	private $serviceUrl = "https://www.myservice.com/servicename";
	
	public function callAPI($data = false)
	{
		$curl = curl_init();
		curl_setopt($curl, CURLOPT_POST, 1);
		curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
		curl_setopt($curl, CURLOPT_URL, $this->serviceUrl);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
		$ret = curl_exec($curl);
		if ($ret === false) {
			$ret = null;
		}
		curl_close($curl);
		return $ret;
	}
	
	public function getUserEntityFromInfo($userInfo) {
		$obj = json_decode($userInfo);
		if ($obj && isset($obj->{'username'})) {
			$user = new UserEntity();
			$user->setuserName($obj->{'username'});
			$user->setemail($obj->{'useremail'});
			return $user;
		}
		return null;
	}
}

Aufruf der Klasse

Das folgende Beispiel zeigt, wie diese Klasse aufgerufen und Post-Werte übergeben werden können.

$restClient = new RestExample();
$curlPostData = array(
		'MyFirstProperty' => 123,
		'MySecondEntry' => "testdata"
);
$ret = $restClient->callAPI($curlPostData);
if ($ret != null) {
	$user = $restClient->getUserEntityFromInfo($ret);
	if ($user != null) {
		echo $user->getuserName();
	}
	else {
		echo "Benutzerinformationen konnten nicht geladen werden.";
	}
}
else {
	echo "Keine Rückgabe nach Webservice-Aufruf erhalten.";
}

Chrome-Extension zum Testen eines REST-Webservices

Zum Schnellen Testen eines REST-Webservices, bietet sich die Google Chrome-Extension Advance REST Client an. Mit dieser Extension können sowohl GET- als auch POST-Requests getestet werden und das Übergeben von Variablen ist möglich.

Anmerkungen

Die hier gezeigten Beispiele sind bewusst recht simpel gehalten. Das Aufrufen eines REST-Webservices wird gezeigt und es ist ersichtlich, wie POST-Daten übergeben werden können. Auch das Erzeugen eines JSON-Objektes wird gezeigt.

Aktualisierte Ansicht von Log-Dateien unter Linux

Wenn zum Beispiel ein Application Server wie jboss läuft, kommt man gelegentlich in die Versuchung, sich Log-Ausgaben in realtime anzeigen lassen zu wollen. Dazu kann z.B. des Kommandozeilenprogramms tail verwendet werden. Der folgende Aufruf zeigt die letzten Zeilen der Log-Datei an und aktualisiert die Ansicht, wenn es neue Einträge gibt:

tail -f /JBOSS-HOME/server/default/log/server.log

Der Parameter -f (follow) gibt an, dass die Ausgabe der Datei stattfinden soll, bis sie durch den Benutzer mit Strg+C beendet wird.

java über Kommandozeile auf Linux-Server installieren

Java-Version installieren

Zunächst wird die aktuelle Java-Version (derzeit 1.7.45) heruntergeladen. Der Download kann über die Java-Download-Seite erfolgen, oder mittels folgendem Kommando:
wget --no-cookies --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com" "http://download.oracle.com/otn-pub/java/jdk/7u45-b18/jdk-7u45-linux-i586.tar.gz"

Danach kann Java wie auf http://www.java.com/de/download/help/linux_install.xml beschrieben installiert werden.

Dazu auf der Konsole den Befehl
tar zxvf jdk-7u45-linux-i586.tar.gz
absetzen. Der Benutzer muss sich dazu in einem Verzeichnis befinden, in dem er Schreibrechte hat, siehe dazu http://www.java.com/de/download/help/linux_install.xml#Java for Linux Platforms. Anschließend sollten noch die Pfad-Angaben ergänzt werden.

Jboss-Einrichtung auf Linux-Server

Dieser Artikel beschreibt, wie jboss auf einem Linux-Server (ManagedServer) von domainFactory eingerichtet werden kann. Annahme: der Application Server wird über das Webfrontend im Admin-Bereich der Webverwaltung installiert und muss anschließend konfiguriert werden. Das Zielsystem beinhaltet einen Java-Webservice, welcher mit einer MySQL-Datenbank kommuniziert.

Vorbedingungen:

  • jboss 6.0.0 wurde installiert und gestartet
  • SSH-Zugriff ist möglich
  • Java ist bereits installiert

jboss Application Server und MySQL-Connection einrichten

Nachdem jboss installiert wurde, kann eingetragen werden, dass er automatisch gestartet werden soll. Dies kann im Webfrontend unter Serverkonfiguration->systemSTARTUP erfolgen. Über diesen Menüeintrag kann der Server auch komfortabel gestartet und gestoppt werden.

Die Integration von MySQL erfolgt mittels einer XML-Datei, die im Ordner deploy (JBOSS-HOME/server/default/deploy/) angelegt wird. Der Inhalt kann dabei wie folgt aussehen (andere Einstellungen sind natürlich denkbar):

<?xml version="1.0" encoding="UTF-8"?>
<datasources>
  <local-tx-datasource>
    <jndi-name>mydatasourcename</jndi-name>
    <connection-url>jdbc:mysql://mysql5.servername:3306/database</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>db-username</user-name>
    <password>db-password</password>
    <min-pool-size>0</min-pool-size>
    <max-pool-size>5</max-pool-size>
    <idle-timeout-minutes>5</idle-timeout-minutes>
    <exception-sorter-class-name>com.mysql.jdbc.integration.jboss.ExtendedMysqlExceptionSorter</exception-sorter-class-name>
    <valid-connection-checker-class-name>com.mysql.jdbc.integration.jboss.MysqlValidConnectionChecker</valid-connection-checker-class-name>
  </local-tx-datasource>
</datasources>

Die MySQL-Jar-Datei (zum Beispiel mysql-connector-java-5.1.26-bin.jar) muss in den Lib-Ordner gelegt werden. Zunächst platzierte ich die Datei in JBOSS-HOME/server/all/lib/, doch wie sich herausstellte, verursachte dies einen Fehler – dazu gleich mehr.

Die korrekte Einrichtung kann beispielsweise mit der Adminkonsole überprüft werden. Dazu zunächst den Server stoppen und danach wieder starten. In der Adminkonsole unter Resources->Datasources sollte nun die soeben erstellte Datasource zu finden sein. Angenommen jboss läuft auf Port 8080, kann die Adminkonsole mittels lynx mit folgendem Aufruf gestartet werden:
lynx http://localhost:8080
Nach Auswahl von Administration Console (siehe Screenshot), gelangt der Benutzer zur Maske zum Eingeben der Login-Daten. Das Passwort wurde bei der Installation von jboss hinterlegt.

Jboss-Admin-Konsole
Adminkonsole von jboss

Eine War-Datei kann deployed werden, in dem sie in den Ordner JBOSS-HOME/server/default/deploy/ gelegt wird. Beim Deployen der War-Datei bin ich auf ein Problem gestoßen. Obwohl der verwendete MySQL-Treiber zur Datenbank passen sollte, gab es folgende Fehlermeldung:

Throwable while attempting to get a new connection: null: org.jboss.resource.JBossResourceException: Could not create connection; - nested throwable: (org.jboss.resource.JBossResourceException: Apparently wrong driver class specified for URL: class: com.mysql.jdbc.Driver, url: jdbc:mysql://mysql5.servername.de:3306/databasename)

Interessanterweise wurden die Tabellen dennoch richtig angelegt. Um die Fehlermeldung los zu werden, musste die MySQL-Lib in den Ordner JBOSS-HOME/server/default/lib/ verschoben werden.

In der Persistence-Datei muss die MySQL-Verbindung angegeben werden, was in nachfolgendem Code-Ausschnitt zu sehen ist.

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
    xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
          http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="persistenceunitname">	
    <jta-data-source>java:/mydatasourcename</jta-data-source> 
    <properties>
    	<property name="hibernate.show_sql" value="true" />
    	<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
    	<property name="hibernate.hbm2ddl.auto" value="create-drop" />
    	<property name="hibernate.connection.useUnicode" value="true" />
		<property name="hibernate.connection.characterEncoding" value="UTF-8" />
    </properties>
  </persistence-unit>
</persistence>