Archiv für die Kategorie ‘Programmierung’

Warum ich doch Java gewählt habe

Montag, 13. Dezember 2010

Unter Gründe für SAP / ABAP im Programmierprojekt habe ich geschrieben, welche Vorteile SAP / ABAP in unserem Programmierprojekt im Studium bietet. Grund für diesen Blog-Eintrag war, dass es letztes Jahr mehr Java als SAP Gruppen gegeben hat und ich etwas gegen wirken wollte.

Ich selbst habe mich für Java entschieden, da ich in Java wesentlich erfahrener bin und es zu den meisten Punkten aus dem ursprünglichen Blog-Eintrag auch einen Java-Vorteil gibt, wenn man die Punkte anders betrachtet. Diese Vorteile möchte ich hier erläutern:

Zu 1.

Mit ABAP haben wir deutlich mehr praktische Erfahrung als mit Java Server Pages, die wir nur kurz in der Vorlesung angesprochen haben und nur ein einfaches Beispiel gesehen habe. Die Einarbeitungszeit in ABAP ist dadurch wesentlich kürzer.

Während wir nur zwei Semester Vorlesungen zu ABAP hatten, haben wir drei Semester lang Java programmiert und dazu mehr Vorlesungen gehabt. Außerdem habe ich mit VPnotifier bereits ein richtiges Projekt mit Java Server Pages umgesetzt, während es bei der ABAP Webprogrammierung nur bei den Übungen in der Vorlesung geblieben ist.

Zu 2.

In SAP erhält man eine vollständig eingerichtete Entwicklungsumgebung. Dagegen muss man die Java-Tools erst konfigurieren, sich Gedanken machen, wie mit mehreren Benutzer gleichzeitig dasselbe Projekt bearbeitet werden kann und wie man Konflikte beim gleichzeitigen Bearbeiten einer Datei von zwei Personen vermeidet.

Das Arbeiten im Team lässt sich sehr leicht durch Versionskontrollsysteme wie Subversion koordinieren, wo ich nur ein neues Repository für das Java Projekt einrichten muss. Zwar fällt beim Einrichten der Entwicklungsumgebung mehr Aufwand an, dafür kann man aber lokal entwickeln, ohne eine Internetverbindung zum SAP Server herzustellen.

Zu 3.

Programmiert man mit Java, muss man zuerst eine Datenbank installieren, welche bei SAP schon vorhanden und eingerichtet ist.

Siehe 2.: Entwickeln ohne Internetverbindung

Zu 4.

Beim Abrufen der Datenbank wird in SAP Open SQL verwendet. SAP findet bei Open SQL Fehler schon während der Syntaxüberprüfung und vermeidet dadurch Laufzeitfehler.

O-R-Mapping durch Hibernate stellt eine Abstraktionsschicht zur Datenbank dar, wodurch Objekte ohne Verwendung von SQL persistent gespeichert werden. Dies ermöglicht eine schnellere Entwicklung, da für das Speichern der Java Objekte keine eigenen Funktionen programmiert werden müssen.

Zu 5.

Zum Veröffentlichen der Java Server Pages im Internet wird ein Servlet-Container wie z.B. Apache Tomcat benötigt. Dieser kann nicht auf einem einfachen Webspace installiert werden sondern benötigt einen eigenen Server, wodurch monatliche Kosten entstehen. Die preiswerteren Server sind mit Linux ausgestattet. Es ist in diesem Fall sinnvoll, gute Kenntnisse in diesem Betriebssystem zu haben. Bei SAP erhalten wir dagegen ein fertig konfiguriertes System.

Durch die Verwendung eines Open Source Servers kann die fertige Anwendung auf einem eigenen Server und unter eigener Domain betrieben werden. Bei SAP ist dies nicht so leicht durchführbar, da hierfür Rechte in SAP benötigt werden, über die nur die SAP Systemadministratoren, nicht aber wir Studenten als Entwickler, verfügen.

Zu 6.

Für die Datensicherungen im SAP sind nicht wir sondern der Betreiber verantwortlich. Bei Java ist dies jedoch Aufgabe der Studenten.

Woher weiß ich, dass auf dem SAP System Datensicherungen durchgeführt werden? Schließlich ist es kein System, mit dem eine Firma produktiv arbeitet. Dagegen kann ich mir sicher sein, dass ich über Backups verfüge, wenn ich automatisiert mein Subversion Repository an einen anderen Ort kopiere. Zudem ist auf jedem Rechner der Teammitglieder durch das lokale Entwickeln eine aktuelle Version verfügbar.

Zu 7.

Innerhalb des SAP-Systems gibt es Unmengen an Funktionsbausteinen, die in den Anwendungen verwendet werden können. Bei Java können über Libraries auch weitere Funktionen ergänzt werden. Diese Libaries müssen jedoch erst heruntergeladen und in das Projekt eingebunden werden, wohingegen die SAP Funktionen direkt verfügbar sind.

Möglicherweise gibt es in Java genauso viele oder noch mehr Funktionsbausteine. Entscheidend ist die Anzahl der Libraries, die der Entwickler kennt. Bei mir ist dies ein klares Kriterium für die Java-Welt.

Zu 8.

Laut Informationen in der Lernplattform Moodle gibt es für die SAP-Gruppen Unterstützung von zwei Dozenten, während die Java-Gruppen nur von einem Dozent betreut werden.

Java ist auf der Liste der beliebtesten Programmiersprachen auf den vorderen Plätzen, während ABAP nur einen geringen Anteil der Stimmen erhalten hat. Deshalb ist davon auszugehen, dass es im Internet wesentlich mehr hilfreiche Tutorials zu Java als zu ABAP gibt.

Zu 9.

In vielen Unternehmen befindet sich das ERP-System SAP im Einsatz. Deshalb sind die Kenntnisse aus der Umsetzung mit SAP hilfreicher als das Know-How, das man durch die Verwendung von Java erhält.

Ob mehr Java oder ABAP Entwickler gesucht werden, kann ich nicht sagen. Betrachtet man die Anzahl der Suchergebnisse von Google dazu, erhält man ebenfalls widersprüchliche Angaben (Stand 12.12.2010):

  • Java Developer: Ungefähr 37.600.000 Ergebnisse
  • ABAP Developer: Ungefähr 429.000 Ergebnisse
  • Java Entwickler: Ungefähr 375.000 Ergebnisse
  • ABAP Entwickler: Ungefähr 482.000 Ergebnisse

Zusammenfassend ist zu sagen, dass es zu jedem SAP-Vorteil bei anderer Betrachtungsweise auch einen Vorteil für Java gibt. Welche Sprache für ein Projekt besser geeignet ist, muss deshalb individuell, Abhängig von der Problemstellung und vom Know-How der Entwickler entschieden werden.

VPnotifier – Vorlesungsplan Benachrichtigungen für die DHBW Mosbach

Sonntag, 21. November 2010

Bei der Dualen Hochschule Baden-Württemberg Mosbach (DHBW Mosbach) werden die Vorlesungspläne pro Monat als PDF-Datei online gestellt. Aufgabe der Studenten ist dann, regelmäßig in den Dateien zu schauen, ob eine Aktualisierung vorhanden ist.

Da ich nicht ständig selbst nach neuen Vorlesungsplänen schauen wollte, habe ich mir gedacht, dass diese Arbeit auch ein Computer erledigen kann. Daraus entstanden ist das Projekt VPnotifier (Vorlesungsplan notifier). VPnotifier ist eine kleine Webanwendung, die alle 5 Minuten die Liste der Vorlesungsplänen der DHBW Mosbach abruft und bei Änderungen die Benutzer benachrichtigt, die den jeweiligen Kurs abonniert haben. Dadurch muss man nicht ständig in den Plänen nachschauen sondern nur noch regelmäßig die E-Mails abrufen.

Hi,

der Vorlesungsplan des Kurses wi08a wurde
am 21.11.2010 um 20:30:00 Uhr aktualisiert.
http://pollux.ba-mosbach.de/cmos_extern_kurs_ext/wi08a-2010-45.pdf
http://pollux.ba-mosbach.de/cmos_extern_kurs_ext/wi08a-2010-49.pdf

Viele Grüße,
VPnotifier

http://julm.de/VPnotifier/

Wer Interesse an den Benachrichtigungen hat, kann sich unter http://julm.de/VPnotifier/ bei VPnotifier anmelden. Wenn ihr mit VPnotifier zufrieden seid oder Anregungen habt, könnt ihr dies gerne in meinen Blog schreiben oder mir per E-Mail mitteilen.

JTwitter mit OAuth zum automatischen Twittern mit Java verwenden

Donnerstag, 09. September 2010

Zum Twittern in Java Programmen gab es schon seit längerem die Library JTwitter. Bisher konnte man dort einfach durch Eingabe des Twitter Logins und des Passworts neue Tweets schreiben. Twitter hat jedoch in den vergangenen Tagen dieses Verfahren, welches den Namen Basic Auth trägt, deaktiviert. Jetzt kann nur noch per OAuth auf die Twitter API zugegriffen werden.

Aus diesem Grund müssen auch die Java Programme, die JTwitter mit Basic Auth verwenden, angepasst werden. Neben einer neuen JTwitter Version ist dazu auch die Bibliothek Signpost OAuth notwendig. Außerdem muss das Programm unter http://dev.twitter.com/ als Twitter Application registriert werden. Nach der Registrierung erhält man die für OAuth benötigten Keys.

Mit dem Beispiel des JTwitter Autors funktioniert OAuth auch gut, solange man das Java Programm nur auf dem Desktop PC laufen lässt und jedes Mal eine PIN eingibt, die die Anwendung zum Twittern autorisiert. Soll die Anwendung aber im Hintergrund (z.B. als Cronjob) laufen, eignet sich dieses Beispiel nicht.

Mit OAuth ist es aber auch möglich, den Twitter Account dauerhaft mit der Twitter Application zu verbinden. Dazu habe ich auch wieder einen Beispielcode gefunden, mit dem der OAuth Token erstellt werden kann. Hierzu trägt man den Consumer Key und das Consumer Secret in dem Code ein und startet das Programm. Anschließend erhält man eine URL, die man im Browser eingibt. Nach dem Akzeptieren wird wieder eine PIN angezeigt, die man im Java Programm eingibt. Danach werden das OAuth Access token und das Secret Token ausgeben.

Nun kann mit folgendem Coding wieder eine Tweet erstellt werden, nachdem im Konstruktor der Klasse OAuthSignpostClient die Keys eingesetzt wurden:

OAuthSignpostClient oauthClient =
	new OAuthSignpostClient(
			consumerKey, consumerSecret,
			accessToken, accessTokenSecret);
Twitter twitter = new Twitter(TWITTER_USER, oauthClient);
twitter.setStatus(status);

Es ist jetzt also notwendig, dass sich jedes Programm auch als Anwendung bei Twitter registriert. Für mein einfaches Programm, dass die Nachrichten per Cronjob absendet, ist das natürlich etwas umständlich. Schreibt man aber eine richtige Twitter Anwendung, lässt sich dieser Vorgang so implementieren, dass er für den Anwender schnell abläuft und dieser sein Passwort nur noch auf der offiziellen Twitter Homepage eingeben muss.

Basic Auth

Jackcess – Java Bibliothek zum Zugriff auf MS Access

Sonntag, 25. April 2010

Um in Java auf Datenbanken zuzugreifen, verwendet man in der Regel JDBC Treiber, die vom Datenbank-Hersteller zur Verfügung gestellt werden. Im Falle von Microsofts Access Datenbanken hat man jedoch schlechte Karten, da Microsoft selbst keinen JDBC Treiber anbietet. Um trotzdem auf MS Access Datenken zuzugreifen, gibt es einige JDBC Treiber, die über ODBC auf die Access Datenbank zugreifen. Diese Möglichkeit besteht aber nur unter Windows Systemen. Wer unter Linux arbeitet, kann diese Möglichkeit also auch nicht nutzen.

Diese Lücke schließt aber die Java Bibliothek Jackcess, mit der unabhängig vom Betriebsystem auf MS Access Datenbanken zugegriffen werden kann. Der Zugriff erfolgt hier nicht über JDBC sondern über die Klassen und Methoden von Jackcess.

Hier nun einige Kommentare zum Umgang mit Jackcess:

Langsames Schreiben beschleunigen
Beim Schreiben in eine große Datenbanktabelle hatte bei mir das Einfügen einer neuen Zeile mehr als 30 Sekunden gedauert. Das liegt daran, dass Jackcess den Schreibvorgang so optimiert, dass beim Absturz der Anwendung möglichst wenig Daten verloren gehen. Wenn man darauf nicht angewiesen ist, kann man diese Optimierung jedoch auch ausschalten. Dazu öffnet man die Datenbank mit folgenden Parametern:

Database.open("database.mdb", "false", "false");

Das zweite Variable, die übergeben wird, steuert, dass die Datenbank nicht im “readOnly” Zugriff geöffnet wird. Die dritte Variable schaltet dann die Option “autoSync” aus, wodurch das Schreiben bei mir stark beschleunigt wurde.

Long Integer als Primary Key
Primärschlüssel werden durch Jackcess normalerweise automatisch hochgezählt. Dies funktioniert aber nur, wenn die Spalte den Typ “Integer” hat. Die Datenbank, die ich schreiben musste, hatte jedoch den Spaltentyp “Long Integer”. Jackcess hat hier das Schreiben immer mit einer Exception abgebrochen.
Abhilfe schafft die Option setUseBixIndex(), mit der auch in “Long Integer” Spalten geschrieben werden kann.

Database db = new Database("database.mdb");
db.setUseBigIndex(true);

Das Verwenden dieser Option hatte jedoch zur Folge, dass der Primary Key nicht mehr automatisch vergeben wurde. Hier habe ich keine andere Möglichkeit gefunden als selbst den höchsten Wert der Spalte zu ermitteln und dann 1 zu addieren.

Lesen der Datenbank
Bei den Code-Beispielen auf der Jackcess Seite fehlt das Lesen, deshalb hier eine kurzes Code-Beispiel:

Table myTable = db.getTable("myTable");
Iterator<Map<String, Object>> it = myTable.iterator();
while (it.hasNext()) {
	Map<String, Object> map = it.next();
	String column = map.get("columnName").toString();
	//...
}

Zuerst wählt man die Tabelle aus, die gelesen werden soll. Das Objekt vom Typ Table stellt einen Iterator zur Verfügung, mit dem die Tabelle durchlaufen werden kann. Der Iterator gibt für jede Spalte eine Map zurück, über die der Zugriff auf die einzelnen Spalten der Zeile möglich ist.

Weitere Informationen gibt es in den Apidocs.