App-Programmierung für iOS und Android mit ReactNative

Einmal JavaScript-Code schreiben und Apps mit nativen Elementen für iOS und Android erhalten. Mit Facebook’s ReactNative können Software-Entwickler, die Erfahrungen mit nativer App-Programmierung haben, zügig eine einfache App für die aktuellen Hauptplattformen entwickeln und in den Apple App-Store sowie GooglePlay Store bringen.

Was ist ReactNative?

Mit ReactNative lassen sich iOS- und Android-Apps programmieren, die native Elemente verwenden und sich somit nicht von nativ programmierten Apps unterscheiden. Der Code wird nur einmal geschrieben, das Ergebnis ist eine App für iOS-Geräte und eine App für Android-Geräte.

ReactNative ist somit in keiner Weise mit Cordova oder ähnlichen Javascript-Frameworks vergleichbar, da diese lediglich Websites in einem Container sind. Native iOS- oder Android-Elemente kommen eigentlich nicht vor.

Bei ReactNative ist das anders. Das Framework von Facebook benutzt JavaScript und React, um native Elemente miteinander zu verbinden. Geschrieben wird der Code in JSX, einer Erweiterung basierend auf JavaScript und direkt in JavaScript. Hierbei wird die JavaScript-Syntax nach der ECMAScript-6-Norm verwendet. ReactNative-Apps laufen auf Geräten ab iOS 8 und Android 4.1.

Render-Funktion des Frameworks ReactNative zur App-Programmierung
Render-Funktion ReactNative

Im Beispiel sieht man die Render-Funktion einer klassischen ReactNative-Component. Zurückgegeben wird eine gestylte „View“, die als Subview ein „Text“-Element beinhaltet. Das „Text“-Element enthält einen Text und die Variable „name“, die von außen gesetzt wird.

Wie auch „View“ hat „Text“ die Property „style“. Mit „style“ lassen sich UI-Elemente Gestalten und Positionen. Das Naming ist ähnlich zu CSS. Will man Elemente in Abhängigkeit zu anderen Elementen positionieren, benutzt man flex, flex-direction und Ähnliches.

Benutzt man wie im Beispiel den Tag „Text“, wird im Hintergrund eine UILabel (iOS) bzw. eine TextView (Android) genutzt. Der „View“-Tag wird zu UIView bzw. zu einer nativen (Android-)View. Viele dieser Elemente oder auch Components genannt, liefert ReactNative standardmäßig und können ohne zusätzliche Installationen benutzt werden. Oftmals findet man in der npm-Library Erweiterungen zu bestehenden Components oder auch ganz neue, praktische Components. Möchte man eine native Component in ReactNative, die noch nicht verfügbar ist oder bestehenden nativen Code nutzen, muss man zuerst ein natives Bridging-Modul erstellen. Hierfür wird aber erweitertes Wissen in nativer App-Entwicklung für die jeweilige Plattform vorausgesetzt.

Was sind die Voraussetzungen für die App-Programmierung ReactNative?

Will man „nur“ Apps programmieren und sich nicht um das Drumherum (Veröffentlichung, Testphasen, etc.) kümmern, sollte man ein solides Wissen rund um JavaScript und das grundlegende Verständnis für den Aufbau einer App (ViewController, Daten-Handling, etc.) mitbringen.

Außerdem sollte man wissen, wie man mit dem Terminal umgeht, da ein großer Anteil bei der Einrichtung eines Projekts über die Console getätigt wird.

Gehen die Anforderungen über das Programmieren hinaus, sind vor allem auf iOS-Seite Erfahrungen rund um Zertifikate, Provisioning-Profiles und iTunesConnect erforderlich, da es sonst an der Veröffentlichung der App scheitern wird. Mit Android geht es vergleichsweise einfach, da es hierbei mit einigen Terminal-Eingaben und einem Google-Account oftmals getan ist.

Wann macht ReactNative Sinn?

Eine pauschale Antwort auf diese Frage gibt es nicht.

Beherrscht man zum Beispiel die native App-Programmierung für Android und kennt sich mit iOS weniger aus, macht eine ReactNative-App vielleicht mehr Sinn, als sich Swift oder Objective-C beizubringen. Das selbe gilt natürlich auch andersrum. Ist diese App allerdings so umfangreich, dass man nur wenige Codezeilen gemeinsam verwenden kann und somit viel mit Bridging-Modulen arbeiten muss, ist die native Programmierung empfehlenswerter.

Starten sollte man aber auf jeden Fall mit einer „kleineren“ App, um ein Gespür dafür zu bekommen, wo die Grenzen von ReactNative sind. Je umfangreicher die App, desto mehr Probleme können auftreten. Gerade bei vielen Daten oder beim Thema Sicherheit muss man sich bewusst sein, dass ReactNative  – Stand Frühjahr 2017 – standardmäßig kein komfortables Datenhandling (Datenbank, Zugriff auf der Platte, etc.) und keinen Zugriff auf den iOS-Keychain mitliefert.

Wie starte ich am besten?

Die aktuell wichtigste Seite im Internet zum Thema ReactNative ist https://facebook.github.io/react-native/.

Wer noch keine Erfahrung mit ReactNative gemacht hat, sollte sich zuerst eines der vielen Tutorials im Internet anschauen und sich mit den Components, deren Life-Circle, State-Changes und Imports vertraut machen, bevor man mit dem eigentlichen Projekt beginnt. Es macht auch immer Sinn, kleinere Testprojekte anzulegen, um zum Beispiel ein neues Modul oder eine externe Library zu testen. Verzichten sollte man auch nicht auf ein Versionsverwaltungstool.

Da ReactNative ein relativ junges Framework ist, kann man davon ausgehen, dass noch viel passieren wird. Man sollte sich aber auch bewusst sein, dass hinter dieser Technologie Facebook steht.

_____

Quellen:

https://facebook.github.io/react-native/

http://blog.teamtreehouse.com/introduction-to-react-native

Automatische Inkrementierung der Bundle Version in Xcode 4

Apple fordert in seinen Guidelines für die Entwicklung von Apps für IPhone, iPad wie auch Mac OSX eine stete Inkrementierung der Versionsnummer wenn eine App im AppStore aktualisiert werden soll. Aber auch für die Entwicklung kann eine fortlaufende Nummer hilfreich sein. Gerade wenn man die App an Beta Tester via adHoc Distribution herausgibt. So lässt sich immer nachvollziehen, welche Entwicklungsversion beim Tester installiert ist und der Fehler kann besser gefunden werden.

Jedoch ist es lästig immer erst die Versionsnummer zu verändern wenn ein neuer Build geschrieben wird. Daher im folgenden nun eine Automatisierung des Ganzen mit Hilfe von Xcode. Wichtig ist es übrigens nicht nur die „Bundle version“ in der project-info.plist anzugeben, sondern auch den Wert für „Bundle versions string, short“.

Für die Automatisierung wird eine xcconfig-Datei benötigt. Dazu einen Rechtsklick auf das Projekt ausführen und „New File…“ auswählen. Im nun angezeigten Popup unter „Other“ den Typ „Configurations Settings File“ auswählen. Nach dem Klick auf Next wird nach dem Dateinamen gefragt. Für diese Beispiel hier verwende ich „version“. Nachdem die Datei erzeugt ist, darauf achten dass sie auf der obersten Ebene im Projekt, als im Projectroot, liegt.

Anschließend folgt die Anpassung der Datei. Wenn man sie öffnet ist die noch leer, bis auf den vorkonfigurierten Kommentarheader. Hier fügt man nun folgende Zeile ein und speichert das ganze:
CURRENT_PROJECT_VERSION = 1

Weiter geht es mit den Einstellungen im Projekt. Dazu links das Projekt auswählen und der nun angezeigten View ebenfalls links unter „Projects“ das entsprechende Projekt auswählen. Im Tab „Info“ gibt es nun die „Configurations“ für das Projekt. Standardmäßig sind das „debug“ und „release“. Nun eine Konfiguration auswählen, aufklappen und für den Wert „Based on Configuration File“ die eben erstellte Datei auswählen für Project und Target. Standardmäßig steht hier „None“. Diesen Schritt für alle Konfigurationen wiederholen, für die man die automatische Inkrementierung haben möchte.

Nun müssen noch die Einstellungen für die Targets angepasst werden. Dazu eben das Projekttarget in der linken Spalte der Hauptview auswählen, welches direkt unter den Projects steht. Nun wird in der angezeigten View unter „Info“ die project-info.plist angezeigt in der sich auch die Einträge „Bundle version“ und „Bundle versions string, shot“ finden sollten. Diese Werte jeweils auswählen und mit folgenden String ersetzen:
1.0.${CURRENT_PROJECT_VERSION}
In diesem Beispiel bedeutet dies, dass die Hauptversion bei 1 liegt und die Unterversion bei 0. Aber der letzte Wert wird nun aus der Datei gezogen und stellt somit die build-Version dar.

Als letzter Schritt muss nun Xcode gesagt werden, dass es diesen Wert hochzählen soll wenn ein neuer build ansteht. Dazu bleibt man in der Target-Ansicht und wählt hier den Tab „Build Phases“ aus (2. Tab rechts neben Info). In der angezeigten View gibt es unten rechts den Button „Add Build Phase“. Diesen anklicken und im angezeigten DropDown „Add Run Script“ auswählen. Nun sollte oben der Bereich „Run Script“ erscheinen, insofern er noch nicht vorhanden war. Diesen aufklappen, wenn dem noch nicht so ist und nun folgende Anpassungen ausführen. Der Wert bei Shell sollte „/bin/sh“ sein und im folgenden Textfeld folgendes Script einfügen:
NEW_VERSION=`cat "$SRCROOT/version.xcconfig" | awk '/CURRENT_PROJECT_VERSION/ { print $3 + 1 }'`
sed -i '' "s/CURRENT_PROJECT_VERSION = .*/CURRENT_PROJECT_VERSION = $NEW_VERSION/" "$SRCROOT/version.xcconfig"
CURRENT_PROJECT_VERSION=$NEW_VERSION
touch "$SRCROOT/version.xcconfig"

Dieses Script zieht sich die aktuelle Versionsnummer aus der Datei und aktualisiert diese.

Das waren alle Anpassungen die nötig sind. Zum Testen des Ganzen, nun einfach einen Build des Projektes herausschreiben. Schaut man nun in die version.xcconfig Datei, ist der darin stehende Wert um 1 erhöht. Auch die Versionsnummer der App ist inkrementiert worden. Dazu links im Project-Browser unter Products > Im Finder anzeigen auswählen. Die angezeigte Datei hat nun ebenfalls die aktualisierte Versionsnummer.

Xerox Docucolor funktioniert nach Update auf OS X 10.6.8 nicht mehr

Nach dem Update auf Mac OS X 10.6.8 funktionieren Drucker mit EFI Fiery Drucker-RIP nicht mehr. Dies betrifft bedauerlicherweise auch professionelle Drucker wie zum Beispiel die Xerox DocuColor Printstations, die in Werbeagenturen und der Druckvorstufe sehr verbreitet sind. So meldet der Treiber der Dokucolor 252 einen Tonermangel und verweigert das Drucken. Derzeit wird weder auf Seiten von Apple, Efi oder Xerox eine Lösung angeboten.

Problembeschreibung

Ausgelöst wird das Problem von veränderten Scripts in Apples CUPS-Drucksystem. Nach einer Beschreibung auf der Website Tiramigoof die Scripte socket, dnssd, lpd und ipp betroffen. Dort wird empfohlen, die vier Dateien durch das Script Repair 10.6.8 austauschen zu lassen. Allerdings hat dies den Nachteil, dass damit die betroffenen Dateien auf den Stand von OS X 10.6.7 zurückgesetzt werden. Aus diesem Grund halten wir diese Lösung nur für diejenigen für sinnvoll, die diese Routine trotz dieses kleinen Schönheitsfehlers vollautomatisch ausführen wollen.

Das AppleScript „Repair10.6.8“, kann man hier herunterladen. Das Script tauscht nach Angaben von Tiramigoof die CUPS-Dateien automatisch aus und setzt auch gleich noch die richtigen Zugriffsrechte. Der Drucker funktioniert anschließend tatsächlich wieder tadellos.

Empfohlene Lösung

Wir empfehlen eine alternative Lösung, die ebenfalls bei allen Fiery Druckern zu funktionieren scheint. Dabei wird lediglich der Drucker PPD editiert und eine weitere Zeile hinzugefügt.

Um die Lösung auszuführen, wird ein Editor wie TextWrangler benötigt. Falls Sie noch keinen Editor besitzen, können Sie die Freeware hier herunterladen. Zusätzlich benötigen Sie auf dem betroffenen Apple Rechner Administratorenrechte oder einen Root Accout.
Im folgenden Beispiel editieren wir einen Xerox DocuColor 252 PPD. Allerdings sollte dies analog bei anderen Druckern auf Fiery auch funktionieren. Der Vorteil dieser Lösung besteht darin, dass die modifizierte PPD jederzeit über die Druckerkonfiguration wieder abgwählt werden kann und am System selbst keine Veränderungen vorgenommen werden.

Um die PPD zu modifizieren gehen Sie wie folgt vor:

Öffnen Sie im Finder die SystemHD. Wählen Sie dann folgenden Pfad aus:
Library/Printers/PPDs/Contents/Resources/de.lproj

Halten sie die „ctrl“-Taste gedrückt und klicken Sie auf die Datei:
DocuColor 242-252-260 PS

Im Kontextdialog wählen sie „öffnen mit“ und wählen Ihren Texteditor z.B. TextWrangler aus. Die Datei wird nun im Texteditor geöffnet. Für uns relevant sind nur die ersten beiden Passagen. Suchen Sie als erstes die Zeile:
*NickName: „DocuColor 242-252-260 PS v3017.102“

Und ersetzen Sie diese durch die Zeile:
*NickName: „DocuColor 242-252-260 PS v3017.102_07“

Ergänzen sie dann den Block
*% ========== EFI Specific Informational Keys ==========
am Ende um diese Zeile (bitte die exakte Schreibweise beachten):
*cupsSNMPSupplies: False

Speichern Sie die modifizierte PDD unter folgendem Namen im gleichen Verzeichnis wie die Ursprungsdatei ab:
DocuColor 242-252-260 PS_07

Überprüfen Sie mit der Tastenkombination „cdm“+“I“, ob jeder das Recht hat, diese neue Datei zu lesen.

Nun öffnen Sie in den „Systemeinstellungen den Untepunkt „Drucken & Faxen“ und wählen den DocuColor-Drucker aus. Drücken Sie auf den Button „Drucker konfigurieren“. Wählen Sie den Tab „Treiber“ aus. Im Dropdown „Drucken mit“ wählen Sie den Punkt „Andere“. Hier finden Sie die modifizierte Datei mit dem Namen DocuColor 242-252-260 PS_07″. Wählen Sie diese aus und stellen Sie ihre Druckeroptionen wieder neu ein.

Jetzt sollte der Ducker wieder einwandfrei funktionieren.

! Achtung: Die Umsetzung dieses Tutorials erfolgt auf eigenes Risiko. zeroseven übernimmt keine Gewährleistung dafür, dass die angebotene Lösung auch in Ihrer Einsatzumgebung die gewünschten Ergebnisse erzielt. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von zeroseven im Zusammenhang mit diesem Artikel oder Lösungsansatz ausgeschlossen.

Xerox Docucolor funktioniert nach Update auf OS X 10.6.8 nicht mehr

Mac OS X Neuinstallation unter Snow Leopard (10.6)

Sind Sie auch schon vor der Frage gestanden, ob Sie Ihren Mac nach einem Neukauf neu Installieren, oder über Time Machine von Ihrem bestehenden Mac übertragen? Beides hat Vor- und Nachteile. Der Vorteil bei der Datenübertragung von Time Machine ist sicherlich die schnelle Wiederherstellung Ihrer gewohnten und aktuellen Umgebung. Der Nachteil liegt auf der Hand. Alle alten System- und Programmleichen werden mit übertragen. Mit ein paar wenigen gezielten Handgriffen können Sie von Ihrem alten Mac die wichtigsten Einstellungen übernehmen.
Gehen Sie wie folgt vor. Im Idealfall haben Sie ein Mobile Me-Konto. Übertragen Sie alle Ihre E-Mail Konten, Adressdaten, Schlüsselbund, Notizen und zum Beispiel Ihre Bookmarks. Starten Sie Ihren neuen Mac von der Installations-CD. Gehen Sie die Dialogfenster durch und klicken dann auf den Button „Optionen“. Hier deaktivieren Sie alle unnötige Einstellungen. Das sind zum Beispiel „Alle Druckertreiber“, „Erweiterte Zeichensätze“, „Erweitere Sprachen“. Bei den Druckertreiber installieren Sie nach der Installation Ihres Betriebssystem einfach die Drucker nach, die Sie in Ihrem Unternehmen oder in Ihrer Umgebung einsetzen. Das spart massig Speicherplatz. Bei den Sprachen benötigen Sie maximal Ihre Landessprache und Englisch. Sofern Sie kein Entwickler sind, der auf mehreren Betriebssystemsprachen entwickelt. Das gleiche gilt bei den Schriften. Mit dem Festplatten-Dienstprogramm löschen Sie die vorinstallierte Festplatte komplett. Sie sollten das neue Betriebssystem auf eine platte Festplatte installieren.

Ist die Installation nun durchgeführt, werden Sie automatisch mit dem Installationsassistenten durch die Anmeldung und Registrierung geführt. Die können Sie getrost durchführen. Als kleiner Tipp noch am Rande. Wenn Sie zum Dialog kommen, wo Sie den Systemadministrator anlegen sollen, ist es immer ratsam einen eigenen Administrator mit Benutzerpasswort als Root-Administrator anzulegen. Ihren Benutzer mit dem Sie dann immer arbeiten, legen Sie dann über den Root-Administrator zusätzlich an. Dieser kann ja ohne weiteres Administrator-Rechte besitzen. Das gibt Ihnen später die Möglichkeit, sollte mit Ihrem System was nicht sauber laufen, immer als Root-Administrator einzuloggen und in das System einzugreifen. Sind Sie nun im Fenster „Daten von einem entfernten Rechner installieren“ angekommen, überspringen Sie diese Fenster getrost. Sind Sie beim Installationsassistenten durch, haben Sie einen Mac der sauber installiert ist und nur die notwendigen Programm-Pakete hat.

Die wichtigsten Daten von Ihrem vorherigen Mac bekommen Sie ganz einfach rüber. Als erstes gehen Sie in die Systemeinstellungen und verbinden sich mit Ihrem Mobile Me Account. Synchronisieren Sie so Ihre wichtigsten Daten auf Ihren neuen Mac. Ist das gemacht, verbinden Sie Ihren vorherigen Mac und den neuen mit einem Firewire-Kabel. Der alte Mac starten Sie bei gedrückter „cmd + T“ Taste (Target-Mode). Ihr neuer Mac erkennt Ihren alten als externe Festplatte. Um die Daten Ihrer E-Mail Konten auf den neuen Mac zu übertragen, müssen Sie drei wichtige Verzeichnisse/Dateien einfach auf Ihren neuen Mac kopieren. Dies sind:

  • User/Library/Mail (hier das ganze Verzeichnis)
  • User/Library/Preferences/com.apple.mail.plist
  • User/Library/Caches/com.apple.mail

Im Verzeichnis „Mail“ befindet sich die Datei „Envelope Index“. Diese können Sie bevor Sie das E-Mail Programm starten löschen. Das Apple E-Mail Programm indiziert dann alle bestehende E-Mails neu. In den beiden Verzeichnisse „Preferences“ und „Caches“ befinden sich auch weitere wichtige Dateien von den gängigen Appel-Programmen wie zum Beispiel „Safari“ oder auch das „AdressBook“. Diese kopieren Sie dann ebenfalls auf Ihren neu konfigurierten Rechner. Des weiteren sollten Sie noch das Verzeichnis „Application Support“ im Auge behalten. Teilweise werden auch hier Apple relevante Programmdaten abgelegt. Zum Beispiel das Adressbuch befindet sich hier oder auch viele der Adobe-Programme. Es gilt grundsätzlich zu empfehlen, dass Sie Programme wie zum Beispiel die von Adobe CS neu installieren. Programme von Apple wie zum Beispiel das Adressbuch, den Kalender etc. können Sie entweder über Mobile Me synchronisieren oder über den oben beschriebenen Weg.

OpenVZ: eine freie Virtualisierungssoftware

OpenVZ ist eine gute Alternative zu kommerziellen Virtualisierungslösungen, die unter der GPL Version 2 veröffentlicht wurde und stellt die Basis der kostenpflichtigen Software Virtuozzo aus dem Hause SWsoft Inc. dar.

Da OpenVZ einen modifizierten Linux-Kernel mitliefert, ist die Auswahl an möglichen Host- und Gast-Betriebssystemen auf Linux begrenzt und bietet im Gegenzug eine bessere Ausnutzung der vorhandenen Ressourcen an. So soll laut der offiziellen Webseite der Virtualisierungsaufwand zwischen 1 bis 3 % der Prozessorleistung betragen. Eine wesentliche Eigenschaft von OpenVZ ist, die Verwendung des Ein-Kernel-Modells – sprich: alle Gast-Systeme (VE’s = Virtual Environments) teilen sich einen gemeinsamen Kernel. Dies ermöglicht die Skalierung einer VE bis auf die Größe des Host-Systems unter Nutzung aller verfügbaren Ressourcen (CPU, RAM, Netzwerkbandbreite usw.). Ferner können die einzelnen Gast-Systeme (VE’s) nicht auf die Hardware des Host-Systems zugreifen, sondern über eine entsprechende Schnittstelle von OpenVZ mit dieser kommunizieren.

Wer sich für OpenVZ interessiert, dem sei an dieser Stelle die offizielle Webseite von OpenVZ ans Hert gelegt. Dort findet ihr entsprechende Informationen zu diesem Thema.

Lighttpd ein schlanker schneller Webserver

Lighttpd ist ein schlanker, schneller Webserver, der unter der BSD-Lizenz vertrieben und Jan Kneschke entwickelt wurde.

Er kann über diverse Module erweitert werden und setzt auf asynchrone Kommunikation. Dadurch kann er mit nur einem Prozess mehrere tausend Anfragen parallel bearbeiten – ohne Systemresourcen, wie die CPU und den Arbeitsspeicher zustark zu belasten.

Ferner unterstützt er die wesentlichen Features, die ein Webserver bieten sollte und kann Code in verschiedenen Skript-Sprachen ausführen. So bindet er PHP über FastCGI und andere über die SCGI-Schnittstelle ein.

Weitere Informationen finden Sie unter:

http://www.lighttpd.net/

JDBC: Fehlerhafte Interpretation von Tinyint-Werten im Java MySQL-Connector 3.1.14

Der JDBC-Treiber 3.1.14 für MySQL interpretiert den Datentyp Tinyint als Boolean. Ein entsprechender getInt() Aufruf liefert in diesem Falle nur true bzw. false als Ergebnis zurück.

Dieser Umstand lässt sich dadurch lösen, das in SELECT-Statements ein entsprechende Typkonvertierung (CAST-Anweisung), von Tinyint nach Integer, verwendet wird.

Beispiel für eine SELECT-Anweisung mit Datentypkonvertierung von Tinyint nach Integer:

SELECT `id`, `name`, CAST (`foo` AS UNSIGNED) AS `foo` FROM `table_name` WHERE `id` > 0;

MonetDB: Eine schnelle Alternative zu anderen Open Source Datenbankmanagementsystemen

MonetDB ist ein relativ junges RDBMS, das in den Niederlanden vom National Research Institute for Mathematics and Computer Science entwickelt wurde.

Laut Angaben der Entwickler-Webseite monetdb.cwi.nl, ist diese hochperformante Datenbank im Schnitt ein vielfaches schneller, als einige andere RDBMS. Dies wird dadurch ermöglicht, dass MonetDB eine vertikale Fragmentierung der Tabellen im Speichermodell verwendet. Ferner wird die interne Datenrepräsentation im Arbeitsspeicher gehalten und konsequent für den CPU-Cache optimierte Query-Anfragen verwendet. Dadurch ist sie bei Verwendung der gleichen Algorithmen, im Vergleich zu typischen auf Interpreter basierenden RDBMS, so schnell. (Siehe Benchmark)

Das MonetDB-Projekt ist in drei Teile gegliedert:

  • MonetDB/SQL : ist das RDBMS,
  • MonetDB/XQuery : ist die XML Datenbankunterstützung,
  • MonetDB Server : ist der „multi-model“ Datenbankserver.

Seine Stärken liegen in datenbank basierenden Anwendungen, die hohe Anforderungen in Hinsicht auf die Performanz an ein RDBMS stellen.

Es lohnt sich auf jeden Fall, sich dieses Projekt genauer anzuschauen.

Links:

  1. http://monetdb.cwi.nl – Webseite
  2. http://en.wikipedia.org/wiki/MonetDB – Artikel im Wikipedia
  3. http://monetdb.cwi.nl/projects/monetdb/SQL/Benchmark/TPCH/index.html – Benchmarkergebnisse

Error listenerStart

Beim Aufsetzen von Projekten mit BlazeDS und Spring bin ich häufiger über einen Fehler gestoßen, der nicht sehr aussagekräftig ist. Die Suche im WWW war dabei fast nie eine Hilfe, deswegen habe ich dem Error listenerStart einen eigenen Eintrag gewidmet, in der Hoffnung, das Andere mehr damit anfangen können als ich mit den Ergebnissen, die ich zu jener Zeit gefunden habe.

Der Fehler manifestiert sich folgendermassen in der Standardausgabe des Tomcat-Servers:

20.06.2008 09:46:15 org.apache.catalina.core.StandardContext start
SCHWERWIEGEND: Error listenerStart
20.06.2008 09:46:15 org.apache.catalina.core.StandardContext start
SCHWERWIEGEND: Context [/mein_projekt] startup failed due to previous errors
20.06.2008 09:46:15 org.apache.coyote.http11.Http11Protocol start

In vielen Fällen tritt der Fehler dann auf, wenn Konfigurationsdateien, welche direkt Spring betreffen syntaktische Fehler beinhalten. Hier am Beispiel der Datei contextConfiguration.xml welche über

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/contextConfiguration.xml</param-value>
</context-param>

eingebunden wird. Ist beispielsweise die Definition einer SpringBean nicht in korrektem XML angegeben, tritt der Fehler Error listenerStart auf. Weitere Ursachen können fehlende Treiber sein, die sich nicht im entsprechenden Verzeichniss finden. Ein Kandidat dafür könnte der Treiber zur Datenbank oder andere fehlende jar’s sein.

In jedem Fall lohnt sich der Blick in die log-Dateien im /tomcat/logs Verzeichniss, dort werden zumindest syntaktische Fehler angezeigt. Um dafür die Genauigkeit der Fehlerausgabe einzustellen kann man im /tomcat/conf Verzeichniss die Datei logging.properties entsprechend anpassen.

Mit oder ohne www?

Technisch gesehen macht es einen Unterschied, ob ich eine Domain mit oder ohne www angebe. Für den Server ist www.zeroseven.de eine andere Domain als zeroseven.de – nicht so aber für viele Benutzer. Diese tippen die Domain mal mit und mal ohne das vorangestellte www ein. Wenn der Server jedoch nicht auf dieses Szenario vorbereitet ist, schaut der User evtl. in die Röhre, bzw. auf eine Fehlermeldung und zieht enttäuscht weiter. Hier wird gezeigt, wie dem ISPMan – einem weit verbreiteten Server-Manager – mit wenigen Klicks gesagt werden kann, wie er mit dem fehlenden www umzugehen hat.

Wir gehen hierbei davon aus, dass der Server den Aufruf von http://example.com so interpretieren soll wie einen Aufruf von http://www.example.com.

Schritt 1:
Wählen Sie die Domain und den Virtual Host, zu dem Sie die Einstellung vornehmen wollen.

Schritt 2:
Wechseln Sie von „General Info“ zu „Website Aliases“.

Schritt 3:
Tragen Sie die Domain ohne das „www“ als Alias dieses Hosts ein (z.B. „example.com“) und klicken Sie auf „Add“.

Schritt 4:
Wechseln Sie zu den „A Records“ der DNS-Verwaltung. Hier muss ein Wildcard-Eintrag vorgenommen werden. Tragen Sie dazu ein @ in die Spalte „Hostname“ ein und übernehmen Sie in der Spalte „IP Address“ den Wert, der beim www-Host eingetragen ist.

Schritt 5:
Gehen Sie jetzt noch, wie nach jeder Änderung im ISPMan zu den „Processes“ um bestätigen Sie die ausstehenden Prozesse mit „Commit Session“.

Schritt 6:
Haben Sie Geduld. Der ISPMan muss jetzt zunächst die ausstehenden Prozesse abarbeiten und anschließend kann es noch einige Zeit dauern, bis sich die aktualisierten DNS-Einstellungen im Internet herum gesprochen haben.