MobileMonday: Drivers of the Mobile Ecosystem

Heute war ein MobileMonday in Berlin über Drivers of the Mobile Ecosystem. Die Veranstaltung schaute auf Trends und Technologien mit dem Potential neue Geschäftsfelder im Mobile-Bereich zu schaffen.

MobileMonday: Drivers of the Mobile EcosystemIch wurde von Intel eingeladen an deren Stand über Intel AppUp, den neuen App-Store für Netbooks und Tablets, zu sprechen.

Deutsche Apps können jetzt ebenfalls veröffentlicht werden

Ab heute akzeptiert Intel auch deutsche Apps im Intel-AppUp-Entwicklerprogramm. Somit werden zur Zeit bereits 4 Sprachen von AppUp unterstützt:

  • Englisch
  • Französisch
  • Deutsch
  • Spanisch

Da ich auch recht viele deutsche Apps habe, werde ich nun damit beginnen diese zu AppUp einzureichen. Natürlich werden die Downloadzahlen der deutschen Apps zu Beginn nicht so toll sein, da Intel zunächst den Store mit Anwendungen füllen muss, bevor sie beginnen können den Store an Endkunden auszuliefern. Aber ich bin ganz zuversichtlich, dass die Downloadzahlen danach auch so gut wie aktuell für das englische System sein werden. ;-)

JBoss-Start dauert sehr lange

In den vergangenen Wochen haben wir mehrere Male Start-Probleme des JBoss’ festgestellt: Entweder er startete überhaupt nicht oder er benötigte sehr (mehr als eine Stunde!) lange.

In den Server-Log-Dateien fanden wir folgende Ausnahmen:

2011-04-19 08:36:09,484 ERROR [de.absoft.portal.core.listener.PortletContextListener] Exception while parsing 'portlet.xml'
org.dom4j.DocumentException: Error on line 573 of document http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd : src-resolve: Cannot resolve the name 'xml:lang' to a(n) 'attribute declaration' component. Nested exception: src-resolve: Cannot resolve the name 'xml:lang' to a(n) 'attribute declaration' component.

Wir haben herausgefunden, dass die Ausnahme geworfen wird, wenn diese Dokument auf der Sun-Webseite – aus welchem und auch immer – nicht erreichbar ist. Zusätzlich kann dieser Fehler auftreten, wenn der JBoss vollständig ohne Internet-Anbidung gestartet wird.

Das größte Problem dabei ist jedoch, dass er, bevor diese Ausnahme geworfen wird, ein Timeout abwartet. Dies führt in diesem Fall zu den extrem langen Startzeiten.

Da es komplett irrsinnig ist, dass der JBoss-Start von einem Sun-Server abhängt, der offensichtlich nicht einmal besonders zuverlässig läuft, suchten wir nach einer Lösung.

Der einzige Grund für dieses Problem war, dass die Validierungsfunktion im Quelltext aktiviert war. Daher mussten wir nur diese Zeilen Quelltext entfernen:

reader.setFeature("http://xml.org/sax/features/validation", true);
reader.setFeature("http://apache.org/xml/features/validation/schema", true);
reader.setFeature("http://apache.org/xml/features/validation/schema-full-checking", true);
reader.setFeature("http://apache.org/xml/features/validation/dynamic", true);

Selbstverständlich ist diese Validierungsfunktion zum Debuggen sicherlich sehr sinnvoll, aber sie sollte definitiv in einer produktiven Umgebung deaktiviert sein.

Haben Sie selbst auch bereits Start-Probleme des JBoss’ aufgrund dieser Funktion beobachten können?

Intel AppUp unterstützt nun auch MeeGo-Apps

Neben Windows-Anwendungen können nun auch MeeGo-Apps zum Intel-AppUp-Entwicklerprogramm eingereicht werden.

Aber was bitte ist eigentlich “MeeGo”?

MeeGo

Ja, auch ich hatte zuvor noch nichts von diesem Betriebssystem behört. Daher schauen wir mal, was uns denn die MeeGo-Seite selbst über dieses System verrät (von mir auf Deutsch übersetzt):

Das MeeGo-Projekt stellt eine Linux-baiserte, open-source Software-Plattform für die nächste Generation von Computern zur Verfügung. Die Software-Plattform ist darauf ausgerichtet den Entwicklern eine möglichst breite Palette von Geräteklassen als Ziel für deren Anwendungen anzubieten. Darunter sind Netbooks, Organizer und Handys, Infotainment-Geräte für Kraftfahrzeuge, Smart-TVs, Tablets und mehr – alle verwenden ein einheitliches Set an APIs basierend auf Qt. Für Endkunden wird MeeGo innovative Anwendungen anbieten, die sie auf beliebigen Geräten verwenden können.

Gut, also grundsätzlich ist MeeGo (noch) eine weitere Plattform für Netbooks, Tablets und andere mobile Endgeräte. Aber Intel puscht diese neue Plattform tatsächlich sehr stark. Wir werden also sehen, wie viel Erfolg sie am Ende haben wird.

Ich werde jedenfalls versuchen zumindest eine meiner Apps auf dieses neue System zu portieren – einfach um zu sehen, wie es funktioniert.

Haben Sie selbst MeeGo mal getestet oder sogar eine App dafür entwickelt?

Gewinner der Vodafone Android Competition

Vor einigen Minuten wurde ich darüber informiert, dass ich einer der Gewinner der Vodafone Android Competition (Englisch) bin! :-)

Vodafone Developer

Meine Android-Anwendung Energiekosten-Schnellrechner wurde als beste Android-App dieser Woche ausgewählt.

Dabei muss ich gestehen, dass mir nicht einmal bewusst war, dass ich bei irgendeinem Wettbewerb teilgenommen habe. Somit war diese E-Mail von Vodafone eine sehr positive Überraschung. ;-)

Ich möchte mich bei Vodafone für den Preis, ein HTC Legend (Android-Smartphone) bedanken:HTC Legend

Europäische Software-Konferenz 2010 in Wien

Dieses Wochenende war ich bei der Europäischen Software-Konferenz (ESWC) in Wien. Das Ziel dieser Konferenz ist es eine gute Möglichkeit zum Informationsaustausch zwischen Softwareentwicklern und Unternehmen sowie Organisationen, die Produkte und Dienstleistung für Softwareentwickler haben, anzubieten.

Europäischen Software-Konferenz (Wien)

Besonders der Erfahrungsaustauch mit andern Entwicklern war super – Ich komme auf jeden Fall auch zur nächsten ESWC in 2011! :-)

Intel AppUp: Neuer App-Store für Netbooks und Tablets

Was ist Intel AppUp?

Intel AppUp

Intel AppUp ist ein App-Store für Netbooks und Tablets. Der Benutzer kann dort Anwendungen direkt herunterladen, installieren und – im Falle von bezahlten Anwendungen – auch kaufen.

Aber warum denkt Intel, dass es mit einem neuen App-Store erfolgreich sein wird?

Natürlich wird es nicht sonderlich viele Leute geben, welche die AppUp Client Software, die für die Benutzung des App-Stores erforderlich ist, von der AppUp-Webseite laden. Aber in Kooperation mit Intels Hardware-Partnern wird der AppUp-Client auf vielen Netbook- sowie Tablet-Geräten bereits vorinstalliert sein. Auf diesem Weg möchte Intel den Client zu möglichst vielen Nutzern bringen.

Aber warum ist das für mich als Entwickler interessant?

Ich suche immer nach einem neuen Vertriebskanal für meine Produkte und da es sehr einfach ist eine Anwendung in den AppUp-Store zu bekommen, teste ich es einfach. ;-)

Mehr darüber und zum Validierungsprozess in einem anderen Post.

Verwendung der Shopping.com-API in PHP

Nach einem Beispiel zur eBay-Finding-API und zur Amazon-Product-Advertising-API in vorangegangenen Beiträgen, möchte ich zum Schluss ein Beispiel zur Shopping.com-API zeigen.

Zunächst müssen Sie sich für einen kostenlose Shopping.com-Entwickler-Account (Englisch) registrieren.

Nun können Sie mit dem Zusammensetzen einer Abfrage-URL beginnen:

http://publisher.api.shopping.com/publisher/3.0/rest/GeneralSearch?
	apiKey=%apikey%&
	trackingId=%trackingid%&
	subTrackingId=%subTrackingId%&
	categoryId=%categoryId%&
	keyword=%keyword%&
	pageNumber=%pageNumber%&
	numItems=%numItems%&
	hybridSortType=%hybridSortType%
	hybridSortOrder=%hybridSortOrder%

Hier ist eine Erklärung zu den jeweiligen Parametern:

  • GeneralSearch: Wir benötigen die Operation GeneralSearch (Englisch) für unsere Schlüsselwort-Suche.
  • apiKey: Diesen API-Schlüssel erhalten Sie in Ihrem Shopping.com-Entwickler-Account.
  • trackingId: Sie müssen eine Tracking-ID von Shopping.com anfordern, um Geld mit Ihrem Traffic zu verdienen.
  • subTrackingId: Wählen Sie hier irgendeinen zusätzlichen Code, den Sie für ein optionales Tracking (z. B. für eine spezielle Kampagne) verwenden möchten.
  • categoryId: Die Kategorie, in der Sie suchen möchten (leer lassen, um in sämtlichen Kategorien zu suchen).
  • keyword: Ihre Suchbegriffe. Stellen Sie sicher, dass Sie utf8_decode verwenden, wenn die Suchbegriffe in UTF-8 vorliegen.
  • pageNumber: Für die erste Abfrage setzen Sie dies auf 1 und erhöhen es in weiteren Abfragen, wenn Sie mehr Artikel benötigen.
  • numItems: Hier können Sie festlegen, wie viele Artikel (maximal 100) je Abfrage zurückgegeben werden.
  • hybridSortType: Wählen Sie, ob die Ergebnisse nach Relevanz (relevance) oder nach dem Preis (price) sortiert sein sollen.
  • hybridSortOrder: Wählen Sie, ob die Ergebnisse aufsteigend (ascending) oder absteigend (descending) sortiert sein sollen.

Das war’s: wir müssen nun nur die URL wieder der kleinen Funktion, die wir bereits für die Abfrage bei der eBay-Finding-API und der Amazon-Product-Advertising-API verwendet haben, übergeben und die XML-Dokument-Antwort der API auswerten:

/**
 * Gibt das SimpleXML-Objekt zurück.
 *
 * @param string $url Die URL, von der das XML-Dokument abgefragt werden soll.
 * @return string Das SimpleXML-Objekt.
 *
 */
function getXml($url) {
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_HEADER, false);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_TIMEOUT, 3);
	$result = curl_exec($ch);
	curl_close($ch);

	return simplexml_load_string($result);
}

Wie Sie sehen können, ist die Shopping.com-API sehr einfach und leicht zu handhaben, nachdem Sie auch die kleinste der drei APIs ist.

Haben Sie die Shopping.com-API selbst schon einmal verwendet?
Kennen Sie andere interessante Online-Shopping-APIs?

Verwendung der Amazon-Product-Advertising-API in PHP

Nachdem ich mit einem Beispiel zur eBay-Finding-API in einem vorangegangenen Beitrag begonnen habe, möchte ich nun mit der Amazon-Product-Advertising-API fortfahren.

Wieder müssen wir mit der Registrierung für einen kostenlosen Amazon-Web-Services-Account. Um Geld mit Ihrem Amazon-Traffic zu verdienen, müssen Sie sich zusätzlich beim Amazon-Partnernetze beginnen.

Nun können wir mit dem Zusammensetzen einer Abfrage-URL für die Amazon-Product-Advertising-API beginnen:

http://ecs.amazonaws.de/onca/xml?
	AWSAccessKeyId=%awsAccessKeyId%&
	AssociateTag=%associateTag%&
	ItemPage=%itemPage%&
	Keywords=%keywords%&
	Operation=%operation%&
	ResponseGroup=%responseGroup%&
	SearchIndex=%categoryId%&
	Service=AWSECommerceService&
	Timestamp=%timestamp%&
	Signature=%signature%

Hier ist eine Erklärung zu den jeweiligen Parametern:

  • ecs.amazonaws.de: Je nachdem, welches Land Sie verwenden möchten, müssen Sie einen bestimmten Endpunkt (Englisch) verwenden. Für Deutschland ist es ecs.amazonaws.de.
  • AWSAccessKeyId: Diesen Zugriffsschlüssel erhalten Sie in Ihrem Amazon-Web-Services-Account.
  • ItemPage: Für die erste Abfrage setzen Sie dies auf 1 und erhöhen es in weiteren Abfragen, wenn Sie mehr Artikel benötigen. Jede Antwort enthält bis zu 10 Artikel (dies kann nicht geändert werden).
  • Keywords: Ihre Suchbegriffe. Stellen Sie sicher, dass Sie hier rawurlencode verwenden.
  • Operation: Der Name der Operation der Amazon-Product-Advertising-API, die Sie aufrufen möchten. Für die Schlüsselwort-Suche nehmen wir ItemSearch (Englisch).
  • ResponseGroup: Je nachdem wie detailliert Sie die Antwort benötigen, können Sie eine sinnvolle Antwortgruppe (Englisch). I verwende meistens Medium für Artikelsuchen.
  • SearchIndex: Ein Such-Index (Englisch) ist eine Art oberste Kategorie. Wenn Sie in allem suchen möchten, wählen Sie einfach All.
  • Service: Verwenden Sie hier einfach AWSECommerceService.
  • Timestamp:Zeitstempel, der in PHP wie folgt generiertert wird:
    rawurlencode(gmdate('Y-m-d\TH:i:s\Z'))
  • Signature: Das ist der witzigste Teil: Bitte lesen Sie unten, wie Sie diese Signatur generieren können.

Um eine gültige API-Anfrage senden zu können, müssen Sie die Signatur wie folgt berechnen:

$request = "GET\necs.amazonaws.de\n/onca/xml\n";
$request .= "AWSAccessKeyId=%awsAccessKeyId%&AssociateTag=%associateTag%&ItemPage=%itemPage%&Keywords=%keywords%&Operation=%operation%&ResponseGroup=%responseGroup%&SearchIndex=%categoryId%&Service=AWSECommerceService&Timestamp=%timestamp%";
$signature = rawurlencode(base64_encode(hash_hmac('sha256', $request, %secretKey%, true)));

Den benötigten %secretKey% erhalten Sie auch in Ihrem Amazon-Web-Services-Account.

Wenn Sie alles richtig umgesetzt haben, können Sie die erzeugte URL dieser Funktion, die wir bereits für die Abfrage bei der eBay-Finding-API verwendet haben, übergeben und die XML-Dokument-Antwort der API auswerten:

/**
 * Gibt das SimpleXML-Objekt zurück.
 *
 * @param string $url Die URL, von der das XML-Dokument abgefragt werden soll.
 * @return string Das SimpleXML-Objekt.
 *
 */
function getXml($url) {
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_HEADER, false);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_TIMEOUT, 3);
	$result = curl_exec($ch);
	curl_close($ch);

	return simplexml_load_string($result);
}

Leider muss ich sagen, dass ich die Amazon-Product-Advertising-API für sehr verwirrend und schlecht dokumentiert halte. Besonders, wenn Sie mit diesen Such-Indizes und Kategorien (sogenannten nodes) arbeiten müssen, macht das alles andere als Spaß. Und es gibt nicht nur Sachen, die in der Amazon-Product-Advertising-API-Dokumentation schlecht, sondern schlichtweg auch falsch dokumentiert sind.

Was ist Ihre Meinung zu der Amazon-Product-Advertising-API?

Verwendung der eBay-Finding-API in PHP

Für ein Kundenprojekt musste eine Webseite an die eBay-Finding-API angebunden werden, um eBay-Artikel innerhalb der Webseite anzeigen zu können.

Im Folgenden beschreibe ich wie eBay-Artikel auf Basis einer schlüsselwort-basierten Suche von der eBay-Finding-API bezogen werden können.

Zunächst müssen Sie sich beim kostenlosen eBay-Entwicklerprogramm (Englisch) anmelden, um Ihre Anwendungs-ID zu erhalten. Wenn Sie zusätzlich Geld mit Ihrem eBay-Traffic verdienen möchten – und wahrscheinlich ist das der Grund weswegen Sie eBay-Artikel auf Ihrer Webseite anzeigen möchten ;-) –, müssen Sie sich zudem noch beim eBay-Partnernetzwerke anmelden.

Nachdem Sie sich beim eBay-Entwicklerprogramm und -Partnernetzwerk registriert haben, können Sie folgende URL verwenden, um eBay-Artikel abzufragen:

http://svcs.ebay.com/services/search/FindingService/v1?
	OPERATION-NAME=%operationName%&
	SERVICE-VERSION=%serviceVersion%&
	GLOBAL-ID=%globalId%&
	SECURITY-APPNAME=%appId%&
	RESPONSE-DATA-FORMAT=%responseDataFormat%&
	REST-PAYLOAD&
	affiliate.networkId=%networkId%&
	affiliate.trackingId=%trackingId%&
	affiliate.customId=%customId%&
	paginationInput.entriesPerPage=%entriesPerPage%&
	paginationInput.pageNumber=%pageNumber%&
	keywords=%keywords%

Hier ist eine Erklärung zu den jeweiligen Parametern:

  • OPERATION-NAME: Der Name der Operation der eBay-Finding-API, die Sie aufrufen möchten. Für die Schlüsselwort-Suche nehmen wir findItemsByKeywords (Englisch).
  • SERVICE-VERSION: Die API-Version, die Sie verwenden (zurzeit ist 1.0.0 aktuell).
  • GLOBAL-ID: Hier müssen Sie die gewünschte ID der eBay-Seite (Englisch) angeben.
  • SECURITY-APPNAME: Die Anwendungs-ID, die Sie von der eBay-Entwicklerprogramm-Webseite erhalten haben.
  • RESPONSE-DATA-FORMAT: Hier können Sie festlegen, wie die Daten zurückgegeben werden sollen. Ich verwende XML, aber Sie können auch JSON oder NV (Name-Wert-Paare) wählen.
  • REST-PAYLOAD: Senden Sie dies einfach ohne Wert nach den obigen Standard-Headern.
  • affiliate.networkId: Diese ID erhalten Sie vom eBay-Partnernetzwerk.
  • affiliate.trackingId: Diese ID erhalten Sie vom eBay-Partnernetzwerk.
  • affiliate.customId: Wählen Sie hier irgendeinen zusätzlichen Code, den Sie für ein optionales Tracking (z. B. für eine spezielle Kampagne) verwenden möchten.
  • paginationInput.entriesPerPage: Hier können Sie festlegen, wie viele Artikel (maximal 100) je Abfrage zurückgegeben werden.
  • paginationInput.pageNumber: Für die erste Abfrage setzen Sie dies auf 1 und erhöhen es in weiteren Abfragen, wenn Sie mehr Artikel benötigen.
  • keywords: Zu guter Letzt können Sie hier die Suchbegriffe übergeben. Stellen Sie sicher, dass Sie utf8_decode verwenden, wenn die Suchbegriffe in UTF-8 vorliegen.

Zum Schluss müssen wir nur noch die XML-Daten abfragen. Hierfür verwende ich eine einfache Funkton, um die Daten von der URL zu erhalten und das XML-Dokument zu laden:

/**
 * Gibt das SimpleXML-Objekt zurück.
 *
 * @param string $url Die URL, von der das XML-Dokument abgefragt werden soll.
 * @return string Das SimpleXML-Objekt.
 *
 */
function getXml($url) {
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_HEADER, false);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_TIMEOUT, 3);
	$result = curl_exec($ch);
	curl_close($ch);

	return simplexml_load_string($result);
}

Natürlich gibt es sehr viel mehr was man mit den eBay-APIs tun kann. Beispielsweise benötigte ich auch eine Artikel-Abfrage basierend auf Kategorien sowie die meist beobachteten Artikel. Das ist auch ziemlich einfach. Falls Sie noch mehr benötigen, können Sie auch den gesamten Kauf-Prozess direkt über die eBay-APIs abwickeln: Dadurch muss der Benutzer Ihrer Seite gar nicht verlassen, um einen Artikel zu erwerben.

Zum Schluss möchte ich sagen, dass die eBay-APIs zwar sehr umfangreich und komplex, jedoch durchaus auch gut dokumentiert sind. Es gibt sehr viel schlechtere Beispiele von API (siehe hierzu auch meinen Beitrag zu der Amazon-Product-Advertising-API).

Haben Sie die eBay-APIs selbst schon einmal verwendet?