Windows 7 und meine Seminararbeit

Damals™, als ich noch Student war, durfte ich mich mit dem Thema „Wie groß ist Windows“ im Rahmen einer Seminarbeit beschäftigen. Damals ging es nicht wirklich um die Inhalte, sondern eher um das Präsentieren. Nunja, inzwischen nimmt Windows 7 konkrete Formen an und ich vergleiche mal meine Prognose mit der Wirklichkeit.

Auf Seite 27 meiner Präsentation habe ich behauptet die Systemanforderungen wären:

  • Jahr 2010
  • 1,8 Ghz CPU
  • 1,6 GB Hauptspeicher
  • 45 GB HDD

Microsoft behauptet jetzt:

  • 1 GHz or faster 32-bit (x86) or 64-bit (x64) processor
  • 1 GB RAM (32-bit) / 2 GB RAM (64-bit)
  • 16 GB available disk space (32-bit) / 20 GB (64-bit)
  • DirectX 9 graphics processor with WDDM 1.0 or higher driver

Naja. Zumindest beim Speicher lag ich einigermassen richtig. Ich bin aber auch sehr froh das es nicht so gekommen ist, wie ich prognostiziert habe. Deshalb schließe ich mit dem Zitat:

„Prognosen sind schwierig, besonders wenn sie die Zukunft betreffen.“

zugeschrieben Karl Valentin, Mark Twain, Winston Churchill u.a.

Powerpoint mit PHP

Wieder was interessantes aus der Gegend von PHP. Office 2007 baut ja inzwischen XML-basierte Dateien, d.h. das Erstellen von Office-Dokumenten ist erstaunlich einfach geworden. Nun gibt es neben der Excel-Klasse auch noch Powerpoint per PHP.

Ein Quellcodebeispiel gibt es hier: http://blog.maartenballiauw.be/post/2009/04/27/PHPPowerPoint-010-(CTP1)-released!.aspx

Das Zipfile das es zum Download gibt, enthält auch vier Testfälle. In meinem Fall musste ich noch den XMLWriter mit in PHP einkompilieren und danach noch ein paar Dateien und Verzeichnisse umbennen, da Linux bekanntlich sehr auf Groß- und Kleinschreibung achtet (PHPPowerpoint.php != PHPPowerPoint.php). Anyway, hier ein Beispielcode aus dem Zip und danach die generierte Powerpoint-Datei:

<?php
/**
 * PHPPowerPoint
 *
 * Copyright (c) 2009 - 2010 PHPPowerPoint
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * @category   PHPPowerPoint
 * @package    PHPPowerPoint
 * @copyright  Copyright (c) 2009 - 2010 PHPPowerPoint (http://www.codeplex.com/PHPPowerPoint)
 * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL
 * @version    0.1.0, 2009-04-27
 */

/** Error reporting */
error_reporting(E_ALL);

/** Include path **/
set_include_path(get_include_path() . PATH_SEPARATOR . '../Classes/');

/** PHPPowerPoint */
include 'PHPPowerPoint.php';

/** PHPPowerPoint_IOFactory */
include 'PHPPowerPoint/IOFactory.php';

// Create new PHPPowerPoint object
echo date('H:i:s') . " Create new PHPPowerPoint object\n";
$objPHPPowerPoint = new PHPPowerPoint();

// Set properties
echo date('H:i:s') . " Set properties\n";
$objPHPPowerPoint->getProperties()->setCreator("Maarten Balliauw");
$objPHPPowerPoint->getProperties()->setLastModifiedBy("Maarten Balliauw");
$objPHPPowerPoint->getProperties()->setTitle("Office 2007 PPTX Test Document");
$objPHPPowerPoint->getProperties()->setSubject("Office 2007 PPTX Test Document");
$objPHPPowerPoint->getProperties()->setDescription("Test document for Office 2007 PPTX, generated using PHP classes.");
$objPHPPowerPoint->getProperties()->setKeywords("office 2007 openxml php");
$objPHPPowerPoint->getProperties()->setCategory("Test result file");

// Remove first slide
echo date('H:i:s') . " Remove first slide\n";
$objPHPPowerPoint->removeSlideByIndex(0);

// Create templated slide
echo date('H:i:s') . " Create templated slide\n";
$currentSlide = createTemplatedSlide($objPHPPowerPoint); // local function

// Create a shape (text)
echo date('H:i:s') . " Create a shape (rich text)\n";
$shape = $currentSlide->createRichTextShape();
$shape->setHeight(200);
$shape->setWidth(600);
$shape->setOffsetX(10);
$shape->setOffsetY(400);
$shape->getAlignment()->setHorizontal( PHPPowerPoint_Style_Alignment::HORIZONTAL_LEFT );

$textRun = $shape->createTextRun('Introduction to');
$textRun->getFont()->setBold(true);
$textRun->getFont()->setSize(28);
$textRun->getFont()->setColor( new PHPPowerPoint_Style_Color( 'FFFFFFFF' ) );

$shape->createBreak();

$textRun = $shape->createTextRun('PHPPowerPoint');
$textRun->getFont()->setBold(true);
$textRun->getFont()->setSize(60);
$textRun->getFont()->setColor( new PHPPowerPoint_Style_Color( 'FFFFFFFF' ) );

// Create templated slide
echo date('H:i:s') . " Create templated slide\n";
$currentSlide = createTemplatedSlide($objPHPPowerPoint); // local function

// Create a shape (text)
echo date('H:i:s') . " Create a shape (rich text)\n";
$shape = $currentSlide->createRichTextShape();
$shape->setHeight(100);
$shape->setWidth(930);
$shape->setOffsetX(10);
$shape->setOffsetY(10);
$shape->getAlignment()->setHorizontal( PHPPowerPoint_Style_Alignment::HORIZONTAL_LEFT );

$textRun = $shape->createTextRun('What is PHPPowerPoint?');
$textRun->getFont()->setBold(true);
$textRun->getFont()->setSize(48);
$textRun->getFont()->setColor( new PHPPowerPoint_Style_Color( 'FFFFFFFF' ) );

// Create a shape (text)
echo date('H:i:s') . " Create a shape (rich text)\n";
$shape = $currentSlide->createRichTextShape();
$shape->setHeight(600);
$shape->setWidth(930);
$shape->setOffsetX(10);
$shape->setOffsetY(100);
$shape->getAlignment()->setHorizontal( PHPPowerPoint_Style_Alignment::HORIZONTAL_LEFT );

$textRun = $shape->createTextRun('- A class library');
$textRun->getFont()->setSize(36);
$textRun->getFont()->setColor( new PHPPowerPoint_Style_Color( 'FFFFFFFF' ) );

$shape->createBreak();

$textRun = $shape->createTextRun('- Written in PHP');
$textRun->getFont()->setSize(36);
$textRun->getFont()->setColor( new PHPPowerPoint_Style_Color( 'FFFFFFFF' ) );

$shape->createBreak();

$textRun = $shape->createTextRun('- Representing a presentation');
$textRun->getFont()->setSize(36);
$textRun->getFont()->setColor( new PHPPowerPoint_Style_Color( 'FFFFFFFF' ) );

$shape->createBreak();

$textRun = $shape->createTextRun('- Supports writing to different file formats');
$textRun->getFont()->setSize(36);
$textRun->getFont()->setColor( new PHPPowerPoint_Style_Color( 'FFFFFFFF' ) );

// Create templated slide
echo date('H:i:s') . " Create templated slide\n";
$currentSlide = createTemplatedSlide($objPHPPowerPoint); // local function

// Create a shape (text)
echo date('H:i:s') . " Create a shape (rich text)\n";
$shape = $currentSlide->createRichTextShape();
$shape->setHeight(100);
$shape->setWidth(930);
$shape->setOffsetX(10);
$shape->setOffsetY(10);
$shape->getAlignment()->setHorizontal( PHPPowerPoint_Style_Alignment::HORIZONTAL_LEFT );

$textRun = $shape->createTextRun('What\'s the point?');
$textRun->getFont()->setBold(true);
$textRun->getFont()->setSize(48);
$textRun->getFont()->setColor( new PHPPowerPoint_Style_Color( 'FFFFFFFF' ) );

// Create a shape (text)
echo date('H:i:s') . " Create a shape (rich text)\n";
$shape = $currentSlide->createRichTextShape();
$shape->setHeight(600);
$shape->setWidth(930);
$shape->setOffsetX(10);
$shape->setOffsetY(100);
$shape->getAlignment()->setHorizontal( PHPPowerPoint_Style_Alignment::HORIZONTAL_LEFT );

$textRun = $shape->createTextRun('- Generate slide decks');
$textRun->getFont()->setSize(36);
$textRun->getFont()->setColor( new PHPPowerPoint_Style_Color( 'FFFFFFFF' ) );

$shape->createBreak();

$textRun = $shape->createTextRun('    - Represent business data');
$textRun->getFont()->setSize(28);
$textRun->getFont()->setColor( new PHPPowerPoint_Style_Color( 'FFFFFFFF' ) );

$shape->createBreak();

$textRun = $shape->createTextRun('    - Show a family slide show');
$textRun->getFont()->setSize(28);
$textRun->getFont()->setColor( new PHPPowerPoint_Style_Color( 'FFFFFFFF' ) );

$shape->createBreak();

$textRun = $shape->createTextRun('    - ...');
$textRun->getFont()->setSize(28);
$textRun->getFont()->setColor( new PHPPowerPoint_Style_Color( 'FFFFFFFF' ) );

$shape->createBreak();

$textRun = $shape->createTextRun('- Export these to different formats');
$textRun->getFont()->setSize(36);
$textRun->getFont()->setColor( new PHPPowerPoint_Style_Color( 'FFFFFFFF' ) );

$shape->createBreak();

$textRun = $shape->createTextRun('    - PowerPoint 2007');
$textRun->getFont()->setSize(28);
$textRun->getFont()->setColor( new PHPPowerPoint_Style_Color( 'FFFFFFFF' ) );

$shape->createBreak();

$textRun = $shape->createTextRun('    - Serialized');
$textRun->getFont()->setSize(28);
$textRun->getFont()->setColor( new PHPPowerPoint_Style_Color( 'FFFFFFFF' ) );

$shape->createBreak();

$textRun = $shape->createTextRun('    - ... (more to come) ...');
$textRun->getFont()->setSize(28);
$textRun->getFont()->setColor( new PHPPowerPoint_Style_Color( 'FFFFFFFF' ) );

// Create templated slide
echo date('H:i:s') . " Create templated slide\n";
$currentSlide = createTemplatedSlide($objPHPPowerPoint); // local function

// Create a shape (text)
echo date('H:i:s') . " Create a shape (rich text)\n";
$shape = $currentSlide->createRichTextShape();
$shape->setHeight(100);
$shape->setWidth(930);
$shape->setOffsetX(10);
$shape->setOffsetY(10);
$shape->getAlignment()->setHorizontal( PHPPowerPoint_Style_Alignment::HORIZONTAL_LEFT );

$textRun = $shape->createTextRun('Need more info?');
$textRun->getFont()->setBold(true);
$textRun->getFont()->setSize(48);
$textRun->getFont()->setColor( new PHPPowerPoint_Style_Color( 'FFFFFFFF' ) );

// Create a shape (text)
echo date('H:i:s') . " Create a shape (rich text)\n";
$shape = $currentSlide->createRichTextShape();
$shape->setHeight(600);
$shape->setWidth(930);
$shape->setOffsetX(10);
$shape->setOffsetY(100);
$shape->getAlignment()->setHorizontal( PHPPowerPoint_Style_Alignment::HORIZONTAL_LEFT );

$textRun = $shape->createTextRun('Check the project site on CodePlex:');
$textRun->getFont()->setSize(36);
$textRun->getFont()->setColor( new PHPPowerPoint_Style_Color( 'FFFFFFFF' ) );

$shape->createBreak();

$textRun = $shape->createTextRun('    http://phppowerpoint.codeplex.com');
$textRun->getFont()->setSize(36);
$textRun->getFont()->setColor( new PHPPowerPoint_Style_Color( 'FFFFFFFF' ) );

// Create templated slide
echo date('H:i:s') . " Create templated slide\n";
$currentSlide = createTemplatedSlide($objPHPPowerPoint); // local function

// Save PowerPoint 2007 file
echo date('H:i:s') . " Write to PowerPoint2007 format\n";
$objWriter = PHPPowerPoint_IOFactory::createWriter($objPHPPowerPoint, 'PowerPoint2007');
$objWriter->save(str_replace('.php', '.pptx', __FILE__));

// Echo memory peak usage
echo date('H:i:s') . " Peak memory usage: " . (memory_get_peak_usage(true) / 1024 / 1024) . " MB\r\n";

// Echo done
echo date('H:i:s') . " Done writing file.\r\n";

/**
 * Creates a templated slide
 *
 * @param PHPPowerPoint $objPHPPowerPoint
 * @return PHPPowerPoint_Slide
 */
function createTemplatedSlide(PHPPowerPoint $objPHPPowerPoint)
{
	// Create slide
	$slide = $objPHPPowerPoint->createSlide();

	// Add background image
    $shape = $slide->createDrawingShape();
    $shape->setName('Background');
    $shape->setDescription('Background');
    $shape->setPath('./images/realdolmen_bg.jpg');
    $shape->setWidth(950);
    $shape->setHeight(720);
    $shape->setOffsetX(0);
    $shape->setOffsetY(0);

    // Add logo
    $shape = $slide->createDrawingShape();
    $shape->setName('PHPPowerPoint logo');
    $shape->setDescription('PHPPowerPoint logo');
    $shape->setPath('./images/phppowerpoint_logo.gif');
    $shape->setHeight(40);
    $shape->setOffsetX(10);
    $shape->setOffsetY(720 - 10 - 40);

    // Return slide
    return $slide;
}

Die Testdatei geniert folgende Konsolenausgabe:

23:16:10 Create new PHPPowerPoint object
23:16:10 Set properties
23:16:10 Remove first slide
23:16:10 Create templated slide
23:16:10 Create a shape (rich text)
23:16:10 Create templated slide
23:16:10 Create a shape (rich text)
23:16:10 Create a shape (rich text)
23:16:10 Create templated slide
23:16:10 Create a shape (rich text)
23:16:10 Create a shape (rich text)
23:16:10 Create templated slide
23:16:10 Create a shape (rich text)
23:16:10 Create a shape (rich text)
23:16:10 Create templated slide
23:16:10 Write to PowerPoint2007 format
23:16:10 Peak memory usage: 3.5 MB
23:16:10 Done writing file.

Und dieses PDF hab ich aus dem Ergebnis erstellt (dazu brauch man dann wieder Powerpoint 2007, das kann die Klasse glaube ich nicht 🙂 )

Soweit so gut.

Panoramafotos

Zweimal hab ich den Post schon editiert (Stand jetzt: 2009-04-07 20:47)

Ich mag Fotographieren photographieren fotografiern Bilder mit der Kamera machen. Allerdings bin ich auch ziemlich faul was das angeht. Fantastischerweise gibt es viele Programme die einem Arbeit abnehmen: Panaoramatools

Der erste (Autostitch) war bisher immer mein Favorit. Klein, einfach und umsonst. Und liefert annehmbare Ergebnisse. Nachdem ich das Programm mal meinem (Ex-)Chef in Amerika gezeigt hatte, hat er sich gleich die kommerzielle Variante gekauft, nämlich Autopano. Ich muss zugeben, das Programm kann schon deutlich mehr als Autostitch, hat automatische „Geister-Erkennung“ (d.h. Leute die in einem Bild sind und im nächsten nicht mehr, werden automatisch ausgeschnitten) und liefert wunderbare Bilder. Außerdem kann man ne Menge einstellen, sowas überfordert mich dann aber schon wieder 🙂

Als neuste Entdeckung hab ich nun den Image Composite Editor gefunden. Der ist von Microsoft itself und macht einen guten Eindruck. Leider hab ich gerade meine Kamera nicht zur Hand, kann also keine Bilder machen um die zusammenzuwürfeln. Für Autostitch hab ich aber ein Bild (das ist vom Fish River Canyon in Namibia, knapp 20 Bilder verarbeitet)

canyonpanorama

EDIT: Ok, ich hab einfach noch die Bilder von Detroit zusammengebastelt. Diesmal mit dem Microsofttool, 23 Bilder, auf 50% skaliert:

detroit_stitch

Und damit man mal weiß wie groß der Ausschnitt eines Bildes ist:

dscf1183

EDIT 2: Nochmal das ganze mit 100% Skalierung. Sind 4,5 MB, im Gegensatz zu den 900kb vom obrigen Bild. Dafür is die Detailtreue deutlich besser.

detroit_stitch_100Und hier der Vergleich in der Großaufnahme, besonders am GM-Logo sieht man den Unterschied:

detroit_stitch_crop_comparison

Die Schaltsekunde

Ich fands ja urkomisch, dass der Zune-Player zum Neujahr sich einfach mal abmeldete. In diversen Apple-Foren wurde sich natürlich hämisch ins Fäustchen gelacht. Sprüche wie „Typisch“ und „Micro$oft“ kamen ganz gross raus. Ich finds zwar immernoch bescheiden, dass Microsoft diesen Check nicht ordentlich gebaut hat, aber schlimmer finde ich eigentlich den Deadlock den Linux produziert.

OpenXML als HTML

Sowas find ich klasse. Microsoft stellt ein Firefox-Addon zur Verfügung mit dem man OpenXML-Dokumente als HTML anschauen kann. Sehr praktisch wenn man gerade kein Microsoft Office zur Hand hat, oder auch kein Openoffice. Einfach das Firefox-Addon installieren, die Datei auf den Firefox ziehen und fertig. Klasse.

AVG löscht Systemdatei, Deutschland ist empört

Ha, endlich mal eine BILD-würdige Überschrift. AVG, bekannt durch den gleichnamigen kostenlosen Virenscanner, hat sich einen kleinen Fauxpas geliefert.

Im Prinzip machen Virenscanner im Hintergrund nichts anderes als aufzupassen welchen Dateien gerade vom Nutzer benutzt werden. Sollte eine bereits als Virus bekannte Datei gefunden werden, oder innerhalb einer Datei schadhafter Code entdeckt werden, dann schlagen die Scanner Alarm. Soweit so gut.

Wie immer im Leben ist sowas aber nicht zu 100% verlässlich. Es gibt sogenannte „false negatives“ und „false positives“. Erstere sind Viren die als „gut“ eingestuft werden, obwohl sie eigentlich „böse“ sind, letztere sind „gute“ Dateien die als „böse“ eingestuft werden. Und genau das ist passiert:

AVG - User32.dll
AVG - User32.dll

Doof ist jetzt nur, dass diese Datei für Windows existenznotwendig ist. Essentiell sozusagen. Wenn diese Datei gelöscht wird, dann geht erstmal gar nichts mehr. Lösungen gibt es viele:

  • Wenn noch nichts passiert ist: AVG auf den neusten Stand bringen, dann tritt das Problem erst gar nicht auf
  • Wenn schon gelöscht:
    • Windows-CD einlegen und Reperaturfunktion starten
    • Eine beliebige LiveCD nehmen und die User32.dll einfach wieder ins Windows-Verzeichnis kopieren
    • Der Anleitung von AVG folgen

Holla die Waldfee. Gut das mir das nicht passiert ist 🙂