Europäische Software-Konferenz 2011: Vortrag über das Intel AppUp Entwicklerprogramm

Dieses Wochenende fand die jährliche Europäische Software-Konferenz (ESWC) in London (Großbritannien) statt.

Ich habe dort einen Vortrag über das “Intel AppUp Entwicklerprogramm: Der neue App-Store für Netbooks und Tablets” gehalten und die Möglichkeiten für Entwickler, die ihre Produkte im AppUp Entwcklerprogramm veröffentlichen, erläutert. An einem kurzen Beispiel habe ich aufgezeigt, wie ein bestehendes Programm für die Veröffentlichung im Intel AppUp App-Store vorbereitet werden kann. Downloaden Sie die PowerPoint-Präsentation (Englisch).

Europäische Software-Konferenz 2011: Intel AppUp

Waren Sie dieses Jahr auch bei der Europäischen Software-Konferenz?

RemotingException bei Verwendung von IPC mit .NET

In einem Projekt verwende ich IPC (Inter Process Communication) zur gemeinsamen Benutzung von Objekten eines Windows-Dienstes mit einer Client-Anwendung.

Das funktioniert stets problemlos, wenn die Client-Anwendung das erste Mal startete und die Objekte des Windows-Dienste aufrief. Aber nachdem die Client-Anwendung einige Minuten später neu gestartet wurde (ohne den Dienst neu zu starten), kam es zu einer RemotingException mit dieser seltsamen Fehlermeldung:

Fehler beim Schreiben auf einen IPC-Port. Die Pipe wird gerade geschlossen.

Es hat eine ganze Weile gedauert bis ich das Problem gefunden habe:
Da es für meinen Dienst sehr wichtig ist wirklich nur eine Instanz des Remote-Objektes für die gesamte Lebensdauer des Dienstes zu haben, verwendete ich RemotingServices.Marshal, um ein zuvor instanziiertes Objekt zu registrieren. Jedoch wusste ich nicht, dass bei der Registrierung mit dieser Methode die Objekte standardmäßig nur eine sehr kurze Zeit (eine Minute) gültig bleiben.

Um das zu korrigieren, muss die Methode MarshalByRefObject.InitializeLifetimeService innerhalb des Remote-Server-Objektes wie folgt überschrieben werden:

public override Object InitializeLifetimeService()
{
	ILease lease = (ILease)base.InitializeLifetimeService();
	if (lease.CurrentState == LeaseState.Initial)
	{
		lease.InitialLeaseTime = TimeSpan.FromDays(365);
		lease.SponsorshipTimeout = TimeSpan.FromDays(365);
		lease.RenewOnCallTime = TimeSpan.FromDays(365);
	}
	return lease;
}

Und hier dasselbe für Entwickler mit VB .NET:

Public Overrides Function InitializeLifetimeService() As Object
	Dim lease As ILease = CType(MyBase.InitializeLifetimeService(), ILease)
	If lease.CurrentState = LeaseState.Initial Then
		lease.InitialLeaseTime = TimeSpan.FromDays(365)
		lease.SponsorshipTimeout = TimeSpan.FromDays(365)
		lease.RenewOnCallTime = TimeSpan.FromDays(365)
	End If
	Return lease
End Function

OK, 365 Tage sind vielleicht etwas übertrieben, aber so können Sie sicher sein, dass Ihre Remote-Objekte so schnell nicht verfallen werden. ;-)

Haben Sie diese Problem selbst auch schon einmal gehabt?

Flaggen-Widget als einfach zu verwendendes WordPress Plug-In

Vor einigen Minuten habe ich mein zweites WordPress-Plug-In veröffentlicht: Ein einfaches Plug-In, das Flaggen-Icons anzeigt, die zu anderen Sprachversionen Ihres Blogs verlinken.

Dieses Plug-In fasst mein Widget zur Anzeige von Flaggen zur Sprachauswahl im Menü und in der Fußzeile mit vielen zusätzlichen Optionen und Einstellungsmöglichkeiten in ein sauberes WordPress-Plug-In zusammen.

Die Installation und Konfiguration ist sehr einfach. Probieren Sie es aus schreiben Sie mir Ihre Meinung!

Visual Studio Formular-Designer mit von abstrakten Klassen abgeleiteten Formularen verwenden

Für ein aktuelles Projekt wollte ich eine abstrakte Formular-Basisklasse erstellen. Dadurch kann einiges an allgemeiner Funktionalität von allen Formularen geerbt und Schnittstellenmethoden können definiert werden.

Das Ergebnis war jedoch folgende Fehlermeldung, sobald ich versuchte eine meiner abgeleiteten Formularklassen in dem Formular-Designer des Visual Studios zu öffnen:

Der Designer kann keine Instanz des Typs <Typname> erstellen, da dieser als abstrakt deklariert ist.

Daraufhin suchte ich eine Lösung im Internet und es scheint als wäre ich nicht der Einzige, der die Idee hatte einige Formularklassen von einer abstrakten Basisklasse abzuleiten. Um das Problem zu lösen, erstellte ich eine Dummy-Implementierung von meiner abstrakten Basisklasse und leitete die Formularklassen von dieser Dummy-Implementierung ab. Dadurch konnten die Formularklassen wieder im Visual Studio Formular-Designer angezeigt werden.

In C# sehen die Klassen nun so aus:

public abstract partial class BaseForm : Form
{
  // Methoden der abstrakten Basisklasse...
}

#if DEBUG
public class BaseFormImpl : BaseForm
{
  // Dummy-Implementierung der abstrakten BaseForm-Klasse.
}
#endif

#if DEBUG
public partial class RealForm : BaseFormImpl
#else
public partial class RealForm : BaseForm
#endif
{
  // Eins der Formular, das das Basis-Formular erweitert.
}

Und für Entwickler mit VB .NET sieht es so aus:

Public MustInherit Partial Class BaseForm
  Inherits Form
  ' Methoden der abstrakten Basisklasse...
End Class

#if DEBUG
Public Class BaseFormImpl
  Inherits BaseForm
  ' Dummy-Implementierung der abstrakten BaseForm-Klasse.
End Class
#endif

Public Partial Class RealForm
#if DEBUG
  Inherits BaseFormImpl
#else
  Inherits BaseForm
#endif
  ' Eins der Formular, das das Basis-Formular erweitert.
End Class

Nun sind Ihnen sicherlich die Compiler-Anweisungen aufgefallen: Natürlich wären diese nicht erforderlich, damit die Formulare wieder korrekt im Formular-Designer funktionieren. Jedoch mag ich keinen unnötigen Quelltext im veröffentlichten Produkt (und diese Dummy-Implementierung der abstrakten BaseForm-Klasse ist wirklich nutzlos). Daher habe ich diese bedingten Compiler-Anweisungen verwendet, um sicherzustellen, dass diese Dummy-Klasse wirklich nur im Debug-Modus verwendet wird.

Sind Sie selbst auch bereits einmal auf dieses Problem gestoßen?

IDF 2011: Podiumsdiskussion über Anwendungsentwicklung für verschiedene Geräte

Heute war ich eingeladen an der Podiumsdiskussion “Apps Across the Compute Continuum: Developing Apps for Multiple Devices” bei dem Intel Developer Forum (IDF) (Englisch) in San Francisco teilzunehmen.

IDF 2011 Podiumsdiscussion

Es hat mich sehr gefreut zusammen mit anderen Intel Black Belts wie Chris Skaggs (Soma Games), Lee Bamber und Rick Vanner (The Game Creators) und Suresh Kumar (Blue Innovations) sowie Bob Duffy (Intel AppUp Community Manager und Moderator dieser Podiumsdiskussion) über die Vor- und Nachteile, aber auch über die Herausforderungen der Anwendungsentwicklung für verschiedene Geräte und Plattformen, diskutieren zu dürfen.

Waren Sie auch bei der IDF 2011?

Die wichtigsten Social Widgets als einfach zu verwendendes WordPress Plug-In

Vor einigen Minuten habe ich mein erster WordPress-Plug-In veröffentlicht: Es zeigt die wichtigsten Social Widgets von Facebook, Twitter und Google+ unterhalb Ihren Artikeln an.

Nun stellt sich die Frage:
Warum noch ein weiteres Social-Widgets-Plug-In, zumal es hier bereits jede Menge gibt?

Die Antwort ist, dass ich nach einem einfachen und leicht zu verwendenten Plug-In gesucht habe und alle Plug-Ins, die ich fand, waren schlicht und ergreifend zu kompliziert: Ich wollte keine unzähligen unterstützen, sozialen Netzwerke mit hunderten an Optionen – einfach ein simples Plug-In, welches die wichtigsten Social Widgets abdeckt, ohne dass hierbei eine Konfiguration erforderlich ist!

Und genau das ist mein neues Plug-In:
Installieren Sie es, aktivieren Sie es und die Social Widgets werden sofort unter Ihren Artikeln angezeigt – ganz ohne Konfiguration.

Welches Social-Widgets-Plug-In verwenden Sie?

Neue Artikel in WordPress mit Veröffentlichungsdatum durch XML-RPC und PHP erstellen

Um neue Artikel zu einem WordPress-Blog hinzufügen zu können, wollte ich die XML-RPC-Schnittstelle mittels PHP verwenden.

Zunächst muss hierfür das Kontrollkästchen “Die WordPress, Movable Type, MetaWeblog und Blogger XML-RPC Schnittstelle aktivieren.” im Menü “Einstellungen”/”Schreiben” aktiviert werden.

Nun suchte ich nach einer direkt verwendbaren Lösung im Internet, da ich sicherlich nicht der Erste war, der Ähnliches bewerkstelligen wollte. Wie erwartet gab es auch eine ganze Reihe von PHP-Skripten, die genau das taten, jedoch mit einem Problem:
Ich wollte auch das Veröffentlichungsdatum manuell mit dem PHP-Aufruf setzen und die meisten Skripte, die ich gefunden hatte, versuchten nicht einmal das zu tun.

Wenige Skripte versuchten zwar das Veröffentlichungsdatum zu setzen, aber das Ergebnis war eine Fehlermeldung ähnlich dieser:
Fatal error: Call to a member function getIso() on a non-object in /var/www/wp-includes/class-wp-xmlrpc-server.php on line 2373

Nachdem ich einige Dokumente über dieses seltsame ISO-8601-Datumsformat gelesen hatte, fand ich selbst eine Lösung:

/**
 * Führt einen XML-RPC zu einem WordPress-Blog aus und fügt einen Artikel hinzu.
 *
 * @param string $title Titel des neuen Artikels.
 * @param string $body Inhaltstext des neuen Artikels.
 * @param string $rpcurl RPC-URL des Blogs (meist xmlrpc.php im Stammverzeichnis).
 * @param string $username Benutzername, der zum Hinzufügen des neuen Artikels verwendet wird.
 * @param string $password Passwort, das zum Hinzufügen des neuen Artikels verwendet wird.
 * @param string $categories Komma-getrennte Liste von Kategorien (stellen Sie sicher, dass diese in Ihrem Blog bereits existieren).
 * @param string $keywords Komma-getrennte Liste von Schlüssel-/Schlagwörtern (im Gegensatz zu den Kategorien müssen diese noch nicht existieren).
 * @param string $pubdate Veröffentlichungsdatum in ISO 8601 (mittels date('c') in PHP; aktuelle Zeit wird verwendet, wenn leer).
 * @param string $draftonly True, um nur als Entwurf abzuspeichern, False um es direkt zu veröffentlichen (Standard).
 * @return string Das Ergebnis des XML-RPC.
 */
function wpPostXMLRPC($title, $body, $rpcurl, $username, $password, $categories, $keywords = '', $pubdate = '', $draftonly = false) {
	$content = array(
		'title' => $title,
		'description' => $body,
		'mt_allow_comments' => 1,
		'mt_allow_pings' => 1,
		'post_type' => 'post',
		'date_created_gmt' => '%pubdate%', // Nur als Platzhalter hier.
		'mt_keywords' => $keywords,
		'categories' => array($categories)
	);
	$params = array(0, $username, $password, $content, !$draftonly);

	$request = xmlrpc_encode_request('metaWeblog.newPost', $params);
	// Nun müssen wir das eigentliche Veröffentlichungsdatum setzen:
	$request = str_replace('<string>%pubdate%</string>',
			       '<dateTime.iso8601>' . $pubdate . '</dateTime.iso8601>',
			       $request);

	$ch = curl_init();
	curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
	curl_setopt($ch, CURLOPT_URL, $rpcurl);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_TIMEOUT, 1);
	$results = curl_exec($ch);
	curl_close($ch);
	return $results;
}

Wie Sie sehen können, habe ich die für das korrekte ISO-8601-Datumsformat benötigte Datenstruktur einfach direkt selbst in den XML-Aufruf eingefügt. Das mag vielleicht nicht die eleganteste Lösung sein, sie funktioniert jedoch einwandfrei. ;-)

Sind Sie selbst auch bereits auf dieses Problem gestoßen?

Die Lösung für mehrsprachige Blogs mit WordPress

Nachdem ich verschiedene Möglichkeiten für mehrsprachige Blogs mit WordPress getestet habe (siehe diesen Artikel), machte Dennis Ploetner mich in einem Kommentar auf sein zwar noch recht unbekanntes, jedoch ganz hervorragendes Plug-In aufwerksam.

Der Multisite Language Switcher erlaubt Ihnen einfach eine WordPress-Multisite-Konfiguration mit einer WordPress-Administration für jede Blogsprache zu nutzen und trotzdem eine Beziehung zwischen den Sprachversionen Ihrer Artikel, Kategorien und Schlagwörter zu erhalten.

Das ist hervorragend, denn dadurch gibt es das Problem der anderen Übersetzungs-Plug-Ins nicht mehr, dass Sie immer darauf achten mussten, dass jedes zusätzlich verwendete Plug-In (wie ein spezielles SEO-Plug-In) auch das verwendete Übersetzungs-Plug-In unterstützt. Ansonsten konnte man beispielsweise keine Übersetzung für den Seitentitel oder die Beschreibung einfügen, was SEO-technisch jedoch wichtig ist.

Aber das ist mit diesem Plug-In kein Problem: Da es nur von der standardmäßigen und offiziellen Funktionalität einer WordPress-Multisite-Konfiguration abhängt, können Sie jedes beliebige Plug-In verwenden, dass die WordPress-Multisite-Funktionalität unterstützt.

Nun könnte man sagen, dass es unpraktisch ist, dass man sich in einen anderen WordPress-Adminbereich einloggen muss, um eine Übersetzung zu verändern. Aber mit der aktuellen Version des Plug-Ins wird jede Übersetzung direkt im Admin-Bereich verlinkt (einfach auf die Sprachflagge klicken). Somit ist es sehr einfach zwischen den verschiedenen Übersetzungen im Editiermodus zu wechseln.

Selbstverständlich können Sie dieses Plug-In hier in Aktion sehen:
Es kann unter jedem Artikel einen Link zu dessen Übersetzungen hinzufügen. Zusätzlich sind die auf den Blog-Seiten angezeigten Flaggen auch direkt mit den Übersetzungen der aktuellen Seite verlinkt.

Im Ergebnis kann ich nur jedem, der nach einer Lösung für einen mehrsprachigen Blog mit WordPress sucht, empfehlen dieses Plug-In zu testen.

Kennen Sie noch andere gute Lösungen für mehrsprachige Blogs mit WordPress?

FAQ zu Code-Signing-Zertifikaten und digitaler Signatur

Im Folgenden werden ich einige häufig gestellte Fragen zu Code-Signing-Zertifikaten und zur digitaler Signatur beantworten.

Wie lange ist ein Code-Signing-Zertifikat gültig?

Normalerweise ein Jahr, aber es ist auch möglich Code-Signing-Zertifikaten mit einer Laufzeit von bis zu 5 Jahren zu bestellen.

Ist es erforderlich Apps oder Dateien, nachdem das Code-Signing-Zertifikaten ausgelaufen ist, erneut zu signieren?

Nein, da zusammen mit Ihrer digitalen Signatur ein Zeitstempel einbezogen wird und somit die Signatur der App oder der Datei nie ausläuft – selbst dann nicht, wenn Ihr Zertifikat selbst bereits ausgelaufen ist.

Muss ich eine App erneut bei Intel AppUp einreichen, nachdem das Code-Signing-Zertifikaten ausgelaufen ist?

Nachdem die Signatur der App selbst niemals ausläuft (siehe oben), ist dies nicht erforderlich. Lediglich, wenn Sie ein Update veröffentlichen möchten, müssen Sie die App erneut signieren und danach wieder einreichen.

Wie viele Apps oder Dateien kann ich mit einem Code-Signing-Zertifikat signieren?

Hier gibt es keine Begrenzung: Sie können eine beliebige Anzahl an Apps oder Dateien mit nur einem Code-Signing-Zertifikat signieren.

Welche Unterlagen werden zum Beantragen eines Code-Signing-Zertifikats benötigt?

Je nachdem ob Sie das Code-Signing-Zertifikat als Einzelperson oder als Unternehmen beantragen, benötigen Sie möglicherweise eine Gewerbeanmeldung oder einen Handelsregisterauszug. Sie sollten auch darauf gefasst sein, dass Sie nach einer Kopie Ihrer Telefonrechnung gefragt werden. Daraufhin wird Sie dann jemand anrufen, um sicherzustellen, dass die auf der Rechnung angegebene Telefonnummer gültig ist.

Woher bekomme ich ein Zertifikat und wie signiere ich Dateien?

Haben Sie weitere Fragen?
Hinterlassen Sie einfach einen Kommentar und ich gebe mein Bestes, um sie zu beantworten. ;-)

Deutsche Übersetzung für MailPress Plug-In

Nachdem ich das MailPress plug-in einsetze, um das Abonnement des Blogs sowie von Kommentaren zu unterstützen, benötigte ich davon eine deutsche Übersetzung. Leider war die einzig verfügbare deutsche Übersetzung dieses Plug-Ins völlig veraltet. Daher entschloss ich mich selbst eine zu erstellen.

Download Sie hier die deutsche Übersetzungsdatei:

Einfach die Übersetzungsdateien in das Verzeichnis /mailpress/mp-content/languages/ entpacken.

Falls Sie Fehler finden, bitte unten posten!