Archiv der Kategorie: Software Engineering

„Windows 8 – Die gekachelte Zukunft des Computing?“ – Präsentation auf dem Webmontag

Nachdem ich im Artikel Windows 8 – neues Feld für Webentwickler schon etwas in die Anwendungsentwicklung mit Webtechniken unter Windows 8 eingetaucht bin, gibts jetzt meinen Vortrag auf dem Webmontag #41 in Frankfurt vom 17.09.2012.

Webmontag - Blick vom Speakerpult kurz vor der Präsentation

Webmontag – Blick vom Speakerpult kurz vor der Präsentation

War meine erste Präsentation vor 150 – 200 Leuten, echt eine Erfahrung. Resonanzen auf den Vortrag sind soweit positiv gewesen, natürlich schwingt unter Webdesignern und Social-Media-Experten immer eine gewisse Windows-Skepsis mit, was ja auch vollkommen okay ist. Möchte auch niemanden umerziehen und nur einen Einblick ins neue System geben. Dass mir Windows 8 selbst ganz gut gefällt, hört man sicher raus.

Veröffentlicht unter Software Engineering, misc IT, Persönlich | Hinterlasse einen Kommentar

Interessante Testarten: Mutationstest und Fuzzing

Bin heute über 2 Testverfahren gestolpert, die ich vorher noch nicht auf der Rechnung hatte. Fangen wir beim Mutationstest an.

Mutationstest

Dabei wird die zu testende Applikation vollautomatisch von einem Programm abgeändert. Das kann etwa so aussehen, dass in einer Schleife aus einem <= ein < gemacht wird. Hier orientiert sich die Art der eigebauten Fehler an den gern von Programmierern gemachten, also z.B. Schleifengrenzen und Verschachtelungen. Wichtig ist hierbei, dass pro Durchlauf immer nur eine Manipulation vorgenommen wird, sonst lässt sich die Auswirkung schließlich schlecht lokalisieren.

Veröffentlicht unter php, Software Engineering, Security, webdev | Hinterlasse einen Kommentar

Aufteilen von Funktionen = doppelte Validierung

Für ein kleines Nebenprojekt bin ich am Werkeln mit codeigniter. Soweit so gut. Ich brauchte eine Funktion, die den Bildupload und anschließendes resizing erledigte. Kein Problem, dank Upload-Klasse und Image Manipulation-Klasse. Okay, das hier soll aber keine Lobhymne auf ein Framework werden, sondern ein allgemeines Thema ansprechen.

Ich hab also meine Funktion, die upload und resize erledigt. Wens interessiert:

public function process_image($cat_id)
{
	//----------------------------------
	//Upload
	
	if (intval($cat_id) <= 0)
		throw new Exception("Invalid Video ID");
	
	$upload_config = array
	(
		'upload_path' => IMAGES_PATH,
		'allowed_types' => 'gif|jpg|png|jpeg',
		'overwrite' => true
	);
	
	if (!is_dir(IMAGES_PATH))
		throw new Exception("Could not find Upload directory");

	$this->load->library('upload', $upload_config);

	if (!$this->upload->do_upload())
		throw new Exception("Upload Error: " . $this->upload->display_errors()); 

	$upload_info = $this->upload->data();

	//----------------------------------
	//Resize
	$thumbname = IMAGES_PATH . 'thumb_' . $cat_id . '_' . uniqid() . "." . $upload_info['image_type'];
				
	$resize_config = array
	(
		'source_image' => $upload_info['full_path'],
		'maintain_ratio' => false,
		'width' => 65,
		'height' => 65,
		'new_image' => $thumbname
	);
	
	$this->load->library('image_lib', $resize_config); 
	
	if (!$this->image_lib->resize())
	{
		@unlink($upload_info['full_path']);
		
		throw new Exception("Resize Error: " . $this->image_lib->display_errors());
	}
	
	@unlink($upload_info['full_path']);
	
	return true;
}

Nunja, als Mensch der die OOP Grundprinzipien hochhalten möchte, schmerzt es natürlich, dass die Funktion sich um Upload und Resize kümmert. Ich trenne also die Funktionen auf, Wiederverwendbarkeit und so…

Veröffentlicht unter php, Software Engineering, webdev | 9 Kommentare

Best-of-the-Web 8

Ding Ding Ding. Runde 8!

Veröffentlicht unter php, Datenbanken, Software Engineering, Best of the Web, webdev | Hinterlasse einen Kommentar

Best-of-the-Web 7

Und erneut gibt es Link-Spaß für die ganze Familie.

Veröffentlicht unter php, Javascript, Software Engineering, Best of the Web, webdev | Hinterlasse einen Kommentar

Testen mal anders: phpt

phpt ist ein schmuckes, kleines Testframework, welches u.a. auch zur PHP Quality Assurance verwendet wird, um damit PHP-eigene Funktionen in PHP zu testen. Wir beginnen mit einem Beispiel:

--TEST--
My first cool test!
--FILE--
<?php 
class Foobar
{
	public function __construct()
	{
		for ($i = 0; $i < 6; $i++)
		{
			if ($i % 2 != 0)
				echo $i;
		}
	}
}

new Foobar();
?>
--EXPECT--
135

Und das Beste: Mit PEAR kommt der Spaß gleich mit:

Pear run-tests

Pear run-tests

Das ists aber lang noch nicht gewesen. Man führe sich folgenden Test zu Gemüte:

--TEST--
Second example: errortesting
--FILE--
<?php 
$foo = array(1, 3) * array(2, 6);
?>
--EXPECTF--
Fatal error: Unsupported operand types in %s.php on line %d

Wir testen hier etwas, was schiefgehen soll. Dabei kommt gleich noch EXPECTF (für formatierte Ausgaben im Stil von scanf) zum Einsatz.

Aber es wird noch cooler. Es gibt sehr sinnvolle –BLÖCKE–, mit denen dann auch sowas realisiert werdern kann:

Veröffentlicht unter php, Software Engineering, webdev | 3 Kommentare

Nette Metapher zum Thema ‚Testen‘

Nach der sträflichen Vernachlässigung des Blogs bedingt durch die fiese Klausurphase sind jetzt Semesterferien und die Liste des „Verbloggenswerten“ ist beträchtlich angewachsen – demnächst also wieder mehr Futter. Losgehen solls mit einem netten Spruch eines meiner Profs, der bei Bosch mal Softwarearchitekt war. Bezieht sich übrigens auf das Thema Softwaretests:

Stress ist, wenn man das Fahrrad so schnell schieben muss, dass man nicht aufsteigen kann.

Denkt mal drüber nach ;).

Veröffentlicht unter Software Engineering | 4 Kommentare

Überdeckungsorientierte Testverfahren

Unit-Tests sind ja hinreichend bekannt. Die nachfolgend vorgestellten Testverfahren sicher jedoch weniger. Deshalb gibts heut mal einen kleinen Ausflug. Ohne viel Vorgeplänkel stelle ich verschiedene überdeckungsorientierte Testverfahren vor.

Zeilenüberdeckung

Folgender (sinnloser) Code:

function foo($bar)
{
	if ($bar && !$bar)
		return true;
		
	return false;
}

Was fällt auf? Die Funktion kann nie true returnen. Durch einen Test auf Zeilenabdeckung kann also erkannt werden, dass hier irgendwas nicht stimmt, weil die return true; – Zeile niemals erreicht wird. Allerdings (großes allerdings!), würde folgende „Umstellung“ des Codes bereits zu einer 100%igen Zeilenüberdeckung führen:

function foo($bar)
{
	if ($bar && !$bar) return true;
		
	return false;
}

Veröffentlicht unter php, Software Engineering, webdev | 4 Kommentare

Lasst die Datenbank ihren Job machen!

Oft schau ich mir Code an und sehe, dass Leute offenbar zu faul für vernünftige SQL-Statements sind. Da wird eine extrem allgemein gehaltene Abfrage auf die Datenbank losgelassen, um dann im Nachklang mit PHP zu filtern / zu gruppieren. Warum? Die Datenbank ist doch zum rechnen und für genau so Aufgaben gedacht. Zudem ists auch noch viel performanter, die Datenbank einfach ihren Job erledigen zu lassen. Vielleicht programmieren gewisse Leute einfach viel zu gern PHP, als das sie sich von der Datenbank die Arbeit abnehmen lassen würden?

Berechnungen im SELECT

SELECT price FROM product

while ($row = $sql->fetch())
{
    print $row['price'] * 1.95583;
}

Warum nicht einfach:

SELECT price*1.95583 AS europreis FROM product

Veröffentlicht unter php, Datenbanken, Software Engineering, Performance, webdev | 6 Kommentare

5 PHP Patterns im Schnelldurchlauf: Factory, Iterator, Observer, Singleton, Strategy

Dieser Post versteht sich ein bisschen als „Reminder“. Bei den folgenden 5 Patterns habe ich in den Codebeispielen besonderen Wert auf Einfachheit gelegt, sodass man ohne große Erklärung gleich sieht, worum es geht. Ich finde es wichtig, sich nach einiger Zeit immer mal wieder die Patterns vor Augen zu halten.

Factory

Eine „Fabrik“ erzeugt je nach Anwendungskontext verschiedene Klassen und gibt diese zurück.

interface IPermission
{
	public function deleteFilePermission();
}

class AdminPermission implements IPermission
{
	public function deleteFilePermission()
	{
		return true;
	}
}

class UserPermission implements IPermission
{
	public function deleteFilePermission()
	{
		return false;
	}
}

//-----------------------------------------------

class UserFactory
{
	public static function build($type)
	{
		switch ($type)
		{
			case 'admin': 
				return new AdminPermission();
				break;
			case 'user': 
				return new UserPermission();
				break;
			default: 
				throw new Exception("No valid type");
		}			
	}
}

//-----------------------------------------------

//admin is allowed to delete files
$admin=UserFactory::build("admin");
var_dump($admin->deleteFilePermission()); //bool(true)

//user is not allowed to delete files
$user=UserFactory::build("user");
var_dump($user->deleteFilePermission()); //bool(false)	

Iterator

Das iterieren mit foreach ist durch das Iterator-Pattern auch über eine Klasse möglich – so als ob sie ein Array wäre. Sinnvoll, wenn ich klassenintern komplexe Strukturen abgebildet habe, die ich nach außen simpel darstellen möchte. Allerdings ist mein Beispiel bewusst einfach gehalten – eigentlich eine Vergewaltigung des iterator-Patterns, bei dem ein einfaches Array die bessere Wahl gewesen wäre. Aber der Zusammenhang sollte klar werden.

Veröffentlicht unter php, Software Engineering | 3 Kommentare