Memo an mich,
Office 2010 per Kommandozeile unbemerkt repaieren:

setup.exe /repair "ProPlus" /config "SilentRepairConfig.xml"

Pfad zur .exe und zur .xml angeben, Produktnamen „ProPlus“ ggf. duch das vorhandene Produkt (steht in der setup.xml Zeile 3 am Anfang) ersetzen.
Setup.exe Parameter

SilentRepairConfig.xml erstellen, wenn im Ordner ProPlus.WW nicht vorhanden:

<Configuration Product="ProPlus">
<Display Level="none" CompletionNotice="no" SuppressModal="yes" AcceptEula="yes" />
<USERINITIALS Value="IQB" />
<USERNAME Value="IQB" />
<Setting Id="SETUP_REBOOT" Value="Never" />
</Configuration>

XML Elemente
Ganz wichtig ist das Element

Setting

, mit dem sich viele wichtige Dinge wie Reboot steuern lassen: Setup/Setting Properties

Grundlegende Batch:

set o2k10=\\server\pfad\Office2010
set log="\\server\pfad\Logs\%computername%.txt"
if exist %windows%\checks\repairo2k10 goto end
echo Repariere Office 2010...
%o2k10%\setup.exe /repair ProPlus /config %o2k10%\ProPlus.WW\SilentRepairConfig.xml
echo %date% %time% - Office repariert, errorlevel: %errorlevel% >> %log%
md %windows%\checks\repairo2k10
:end

Update:
Bei einigen Office Repairs verhält sich Office 2010 anders. Mal startet es den Computer direkt nach der Reperatur neu, mal nicht. Ich hatte < setting Id="SETUP_REBOOT" Value="Never" /> in die .xml genommen damit der Rechner nie neu gestartet wird. Das resultiert bei den Rechnern, die neu gestartet hätten, im Fehlercode 3010: ein Neustart wird benötigt (Mögliche Errorlevel). Die Computer haben dann ein fehlerhaftes Office 2010 solange der Rechner nicht neu gestartet wird. Andere Microsoft Programme (Visual Studio z.B.) laufen dann auch fehlerhaft.

Also passe ich die Batch an, speicher den errorlevel des Repair-Vorgangs ab und reagiere auf den 1030 Code mit einem Reboot nachdem das Script beendet wurde.

set o2k10=\\server\pfad\Office2010
set log="\\server\pfad\Logs\%computername%.txt"
if exist %windows%\checks\repairo2k10 goto end
echo Repariere Office 2010...
%o2k10%\setup.exe /repair ProPlus /config %o2k10%\ProPlus.WW\SilentRepairConfig.xml
set repairerrorlevel=%errorlevel%
REM weitere Befehle...
echo %date% %time% - Office repariert, errorlevel: %repairerrorlevel% >> %log%
REM weitere Befehle...
md %windows%\checks\repairo2k10
:end
if %repairerrorlevel%==1030 shutdown -r -f -t 120 -c "Um die Office Reperatur erfolgreich abzuschliessen muss der Computer neugestartet werden. Der Computer wird in 120 Sekunden neugestartet!"

Einfach < setting Id="SETUP_REBOOT" Value="Never" /> aus der .xml zu löschen würde den Computer direkt nach dem Repair-Vorgang neustarten, die Batch würde nicht zu Ende ausgeführt!

Eigentlich finde ich Veränderungen bei Gewohnheiten, die mittlerweile so in’s Blut übergegangen sind wie einen Suchbegriff bei Google eingeben, nicht wirklich sinnvoll. Zeitersparnis gibt es oftmals nicht weil bei „g[Leerzeichen]suchbegriff“ nicht mehr viel zu optimieren ist. Mittlerweile erkennen ja alle Browser eine Eingabe in die Adresszeile, wenn es keine gültige URL ist, sowieso schon als Suchanfrage. Also wie gesagt, es macht kaum Sinn.

Aber der Post soll eigentlich eher ein kleines Lob an die Spracherkennung von der neuen Google Voice Search sein. Die Erkennung der Sprache, deutsche Sprache wohlgemerkt, ist ziemlich perfekt. Man muss schon sehr nuscheln damit Google das Wort „Ottonormalverbraucher“ (ja, Mario, nur für dich getestet ;)) nicht erkennt und „Ordnungsamt“ draus macht. Aber ansonsten, 1A Spracherkennung von deutschen Wörtern, Namen, Begriffen, leise sprechen, ein wenig nuscheln, alles kein Problem.

Hier ein kurzer Eindruck:

Und wie gesagt, auch Ottonormalverbraucher ohne zu zucken erkannt.

Findet ihr die Sprachsuche sinnvoll? Sie ist momentan noch ausschließlich auf google.com nutzbar aber würdet ihr die Funktion auch nutzen weil ihr z.B. ein Headset habt und das Mikro sowieso immer an ist?

Ganz ehrlich, mir gefällt die neue Schriftart im Editor nicht und da man sich bei WordPress im Backend sowieso 95% im Editor befindet sollte man sich dort schon wohl fühlen.

Lösung: neue Schriftart. Ich übernehme die Schriftarteinstellungen des Post-Titels.
Öffnet die Datei

\wp-admin\css\wp-admin.css

von eurem FTP Server und sucht nach

#editorcontainer #content

.
1 Fundstelle zeigt eine

font-family:

Beschreibung dahinter, diese ändert ihr ab.

Z.B. von

#editorcontainer #content{font-family:Consolas,Monaco,monospace;

(Original, hässlich)
zu

#editorcontainer #content{font-family:Arial,"Bitstream Vera Sans",Helvetica,Verdana,sans-serif;

(Arial, wie der Titel)
oder zu

#editorcontainer #content{font-family:"Trebuchet MS",Arial,"Bitstream Vera Sans",Helvetica,Verdana,sans-serif;

(Trebuchet MS)
oder welche Schriftart auch immer ihr mögt.

Hier alt und neu im Vergleich:

Achtung, ersetzt die Angaben korrekt sonst zerschießt ihr euch noch den Editor. Die Angabe mehrerer Schriftarten hintereinander bewirkt nur, dass, wenn eine Schriftart nicht gefunden wird, die nächststehende versucht wird. Schriftarten mit Leerzeichen unbedingt „eindingseln“.

Ich bin positiv überrascht, das neue WordPress Update 3.2 – „Gershwin“ hat es in sich!

Dem Backend wurde ein neues Aussehen verpasst, dass mir sehr gut gefällt.

Die Admin Bar im Blog hat bei „Add New“ ein paar zusätzliche Punkte bekommen.
Der Editor bekommt einen ziemlich coolen Vollbildmodus.

Entgegen anderer Updates wurde stark an der Performance gearbeitet. Das kann ich durchaus bestätigen, das Backend reagiert jetzt wesentlich schneller als zuvor. Aufgrund einiger Plugins war mein Backend recht langsam geworden.
Ich glaube auch, dass das Hinzufügen von Bildern in Artikel jetzt schneller läuft. Das war für mich immer einer der größten Flaschenhälse von WordPress, dieser halb CSS halb Flash realisierte Image Uploader.

Dann gibt es noch ein neues Standarddesign, realisiert in HTML5, zusätzliche Codeoptimierungen im System und vieles mehr.

All diese Änderungen blasen WordPress diesmal aber nicht so sehr auf wie die letzten Updates, der RAM Verbrauch von WordPress steigt um gerade mal 0,4MB.

Hier noch der offizielle Release Post und ein kurzes Video mit allen Neuerungen und Features:
https://www.youtube.com/watch?v=http://www.youtube.com/watch?v=oOvUf-1jjyo&hd=1[/embed]

Letztens habe ich über ein auf PHP Arrays basierendes Mehrsprachigkeitssystem bei Webseiten gesprochen.
Einer der Nachteile bei diesem System ist, dass jeglicher Webseiteninhalt in die Seite ge‘

echo

‚t wird. Möchte man jetzt interaktive PHP Inhalte auf die Seite bringen, wird es kompliziert.

Denn durch

echo

ausgegebene Inhalte werden einfach nur wiedergegeben, nicht noch einmal verarbeitet. Das führt dazu, dass durch

echo

ausgegebene PHP Codezeilen einfach ignoriert bzw. auskommentiert (Chrome) werden.

Beispiel:

<?php
$string='Dies <?php echo("ist ein"); ?> Test!'; 
echo($string);
?>

Ausgegeben wird:
Dies Test!

Der PHP Code wurde ignoriert.

Lösung:
Ich habe eine Funktion geschrieben, mit der PHP Code selbst durch ein

echo

noch funktioniert.
Der Funktion wird ein Text übergeben, der sowohl einfach nur ausgegeben werden soll, als auch PHP Code enthält, der ausgeführt werden soll. Die Funktion teilt einfachen Text und PHP Code auf, gibt den Text normal aus und führt den PHP Code aus.

Code

Code anzeigen

<?php
$arr['a']='dies <em>ist <?php echo("ein");?> test</em> und gleich 
<?php 
$test="<b>noch ein"; 
$mark="!!";
echo($test." test".$mark); 
?></b>
<hr />
ja ja, so geht das';

function printcontent($page) {
	if(strpos($page,"<?php")!==false) {
		$temp = split("(<\?php|\?>)",$page);
		for($i = 0; $temp[$i]; $i++) {
			if(strrpos($temp[$i],";")>=strlen($temp[$i])-3) {
				echo(eval($temp[$i]));
			} else { 
				echo($temp[$i]); 
			}
		}
	}
}
?>

<html>
<body>
<?php printcontent($arr['a']); ?>
</body></html>

Usage:

<?php printcontent($string); ?>

Wobei $string eine Zeichenkette ist, die einen

< ?php ... ?>

Part enthält. Wichtig ist, dass ihr tatsächlich mit

< ?php

beginnt, nicht nur

< ?

und dass das

?>

spätestens 3 Zeichen nach dem letzten Semikolon der letzten PHP Zeile kommt. So wird jeder PHP Part erkannt.
Setzt ihr also vor dem abschließendem

?>

5 Absätze oder Leerzeichen schlägt die korrekte Interpretation fehl.

Demo

Demo

Download

echo-php-code [.zip]

Changelog


v1.1: Performance mit schneller strpos() Vorabfrage erhöht. Regex kommt jetzt nur noch zum Einsatz wenn im String überhaupt ein < ?php gefunden wird.

Ziel: Aus einem Batch Script E-Mails verschicken können ohne vorher Programme installieren oder konfigurieren zu müssen.
Extra: 1-Zeiler

Lösung:
Aus dem Script einen PHP Webmailer fernsteuern. Wenn die Ansprüche nicht zu hoch sind ist diese Lösung in 2, 3 Minuten einsatzbereit und absolut ausreichend.
Einzige Voraussetzung ist hierbei natürlich ein PHP fähiger Webserver. Auf den (Windows) Clients sind keine weiteren Anforderungen gegeben.

Voraussetzung: PHP fähiger Webserver für den Mailer und eine Internetverbindung am Client

Scriptbeispiel:

start "iexplore" "http://php.webserver.de/webmailer.php?submitcode4f3d2s1a&contactname=Testserver 110&subject=Backup fehlgeschlagen&email=edv@iqb.hu-berlin.de&message=Das NAS Backup ist fehlgeschlagen&mailto=hannes.schurig@online.de"

PHP Mailer Code:

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

<?php
$sendMailFeedback = "";
 
if (isset($_GET['submitcode44gf902jd284'])) {
 
    if (trim($_GET['contactname']) == '') { 
			$sendMailFeedback = "no contact name"; 
		} else { 
			$name = trim($_GET['contactname']); 
		}
 
    if (trim($_GET['subject']) == '') { 
			$sendMailFeedback = "no subject";
		} else {
      $realsubject = trim($_GET['subject']);
      $subject = 'PHP Mailer: "'.$realsubject.'"'; 
    }
 
    if (trim($_GET['email']) == '')  { 
			$sendMailFeedback = "no email";
		} else if (!preg_match("/[a-z0-9._+-]*@[a-z0-9._+-]+/", trim($_GET['email']))) { 
			$sendMailFeedback = "no valid email"; 
		} else { 
			$email = trim($_GET['email']); 
		}
 
    if (trim($_GET['message']) == '') { 
			$sendMailFeedback = "no message"; 
		} else {
        if (function_exists('stripslashes')) { 
					$comments = stripslashes(trim($_GET['message'])); 
				} else { 
					$comments = trim($_GET['message']); 
				} 
		}
 
    if ($sendMailFeedback=="") {
        $emailTo = $_GET['mailto'];
        $datum = date("d.m.Y",$timestamp);
        $uhrzeit = date("H:i",$timestamp);
        $body = "\n###############\nPHP Mailer\n###############\n\nVersendet am $datum um $uhrzeit Uhr\nAn: $emailTo \nVon: $name \nEmail: $email \nBetreff: $realsubject \n\nText:\n$comments";
        $headers = 'From: PHP Mailer <'.$emailTo.'>' . "\r\n" . 'Reply-To: ' . $email;
 
        mail($emailTo, $subject, $body, $headers);
        $sendMailFeedback = "success";
    }
} else {
	$sendMailFeedback = "submitcode missing or wrong";
}
echo $sendMailFeedback;
?>

Erläuterung:
Das Batch Script startet den Internet Explorer (bzw. den als Standard eingestellten Browser) mit einer URL als Parameter, die dann also aufgerufen wird.
Da der Prozess

iexplore

angesprochen wird sollte es ein Windows PC mit installiertem Internet Explorer sein. Computer ohne IE oder mit anderem OS müssen den Pfad zu einem Browser einsetzen, der URLs per Parameter annimmt und aufruft.

Die URL ruft das PHP Script auf, das ihr vorher auf einen Webserver geparkt habt.
Mein erster Parameter ist so etwas wie ein Passwort. Damit nicht jeder im Web diesen Webmailer einfach so gebrauchen kann wird im PHP Code ganz am Anfang mit

if(isset($_GET['submitcode4f3d2s1a'])) {

überprüft, ob ein bestimmter Parameter gesetzt ist, den am besten nur ihr wisst und auch anpassen solltet. Ohne diesen Key funktioniert der Webmailer nicht, gibt ihn also nur bedingt weiter.
Alle weiteren Parameter sind beliebig anpassbar, müssen natürlich den GET Abfragen der PHP entsprechen.

Diese Variante ist also recht flexibel. Ihr könnt den Mailer beliebig anpassen, abspecken, aufrüsten usw.

Beispielnutzung: automatisierte Server Backup Batch Lösung

Letzte Woche habe ich die Mehrsprachigkeit einer Webseite in PHP mit einigen zusätzlichen Extras und Debuginformationen veröffentlicht. Ich zeige jetzt nochmal eine gekürzte Produktivversion ohne Schnick-schnack und Kommentare.

Code

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

<?php
/*
   ###################
    PHP Multilanguage (minified version)
   ###################
   Desc: This page detects your browserlanguage, cookie or chosen language with PHP and displays the right content.
   Author: Hannes Schurig
   Date: 20.06.2011
   Edited: 20.06.2011 (v1.5)
   based on 1.4 of the long version
   1.5: * Code minified
   1.6: + header(Location) URL correction, no more .php?lang=?? after choosing lang
   URL (min version): http://hannes-schurig.de/21/06/2011/php-mehrsprachigkeitssystem-minified/
   URL (long version): http://hannes-schurig.de/17/06/2011/php-mehrsprachigkeitssystem-mit-einigen-extras/
 */

$lang = detectlang();
function langanalyse($new_lang) {
	switch($new_lang) {
		case ("de"): case ("en"): 
			$lang = $new_lang; 
			setcookie("lang", $lang, time()+31536000); break;
		case ("delete"):
			setcookie("lang", $lang, time()-3600); break;
		default:
			$lang = "de"; 
			setcookie("lang", $lang, time()+31536000); break;
	}
	return $lang;
}
function detectlang() {
	//https Erkennung
	$s = empty($_SERVER["HTTPS"]) ? '' : ($_SERVER["HTTPS"] == "on") ? "s" : "";
	if(isset($_GET["lang"])) { 
		$lang = langanalyse($_GET["lang"]);
		header('Location: http'.$s.'://'.$_SERVER['SERVER_NAME'].$_SERVER['SCRIPT_NAME']); 
	}
	elseif(isset($_COOKIE["lang"])) { $lang = langanalyse($_COOKIE["lang"]); }
	elseif(isset($_POST["lang"])) { 
		$lang = langanalyse($_POST["lang"]);
		header('Location: http'.$s.'://'.$_SERVER['SERVER_NAME'].$_SERVER['SCRIPT_NAME']);
	}
	else {
		$cutstring = explode("-", $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
		$detectlang = $cutstring[0];
		$lang = langanalyse($detectlang);
	}
	return $lang;
}

echo('
<a href="'.$_SERVER['SCRIPT_NAME'].'?lang=de">De</a>  
<a href="'.$_SERVER['SCRIPT_NAME'].'?lang=en">En</a>  
<a href="'.$_SERVER['SCRIPT_NAME'].'?lang=delete">Del</a>
');

// PHP Array mit den eigentlichen Inhalten der erlaubten Sprachen
$content["de"]["text"]="Hallo, dies ist nur ein Test";
$content["en"]["text"]="Hello, this is just a test";
$content["de"]["menu"]="
<ul>
 <li>Autos</li>
 <li>Frauen</li>
 <li>Alkohol</li>
</ul>";
$content["en"]["menu"]="
<ul>
 <li>Sex</li>
 <li>Drugs</li>
 <li>Rock'n'Roll</li>
</ul>";
$content["de"]["info"]="Zu Ihrer Information:<br/>
News 1: bla<br/>
News 2: bla<br/>
Test";
$content["en"]["info"]="For Your Information:<br/>
News 1: Foo<br/>
News 2: Bar<br/>
foobar";

?>
<html>
 <head>
  <title>Mehrsprachigkeit mit PHP, Array und COOKIES</title>
  <style type="text/css">
  div {
    margin: 20px;
	padding: 15px;
	float: left; }
  #langdebug {
    border: 1px solid black;
    font-size: 0.8em; }
  </style>
 </head>
<body>
 
 <div id="menu">
  <? echo($content[$lang]["menu"]); ?>
 </div>
 <div id="text">
  <? echo($content[$lang]["text"]); ?>
 </div>
 <div id="info">
  <? echo($content[$lang]["info"]); ?>
 </div>

</body>
</html>

Der eigentliche Codeteil (ohne Kommentare, Array und Sprachwahllinks) ist also nur noch 20 Zeilen lang aber trotzdem noch gut lesbar.

Demo

Demo Link

Download

min [.zip]

long version: Link