Dez 19

Programmieren lernen – Teil 7 (Java)

In diesem Artikel wird erklärt, was wir tun müssen, um mit der Programmiersprache Java arbeiten zu können und wie ein Benutzer unsere erstellen Programme verwenden kann.

Java

Wie bereits erklärt, kann ein Computer im Grunde nur seine Ur-Sprache, die Maschinensprache, verstehen. Alle anderen Programmiersprachen können nur deshalb funktionieren, weil sie wieder in Maschinensprache übersetzt werden. Der Computer wird im Inneren also nie die Java sprechen können. Java dient uns Programmierern nur als Hilfsmittel, weil Java eine schöne und logisch aufgebaute Sprache ist. Die Maschinensprache wiederum ist komplex und unleserlich. Deshalb schreiben wir unsere Programme mit Java lassen diese dann in Maschinensprache übersetzten. So haben wir hinterher ein Programm, das der Computer verstehen kann, ohne dass wir Programmierer selbst die Maschinensprache verstehen müssen.

Auch haben wir gelernt, dass es bei der Erstellung eines Programms zwei Gruppen von Personen gibt. Die einen erstellen (programmieren) das Programm: die Entwickler. Die anderen benutzen das Programm: die Benutzer. Das Übersetzen eines Programms in Maschinensprache ist Aufgabe des Programmierers. Ein Benutzer kann mit dem Programm nur in bereits übersetzter Maschinensprachen-Form etwas anfangen, weil sein Computer nur diese Sprache spricht. Keine Angst, das Übersetzten muss nicht von Hand gemacht werden. Dafür bekommt der Programmierer alles Notwendige an die Hand, man denke an den Werkzeugkoffer auf der grünen Wiese. Das dauert bei kleineren Programmen nur wenige Sekunden. Diese Werkzeuge, um als Programmierer mit Java zu arbeiten, fehlen im Normalfall auf einem herkömmlichen Benutzer-Computer und müssen deshalb noch installiert werden. Darum geht es in diesem Artikel.

Die Übersetzung

Bei Java (wie auch bei anderen modernen Programmiersprachen) gibt es noch eine wichtige Besonderheit: Auch zum Starten von Programmen, die mit Java erstellt wurden, muss auf dem Computer noch etwas installiert werden, sofern das nicht schon getan wurde. Warum ist das so? Weiter oben habe ich erklärt, dass Programme in einer bestimmten Programmiersprache (bei uns Java) vom Programmierer in Maschinensprache übersetzt werden, und dass dieses übersetzte Programm von einem Benutzer, bzw. dessen Computer direkt verstanden werden kann, weil der Computer Maschinensprache versteht. Das ist auch richtig. Bei Programmiersprachen wie beispielsweise C, C++ und Pascal wird es genau so gemacht.

Tatsache ist aber, dass Java-Programme nicht auf direktem Weg in Maschinensprache übersetzt werden, sondern erst über einen Umweg in eine so genannte Zwischensprache. Das Programm wird in dieser Zwischensprache an den Benutzer gegeben. Dieser braucht dann wiederum auch ein Werkzeug, um den zweiten und letzten Übersetzungs-Schritt von der Zwischensprache zur Maschinensprache zu gehen. Das hört sich komplizierter an, als es tatsächlich ist. In der Realität bekommt der Benutzer von diesem zweiten Übersetzungs-Schritt überhaupt nichts mit. Wenn er ein Programm starten möchte, das mit Java erstellt wurde, geschieht das, wie bei jedem anderen Programm auch, vermutlich über den Doppelklick auf ein Icon auf dem Desktop oder aus einem Programm-Menü heraus. Für ihn unsichtbar wird nun die Übersetzung von Zwischensprache in Maschinensprache vollzogen.

Als kleinen Blick über unseren Java-Tellerrand möchte ich erklären, dass sich die Programmiersprachen in dieser Hinsicht so in drei Gruppen einteilen lassen. Erstens Sprachen wie C, C++, Pascal und viele weitere, die komplett fertig in Maschinensprache übersetzt an den Benutzer gegeben werden. Des Weiteren Sprachen wie Java und die .NET-Sprachen von Microsoft, die in Form einer Zwischensprache beim Benutzer ankommen und dort in einem zweiten Schritt in Maschinensprache übersetzt werden. Die dritte Gruppe von Programmiersprachen wurden bisher noch nicht erwähnt. Hierzu zählen beispielsweise BASIC, PHP und noch einige mehr. Diese Sprachen werden überhaupt nicht übersetzt, sondern landen unübersetzt beim Benutzer. Erst beim Starten des Programms auf dem Benutzer-Computer findet eine Übersetzung statt.
Jede dieser drei Gruppen hat durch ihre ganz einzigartige Technik Vor- und Nachteile, die sich im Laufe der Zeit als Programmierer noch herausstellen werden. Nur so viel sei gesagt: Java, sowie auch die .NET-Sprachen, geht mit dem Zwischenschritt der Übersetzung zu einer Zwischensprache einen gut ausbalancierten Mittelweg.

JRE oder JDK

Für diese beiden Anwendungsgebiete im Java-Umfeld, für Benutzer oder Programmierer, gibt es zwei unterschiedliche Pakete, die auf einem Computer installiert werden können: JRE oder JDK.

JRE steht ausgeschrieben für Java Runtime Environment (Java Laufzeitumgebung). Die Laufzeitumgebung ist banal ausgedrückt eine Umgebung, um Java-Programme laufen zu lassen, also zu verwenden. Genauer ausgedrückt kann die JRE Programme, die in der Java-Zwischensprache vorliegen, in die Maschinensprache übersetzen. Folglich ist die JRE das Modul für Benutzer.

JDK bedeutet Java Development Kit (Java Entwickler-Austattung). Wie der Name hier schon genau ausdrückt, ist das JDK die Austattung, die ein Java-Entwickler braucht. Es enthält die Funktion, Java-Programme in die Java-Zwischensprache zu übersetzen, die dann an Benutzer weiter gegeben werden kann.
Weil die Entwickler auch gleichzeitig die Benutzer ihrer eigenen Programme sind, ist es nur logisch und sinnvoll, dass die Entwickler-Austattung auch eine vollwertige Laufzeitumgebung enthält. Installiert man also ein JDK, ist eine JRE automatisch mit dabei.

JDK installieren

Sowohl die JRE, als auch das JDK, kann ganz einfach installiert werden. Die genaue Installations-Vorgehensweise ist allerdings von Betriebssystem zu Betriebssystem unterschiedlich.

Ab hier kommt es in dieser Artikel-Serie öfters vor, dass sich Erklärungen und Beschreibungen von einem Betriebssystem zum anderen unterscheiden. Drei Gruppen von Betriebs-Systemen werden berücksichtigt: Windows, Linux und MacOS. Die betreffenden Stellen mit unterschiedlichem Inhalt werde ich farblich markieren. Windows bekommt die Farbe blau, Linux und MacOS teilen sich die Farbe grün. Das hat den Grund, dass viele Erklärungen, jedoch nicht alle, für Linux und MacOS zusammengefasst werden können.
Natürlich reicht es, nur den Text des eigenen Betriebssystems zu lesen. Schaden kann es aber sicher nicht, zumindest ab und zu einmal in die anderen Betriebssysteme rein zu schnuppern. Zu neugierig kann man beim Programmieren eigentlich nie sein.

Und hier haben wir schon den ersten Fall:

Windows Für Windows-Betriebssysteme gibt es einen JDK-Download (natürlich auch einen JRE-Download) auf der Oracle Internet-Seite im Bereich Java-Downloads. Java wird aktuell von der Firma Oracle verwaltet. Dieser Download muss lediglich auf dem Computer installiert werden. Danach ist der Computer für die Software-Entwicklung mit Java ausgestattet.
Linux Auch für Linux-Betriebssysteme gibt es einen JDK-Download bei Oracle. Bei verbreiteten Linux-Varianten wie Ubuntu, Debian, openSUSE, Fedora und weiteren würde ich allerdings die Installation über eine Paketverwaltung empfehlen. Bei Ubuntu beispielsweise bietet sich hier das Software-Center oder für fortgeschrittene Benutzer “synaptic” oder “apt” an.
MacOS Ähnliches gilt für MacOS-Betriebssysteme, wo das JDK über die Funktion “Software Update” installiert werden kann.

Fazit

Wir haben Java auf unserem Computer installiert, und zwar die Variante von Java, mit der wir neue Programme erstellen können (JDK), nicht nur bereits bestehende Programme starten (JRE).

Posted in Programmieren lernen | Tagged , , , , , , , , | Leave a comment
Dez 18

Programmieren lernen – Teil 6 (Input und Output)

In diesem Artikel werden wir analysieren, wie ein Benutzer mit einem Programm arbeitet. Und wir werden lernen, dass es verschiedene Arten von Programmen gibt, die auch unterschiedlich bedient werden.

Input und Output

Ein Beispiel: In einem Internet-Browser gibt es oben eine Adresszeile, in die der Benutzer die Adresse einer Internet-Seite eingeben kann, zu der er gerne navigieren möchte. Diese Adress-Zeile ist ein Eingabe-Element, womit eine Information in das Programm “eingegeben” werden kann. Dieser Vorgang nennt sich “Input”. Mit diesem Input ruft der Benutzer eine Funktion des Internet-Browsers auf, und zwar die Navigation zu eben genau dieser Internet-Seite. Der Browser führt die Funktion aus und stellt dann die gewünschte Internet-Seite im großen Anzeigefeld dar, das die größte Fläche im Layout des Browsers einnimmt. Das wiederum nennt man “Output”.
Aus dieser Kombination von Input und Output ergibt sich, wie man das Programm bedient. Ein Benutzer gibt Daten in ein Programm ein und betätigt über Schaltflächen bestimmte Funktionen des Programms (Input). Das Programm führt intern seine Funktionen aus und stellt Daten und Ergebnisse dar (Output). Damit kann der Benutzer dann weiterarbeiten und ggf. neue Daten eingeben und andere Funktionen aufrufen, die wiederum Output erzeugen.

An dieser Stelle kehren wir wieder einmal kurz zum Vergleich der grünen Wiese zurück. Da war nämlich von zwei Lücken im Zaun die Rede. Durch jede dieser zwei Lücken ist ein Förderband angebracht. Eines ist so eingestellt, dass es Dinge nach außerhalb des Zauns transportiert, das andere läuft in die Richtung, dass es Dinge nach innen transportiert. Diese zwei Förderbänder stellen eine grundlegende Verbindung zwischen innerhalb und außerhalb des Zauns her.
Die Förderbänder stehen sinnbildlich für Input und Output. Ein Benutzer kann etwas auf das Input-Förderband legen und so Daten in das Programm “eingeben”. Das Programm wiederum kann durch das Output-Förderband Daten an den Benutzer “ausgeben”.

Fenster oder Text

Programme lassen sich aus der Sicht eines Benutzers grob in zwei Kategorien einteilen:

Die meisten Programme, die ein durchschnittlicher Benutzer Tag für Tag verwendet, sind Programme, die in einem Fenster ablaufen, also z. B. der Internet-Browser oder ein Taschenrechner-Programm. Programme im Fenster werden auch Programme mit einer “grafischen Benutzerschnittstelle” genannt. Das bedeutet, die “Schnittstelle”, also die Verbindung zwischen den Programm-Funktionen und dem Benutzer, der das Programm bedient, findet auf eine grafische Art und Weise statt. Mit “grafisch” sind hier keine Grafiken/Bilder gemeint, sondern dass das Fenster, in dem das Programm läuft, ein Layout besitzt: Bestimmte Ein- und Ausgabe-Elemente sind sinnvoll angeordnet, wie beispielsweise die Adress-Zeile oder das große Anzeigefeld im Internet-Browser. Diese Ein- und Ausgabe-Elemente sind interaktiv, sie lassen sich mit der Maus anklicken, Menüs können aufgeklappt werden, ein Anzeige-Text kann seine Farbe ändern und weitere Fenster können erscheinen (z. B. ein Fenster mit einer Fehlermeldung oder für Programm-Einstellungen).

Programme der zweiten Kategorie besitzen keine grafische Benutzerschnittstelle. Da es für fast alle Anwendungsgebiete eines normalen Computer-Benutzers Programme mit grafischer Benutzerschnittstelle gibt, führen Programme ohne grafische Benutzerschnittstelle im Leben eines Benutzers ein Schattendasein. Anders sieht dies allerdings für die Programmierung aus. Hier haben solche Programme, nämlich Kommandozeilen-Programme, eine größere Bedeutung. Die Besonderheit von Kommandozeilen-Programmen ist, dass die Dateneingabe durch den Benutzer und die Datenausgabe durch das Programm rein in Textform stattfindet. Was genau die “Kommandozeile” ist und wie sie funktioniert, wird im Folgenden noch genau erklärt.

An dieser Stelle ist wichtig: Grundlegend gibt es keinen Unterschied zwischen der Programmierung eines Programms mit grafischer Benutzerschnittstelle oder eines Kommandozeilen-Programms. Lediglich Stellen im Programm, in denen es um Input und Output, also Dateneingabe und -ausgabe geht, müssen entsprechend anders programmiert werden. Ein Programm besteht aber aus vielen weiteren Teilen. Sieht man von Input und Output ab, gestaltet sich die Programmierung eines Programms mit grafischer Benutzerschnittstelle und eines Kommandozeilen-Programms exakt gleich. Aufgrund dieser Tatsache kann auch nachträglich ein Kommandozeilen-Programm in ein Programm mit grafischer Benutzerschnittstelle “umprogrammiert” werden, ohne dass man das komplette Programm umschreiben muss. Lediglich die Teile, die Input und Output betreffen, müssen umgeschrieben werden.

Wir werden mit Kommandozeilen-Programmierung beginnen. Das ist verglichen mit einer grafischen Benutzerschnittstelle zwar etwas unspektakulär, dafür aber für den Anfang auch viel einfacher. Und wie bereits erwähnt, lässt sich dies später auch leicht umstellen.

Fazit

Wir haben gelernt, dass man Informationen mit einem Programm austauscht, während man es benutzt. Dies wird Input und Output genannt. Bei Kommandozeilen-Programmen findet Input und Output in reiner Textform statt. Bei Programmen, die in einem oder mehreren Fenstern ablaufen, spricht man von Programmen mit grafischer Benutzerschnittstelle.
Das “Hallo Welt!”-Programm ist ein Kommandozeilen-Programm.

Posted in Programmieren lernen | Tagged , , , , , , , , , | Leave a comment
Nov 15

Programmieren lernen – Teil 5 (Der rote Knopf)

Dieser Artikel beschreibt, wie man den Befehlen, die man in einer Programmiersprache formuliert hat, Leben einhaucht, also dafür sorgt, dass die Befehle ausgeführt werden.

Der rote Knopf

Bisher ist bekannt, dass wir sinnbildlich eine Konstruktion innerhalb des Zauns auf unserer Wiese errichten, also Java-Befehle formulieren müssen, um ein Programm zu erhalten. Hier ist es wichtig zu wissen: Wenn wir auf der Wiese eine Konstruktion erfinden und zusammen bauen, so verrichtet diese anfänglich ihre Arbeit erst einmal noch nicht. An der Außenseite des Zauns, ganz in der Nähe der zwei Lücken, die ich bereits erwähnt habe, ist ein roter Knopf angebracht. Die Konstruktion im inneren des Zauns erfüllt ihre Arbeit erst dann, wenn jemand von außen diesen Knopf betätigt. Erst diese Aktion haucht der Konstruktion Leben ein, versorgt sie mit Energie, wenn man so will.

Zuerst denkt sich der Programmierer innerhalb des Zauns eine Konstruktion aus. Diese Konstruktion tut aber noch nichts, der Programmierer konstruiert in der Hoffnung, dass sie später genau das erledigt, was sie soll. Danach muss außerhalb des Zauns auf den roten Knopf gedrückt werden, um die Konstruktion zu aktivieren. Üblicherweise wird auch diese Aufgabe vom Programmierer erledigt. Er begibt sich also nach draußen, drückt auf den roten Knopf und sieht zu, ob die Konstruktion genau das tut, wofür sie erfunden wurde. Wenn sie es tut, freut er sich und begibt sich wieder nach innen, um weiter zu bauen. Die Konstruktion soll ja mit der Zeit immer mehr können. Hat der Programmierer die Konstruktion für eine neue Aufgabe erweitert und angepasst, geht’s wieder nach draußen, um den roten Knopf zu drücken. Erfüllt die Konstruktion die neu hinzu gekommene Aufgabe? Erfüllt sie auch noch ihre bisherigen Aufgaben? Der Programmierer prüft, ob alles stimmt.

Jetzt ist es so, dass Konstruktionen mit der Zeit immer ausgefeilter und komplexer werden. Die Aufgaben, die sie erfüllen sollen, werden schwieriger und dauern länger, bis sie erledigt sind. Vielleicht muss ein Hamster erst einmal 5 Minuten im Laufrad laufen, um das Gummiband soweit aufzurollen, bis es…. usw.
Fehler können sich einschleichen und die Konstruktion macht etwas falsch. Dann begibt sich der Programmierer wieder innerhalb des Zauns und versucht den Fehler zu finden und zu korrigieren. Danach geht’s wieder nach draußen, um den roten Knopf zu drücken. Mit dem Finden von Fehlern und Einbauen neuer Komponenten verbringt der Programmierer seine Zeit. Er wechselt ständig von innerhalb des Zauns nach außerhalb und wieder zurück.

Irgendwann ist aber endlich der Zeitpunkt erreicht, an der die Konstruktion alle Aufgaben, für die sie vorgesehen ist, ohne Fehler ausführt. Dies ist der freudige Augenblick, an dem man einen Nicht-Programmierer, also einen Programm-Benutzer, an den Zaun einladen kann. Dieser soll nun auf den roten Knopf drücken und staunen, was die Konstruktion alles kann! Der Programmierer sieht dem Benutzer vielleicht noch eine Weile zu, irgendwann lässt er ihn dann aber allein am Zaun und legt er sich auf einen Liegestuhl in die Sonne. Sollten dann doch wieder Fehler auftauchen, muss der Programmierer wieder ran. Raus aus dem Liegestuhl und zurück zur Konstruktion! Denn wie bereits gehört, darf nur ein Programmierer innerhalb des Zauns, und nur er hat das nötige Werkzeug, um die Konstruktion zu reparieren.

Fazit

Mit diesem Artikel sollte verdeutlicht werden, dass sich innerhalb des Zauns der Programmierer befindet, und außerhalb des Zauns der Benutzer. Wenn ein Programm allerdings noch nicht fertig ist, wird der Software-Entwickler selbst zum Benutzer, in dem er nach außen geht und auf den roten Knopf drückt, um seine eigene Konstruktion, sein eigenes Programm, auszuprobieren. Somit ist der Programmierer immer der erste Benutzer eines Programms, vor Allem wenn es noch gar nicht fertig ist.

Posted in Programmieren lernen | Tagged , , , , | Leave a comment
Nov 15

Programmieren lernen – Teil 4 (Die grüne Wiese)

In folgendem Artikel versuche ich die Vorgehensweise beim Programmieren zu erklären, also wie man aus dem Nichts heraus etwas erschafft, und zwar ein Programm. Das versuche ich mit einem Vergleich zu erklären.

Die grüne Wiese

Mit Vergleichen ist das immer so eine Sache. Oft können sie ein Thema gut veranschaulichen, manchmal stehen Sie einem eher im Weg. Ich möchte an dieser Stelle einen Vergleich anwenden, bei dem hoffentlich überwiegend Ersteres zutrifft.

Stell dir vor, du stehst auf einer großen grünen Wiese. Mit Brettern zäunst einen Bereich ein, und dann stellst du dich innerhalb dieses Bereichs. Der nun eingezäunte Bereich dieser Wiese ist dein Programm. Nur du als Programmierer darfst hinein. Alle anderen müssen draußen bleiben. An zwei Stellen im Zaun machst du die Bretter nicht durchgängig, sondern lässt zwei kleine Lücken frei. Wozu diese Lücken gut sind, werde ich später noch näher erklären. Du hast eine Werkzeugkiste dabei, auf der ein Schriftzug aufgedruckt ist: “Java”. Mit allem, was in der Werkzeugkiste ist, kannst du dich jetzt innerhalb deines Bereichs austoben. Du kannst bauen und basteln…

Mit dem Vergleich der grünen Wiese möchte ich die Brücke zum Programmieren schlagen. Es soll anschaulich gemacht werden, was wir für die Programmierung unseres kleinen Spiels benötigen. Im Folgenden werde ich noch etwas ausführlicher:

Ich habe schon erklärt, dass man dem Computer Befehle geben muss, die ausdrücken, was genau in einem Programm geschehen soll. Diese Befehle müssen in einer Programmiersprache formuliert werden, die in unserem Falle “Java” heißt. Diesen Vorgang, die Formulierung von Befehlen in einer Programmiersprache, nennt man “programmieren”. Der Vergleich mit der Wiese und dem Zaun fordert an dieser Stelle ein klein wenig Vorstellungskraft. Es geht darum, wie die Java-Befehle aussehen würden, wenn man sie auf dieser Wiese mit Werkzeug baute. Ich stelle mir immer eine abenteuerliche Konstruktion aus Zahnrädern, Federn, Gummibändern und all solchen Sachen vor. Vielleicht gibt es roboter-artige Greifarme, Magneten, Sensoren und Hamster in Laufrädern.
All diese Komponenten, die sinnbildlich für unsere Java-Befehle stehen, spielen zusammen und ergeben ein Programm. Viele Einzelkomponenten werden gebraucht, damit das Programm eine komplexe Aufgabe erfüllen kann. Diese Komponenten sind miteinander verbunden und erledigen nur in Zusammenarbeit ihre Pflicht.

Fazit

In diesem Artikel ging es darum, dass man mit vielen kleinen Teilen, nämlich Befehlen in der Sprache Java, einen größeren Zweck erfüllen kann, wenn diese Teile sinnvoll zusammen arbeiten.

Posted in Programmieren lernen | Tagged , , | Leave a comment
Nov 13

Apache und Glassfish mit “mod_jk” verbinden (Ubuntu)

1 Einleitung

In diesem Tutorial geht es darum, wie man Apache und einen Glassfish Server miteinander verbinden kann, so dass der Apache “vor” dem Glassfish Server sitzt und alle Anfragen an den Glassfish weiterleitet. Dies funktioniert mit dem Apache-Modul “mod_jk”.

2 Voraussetzungen

Für dieses Tutorial habe ich folgende Umgebung und Versionen verwendet:

  • Ubuntu 8.04.4 LTS
  • Apache 2.2.8
  • Glassfish 3.1.1
  • mod_jk 1.2.32

Aber das Tutorial dürfte sich leicht auf eine andere Umgebung übertragen lassen…

3 “mod_jk” kompilieren

Leider gab es für meine Umgebung kein vorkompiliertes “mod_jk”, das bedeutet also: selbst kompilieren! Auf http://tomcat.apache.org/download-connectors.cgi gibt es die Source Releases, bei mir war die aktuellste Version 1.2.32. Dann den Download auspacken, im Archiv gibt es eine BUILD.txt, die den Kompiliervorgang beschreibt. Auszug (kann man so noch nicht verwenden):

$> cd native
$> ./configure --with-apxs=/usr/sbin/apxs (or where ever the apxs/apxs2 is)
$> make
$> su -c 'make install'

Ich habe über apt (oder synaptic) das Paket “build-essential” installiert, mit dem fast alle Voraussetzugen für diesen Kompilier-Vorgang erfüllt sind. Lediglich apxs (bzw. apxs2) fehlt, was man offensichtlich für das “configure” benötigt, wie oben zu sehen. Hier habe ich in synaptic nach apxs gesucht und so zwei Apache-Pakete gefunden. Für eines von beiden muss man sich entscheiden, ich habe das “threaded”-Paket gewählt. Ob es mit dem anderen Paket auch funktioniert, habe ich nicht getestet (für Feedback bin ich dankbar!). Danach liegt apxs bei mir unter folgendem Pfad (ein “find” sollte die Datei ausfindig machen):

/usr/bin/apxs2

Damit können wir also den Kompilier-Vorgang folgendermaßen durchführen:

$> cd native
$> ./configure --with-apxs=/usr/bin/apxs2
$> make
$> su -c 'make install'

Das Kompilieren sollte nun ohne Fehler durchlaufen. Falls configure oder make doch noch etwas anmeckert, dann sind es oft Header-Dateien, die in den entsprechenden “dev”-Paketen enthalten sind, die man leicht mit synaptic finden und nachinstallieren kann.

4 “mod_jk” konfigurieren

Wenn “mod_jk” fertig kompiliert und installiert ist, muss es noch über zwei Konfigurations-Dateien konfiguriert werden.

Die erste ist die workers.properties. Also eine Datei workers.properties anlegen, egal wo, aber am besten unter /etc/apache2/ mit folgendem Inhalt:

worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009

Wir müssen diese Datei später noch erweitern, aber für den Anfang reicht es so.

Dann muss die Apache-Konfigurations-Datei /etc/apache2/httpd.conf angepasst werden (war bei mir anfangs leer). Einige Eigenschaften verweisen auf Pfade, die natürlich stimmen müssen, d. h. die mod_jk.so-Datei vorher mit “find” ausfindig machen und den richtigen Pfad hier einsetzen. Das gleiche gilt für die log-Dateien und ganz wichtig: die zuvor angelegte workers.properties:

LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so
JkWorkersFile /etc/apache2/workers.properties
JkLogFile /etc/apache2/mod_jk.log
JkLogLevel debug
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
JkMount /yourWebApp/* worker1
JkMountCopy All

Die vorletzte Zeile (JkMount) gibt an, dass alle Anfragen von /yourWebApp/* zu dem Alias “worker1″ aus der workers.properties-Konfigurations-Datei weitergeleitet werden. Von da geht es dann zu dem dort konfigurierten Host und Port (bei mir localhost:8009) weiter.

ACHTUNG: Wenn man für JkMount /yourWebApp/* konfiguriert, dann darf in der Anfrage das abschließende Slash (“/”) nicht fehlen. Darauf bei eventuellen Weiterleitungen achten! Folgende Anfrage würde funktionieren:

http://yourdomain.com/yourWebApp/

Folgende Anfrage würde NICHT funktionieren:

http://yourdomain.com/yourWebApp

Die letzte Zeile in workers.properties (JkMountCopy All) vererbt die JkMount-Konfiguration auf alle eventuellen VirtualHosts.

Mit JkLogLevel debug fallen sehr viel log-Daten an, ich fahre aktuell ganz gut mit JkLogLevel info.

5 Glassfish konfigurieren

Die Konfiguration des Glassfish erweist sich als denkbar einfach. Über zwei Kommandos muss der jk-connector des Glassfish aktiviert werden:

asadmin create-http-listener --listenerport 8009 --listeneraddress 0.0.0.0 --defaultvs server jk-connector
asadmin set configs.config.server-config.network-config.network-listeners.network-listener.jk-connector.jk-enabled=true

6 Glassfish-Bug beheben

An dieser Stelle kann nach einem Neustart von Apache und Glassfish ein erster Verbindungs-Test vorgenommen werden, d. h. einfach mit einem Browser folgende URL besuchen:

http://yourdomain.com/yourWebApp/

Ohne die soeben vorgenommenen Schritte hätten wir mit Sicherheit eine 404-Seite erhalten, jetzt würden wir aber die Startseite der WebApp erwarten. Dummerweise erschien bei mir nur eine weiße Seite. Immerhin kein 404, was bedeutet, dass Konfiguration zumindest ansatzweise gefruchtet hat. Nach einiger Log-File und Internet-Recherche bin ich auf folgenden Thread gestoßen, der einen Glassfish-Bug behandelt: http://forums.java.net/node/821526.
Der Fix besteht darin, eine Datei im Glassfish auszutauschen, und zwar

grizzly-utils.jar

Diese Datei kann man in dem Thread downloaden. Danach Glassfish neu starten und die Startseite der WebApp sollte erscheinen.

7 Verbindungsprobleme

Einfache WebApps sollten mit dieser Einstellung zumindest grundlegend laufen. Sobald aber ein wenig mehr Last anliegt, dürften bei dieser Konfiguration die ersten Verbindungsprobleme auftreten. Mit Firefox und zugehörigem Plugin “Firebug” kann man sehen, dass manchmal auf eine bestimmte Resource (Bilder, css oder JavaScript-Dateien, manchmal die Seite selbst) sehr lange gewartet wird. Irgendwann (nach ein paar Minuten) wird die Resource aber dann doch noch ausgeliefert. So lange wird ein User natürlich nicht warten.

Anfangs spekulierte ich auf einen Bug in mod_jk, nach einiger Recherche bin ich dann allerdings auf diese Website gestoßen: http://community.jboss.org/wiki/OptimalModjk12Configuration. Dort ist erklärt, dass die Standard-Konfiguration von Apache und mod_jk ungeeignet für den produktiven Betrieb sind. Hauptsächlich geht es um ungünstige Defaults von Timeouts, die entweder viel zu hoch angesetzt sind oder überhaupt nicht greifen.

Die Erklärung auf dieser Seite ist allerdings nicht für Glassfish, sondern für Tomcat. Man kann aber trotzdem einen Großteil der Vorschläge dort umsetzen. In Glassfish selbst ist es ohnehin nur eine Einstellung, und zwar die max-thread-pool-size, die man leicht mit folgendem Kommando auf 200 setzen kann (Default ist 5):

asadmin set configs.config.server-config.thread-pools.thread-pool.http-thread-pool.max-thread-pool-size=200

Die restlichen Konfigurationen für workers.properties und Apache bitte dem Link entnehmen.

Posted in Administration | Tagged , , , , , , , , , | 3 Comments
Nov 12

Programmieren lernen – Teil 3 (Die Programmiersprache)

In diesem Artikel geht es darum, was eine Programmiersprache ist. Wir werden erfahren, dass es mehr als eine Programmiersprache gibt, welche Beziehung die Programmiersprachen zueinander haben, und welche wir verwenden.

Was ist eine Programmiersprache?

Das Thema der Programmiersprache bedarf einer etwas ausführlicheren Erklärung:

Wenn wir uns die Sprache der Menschen ansehen, so wissen wir, dass sie sich erst über Jahrtausende hinweg entwickeln musste, bis wir so kommunizieren konnten, wie wir es heute tun. Als Steinzeitmenschen haben wir vielleicht auch schon kommuniziert. Aber vielmehr als “Mammut, happa happa!” wird es wohl nicht gewesen sein.

So ähnlich kann man sich auch die Entwicklung der Programmiersprachen vorstellen. Auch hier gibt es eine Art Ur-Sprache, auf der alle anderen Sprachen aufbauen. Diese Ur-Sprache wird Maschinensprache genannt. Die allerersten Programme überhaupt mussten mit dieser Maschinensprache erstellt werden, einfach aus dem Grund, weil es noch keine anderen Programmiersprachen gab. Auch heute noch gibt es einige Anwendungsgebiete, zu denen diese “urtümlichste” aller Sprachen eingesetzt wird. Im normalen Entwickler-Alltag ist sie aber nur noch äußerst selten anzutreffen.

Folgendes ist wissenswert: Die angesprochene Ur-Programmiersprache, die Maschinensprache, ist die einzige Sprache, die der Computer in seinem Inneren wirklich versteht. Das Herzstück eines jeden Computers, der Prozessor, spricht nur diese Sprache. Jetzt ist es so, dass es nur deswegen hunderte von weiteren Programmiersprachen geben kann, weil diese wieder zu Maschinensprache zurückübersetzt werden. Das kann man sich ungefähr so vorstellen, dass man im Restaurant beim Ober ein “Steak” bestellt, weil man “Hunger” hat. Egal in welcher Sprache man das zum Ausdruck bringt, im Inneren des Gehirns läuft trotzdem immer noch “Mammut, happa happa!” ab.

Welche Programmiersprache sollst du verwenden?

Die Wahl der Programmiersprache ist eine der ersten Hürden, die man als angehender Programmierer nehmen muss. Und dafür gibt es leider keine Faustregel, die Internetforen sind voll von Diskussionsbeiträgen zu diesem Thema. Eines kann ich aber mit Sicherheit sagen: Noch nie hat jemand eine einstimmige Antwort auf diese Frage erhalten.

Die “beste” Programmiersprache gibt es nicht. Eine Sprache ist leichter zu erlernen als manch andere und gilt daher vielleicht als “Einsteiger”-Programmiersprache. Mit einer anderen Programmiersprache hat man wiederum mehr Möglichkeiten als mit wieder einer anderen. Alle Sprachen haben aus einem bestimmten Grund ihre Daseinsberechtigung.
Vielmehr geht es beim Programmieren darum, dass man die grundlegenden Konzepte und Vorgehensweisen verstanden hat. In diesem Fall kann man mit verschiedenen Sprachen umgehen.

Wir werden in dieser Anleitung mit der Sprache “Java” beginnen. Sie ist in den letzten Jahren zu einer der beliebtesten und weit verbreitetesten Sprachen überhaupt geworden. Aus gutem Grund: Java ist modern und gut strukturiert, man kann sie für sehr viele Anwendungszwecke verwenden und im Internet gibt es eine große Anhängerschaft, bei der man Unterstützung bekommen kann.

Fazit

Wir haben folgendes gelernt: Es gibt eine Ur-Programmiersprache und viele weitere Sprachen, die auf dieser aufbauen. Eine dieser Sprachen heißt Java, welche wir auch verwenden.

Posted in Programmieren lernen | Tagged , , , , | Leave a comment
Nov 11

Programmieren lernen – Teil 2 (Programmieren)

In diesem Artikel soll es darum gehen, was Programmieren eigentlich ist, wie es grundsätzlich funktioniert, und was man alles damit machen kann.

Was ist Programmieren?

Programmieren ist, ganz einfach ausgedrückt, die Tätigkeit Programme zu erstellen. Auf deinem Computer gibt es schon viele Programme: Vielleicht ein Zeichenprogramm, einen Taschenrechner und einen Internet-Browser (Internet Explorer, Firefox, etc.). Ein neues Programm zu erstellen, oder auch ein schon bestehendes Programm zu verändern, nennt man “programmieren”. Wenn man programmiert, dann darf man sich einen “Programmierer” nennen. Nun denn, Willkommen im Club!
Programme, oder allgemeiner ausgedrückt, Software, gibt es nicht nur auf einem PC, sondern auch an vielen anderen Orten. Auf Handys und Smartphones laufen Programme für Kalender und Spiele, auch hinter Internet-Seiten, besonders wenn diese dynamisch aufgebaut sind, laufen Programme um die Seiten zusammen zu bauen. Sogar in modernen Haushaltsgeräten und Autos wird Software ausgeführt, um die Funktionen dieser Geräte zu steuern. All diese vielfältigen Möglichkeiten stehen einem mit der Programmierung zur Verfügung.
Ein weiteres Wort für “programmieren” ist auch “entwickeln”, somit ist ein Synonym für “Programmierer” auch “Entwickler”, oder “Software-Entwickler”, da Programme ja Software sind.

Wie programmiert man?

Wie gerade gehört muss man programmieren, um ein Programm zu erhalten. Nur wie genau geht das? Wie programmiert oder entwickelt man Software? Die Antwort: Man muss dem Computer ganz genau erklären, was in dem Programm, dass man erstellen möchte, geschehen soll. Genauer ausgedrückt: Man erteilt dem Computer Befehle. Der Computer führt diese Befehle aus. Ein Programm besteht aus einer Vielzahl von solchen Befehlen. Ein kleines, langweiliges Beispiel: Stellen wir uns vor, wir möchten einen Taschenrechner programmieren. Als Programmierer gebe ich dem Computer den Befehl, dass im Textfeld oben im Taschenrechner die “3″ erscheinen soll, wenn der Benutzer des Taschenrechners auf die Taste “3″ drückt. Solche Befehle erteile ich auch noch für alle anderen Nummerntasten. Dann soll der Benutzer des Taschenrechners auch noch die Tasten “Plus”, “Minus”, “Mal” und “Geteilt” drücken können. Dabei soll jedesmal das entsprechende Rechenzeichen im Textfeld des Taschenrechners oben erscheinen. Wenn ich dem Computer nicht den genauen Befehl erteilen würde, was passieren soll, wenn die Tasten gedrückt werden, dann würde auch nichts passieren. Aber ich erteile diese Befehle, ich programmiere…

Ein weiterer Befehl wäre beispielsweise, dass der Computer die Rechenaufgabe, die der Benutzer durch Drücken der genannten Tasten eingegeben hat, ausrechnen, und das Ergebnis dann in das Textfeld des Taschenrechners schreiben soll. So ergibt sich mit der Zeit eine Sammlung von Befehlen, die genau beschreiben, wie das Programm, der Taschenrechner, funktioniert.

Sehen wir uns einmal folgenden Befehl an:

"Computer, ich befehle dir, wenn der Benutzer die
Taste "3" drückt, soll die Zahl "3" im Textfeld
des Taschenrechners erscheinen."

Unglücklicherweise versteht der Computer diesen Befehl nicht. Er kann diesen menschlichen Satz nicht interpretieren, weil er die Menschen-Sprache nicht versteht. Und selbst wenn der Computer fähig wäre, diesen Befehl zu verstehen… Wo hättest du diesen Satz hinschreiben sollen?

Aber wie funktioniert es denn nun? Wie bringen wir den Computer dazu, uns zu verstehen? Das Geheimnis ist: Die Programmiersprache! Wie bereits erklärt, können wir einem Computer keine menschlichen Befehle geben. Wir müssen ihm Computer-Befehle geben. Wenn wir wollen, dass der Computer Befehle ausführt, müssen wir ihm diese auch so formulieren, wie er sie verstehen kann. Und zwar in einer Programmiersprache, die wir erlernen müssen.

Geht das nicht einfacher?

Der Text hat bis zu diesem Zeitpunkt vermutlich schon deutlich gemacht, dass die Erstellung eines Programms ein technischer Vorgang ist. Zur Beruhigung sei aber gesagt: Computer, sowie auch die Programmiersprachen sind von Menschen gemacht, und deshalb darauf ausgelegt, auch von Menschen verstanden zu werden. Ein wenig logischen Verstand vorausgesetzt …

Womit fangen wir an?

Lasst uns einen Blick nach vorne werfen. Was soll das erste Programm sein, das wir erstellen? In dieser Anleitung beginnen wir mit der Erstellung eines kleinen Computerspiels. Es wird ein kleines aber feines Abenteuer-Spiel werden, ganz ähnlich den Spielbüchern (Wikipedia – Spielbuch), nur dass dies logischerweise kein echtes Buch wird, sondern die Computer-Programm-Variante davon.
In einem Spielbuch beginnt der Leser wie gewöhnlich am Anfang des Buches. Er gelangt dann aber an eine Stelle, an der er sich entscheiden muss, auf welcher Seite er weiter lesen möchte. Meist kann er zwischen zwei oder drei Möglichkeiten auswählen. Beispiel:

"Du kommst an eine Weggabelung.
Möchtest du nach links gehen, dann lies weiter auf Seite 54,
möchtest du nach rechts gehen, lies weiter auf Seite 117."

So hangelt sich der Leser (oder Spieler) dieses Buches durch eine Geschichte, die nicht von Vornherein festgelegt, sondern recht dynamisch ist, fast wie ein Computerspiel.

Die Hauptfigur in unserem Spiel ist ein Abenteurer. Man kann an verschiedene Ort reisen und sich entscheiden, was man dort tun möchte. Mithilfe einer Programmiersprache stehen uns natürlich deutlich mehr Möglichkeiten für die Erstellung dieses Spiels zur Verfügung, als in einem herkömmlichen Spielbuch. Wir werden unsere Spielfigur nicht nur von einem Ort zum anderen reisen lassen, sondern können sie auch Gegenstände in eine virtuelle Tasche stecken und sie Kämpfe austragen lassen. Noch vieles Mehr ist möglich, dieses verbesserte, interaktive Buch ist nur der Anfang. Der Fantasie sind keine Grenzen gesetzt!

P. S.
Eines möchte ich noch erwähnen: Dieses Abenteuer-Spiel wird nicht das allererste Programm sein, das wir erstellen. Kurz vorher werden wir uns noch einer Programmierer-Tradition beugen. Diese besagt, dass das erste Programm immer das “Hallo Welt!”-Programm sein muss, dazu aber später mehr!

Fazit

In diesem Artikel haben wir gelernt, das Programmieren die Tätigkeit ist, dem Computer Befehle zu erteilen, die ganz genau ausdrücken, was der Computer machen soll, und dass man dies auch Software-Entwicklung nennt. Dies geschieht in einer Sprache, die der Computer versteht, der Programmiersprache. Wir werden diese Erkenntnis einsetzen, um erst ein “Hallo Welt!”-Programm, und dann ein kleines Computerspiel zu erstellen.

Posted in Programmieren lernen | Tagged , , , , , , | Leave a comment
Nov 11

Programmieren lernen – Teil 1 (Einleitung)

Herzlich Willkommen zur Artikel-Serie “Programmieren lernen”!
Dieser Artikel ist die Einleitung, eine Erklärung, worum es überhaupt geht.

Wie lernt man Programmieren?

Du möchtest also wissen, wie man Programmieren lernt… Vielleicht hast du ja schon ein bisschen im Internet herum gesucht, aber keine passende und einfache Antwort gefunden. Oder die Antworten waren zu ausführlich und voll mit Fachbegriffen, auf die du dir keinen Reim machen konntest. Alle Erklärungen, die Du gefunden hast, setzten schon Grundlagen voraus, klangen kompliziert oder aufwendig. Vielleicht kennst Du ja das Wort “programmieren”, vielleicht auch “Programmiersprache”. Du weißt aber nicht, was das genau ist, oder was man damit macht? Eventuell bist du sogar über Begriffe wie “C”, “C++”, “Java” oder “Basic” gestolpert, nur was das alles bedeutet und was man damit anfangen soll, ist dir nicht klar…

Das macht alles nichts: Hier bist du hier genau richtig!

Was kannst du von dieser Anleitung erwarten?

Dies ist eine Anleitung, wie du programmieren lernen kannst. Das Besondere daran: Für diese Anleitung sind keinerlei Vorkenntnisse nötig! Alles was du wissen musst, werde ich von Grund auf, Stück für Stück erklären.
Um Programmieren zu lernen, musst du keine jahrelangen Anstrengungen auf dich nehmen, bevor du die ersten Ergebnisse erzielst. Programmieren macht Spaß, und schon nach den ersten Stunden wirst du Erfolgserlebnisse erzielen. Lies einfach diese Anleitung, hier erkläre ich dir alles haarklein und ganz genau.

Wie fängst du an?

Tatsächlich fällt der Einstieg in die Programmierung ohne eine genaue Anleitung recht schwer. Deswegen habe ich mich auch dazu entschlossen, diese Anleitung zu schreiben. Man muss allerdings wissen: Die Schwierigkeit liegt weniger im Thema an sich. Programmieren ist nicht kompliziert. Aber Programmierung besteht aus einigen Teilgebieten. Und gerade am Anfang ist es schwer, einen Überblick über diese Teilgebiete zu bekommen und zu verstehen, wie man diese benutzt, und welche man vielleicht anfangs gar nicht benötigt. Auch gibt es für die gleiche Zielsetzung oft eine Vielzahl von unterschiedlichen Lösungsmöglichkeiten. So ist es schlicht unmöglich, ohne Irrwege einen guten Einstieg zu finden.

Aber damit ist jetzt Schluss: Sieh diese Anleitung als eine Karte durch den Dschungel, um von Grund auf Programmieren zu lernen. Der Dschungel ist riesig und es gibt unendlich viele Wege zum Ziel, aber unendlich viele Wege mehr, die nirgendwo hin führen. Der Weg mit dieser Anleitung führt auf jeden Fall zum Ziel, und ich werde dich bei jedem Schritt begleiten.

Was ist, wenn du etwas nicht verstehst?

Es können immer Fragen auftauchen, die in dieser Anleitung noch nicht behandelt werden. Bitte zögere nicht, Kontakt mit mir aufzunehmen! Ich werde versuchen, die betreffende Stelle im Text zu verbessern oder zu erweitern. Jede noch so kleine Anregung oder Verbesserungsvorschlag ist wichtig, um diesen Text immer besser werden zu lassen.

Kostet es Geld?

Nein! Alles was du benötigst, um diese Anleitung durch zu arbeiten, ist kostenlos verfügbar.

Was brauchst du?

Lediglich ein PC mit Windows, Linux oder MacOS wird vorausgesetzt.

Was sind die Voraussetzungen?

Wie weiter oben versprochen, sind für diese Anleitung keinerlei Vorkenntnisse nötig. Lediglich grundsätzliche Computerkenntnisse, wie beispielsweise das Anlegen und Verwalten von Dateien und Ordnern, wird vorausgesetzt.

Fazit

Nach diesem Einleitungs-Artikel ist dir hoffentlich klar, worum es genau in der Artikel-Serie “Programmieren lernen” geht. Ich hoffe, du findest die Artikel-Serie “Programmieren lernen” hilfreich und ich kann dir einen Teil meiner grenzenlosen Faszination für das Programmieren weitergeben.

Posted in Programmieren lernen | Tagged , , , , , , , , | Leave a comment