Onlinekurs „Französisch ohne Mühe“ fertig





Ich habe die letzten Wochen das Sprachmodul weiter entwickelt, über das man online Sprachen lernen kann (also eine moderne RIA, die auf AJAX sowie Dojo und Prototype aufsetzt und zur Wiedergabe und Aufnahme von Tondateien zudem Java und Flash einsetzt).

Das Modul stellt einmal Texte in der Fremsprache und Deutsch dar, spielt die englischen Sätze als Tondateien ab, beinhaltet ein kleines Tonstudio, um eigene Sprachübungen aufzunehmen und bietet verschiedene Übungstechniken zum Vertiefen der erlernten Sprachkenntnisse.
Heute ist der Kurs Französisch ohne Mühe fertig geworden.

Ich habe die RIA so konzipiert, dass die Erweiterung auf neue Sprachen mit relativ geringem Aufwand möglich sein sollte.
Der Prototyp war ein Englischkurs für Einsteiger (Englisch ohne Mühe) und nach dessen Livetests habe ich nun mit dem Französischkurs die erste Anpassung an eine neue Sprache bis zur Praxisreife durchgezogen.
Schon der Prototyp war gar nicht schlecht konzipiert, denn die Anpassung ging recht glatt. Und mit zwei verschiedenen Sprachmodulen habe ich jetzt ein gute Testbasis, um die Integration von weiteren Sprachen immer leichter möglich zu machen. Die Anpassung an Französisch hat das Programm insgesamt vorangebracht und ich setzte die Versionsnummer auf 0.96 hoch. Also meiner Meinung nach fast fertig.

Als nächstes gehe ich Italienisch an und der Fortgeschrittenenkurs Englisch funktioniert ja auch schon im Groben.

Hier geht es zur Anmeldung zu den Sprachkursen, die in Zusammenarbeit mit dem Verlag ASSIMIL GmbH und dem Arbeitskreis für Information – AKI RP/Eifel progammiert und vertrieben werden.

Technisch handelt es sich bei dem Programm wie gesagt um eine RIA (Rich Internet Application) auf Basis von PHP, MySQL, DHTML, AJAX sowie den AJAX-Frameworks Dojo Toolkit und Prototype. Daneben kommen noch Flash und Java zur Unterstützung von Multimediaeffekten zum Einsatz.
Um deshalb ein bisschen Werbung in eigner Sache zu machen – viele Grundlagen der Umsetzung findet man in meinem Buch Ajax Frameworks.



Als Verwaltungsplattform verwenden wir ILIAS, eine leistungsstarke, web-basierte Lernplattform für E-Learning in einem integrierten System (Persönlicher Schreibtisch, Kursmanagement, Gruppensystem, Magazin mit Rollen-basiertem Zugriff, …).

Kleine Animation mit JavaFX Script

Der nachfolgende Quelltext zeigt eine kleine Animatin, die mit den mächtigen Komponenten in JavaFX Script auf einfachste Weise erzeugt werden kann.

Erstellt mit der Finalversion 1.0 von JavaFX!


/*
* Main.fx
* Eine kleine Animation mit JavaFX Script
*
* Created on 27.01.2009, 12:11:28
* Copyright Ralph Steyer, www.rjs.de, RJS EDV-KnowHow
*/

package gui7;

import javafx.animation.Interpolator;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.Scene;
import javafx.stage.Stage;

var x=0;
var y=0;
var bild =ImageView {
translateX: bind x
translateY: bind y
image: Image {
url: "https://rjs.de/bilder/devil.gif"
}
}
Timeline {
repeatCount: Timeline.INDEFINITE
keyFrames: [
KeyFrame {
time: 5s
canSkip: true
values: x => 150

},
KeyFrame {
time: 8s
values: y => 80 tween Interpolator.LINEAR


}
]
}.play();
Stage {
title: "Animationen"
width: 250
height: 250
scene: Scene {
content: [bild]
}
}

Und hier ein kleiner Formulargag mit Scriptaculous für AJAX

Den so genannten In.Place-Editor von Scriptaculous find ich klasse. Klicken Sie mal auf den Text in dem IFrame. Da wird ein normaler Text editierbar ohne die sonst üblichen häßlichen Formulareingabefelder in der Webseite anzuzeigen, wenn der Inhalt nur angezeigt werden soll.

Auch aus meinem Buch Ajax Frameworks



So geht’s:

<!DOCTYPE HTML PUBLIC „-//W3C//DTD HTML 4.01//EN“
 „https://www.w3.org/TR/html4/strict.dtd“>
<html>
 <head>
   <meta http-equiv=“Content-Type“
     content=“text/html; charset=iso-8859-1″ />
   <title>Scriptaculous</title>
   <script type = „text/javascript“
     src=“prototype-1.6.0.3.js“></script>
   <script  type=“text/javascript“
 src=“scriptaculous-js-1.8.2/src/scriptaculous.js“></script>  
 </head>
 <body>
   <h1>AJAX-Anfrage mit Ersetzen eines Textes</h1>
<div id=“klickmich“>Klick mich an um mich zu bearbeiten und dann zu ersetzen</div>
<script type=“text/javascript“>
new Ajax.InPlaceEditor(‚klickmich‘, ‚info.php‘);
</script>
</body>
</html>

Kleiner Dojo-Effekt für die Webseite

Hier ist ne kleine Dojo-Anination für die Webseite.

Aus meinem Buch Ajax Frameworks



So geht’s:
<!DOCTYPE html PUBLIC „-//W3C//DTD XHTML 1.0 Transitional//EN“
   „https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>
<html xmlns=“https://www.w3.org/1999/xhtml“>
<head>
<meta name=“generator“ content=
„HTML Tidy for Windows (vers 14 February 2006), see www.w3.org“ />
<title>Animationen mit Dojo</title>

<script type=“text/javascript“ src=
„https://o.aolcdn.com/dojo/1.2/dojo/dojo.xd.js“ djconfig=
„parseOnLoad: true, isDebug:false“>
</script>
<script type=“text/javascript“>
//<![CDATA[
     dojo.require(„dojo.fx“);
     dojo.addOnLoad(function(){
   var anim = dojo.fadeOut({ node: „meineID“, duration:5000 });
   var anim2 = dojo.fadeIn({ node: „meineID“, duration:6000 });
   dojo.fx.chain([anim,anim2]).play();
     });
//]]>
</script>
</head>
<body>
<h1>Aus- und Einblenden</h1>
<img src=“b5.jpg“ id=“meineID“ name=“meineID“ />
</body>
</html>

Wieder zuhause

Bin wieder zuhause. Der Rückflug heute morgen war unmenschlich früh. Schon um 6:20 Uhr ab Graz. Dafür war ich um 9:00 Uhr schon im Büro. Manche Leute haben jeden Tag so eine Anreisezeit zur Arbeit ;-).
Und irgendwie wollen da ganz viele Leute nach Frankfurt. War ausnahmsweise mal ein etwas größerer Jet und im Gegensatz zu sonst nicht von Eurowings, sondern Lufthansa selbst.

That’s it

Fertisch!

Auch das Onlinetraining zu JavaFX Script ist eingespielt. Ist allerdings erheblich umfangreicher geworden als ich geplant hatte. Gibt halt doch ne Menge zu dem Thema zu sagen.

Jetzt noch ein paar Abschlussarbeiten und dann ist mein Job in Graz erledigt. Morgen fliege ich zurück. Dummerweise schon um 6:20 Uhr. Eckelhaft!

Ansonsten gab es auch dieses Mal Filmaufnahmen. Ich musste heute noch zwischenzeitlich ins Filmstudio und musste zu den 4 Trainings was vor der Kamera loslassen. Dachte eigentlich, dass das nur bei DVDs üblich ist. Und ich habe erstmals mit einem Teleprompter gearbeitet, von dem ich meinen Text während der Filmaufnahmen abgelesen habe. Das ist ja tierisch anstrengend.

Das war der dritte Streich

Ist schon toll. Andere Leute sagen, dass heute Sonntag ist ;-). Aber ich habe nicht viel davon mitbekommen in meinem abgeschlossenen Tonstudio (ohne Fenster). Egal. Das dritte Onlinetraining ist eingespielt und ich bin gut in der Zeit. Bis Dienstagabend muss ich noch ein Training zu JavaFX Script einspielen und bisher habe ich etwa 1,5 Tage pro Training gebraucht.

Los geht es mit den Videotrainings

Ich bin in Graz bei Video2Brain angekommen und nehme jetzt erst einmal ein Onlinetraining zu AJAX auf. Die Anreise war problemlos, nur hab ich aus dem Flugzeug rein gar nix gesehen. In einer Mittelreihe direkt am Triebwerk gesessen. Egal – kenne die Route ja mittlerweile recht gut ;-).
Ansonsten wohne ich nicht wie sonst in der Trainerwohnung, sondern in einem Hotel. Keine selbstverpflegung möglich, aber zumindest gibt es Frühstück. Sind richtig viele Trainer hier gerade am Aufnehmen.

Windows 7

Ich halte zwar – wie immer wieder betont – Linux für das Betriebssystem, das den besten Kompromiss aus Sicherheit, Benutzerfreundlichkeit und Leistungsfähigkeit bietet (ohne MacOS genau zu kennen, was angeblich ebenso gut sein soll). Aber ich habe auch keine Berührungsängste mit Windows zu arbeiten. Die meisten Versionen von Windows haben durchaus ihre Qualitäten (insbesondere im Massenmarkt) und ich habe weder Zeit noch Lust rein aus dogmatischen Gründen an meinem geliebten Linux zu kleben. Wenn es Sinn macht oder notwendig ist, verwende ich auch Windows. Z.Z ausschließlich XP, denn ältere Versionen sind einfach nicht mehr zeitgemäß. Und dass Hasta la Vista neben ME der größte Flopp der Windows-Reihe ist braucht nicht diskutiert werden.

Aber wenn die ersten Berichte stimmen hat Microsoft aus dem Vista-Disaster gelernt und mit Windows 7 ein gutes System hingelegt, das es seit ein paar Tagen in einer Betaversion zum kostenlosen Download und Test gibt. Die Version soll bis August 2009 laufen. Das Teil muss ich mir unbedingt ansehen und dazu in einer VM installieren. Das soll angeblich recht problemlos gehen.

Hab mir gerade eine Windows Live ID besorgt (leider vor dem Download notwendig) und aktuell lade ich mir gerade das ISO-File. Dazu kommt ein Downloadmanager zum Einsatz. Und der ist in – festhalten – Java geschrieben! Zumindest wenn man die Sache mit Firefox durchzieht. Ich fasse es nicht. Auch Microsoft verliert Berührungsängste ;-). Alles wird gut ;-).

Datenumzug unter erschwerten Bedingungen

Musste beim Datenumzug helfen. Von einem Uralt-Pentium 2 mit Windoof 98 auf einen Neurechner mit Witzda. Ohne Netzwerk oder Internet. Man was eine Aktion.

Der Uraltrechner kommt mit USB-Sticks etc. nicht zurecht und der Neurechner hat natürlich keine Altschnittstellen oder gar ein Diskettenlaufwerk. Ich musste mein Notebook als Zwischenstation verwenden, um die Daten per Diskette vom Altrechner zu sichern und da auf den USB-Stick schieben, den dann der Neurechner nutzen konnte. Der Sch… hat dermaßen Nerven gekostet. Leute – sichert die Daten auf Altrechner rechtzeitig und tauscht Rechner nicht erst nach 10 Jahren aus.

Und ich konnte endlich mal wieder mit Vista arbeiten. War wichtig – ich hatte in der Tat mit dem Gedanken gespielt auf meinem nächsten Rechner Vista zu nehmen. Bin wieder kuriert. Bloß nicht. Nicht dass XP gut ist, aber zumindest nicht so eine Katastrophe wie Witzda. Ich hoffe mal, dass das neue Windows endlich ein guter Wurf wird und damit auch wirklich mit Linux mithalten kann (was ich in ersten Tests gelesen habe, ist ja ganz vielversprechend). Würde gerne dieses Jahr einen neuen Rechner anschaffen, aber nicht mit Wischda. Und Linux werde ich sowieso immer parallel fahren.

Minuend – was bitte?

Heute kamen meine Kinder mit einem Lehrplan nach Hause, was Sie bis zum Ende der Grundschule noch alles in Mathematik lernen sollen. Unter anderem tauchte der Begriff Minuend auf. Toll – zwar habe ich 12 Semester Mathematik studiert, aber das Wort ist mir noch nie unter gekommen. Musste gleich mal im Internet suchen, ob es diesen Begriff wirklich gibt oder nur ein Kunstwort der Bildungsmissere ist. Aber anscheindend benutzen Leute diesen Begriff wirklich. Ob es das bringt für die Grundrechenarten Kindern Worte unterzujubeln, die selbst Mathematiker, Bankfachwirte, und weitere Zahlenakkrobaten nicht kennen?

Weitere Sprachen für den Onlinekurs

Wie schon an anderer Stelle gespostet, programmiere ich derzeit ein Sprachmodul, über das man online Sprachen lernen kann.

Ich habe die RIA so konzipiert, dass die Erweiterung auf neue Sprachen mit relativ geringem Aufwand möglich sein sollte. Nachdem der Englischkurs für Einsteiger seit einigen Tagen im Livetest ist, habe ich gestern mit zwei weiteren Kursen erste Experimente gemacht. Das bedeutet im Wesentlichen, dass jeweils neue Tondateien bereitgestellt werden und eine neue Datenbank hinzukommt. Danach werden ein paar Parameter im Programm angepasst und die Sache sollte gehen. Und in der Tat – die ersten Tests sehen absolut vielversprechend aus. Der Fortgeschrittenenkurs Englisch und der Einsteigerkurs Französisch funktionieren im Groben. Ich muss wahrscheinlich nur noch den Quellcode etwas mehr modularisieren bzw. Texte auslagern und die Texte in der Datenbank an die RIA anpassen – dann sollte es gehen. Wäre super, wenn sich neue Sprachen wirklich so einfach einbauen ließen. Dann hätte ich den Prototypen doch gar nicht so dumm konzipiert (Hoffnung 😉 ).
Für einen kurzen Zeitraum können Sie das Sprachprogramm auch kostenlos testen.

JavaFX-Kurs

Ich halte gerade meinen ersten Kurs in JavaFX Script. Zwar habe ich so einen Kurs schon seit einigen Monaten angeboten, aber bisher war die Resonanz null. Aber heute und morgen läuft sozusagen der Prototyp. Es ist auch für mich sehr interessant den aktuellen Stand der Finalversion von JavaFX nochmal im Detail anzusehen und mit den Kenntnissen zu vergleichen, die ich mir auf Grund der Vorversionen erarbeitet hatte.
JavaFX Script ist alles in Allem richtig rund geworden, aber in diversen Details muss man als Java-Programmierer schon ziemlich schlucken. Die Abweichungen zu reinem Java sind teilweise ziemlich heftig.
Dennoch – ich verspreche JavaFX eine durchaus interessante Marktchance. Vor allen Dingen durch die darunter liegenden Java-Basis, die ja praktisch auf jedem Computer und den meisten Customergeräten sowieso vorhanden ist.

RJSKryp for JavaFX

Ich erstelle schon seit Jahren immer wieder verschiedene Varianten von einem Kodierungsprogramm, das ich unter dem Namen RJSKryp laufen lasse.
Mittlerweile gibt es verschiedenste Java-Varianten, die teils mit einer GUI, teils ohne GUI auskommen. Es vor einigen Wochen habe ich ja auch hier im Blog eine neue Version gepostet.

Durch die wachsende Popularität von JavaFX und vor allen Dingen das Erscheinen der Finalversion lag es nun für mich sehr nahe, eine Abwandlung auf Basis von JavaFX zu erstellen.

Die neue Version RJSKryp for JavaFX ist nun ein Kodierungsprogramm für beliebige Dateien, das in wesentlichen Punkten mit JavaFX Script erstellt wird (insbesondere die GUI). Für die konkreten Dateizugriffe wird Java selbst verwendet und es werden auch Swing-Komponenten direkt eingebunden. Man kann hier also auch das direkte Zusammenspiel zwischen JavaFX Script und Java erkennen.

Das Programm verwendet zum Kodieren und Dekodieren von Dateien wie die anderen Varianten einen Verschlüsselungs- und Entschlüsselungalgorithmus, der auf einer Verschiebung der Zeichenkodierung basiert. Der verwendete Algorithmus ist auf Grundlage der Cäsar-Chiffre konzipiert. Dies ist ein einfacher Verschiebungsalgorithmus. Diese Verschlüsselungsmethode lautet wie folgt: für jeden im Quelltext vorkommendes Zeichen setze im Chiffretext einen um einen festen Parameter versetztes Zeichen.

Hier ist nun ein Webstart-Aufruf für die Applikation
Auruf als Java-Applet über eine neue Webseite

Der Quelltext

RJSKryp.fx

/*
* RJSKryp.fx
*
* Created on 02.01.2009, 11:33:02
*/

package rjskryp;

import java.lang.System;
import javafx.animation.Interpolator;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.ext.swing.SwingButton;
import javafx.ext.swing.SwingHorizontalAlignment;
import javafx.ext.swing.SwingLabel;
import javafx.ext.swing.SwingSlider;
import javafx.ext.swing.SwingTextField;
import javafx.scene.effect.DropShadow;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.paint.RadialGradient;
import javafx.scene.paint.Stop;
import javafx.scene.Scene;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.scene.text.TextAlignment;
import javafx.scene.transform.Scale;
import javafx.stage.Stage;
import javax.swing.JFileChooser;
import rjskryp.Kodier;

/**
* @author Ralph Steyer – RJS EDV-KnowHow – www.rjs.de
* Kodierungsprogramm mit JavaFX Script
*
* Hauptprogramm – die GUI im Wesentlichen mit JavaFX Script, die Kodierung selbst Java
*
* Das Programm verwendet zum Kodieren und Dekodieren von Dateien einen Verschlüsselungs-
* und Entschlüsselungalgorithmus, der auf einer Verschiebung
* der Zeichenkodierung basiert. Der verwendete Algorithmus ist auf
* Grundlage der Cäsar-Chiffre konzipiert. Dies ist ein einfacher
* Verschiebungsalgorithmus. Diese Verschlüsselungsmethode lautet wie folgt:
* für jeden im Quelltext vorkommendes Zeichen setze im Chiffretext einen um
* einen festen Parameter versetztes Zeichen.
*/

var scale = 1.0;
var color = Color.SILVER;
Timeline {
repeatCount: Timeline.INDEFINITE
keyFrames: [
KeyFrame {
time: 10s
canSkip: true
values: [
scale => -1.0 tween Interpolator.EASEBOTH
color => Color.BLUE
]
}
]
}.play();
var f = new JFileChooser(); // Eine Swing-Komponente aus javax.swing

var label1=SwingLabel {
font:Font{
name:“Tahoma“
size: 25
}
text: „RJSKryp for JavaFX – Version 1.01 – www.rjs.de“
foreground:Color.SILVER
horizontalAlignment:SwingHorizontalAlignment.CENTER
width:600

}

var meinSlider=SwingSlider {
minimum: 0
maximum: 255
value: 3
vertical: false
}

var buttonGruppe=HBox{
spacing: 10
translateY:50
translateX:100
content:[
SwingButton {
text: „Kodieren“
action: function() {
var returnVal = f.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
var quelle = f.getSelectedFile();
returnVal = f.showSaveDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
var ziel = f.getSelectedFile();
if (ziel.exists()) then {
nachrichten1.text =
„Achtung! Zieldatei schon vorhanden. Vorgang wird abgebrochen“;
}
else {
nachrichten1.text =“Verarbeitung läuft“;
nachrichten2.text =““;
if (
new Kodier().kodiere(quelle, ziel, true,meinSlider.value) == 0) then {
nachrichten1.text =
„Verarbeitete Datei:n {quelle}“;
nachrichten2.text =
„Erstellte Datei:n {ziel}“;
}
else {
nachrichten1.text=“Fehler bei der Verarbeitung“;
}
}
}
}
else {
nachrichten1.text =““;
nachrichten2.text =““;

}

}
},
SwingButton {
text: „Dekodieren“
action: function() {
nachrichten1.text =“Verarbeitung läuft“;
nachrichten2.text =““;
var returnVal = f.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
var quelle = f.getSelectedFile();
returnVal = f.showSaveDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
var ziel = f.getSelectedFile();
new Kodier().kodiere(quelle, ziel, false,meinSlider.value);
}
}

}
},
SwingButton {
text: „Ende“
action: function() {
System.exit(0);
}
}
,
meinSlider
]

}
var verschiebung=SwingLabel {
text: bind „Verschiebungsfaktor: {meinSlider.value}“
foreground:Color.SILVER
translateX:400
translateY:80
font:Font{
name:“Tahoma“
size: 12
}
width:300
}
var nachrichten1=SwingTextField {
columns: 10
text: „“
editable: false
translateX:10
translateY:150
foreground:Color.RED
font:Font{
name:“Tahoma“
size: 12
}
width:575
height:20
background:Color.SILVER

}
var nachrichten2=SwingTextField {
columns: 10
text: „“
editable: false
translateX:10
translateY:170
foreground:Color.RED
font:Font{
name:“Tahoma“
size: 12
}
width:575
height:20
background:Color.SILVER

}

Stage {
title: „RJSKryp for JavaFX – Version 1.01 – www.rjs.de“
width: 600
height: 400
scene: Scene {
fill:RadialGradient {
centerX: 375
centerY: 175
radius: 390
proportional: false
stops: [
Stop {
offset: 0.0
color: Color.BLUE},
Stop {
offset: 1.0
color: Color.BLACK}
] // stops

} // RadialGradient
content: [VBox{
spacing: 10
content:[
label1
]
},
buttonGruppe,
verschiebung,
nachrichten1,
nachrichten2,

Text {
translateX:200
translateY:150

font: Font {
size: 14
}
x: 110,
y: 90
textAlignment: TextAlignment.CENTER
content:“RJS EDV-KnowHownnCopyright: Ralph SteyernInternet: www.rjs.de – www.javafx-buch.denBlog: rjsedv.blogspot.com“
fill: bind color
effect: DropShadow {
offsetX: 10
offsetY:5
color: Color.color(0.2, 0.2, 0.1)
}; // DropShadow
transforms: Scale{
x: 1
y: bind scale
pivotX: 100,
pivotY: 100
} // Scale
} //Text

]
}
visible:true
}

Kodier.java

package rjskryp;

/**
* @author Ralph Steyer – RJS EDV-KnowHow – www.rjs.de
* Kodierungsprogramm mit JavaFX Script
* Java-Klasse zur Bereitstellung der Dateizugriffe und der eigentlichen Kodierung
*/
import java.io.*;

public class Kodier {

/**
* Die Methode zum Kodieren und Dekodieren. Dazu wird ein Verschlüsselungs-
* und Entschlüsselungalgorithmus implementiert, der auf einer Verschiebung
* der Zeichenkodierung basiert. Der verwendete Algorithmus ist auf
* Grundlage der Cäsar-Chiffre konzipiert. Dies ist ein einfacher
* Verschiebungsalgorithmus. Diese Verschlüsselungsmethode lautet wie folgt:
* für jeden im Quelltext vorkommendes Zeichen setze im Chiffretext einen um
* einen festen Parameter versetztes Zeichen.
*
* Als Übergabeargumente werden die Quelldatei und Zieldatei sowie ein Flag
* zur Steuerung, ob Kodieren oder Dekodieren, und die Verschiebung
* angegeben
*
* @param quelle2
* zu kodierende oder dekodierende Datei
* @param ziel2
* die Zieldatei mit dem veränderten Inhalt
* @param kodieren
* Angabe ob kodieren (true) oder dekodiern (false)
* @param verschiebung
* Faktor der Verschiebung
*/
public int kodiere(File quelle2, File ziel2, boolean kodieren,
int verschiebung) {
// Erstellen eines Eingabe- und eines
// Ausgabestroms.

// Quelle nur zum Lesen öffnen
RandomAccessFile quelle=null, ziel=null;
try {
quelle = new RandomAccessFile(quelle2, „r“);
ziel = new RandomAccessFile(ziel2, „rw“);
while (true) {
// Einlesen eines Bytes aus der Quelle
byte b = (byte) quelle.readByte();
/*
* Hier findet die Verschiebung statt. Wir kümmern uns selbst um
* den Wertebereich von dem Datentyp byte, indem wir den
* Modulo-Operator verwenden.
*/
if (kodieren)
b = (byte) ((b + verschiebung));
else
b = (byte) ((b – verschiebung));
// Schreiben eines Bytes in die Zieldatei
ziel.writeByte(b);
}
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
return 1;
}

// Dateiende der Quelldatei erreicht.
catch (EOFException e) {
try {
quelle.close();
ziel.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

return 0;
} catch (IOException e) {
return 2;
}

}

}

Kurs Englisch ohne Mühe

Die letzten Wochen und Monate habe ich in Zusammenarbeit mit dem Verlag ASSIMIL GmbH und dem Arbeitskreis für Information – AKI RP/Eifel ein Sprachmodul progammiert, über das Sie online Sprachen lernen könnnen.

Technisch handelt es sich um eine RIA (Rich Internet Application) auf Basis von PHP, MySQL, DHTML, AJAX sowie den AJAX-Frameworks Dojo Toolkit und Prototype. Daneben kommen noch Flash und Java zur Unterstützung von Multimediaeffekten zum Einsatz.

Das Modul stellt einmal Texte in Englisch und Deutsch dar, spielt die englischen Sätze als Tondateien ab, beinhaltet ein kleines Tonstudio, um eigene Sprachübungen aufzunehmen und bietet verschiedene Übungstechniken zum Vertiefen der erlernten Sprachkenntnisse.

Als Verwaltungsplattform verwenden wir ILIAS, eine leistungsstarke, web-basierte Lernplattform für E-Learning in einem integrierten System (Persönlicher Schreibtisch, Kursmanagement, Gruppensystem, Magazin mit Rollen-basiertem Zugriff, …).

Mein Sprachmodul wird nach einer Anmeldung als HTML-Lernmodul in einem eigenen Browserfenster zur Verfügung gestellt.


Der Kurs Englisch ohne Mühe (als auch die geplanten Kurse für andere Sprachen) präsentiert einem Lernenden die Sprache so, wie man ihr im täglichen Leben begegnet (die so genannt Assimilmethode). Durch den lebendigen Kontext werden sich Lernende sehr schnell wohlfühlen. Die Assimilmethode bietet eine natürliche Progession: Lassen Sie sich leiten, und Sie werden sehr bequem Ihr Ziel erreichen. Dieser konkrete erste Kurs richtet sich sowohl an Personen, für die das Englische noch eine völlig unbekannte Sprache ist, als auch an Personen, die bereits über ein wenig Englischkenntnisse verfügen und diese gerne auffrischen möchten. Es vermittelt in 110 Lektionen modernes und lebensnahes Englisch. Insgesamt umfasst der Wortschatz, den Sie in diesem Kurs erlernen, ca. 3000 Vokabeln.


Für einen kurzen Zeitraum können Sie das Modul kostenlos testen

Neue Umstiegsanleitung für JavaFX Script

Wie schon versprochen hab ich die Umstiegsanleitung von altem JavaFX-Code auf die Finalversion überarbeitet. Hier ist die angepasste Umstiegsanleitung.

Wer bereits mit JavaFX Script auf Basis erster Preversionen seit etwa Mitte 2007 programmiert hat, wird in der nun Ende 2008 erschienenen Finalversion 1.0 mit einigen Änderungen bzw. Umstrukturierungen konfrontiert.

Etwas bedauerlich ist, dass die Umstrukturierungen über die zweite Hälfte des Jahres 2008 in mehreren Schritten vollzogen wurde und immer wieder Syntaxstrukturen verändert wurden. Insbesondere wurden auch viele Token und Syntaxstrukturen, die in ersten Versionen verwendet wurden, in der Finalversion aufgegeben. Insgesamt ist m.E. die Finalversion von JavaFX Script aber viel stringenter und logischer als die Preversionen geworden und orientiert sich doch verstärkter an dem streng objektorientierten Konzept von Java selbst. Allerdings sind auch durchaus syntaktische Anleihen aus anderen Sprachen wie C/C++/C# oder PHP und JavaScript erkennbar.

 

Hier gibt es die Umstiegsanleitung für JavaFX Script auf die Finalversion 1.0 als PDF zum Download

 

Operationen

In den Preversionen von JavaFX Script hat Sun mit Prozeduren experimentiert. Schon Funktionen sind in der streng objektorientierten Welt von Java gewagt, aber Prozeduren, die sogar einen Rückgabewert liefern konnten, waren wohl doch des Guten zu viel. In der Finalversion entfallen diese Prozeduren, die bisher mit dem Schlüsselwort operation eingeleitet wurden.

Ein Umstieg von altem Code ist jedoch denkbar einfach. Stattdessen werden einfach grundsätzlich Funktionen verwendet, die mit dem Schlüsselwort function eingeleitet werden. Man muss dabei also nur konsequent den Token operation durch den Token function ersetzen. Das ist alles.

Ein Beispiel für die alte Syntax:

class MeineKlasse {

function times2(x) { return x * 2; }

operation print(s) { System.out.println(s); }

}

Das gleiche Beispiel in der neuen Syntax:

class MeineKlasse {

function times2(x) { return x * 2; }

function print(s) { System.out.println(s); }

}

Eine Funktion kann auch explizit mit Void gekennzeichnet werden um zu kennzeichnen, dass eine Funktion keinen Rückgabewert liefert.

Beispiel:

function ausgabe() : Void {

println("Keine Rückgabe!");

}

 

Attributinitialisierung

Die Initialisierung von Attributen erfolgte bisher außerhalb einer Klassendefinition. Diese Technik wurde nun Java angeglichen und die Attribute werden bei der Deklarierung in der Klasse selbst initialisiert.

Ein Beispiel für die alte Syntax:

class MeineKlasse {

attribute bar: Boolean; }

 

attribute Foo.bar = true;

Das gleiche Beispiel in der neuen Syntax:

class MeineKlasse {

var bar: Boolean = true;

}

Beachten Sie, dass nun auch der Token attribute entfällt und stattdessen var (oder def beim Einsatz von dynamischem Binden) zum Einsatz kommt.

 

Ersetzen von Triggern

Bisher waren Trigger, die außerhalb von einer Klasse definiert wurden, ein zentraler Bestandteil der Definition von der Reaktion auf Ereignisse. Die neue Syntax definiert so genannte replace triggers als Teil der Attributdeklaration. Die Trigger-Funktion folgt dabei nun den Schlüsselworten on replace.

Ein Beispiel für die alte Syntax:

class MeineKlasse {

attribute bar: Boolean;

}

 

trigger on MeineKlasse.bar = value {

if (bar == true) {

beep();

}

}

Das gleiche Beispiel in der neuen Syntax:

class MeineKlasse {

var bar: Boolean on replace {

if (bar == true) { beep();

}

};

}

Ein Beispiel für die alte Syntax mit Initialisierung:

class MeineKlasse {

attribute bar: Boolean = true;

}

 

trigger on MeineKlasse.bar = value {

if (bar == true) {

beep();

}

}

Das gleiche Beispiel in der neuen Syntax mit Initialisierung:

class MeineKlasse {

var bar: Boolean = true on replace {

if (bar == true) {

beep();

}

};

}

 

Kardinalität

Die beliebige Häufigkeit von Attributen wurde bisher mit dem Sternoperator * angegeben und die Werte außerhalb zugewiesen. Nun werden dafür die eckigen Klammern [] verwendet und die Werte direkt in der Klasse zugewiesen.

Ein Beispiel für die alte Syntax:

class MeineKlasse {

attribute names :String*;

}

 

attribute names = ["Ralph", "Felix", "Florian"];

Das gleiche Beispiel in der neuen Syntax:

class MeineKlasse {

var names :String[] = ["Ralph", "Felix", "Florian"];

}

 

Benannte Instanzen

In den bisherigen Versionen von JavaFX Script waren benannten Instanzen mehr oder weniger das, was nun vollqualifizierte Konstanten darstellen (oder Objektliterale).

Ein Beispiel für die alte Syntax:

Frame {

title: "White Frame"

background: white

}

Ein vergleichbares Beispiel in der neuen Syntax:

SwingLabel {

text: "Label"

foreground:Color.WHITE

}

Alternativ das gleiche Beispiel in der neuen Syntax:

SwingLabel {

text: "Label"

foreground:Color {

red: 1

green: 1

blue: 1

opacity: 1

}

}

 

Anonyme Objektliterale

Bisher konnten Sie ein anonymes Objektliteral ohne die Spezifizierung von einen Typ deklarieren . Der Interpreter legte den Typ implizit fest (eine Art der losen Typisierung, wie es auch unter JavaScript oder PHP Einsatz findet, unter Java allerdings ziemlich brutal im Widerspruch zum streng typisierten Konzept stand). In der neuen Version müssen Sie explizit Objektliterale benennen.

Ein Beispiel für die alte Syntax:

accelerator: {

modifier: CTRL

keyStroke: O

}

….

Das gleiche Beispiel in der neuen Syntax:

accelerator: Accelerator {

modifier: KeyModifier.CTRL

keyStroke: KeyStroke.O

}

 

Überschreiben von Funktionen nun mit expliziter Angabe des Rückgabetyps und override

Bisher konnten Sie beim Überschreiben von einer Funktion diese einfach redefinieren und zum Beispiel auf die Angabe des Rückgabetyps verzichten.

Nun geben Sie in der Signatur der Funktion diesen Rückgabetyp und das vorangestellte Schlüsselwort override an. Zwar ist so eine vollständige Signatur nicht in jedem Fall unbedingt zwingend, aber zur Kennzeichnung und Vereinheitlichung immer sinnvoll.

Ein Beispiel für die alte Syntax:

class MyWidget extends CompositeNode {

function composeNode() {

}

}

Ein vergleichbares Beispiel in der neuen Syntax:

class MyCustomNode extends CustomNode {

public override function create(): Node {

return Group {

content: []

};

}

}

 

for-Schleife

Nachdem man in Java selbst ein foreach-Konstrukt eingeführt, aber syntaktisch anders als in JavaFX Script aufgebaut hat, war diese syntaktische Abweichung in JavaFX Script ziemlich unglücklich. In der neuen Varianten wurde die Syntax an Java angepasst.

Ein Beispiel für die alte Syntax:

for (Integer i = 0; i < element.length; i++) {

 

System.out.println(element);

}

foreach (element in group) {

System.out.println(element);

}

Das gleiche Beispiel in der neuen Syntax:

...

for (Integer i = 0; i < element.length; i++) {

System.out.println({element});

}

for (element in group where element.length() < 4) {

System.out.println({element});

}

Negative Rangebereiche und Schrittweite

Bisher ging so was:

for (i in [5..4]) {

System.out.println("i = {i}");

}

In der neuen Version sind negative Rangebereiche nicht mehr erlaubt.

Ebenso können Sie die Schrittweite der Iteration nicht mehr wie folgt angeben:

for (i in [1,5..10]) {

System.out.println("i = {i}");

}

Stattdessen verwendet man nun den Token step, der so auch normal in Arrays zu verwenden ist.

Beispiel:

var nums = [1..10 step 2];

 

Stringliterale und Stringausdrücke in JavaFX

Sie können in JavaFX Script eine Zeichenkette sowohl in einfache als auch doppelte Hochkommata einschließen. Und wie auch beispielsweise in PHP wurden Zeichenketten in den ersten Versionen von JavaFX Script in doppelten und einfachen Hochkommata vom System bei gewissen Situationen unterschiedlich behandelt.

Auswertung von Ausdrücken in Strings

Allgemein gilt – wenn Sie den Bezeichner einer Variablen in eine Zeichenkette mit doppelten Hochkommata notieren und diesen in geschweifte Klammern {} einschließen, wird der Ausdruck ausgewertet. Sie erhalten in dem resultierenden String den Wert der eingeschlossenen Variablen beziehungsweise eines Ausdrucks. Dabei sind Sie für die Art der ausgewerteten Variable nicht auf Zeichenketten beschränkt. Bei einer Zeichenkette in einfachen Hochkommata finden Sie in bisherigen Versionen dieses Verhalten nicht .

Beispiel:

import java.lang.System;

var name = 'Trillian';

var wert = 5;

var s1 = "Hallo {name}"; // Zeichenkette mit doppelten Hochkommata

var s2 = 'Hallo {name}'; // Zeichenkette mit einfachen Hochkommata

var s3 = "Hallo {wert}"; // Zeichenkette mit doppelten Hochkommata

System.out.println(s1); // Hallo Trillian

System.out.println(s2); // Hallo {name}

System.out.println(s3); // Hallo 5

Die Ausgabe ist in alten Versionen folgende:

Hallo Trillian

Hallo {name}

Hallo 5

In neuen Versionen erhalten Sie aber folgende Ausgabe:

Hallo Trillian

Hallo Trillian

Hallo 5

M.a.W.: Auch in einfachen Hochkommata eingeschlossene Ausdrücke werden in der neuen Version von JavaFX Script ausgewertet!

Zeilenumbrüche in Strings

Im Gegensatz zu Java konnten in JavaFX in den ersten Versionen Zeichenketten Zeilenumbrüche enthalten, wenn sie in doppelte Hochkommata eingeschlossen sind. Das geht nun nicht mehr.

 

Modulooperator

Der Modulooperator % wurde in neuen JavaFX-Versionen durch den Token mod ersetzt. Damit ist allerdings eine weitere Inkompatibilität zu Java zu beachten.

 

Arrays

In JavaFX ist [] ein eigener Operator und dieser Operator [] steht für eine Selektion. Die darin notierte Lokalisierung ist eine Verwendung, die ähnlich in XPath beziehungsweise XQuery vorkommt.

Einfügen von Arrayelementen

Das Einfügen von Elementen erfolgt über die insert-Anweisung. Diese Anweisung konnte bisher die folgenden verschiedene Formen annehmen:

  • insert Ausdruck1 [as first | as last] into Ausdruck2

  • insert Ausdruck1 before Ausdruck2

  • insert Ausdruck1 after Ausdruck2

Die Token as first und as last wurden aufgegeben!

 

Die Grundlagen einer GUI mit JavaFX Script

Die grundlegenden Klassen zum Aufbau einer GUI wurden in der Finalversion von JavaFX Script massiv unstrukturiert, ohne jedoch das grundsätzliche Konzept zu verändern. Die Basis bilden nur neue Klassen.

Unter javafx.ext.swing sind nun die meisten Swing-Komponenten zu finden.

Und die Grundlage der gesamten grafischen Applikation bildet javafx.stage.Stage, was für das gesamte Fenster steht.

Dieses wird in der Regel in einzelne Szenen (javafx.scene.Scene) mit spezifischen Inhalten (also etwa Swing-Komponenten) unterteilt werden.

Beispiel:

import javafx.ext.swing.SwingButton;

import javafx.scene.Scene;

import javafx.stage.Stage;

var button = SwingButton {

text: "Button"

action: function() {

java.lang.System.exit(0);

}

}

Stage {

title: "Meine Applikation"

width: 250

height: 80

scene: Scene {

content: button

}

}

 

Bidirektionales Binden – with inverse

Das bidirektionales Binden verwendet in der neuen Variante von JavaFX die Syntax with inverse.

Ein Beispiel für die alte Syntax:

… TextField {

value: bind model.firstName

}

Ein vergleichbares Beispiel in der neuen Syntax:

SwingTextField {

columns: 10

text: bind model.firstName with inverse

editable: true

}

 

Casting von Number nach Integer

Bei der Typumwandlung von Number nach Integer verwendet man in neuen JavaFX-Varianten die Funktion intValue(), um einem Verlust der Genauigkeit vorzubeugen.

Ein Beispiel für die alte Syntax:

var real :Number;

num = 6.42;

var integer :Integer;

integer = real;

Das gleiche Beispiel in der neuen Syntax:

var real :Number;

var num = 6.42;

var integer :Integer = real.intValue();

 

Vererbung

Bei der Vererbung gibt es in JavaFX Script aktuell ein paar kleinere Probleme, so dass das Schlüsselwort as in einigen Situationen notwendig sein kann.

Beispiel:

content: foo as Node

 

Das neue API

Das API von JavaFX Script wurde wie schon erwähnt in einigen Bereichen reorganisiert. Insbesondere zur GUI. Details lassen sich aber leicht über die JavaFX Script Programming Language API Documentation unter https://java.sun.com/javafx/1/docs/api/ nachschlagen.

 

 

 

 
Hier gibt es die Umstiegsanleitung für JavaFX Script auf die Finalversion 1.0 als PDF zum Download

Und wie gesagt – in meiner Seite zu JavaFX – https://www.javafx-buch.de gibt es weitere Infos zu JavaFX.