Blogthemen filtern:

Unsere Blogthemen

Am 25.10. wird TYPO3 4.6 veröffentlicht und wir möchten das mit Euch feiern. An alle TYPO3 Interessierten: Wir laden euch ein, zusammen mit uns und parallel zu anderen internationalen Release Partys den Start der neuen TYPO3 Version zu feiern.

Ab 19 Uhr geht es in unserem Kieler Büro los:
Kleiner Kuhberg 42, 24103 Kiel

Wir sorgen für Pizza, Bier und Softdrinks und planen einen Blick in die Features der neuen Version zu werfen. Zwecks Planung wäre es gut, wenn Ihr Euch in einer der Listen eintragen würdet:

21. Oktober 2011

Für die Kontrolle der Nutzer-Aktivitäten und die Suchmaschinenoptimierung ist ein gutes Web-Analysetool unumgänglich. Hierfür empfehlen wir gerne das mächtige und kostenfreie Tool Google Analytics, doch aus datenschutz-rechtlicher Sicht gab es hier immer wieder Bedenken.

Wie der Hamburgische Beauftragte für Datenschutz und Informationsfreiheit heute bekannt gab, ist der „beanstandungsfreie Betrieb von Google Analytics ab sofort möglich“. Für die Webseitenbetreiber gilt es hierbei zwar ein paar Spielregeln einzuhalten, damit die datenschutzkonforme Nutzung gewährleistet ist, hierbei handelt es sich aber im Vergleich zu dem großen Nutzen, die die Verwendung des Tools mit sich bringt um einfach zu erfüllende Anforderungen:

  • Innerhalb der Datenschutzerklärung der Webseite muss erwähnt werden, dass Google Analytics zum Einsatz kommt
  • Die IP-Masken Funktion muss verwendet werden, damit die Besucher-IPs anonymisiert werden
  • Innerhalb der Datenschutzerklärung soll darauf hingewiesen werden, dass es mittels Browser-Erweiterung möglich ist, das Tracking seitens Google Analytics zu unterbinden

Wir freuen uns über diese Entwicklung, wodurch wir endlich auch abgedeckt durch das deutsche Recht die Verwendung dieses mächtigen Tools empfehlen können.

conversionroom-de.blogspot.com/2011/09/deutsche-datenschutzbehorden-bestatigen.html
www.datenschutz-hamburg.de/news/detail/article/beanstandungsfreier-betrieb-von-google-analytics-ab-sofort-moeglich.html

15. September 2011

Unter dem Motto "Flow to Five" startet ab dem 6. Oktober die diesjährige internationale TYPO3 Konferenz in Frankfurt Hanau.

Bereits zum siebten Mal startet die internationale TYPO3 Konferenz dieses Jahr. Vom 6. - 8. Oktober lädt die TYPO3 Community zu diesem weltgrößten TYPO3-Event im Kongress Park Hanau bei Frankfurt. Dieses Jahr werden ungefähr 500 Teilnehmer aus über 30 verschiedenen Ländern erwartet. Im Rahmen verschiedener Themen-Bereiche wird jede Zielgruppe angesprochen: Entscheider, Entwickler, Designer - für jeden ist etwas Passendes dabei. Als eine der ersten aktiven Firmen in der FLOW3 Entwicklungsowie TYPO3 Agentur wird natürlich auch networkteam mit einem Teil des Teams in Frankfurt vertreten sein.

6. September 2011

Ich darf mich vorstellen: Lars Lehners mein Name.
Ich bin nun "der Neue" hier und mittlerweile seit ziemlich genau einem Monat Team-Mitglied. 

Ursprünglich bin ich gelernter IT-Systemkaufmann. Aber irgendwie habe ich schon immer viel lieber gestalterische Dinge getrieben. Nach der Ausbildung war schnell klar: Ich will was mit Medien machen.

29. August 2011

Seit ungefähr einer Woche hat das sogenannte "Panda Update" auch Deutschland erreicht. Gemeint sind damit Änderungen am Google-Algorithmus, mit dem Ziel, die Qualität der Suchergebnisse zu erhöhen.

Das Update des Such-Algorithmus will Seiten mit minderwertigen Inhalten schlechter auffindbar machen und den Fokus auf solche Suchergebnisse setzen, die dem Suchenden wirklich weiter helfen. Ein wichtiger Aspekt des Panda-Updates besteht darin, dass die Optimierungen aus dem menschlichen Blickwinkel heraus erschaffen wurde und nicht von dem Standpunkt einer Maschine gesehen. Es geht also wirklich darum, solche Seiten von den ersten Suchergebnis-Positionen zu vertreiben, die ein menschlicher Betrachter sofort als minderwertiges Suchergebnis einordnen würde (z.B. die eher weniger beliebten Branchenbucheinträge). Panda bewertet zudem komplette Webseiten und nicht nur einzelne Unterseiten. Überwiegt also der Anteil schlechter Seiten innerhalb einesWebprojekts wird die komplette Webseite schlechter bewertet.

19. August 2011

Pünktlich zum Neubau der Firmenzentrale in Flintbek präsentiert sich L und M, ein schon langjähriger Kunde vom networkteam, mit einem frischem und modernen Design.

Der L und M Relaunch basiert weiterhin auf dem WCMS TYPO3 und kann von Kundenseite aus weiter gepflegt werden. Das Design wurde modern und schlicht gehalten, wirkt aber dennoch durch einzelne Design-Elemente sehr erfrischend. Die Startseite sorgt für viel Animation und einer interaktiven Unternehmenspräsentation auf Basis von JavaScript.

Die verschiedenen Bereiche, die das IT Systemhaus L und M anbietet, werden durch einen animierten Bilderwechsel (Slideshow) vorgestellt. Auch die beiden Hauptbereiche, IT- und Drucklösungen, werden übersichtlich in einer "Tab-Box" dargestellt.

Der "Virtuelle Rundgang" dient, anhand des Neubaus in Flintbek, zur gesamthaften Darstellung der einzelnen Bereiche in Tooltips.

Lassen auch Sie sich durch das Unternehmen führen und besuchen Sie die L und M Website.

22. Juli 2011

Ich möchte diese Gelegenheit nutzen, um mich als neues Mitglied des networkteam kurz vorzustellen.

Mein Name ist Thilo Kressdorf und ich bin nun seit knapp 2 Monaten ein Teil des networkteam und werde am 01.08.2011 eine Ausbildung zum Mediengestalter für Digital- und Printmedien beginnen. Parallel zu meiner Ausbildung habe ich am 15.05.2011 ein Studium im Bereich Grafik-Design an einer Hamburger Kunstschule begonnen.

Schon in der Schulzeit habe ich mich für Kunst, digitale Bildbearbeitung, Webdesign etc. interessiert. Und warum nicht das Hobby zum Beruf machen?

Nach einem ersten zweiwöchigen Praktikum war mir bereits klar, dass networkteam die richtige Agentur für mich ist. 
Lockeres Betriebsklima, nette Kollegen, bestes Know-how und einen 1A Kaffee. Das Gesamtpaket war einfach perfekt: „Wo soll ich unterschreiben?“

Und so ist es dann auch geschehen.

Ich freue mich auf den Beginn meiner Ausbildung, neue Herausforderungen und weiterhin auf gute Zusammenarbeit.

10. Juni 2011

Welcher Test ist der richtige?

In der Entwicklung mit FLOW3 spielen Tests eine große Rolle. Das Tests dabei wartbar und aussagekräftig sind, erfordert einiges an Erfahrung beim Test-Driven-Development. Wichtig ist zwischen den verschiedenen Arten von Tests zu unterscheiden und für den richtigen Einsatzzweck anzuwenden:

Unit-Tests sind ein wichtiger Bestandteil zur Steigerung der Qualität und für eine größere Sicherheit bei zukünftigen Änderungen. Dabei wird jeweils nur eine Code-Einheit (z.B. eine Klasse) ohne größere Abhängigkeiten getestet. Ein fehlgeschlagener Unit-Test kann die Frage nach dem genauen Ort eines Problems oder einer inkompatiblen Änderung beantworten. Auch sind Unit-Tests die eigentliche Grundlage für Test-Driven-Development mit einem Test-First-Ansatz (also zuerst einen Test schreiben der fehlschlägt, dann die Implementierung).

Aber: selbst wenn alle Unit-Tests laufen, heißt das noch nicht, dass das Gesamtsystem zuverlässig läuft. Ausserdem sind Unit-Tests aus meiner Erfahrung bei der ersten Implementierung von ganz neuen Features (z.B. ein neues Persistenz-Backend wie das CouchDB-Package) unzureichend und störend, da die Richtung der Entwicklung oftmals noch nicht klar ist und über viele Schichten des Systems hinweg gearbeitet wird.

Functional-Tests in FLOW3 sind ein noch recht neues Feature um das System mit (fast) allen Abhängigkeiten testen zu können. Dabei steht das komplette FLOW3 mit Dependency Injection, AOP etc. in einem speziellen Kontext Testing zur Verfügung. So kann z.B. einfach der Versand von E-Mails oder die Datenbankverbindung für Tests umkonfiguriert werden.

Gerade für das Implementieren neuer Features können am Anfang gut Functional-Tests für eine automatische Überprüfung der Ziele benutzt werden. Wer im Browser in einer Webanwendung immer dieselben Schritte macht bis der Code das richtige tut, sollte vielleicht überlegen, ob Functional-Tests nicht Zeit einsparen könnten.

Der wichtigste Punkt für Functional-Tests ist für mich aber die Sicherheit, dass ein Feature im kompletten System mit allen Packages und Abhängigkeiten funktioniert. Generell sollte für jedes Szenario einer User-Story, also jedes zentrale Feature einer Applikation ein Functional-Test hinterlegt werden. Dabei ist es nicht wichtig jeden Ausführungspfad zu testen, das können auch Unit-Tests erledigen.

Functional-Test Tricks

1. Partielles Mocken von Objekten

Dabei werden Abhängigkeiten eines Objekts zum Teil durch ein Mock ersetzt. Nützlich für schwierig zu konfigurierende und zu testende Abhängigkeiten, z.B. Mailversand, externe Webservices oder Simulation eines Requests (die Helper-Methode sendWebRequest der FunctionalTestCase-Klasse nutzt selber diesen Trick). Richtig angewendet kann man damit zwar viele Schichten des Systems testen, aber bestimmte Abhängkeiten ausschließen.

2. Fixture Factories für Testdaten

Natürlich brauchen Functional-Tests irgendwann auch ein fertig instanziiertes Model als Grundlage. Recht lästig wird es, wenn jedesmal bestimmte Eigenschaften gesetzt werden müssen und dieses dann in verschiedenen Tests wiederholt wird. Auch Tests sollten nicht zu viel Redundanz aufweisen. Änderungen am Model und Änderungen in der Validierung verursachen dann viel Arbeit.

Model. Bauen. Redundanz? Da gibt es doch dieses Factory-Pattern? Genau. Ein wunderbarer Anwendungsfall. Mit ein bisschen Flexibilität gepaart, können durch eine Fixture-Factory viele Zeilen Testcode vereinfacht werden.

Nehmen wir z.B. ein Customer-Model für Kundendaten. Eine solche Factory könnte eine Methode buildValidCustomerbereitstellen, die ein Objekt baut und gleich mit den richtigen Beispiel-Eigenschaften versieht. Wenn dann noch Eigenschaften in einem Array zum Überschreiben übergeben werden können, sind auch Tests mit Abhängigkeiten auf bestimmte Werte in Eigenschaften gut lesbar und unterschiedliche Varianten eines Objektes möglich.

Mit einer zusätzlichen Method createValidCustomer könnte man dann auch das Repository im Functional-Test sparen und das Objekt direkt zum Repository hinzufügen.

class Customers {
 
  protected $validCustomerProperties = array(
    'customerNumber' => '123456',
    'emailAddress' => 'john.doe@example.com',
    'firstname' => 'John',
    'lastname' => 'Doe'
  );
 
  public function buildValidCustomer(array $overrideProperties) {
    $properties = array_merge($this->validCustomerProperties, $overrideProperties);
    $customer = new \F3\MyPackage\Domain\Model\Customer();
    foreach ($properties as $propertyName => $propertyValue) {
      if (\F3\FLOW3\Reflection\ObjectAccess::isPropertySettable($customer, $propertyName)) {
        \F3\FLOW3\Reflection\ObjectAccess::setProperty($customer, $propertyName, $propertyValue);
      }
    }
    return $customer;
  }
 
}
class CustomersTest extends \F3\FLOW3\Tests\FunctionalTestCase {
 
  static protected $testablePersistenceEnabled = TRUE;
 
  /**
   * @var \F3\MyPackage\Tests\Function\Fixtures\Domain\Model\Customers
   */
  protected $customers;
 
  public function setUp() {
    parent::setUp();
    $this->customers = $this->objectManager->get('F3\MyPackage\Tests\Function\Fixtures\Domain\Model\Customers');
  }
 
  /**
   * @test
   * @expectedException \F3\FLOW3\Persistence\Generic\Exception\ObjectValidationFailedException
   */
  public function customerEmailAddressHasToBeUnique() {
    $customer1 = $this->customers->buildValidCustomer(array('emailAddress' => 'foo@bar.com'));
    $customer2 = $this->customers->buildValidCustomer(array('emailAddress' => 'foo@bar.com'));
    $this->customerRepository->add($customer1);
    $this->customerRepository->add($customer2);
    $this->persistenceManager->persistAll();
  }
 
}

Was uns direkt zum nächsten "Trick" bringt: dem effektiven Testen von Exceptions in Tests.

4. Test von Exceptions

PhpUnit bringt eine einfache Möglichkeit mit sich Exceptions zu erwarten. Ein mit @expectedException (wie im Beispiel oben) annotierter Test stellt sicher, dass eine Exception mit dem angegebenen Typ geworfen wurde.

Was aber, wenn die Eigenschaften einer Exception relevant sind? Nehmen wir z.B. eine Exception, die bei Validierungen geworfen wird, und die ein Validierungsergebnis (F3\FLOW3\Error\Result) beinhaltet. Wenn ein Test sicherstellen soll, dass die richtige Eigenschaft als Fehlerhaft markiert wurde, macht es Sinn, die Exception abzufangen, die Testerwartung durch ein Assert anzugeben und die Exception wiederum zu werfen, damit ein @expectedException für uns den Rest erledigt und den Test gut lesbar dokumentiert.

class CustomersTest extends \F3\FLOW3\Tests\FunctionalTestCase {
 
  // ... Set up dependencies
 
  /**
   * @test
   * @expectedException \F3\MyPackage\Exception\ValidationException
   */
  public function createCustomerWithMissingEmailAddressThrowsValidationException() {
    try {
      $this->customerService->createCustomer($this->customers->buildValidCustomer('emailAddress' => ''));
    } catch (\F3\MyPackage\Exception\ValidationException $exception) {
      $this->assertTrue($exception->getResult()->forProperty('emailAddress')->hasErrors());
      throw $exception;
    }
  }
 
}

Testen testen testen ...

Es gibt noch viele weitere interessante Bereiche des Testings von Webanwendungen mit PHP und FLOW3. Dazu gehört sicherlich auch die richtige Anwendung von Mock-Objects und vor allem das Schreiben von aussagekräftigen und lesbaren Tests. Es bleibt also noch Platz für den einen oder anderen Folgeartikel...

Aus aktuellem Anlass: Wir suchen erfahrene PHP-Entwickler, die unser Team verstärken wollen und Lust auf spannende PHP-Projekte der nächsten Generation z.B. mit FLOW3 Entwicklung haben.

27. Mai 2011

Dependency Injection

Dependency Injection ist ein Entwurfsmuster (Design Pattern), dass helfen soll, Abhängigkeiten eines Objektes in der objekt-orientierten Programmierung einfacher aufzulösen. Es findet eine Umkehr der Steuerung (Inversion of Control) statt, um das Objekt von unnötigen Verbindungen zu seiner Umwelt zu befreien, die es nur für die Auflösung von Abhängigkeiten, nicht aber für seine eigentliche Aufgabe benötigt. Die Verantwortung für das Auflösen der Abhängigkeiten wird aus dem Objekt in das umliegende Framework, in unserem Falle Extbase, verlagert.

8. April 2011

Git? Gerrit? Jenkins?

Am 26.01.2011 zogen Extbase, Fluid und das Blog Example aus der bisherigen Versionsverwaltung SVN nach Git um. Git bietet viele Vorteile gegenüber SVN, vor allem das dezentrale Arbeiten auf einer eigenen Kopie des Repositories (inklusive der gesamten Historie) und die viel flexiblere Behandlung von Branches.

Git bringt viel mehr Möglichkeiten mit sich - zu branchen, zu mergen, zu cherry-picken und zu squashen - und hat damit natürlich eine wesentlich steilere Lernkurve als SVN. Ich will euch hier einen kurzen Einstieg in Git geben, der euch alles an die Hand gibt, was ihr zum Arbeiten braucht. Man sollte sich aber nichts vormachen...  auch nach Monaten mit Git (und Gerrit) lernt man immer noch ständig etwas Neues dazu. ;-)

25. Februar 2011