Monday, December 16, 2019
Wednesday, October 10, 2012
JavaScript als funktionale Programmiersprache – Teil 2
Parameter und Parametervalidierung
function plus(x, y) {
return x + y;
}
print(plus(1,2,3)); // 3
print(plus()); // NaN
Funktionen als Konstuktor-Funktionen aufrufen
Achtung: Wenn die Funktion wie ein Konstruktor-Objekt (siehe folgendes Kapitel!) über die new-Anweisung aufgerufen wird, dann wird statt undefined das erzeugte Objekt zurückgegeben, falls die Funktion selbst keine Objekt als Rückgabewert hat!

Parameter und Parametervalidierung
function plusAll() {
var result = 0;
for (var i in arguments) {
result += arguments[i];
}
return result;
}
print(plusAll()); //0 print(plusAll(1,2,3,4,5)); // 15
function plusWithHandling(x, y) {
if (! x) {
throw("x is undefined");
}
y = y || 0; // 0 als Defaultwert
return x + y;
}
try {
print(plusWithHandling()); // Exception
} catch (e) {
print(e); // x is undefined
}
print(plusWithHandling(1)); // 1
print(plusWithHandling(0)); // 0
if (! x) {
throw("x is undefined");
}
Das Arguments-Array
Achtung: Das Array arguments ist kein echtes Array. Es hat zwar ein length-Attribut und man kann über dieses iterieren, allerdings fehlen ihm die Methoden eines echten Array-Objekts.
y = y || 0; // 0 als Defaultwert
function plusWithBetterHandling(x, y) {
if (typeof x === "undefined" || x < 0) {
throw("x is invalid");
}
if (typeof y === "undefined" || y < 0) {
y = 0;
}
return x + y;
}
print(plusWithBetterHandling(0, -1)); // 0 print(plusWithBetterHandling(0, "Meaning")); // 0;
function plusWithStrictHandling(x, y) {
if (typeof x !== "number") {
throw("x is of invalid type " + typeof x);
}
if (typeof y !== "number") {
y = 0;
}
return x + y;
}
print(plusWithStrictHandling(new Number(-1),5)); //x is of invalid type object
Tuesday, September 18, 2012
JavaScript als funktionale Programmiersprache – Teil 1
Funktionsliteral
function plus(x, y) {
return x + y;
}
print(plus(1,2)); // 3
Funktionen als Konstuktor-Funktionen aufrufen
Achtung: Wenn die Funktion wie ein Konstruktor-Objekt über die new-Anweisung aufgerufen wird, dann wird statt undefined das erzeugte Objekt zurückgegeben, falls die Funktion selbst keine Objekt als Rückgabewert hat!
Funktionsnamen
Parameter
function plus(x, y) {
return x + y;
}
print(plus(1,2,3)); // 3
print(plus()); // NaN
function plusAll() {
var result = 0;
for (var i in arguments) {
result += arguments[i];
}
return result;
}
print(plusAll()); //0 print(plusAll(1,2,3,4,5)); // 15
Das Arguments-Array
Achtung: Das Array arguments ist kein echtes Array. Es hat zwar ein length-Attribut und man kann über dieses iterieren, allerdings fehlen ihm die Methoden eines echten Array-Objekts.
Thursday, August 23, 2012
Core JavaScript – Imperative Programmierung Teil 2 – Kontrollstrukturen und Schleifen
Kontrollstrukturen
If-Anweisung
if (x === y) {
// Then-Block
print("x ist y");
} else {
// Else-Block
print("x ist ungleich y");
}
Switch-Anweisung
switch (x) {
case 3: {
print("x ist 3");
break; // ansonsten wird default auch abgearbeitet
}
default: {
print("Default");
}
}
Schleifen
While-Schleife
var x = 0;
while (x < 5) {
print(x); // 0, 1, 2, 3, 4
x++;
}
Do-While-Schleife
var x = 0;
do {
print(x); // 0, 1, 2, 3, 4, …
x++;
} while (x < 10);
For-Schleife
for (var i = 0, j = 100; i < 100; i++, j--) {
print(i);
print(j);
};
Wenn die Eigenschaften in der Schleife hinzugefügt wurden, dann kann man sich nicht darauf verlassen, dass diese Eigenschaften in der Iteration berücksichtigt werden. Daher sollte das Objekt in der Schleife nicht verändert werden.
var foobar = {"foo": "hello", "bar": "world"};
for (var i in foobar) {
print (i + " ist " + foobar[i]);
}
Sprunganweisungen
outerloop: for (var x = 0; x < 100; x ++) {
innerloop: for (var y = 0; y < 100; y++) {
print (x + " : " + y);
if (y > 10) break outerloop;
}
}
Monday, July 23, 2012
Core JavaScript – Imperative Programmierung Teil 1
Imperative Programmierung Teil 1
Ausdrücke und Operatoren
typeof ("42"*1) // numberVergleiche
42 == “42” // true
42 === "42" // false- false
- null
- undefined
- ” (leerer String)
- 0 (die Zahl Null) oder NaN (der Zahlenwert „Not a Number“)
!!0 // false
!!1 // trueVariablen
var x;
var x;
x == null; // true
typeof x; // undefined
x = 5;
x; // 5
typeof x; // number
var x, y, z;Blöcke und Gültigkeit von Variablen
{
var x = 10;
print(x); // 10
}
{
var x = 10;
print(x); // 10
}
print(x); // 10Achtung: Anders als in vielen anderen Programmiersprachen, wie Java und C, wird durch einen Block kein neuer Gültigkeitsbereich für Variablen definiert. Das heißt, auch Variablen, die in einem Block definiert wurden, sind außerhalb des Blocks nach ihrer Deklaration sichtbar.
Eine Variable sollte stets durch die Var-Anweisung definiert werden.
Außer über die var-Anweisung sollen sich lokale Variablen in der kommenden ECMAScript 6th Edition auch mit der let-Anweisung deklarieren und definieren lassen. Die let-Anweisung soll eindeutig zwischen lokalen und globalen Variablen unterscheiden. Zudem hat die let-Anweisung einen Blockgültigkeitsbereich und keinen Funktionsgültigkeitsbereich. Sie kommt daher der Variablendefinition anderer Sprachen wie Java sehr viel näher.
const PI = 3.14159265;Zahlen
0.05 + 0.01 = 0.060000000000000005
const C1 = 299792458;
const C2 = 2.99792458E8; // C1 == C2
var saldo = -768;
print(0xFF); // liefert 255NaN
var notANumber1 = NaN;
print(notANumber1 == NaN); // liefert false
print(isNaN("Hello")); // liefert true
print(isNaN("3.27E6")); // liefert falseInfinity
var infinite = 2E308;
print(infinite); // liefert Infinity
print(Infinity == infinite); // liefert true
print(infinite == infinite * 2); // liefert trueFormatierung und Konvertierung
Zeichenketten
typeof "Hello World" // String
var myString = "Hello World\nJetzt kommt eine neue Zeile";
print("¢" === "\u00A2"); // true
print("Hello World".length); //11Die Methoden des String-Literals entsprechen den Methoden des String-Objekts, da intern das Literal zu einem Objekt wird, wenn eine Methode aufgerufen wird.
Boolesche Werte
typeof true // booleanArrays
var planets = ["Merkur", "Venus", "Erde", "Mars"];
print(planets[2]); // ErdeArray-Literal und Array-Objekt
typeof planets // objectDer typeof-Operator ist hier nicht hilfreich, da dieser sowohl bei einem String-Objekt als auch bei einem Array schlicht object zurückliefert. Zu prüfen, ob das übergebene Objekt die length-Eigenschaft hat, funktioniert leider auch nicht, denn Array-ähnliche Objekte wie Strings haben auch diese Eigenschaft. Man muss also zusätzlich prüfen, ob der Konstruktor des übergebenen Objekts der Array-Konstruktor ist:
function isArray(value) {
return (value && // value ist defined
typeof value === "object" && // value ist ein Objekt
value.constructor === Array) // Konstruktor ist Array
}
print(isArray(["eins", "zwei", "drei"])); // true
print (isArray("Hello")); // falsetoArray-Hilfsmethode
function toArray(value) {
return Array().slice.call(value, 0);
}
print(toArray("Hello")); // H,e,l,l,o
print(toArray(47)); // empty
print(toArray(["eins", "zwei", "drei"])); // eins,zwei,dreiReguläre Ausdrücke
var regexp = /\((\d*)\)/;
typeof /\((\d*)\)/; // function
var regexp = /\([\d\w]*\)/;
print("Telefon: (040) 55555".search(regexp)); //9„\d“ und „\w“ sind Metazeichen.
var vorwahl = /^\([\d\w]*\)$/;
print("Telefon: (040) 55555".search(vorwahl)); //-1
print("(404)".search(vorwahl)); // 0Kommentare
/*
var matches = /\d*/.match("1234");
*/
$ v8 blockcomments.js
blockcomments.js:2: SyntaxError: Unexpected token .
var matches = /\d*/.match(1234);
^
SyntaxError: Unexpected token .
// Folgender Codeblock demonstriert den Zeilenkommentar.
// Es wird der Wert 5 ausgegeben, da das Inkrement auskommentiert wurde.
var a = 5;
// a++;
print(a);
/*
Folgender Codeblock demonstriert den Zeilenkommentar.
Es wird der Wert 5 ausgegeben, da das Inkrement auskommentiert wurde.
*/
var a = 5;
// a++;
print(a);Tokens und Whitespaces
Whitespaces, also Leerzeichen, Tabs und Zeilenumbrüche, werden verwendet, um einzelne Tokens voneinander zu trennen. Darüber hinaus haben sie keine Bedeutung. Man setzt sie ein, um Code zu strukturieren.
var a = 5 / 8
-8 + 9
print(a) // 1.625
var a = 5 / 8 - 8 + 9;
print(a);Wednesday, July 18, 2012
Core JavaScript – Typen und Werte
Einleitung
Eine Skriptsprache wird dazu verwendet, um ein bereits bestehendes System zu verändern, anzupassen oder um wiederkehrende Abläufe zu automatisieren. In einem solchen System existieren bereits Funktionalitäten. In der Regel lassen sich diese entweder über ein User Interface oder über Befehle aufrufen. Wenn das System seine Funktionen über eine programmierbare Schnittstelle anbietet, dann ist es scriptbar. Ein gutes Beispiel für ein Script ist ein Shell-Script, das einem lästige Wartungsaufgaben abnimmt.
Typen und Werte
Schwache Typsierung
Literale
Typeof-Operator
typeof "Hallo Welt" // string
typeof 1234 //number
typeof true // boolean
typeof {"name": "Peter"} // object
typeof [1,2,3,] // objectTypenlose Verwendung
123 == "123" // trueMonday, May 14, 2012
JavaScript für Enterprise-Entwickler: Professionell programmieren im Browser und auf dem Server
JavaScript ist längst nicht mehr nur für klassische Webprogrammierer interessant. Auch bei der Entwicklung von Unternehmensanwendungen spielt JavaScript eine immer größere Rolle: Enterprise-Entwickler mit Java- oder .NET-Hintergrund programmieren selbst Server- und Browser-seitig mit JavaScript, oder sie überarbeiten JavaScript-Code, der von Webagenturen erstellt wurde.
Das Buch "JavaScript für Enterprise-Entwickler: Professionell programmieren im Browser und auf dem Server" behandelt daher die Schwerpunkte, die für Entwickler aus dem Enterprise-Umfeld beim Umgang mit JavaScript besonders von Bedeutung sind.
Nach einem kompakten Überblick über die Kernkonzepte von JavaScript geht der Autor im Detail auf wichtige Themen der professionellen Anwendungsentwicklung ein. Behandelt werden u.a.:
- JavaScript als funktionale, prototypische und objektorientierte Sprache
- Testen
- Packaging
- Entwurfsmuster
- node.js: JavaScript auf dem Server
Zielgruppe sind professionelle Backend-Enwickler, die sich schnell in JavaScript einarbeiten wollen. Darüber hinaus spricht das Buch Webentwickler an, die über den Browser-Rand hinausblicken möchten.
Kenntnisse in der Webentwicklung sind für die Lektüre erforderlich, ein Java-EE- (oder .NET-) Hintergrund ist hilfreich.
Die Website zum Buch ist hier. Das Buch erscheint heute in zwei Wochen.
Wednesday, March 28, 2012
MobileTech Conference 2012 - Tag 1
Mein Kollege Norman Erck und ich sind auf der MobileTech Conference 2012 in München.
Die Konferenz wurde durch Sebastian Meyen vom Software&Support-Verlag eröffnet. Er übergab die Session an Maks Giordano von Nunatak. Wer vom Design mobiler Applikationen spricht, meint dabei meist das Design von grafischen Oberflächen. Dass Audio genauso wichtig sein kann, liegt schon in der Historie der Telekommunikation begründet. Mobile Anwendungen laufen auf modernen Telefonen. Telefone wurden erfunden, um Sprache zu übertragen.
Manfred Lutzky von Fraunhofer IIS stellte den AAC-ELD-Codec vor. Dieser Codec ist ein Full HD Voice-Codec, der heute schon in Apple Facetime verwendet wird und in iOS 5 auch Entwicklern von Apps zur Verfügung steht. Die AAC-ELD-Codec ähnelt dem AAC-Codec, ist aber auf geringe Verzögerungen optimiert, was wichtig für die Real-Time-Kommunikation ist.
Philipp Eibach stellte sein neues Startup wahwah.fm vor. Eibach war schon an der Gründung von last.fm beteiligt und ist schon lange im Bereich Social Music unterwegs. Auf dem Smartphone hört jeder Musik für sich alleine. Das Ziel von wahwah.fm ist, dass Musik wieder gemeinsam und zusammen gehört wird. So lässt sich Musik von Bekannten und Unbekannten entdecken. In wahwah.fm kann jeder Nutzer mit seiner Playlist auf Sendung gehen. Jeder Nutzer ist damit ein eigener, kleiner Radiosender. Andere Nutzer können sich in diese Sendung einklinken und mithören. Hörer eine laufenden Sendung könnten über Chats etc. interagieren. Die Location eines Senders lässt sich bei der Suche nach Sendern berücksichtigen. wahwah.fm ist eine prima Möglichkeit, Musik neu zu entdecken.
Michael Breidenbrücker von Reality Jockey Ltd. zeigte RjDj. RjDj lässt einen Nutzer selbst Musik erschaffen. Dabei verwendet RjDj nicht ein klassisches User Interface sondern bezieht das komplette Sensor-Netzwerk des Smartphones ein. Musik wird also durch die Location, die Bewegung des Nutzers und sein Umfeld erschaffen. Der Nutzer taucht so in eine audiovisuelle Umgebung ein, in der die Intensität der Immersion sehr hoch ist. Auf Basis von RjDj wurden bereits weitere Apps entwickelt wie die Audio-App zum Film Inception, die in Zusammenarbeit mit dem Soundtrack-Komponisten Hans Zimmer und dem Regisseur Christopher Nolan entstanden sind.
Anika Brinkmann, die als Kommunikationsdesigner Mobile-Knowledge.de verantwortet, eröffnete den Mobile Web-Track. Sie gab einen allgemeinen Überblick über die Themen des Tracks: Was bedeutet „Always on“? Hat always online nur gute oder auch unangenehme Seiten wie die allzeitige Bereitschaft von Arbeitnehmern, die mit modernen Kommunikationsendgeräten ausgestattet werden. Ist „Always on“ nur ein Versprechen oder schon heute Realität? Gibt es immer noch die Schere zwischen Stadt und Land was die Netzabdeckung von UMTS und LTE angeht? Der Footprint (die Größe) der Seiten wächst im Moment noch stärker als die verfügbare mobile Bandbreite. Was nutzt die Cloud, wenn wenn gerade keine Verbindung zum Internet herstellen kann? Wie muss mit Nutzerdaten umgegangen werden - besonders im Spannungsfeld zwischen den Wünschen des Marketings und den Anforderungen des Datenschutzes? Wie befreie ich Daten aus Datensilos wie SAP oder gängigen CRM-Systemen? Content (sprich: Daten) muss in unterschiedlichen Kontexten unterschiedlich genutzt werden können. Daher muss Content in offenen Formaten (kein Flash) und in unterschiedlichen Ausprägungen (z.B. auch in hoher Auflösungen für Retina-Displays) vorliegen, um genutzt werden zu können. Um all diese Fragen zu beantworten, sollte zunächst eine Strategie erarbeitet werden. Aus dieser Strategie können Konzepte entwickelt werden. Content sollte sowohl für’s Web als auch für mobile Anwendungen verwendet werden können. Dabei sollte man auf offene, zukunftssichere Plattformen statt auf proprietäre Technologien setzen. Wir sind hier und jetzt dabei, ein neues Level der Kommunikation zu erreichen. Zu den Technologien, mit dem dies umgesetzt werden wird, gehören sicherlich HTML5 und CSS3.
Ulrich Schmidt von sevenval zeigte die Offlinemöglichkeiten von HTML5-Webapplikationen. Der Grund, warum man überhaupt Offline-fähige Applikationen braucht, ist die unvollständige Netzabdeckung. Gerade wenn man beispielsweise in der Bahn unterwegs oder im Ausland-Urlaub ist, dann hat man oft kein Netz. Offline zu sein ist ein temporäres Problem, das durch HTML5 gelöst werden kann. Konzeptionell ist zwischen Daten und Funktionen zu trennen. Entweder man kann nur Daten oder nur Funktionen offline vorhalten. Oder man kann eine komplett Offline-fähige Webapplikation erstellen. Technologien für ein „Aktives Offline“ für Daten sind Local Storage, das als Cookie-Ersatz in allen Browsern läuft, WebSQL, das inzwischen deprecated ist aber zumindest auf iOS und Android zur Verfügung steht, und IndexDB, die in neueren Browsern (allerdings noch nicht in mobilen Browsern) als Weiterentwicklung von Local Storage und WebSQL angesehen werden kann. Als Bleeding Edge kann die FileSystem API angesehen werden, die ab Chrome 13 einen direkten Zugriff aufs Filesystem zur Ablage von Binärdaten erlaubt. „Passives Offline“ für Funktionalität (JavaScript) und Ressourcen (HTML, CSS, Bilder) bietet der Application Cache. Die Herausforderung bei der Verwendung des Application Caches ist es, diesen „aktuell“ zu halten und das Update-Verhalten sinnvoll zu implementieren. Der Application Cache schlägt HTTP-Header (außer beim Firefox). Die Schritte zur Erstellung einer Offline-fähigen Webapplikation sind laut Schmidt zuerst das Erstellen von Layout und Struktur (analog zu einer normalen Webapplikation), danach das Einführen von Local Storage zur Speicherung der Daten und anschließend die Verwendung des Application Caches zur Speicherung der bereits erstellten Layout und der Struktur. Der Vortrag schloss mit Empfehlungen aus der Praxis zum Umgehen von Fallstricken.
Sven Günther von it-agile zeige die API des Zeitungskiosks in iOS 5. Zeitschriften-Apps lassen sich mit NewsstandKit implementieren. NewsstandKit bietet Features wie Push Notificiation und Background Downloads. Außerdem lässt sich programmatisch das Programm-Icon verändern, so dass das Cover der aktuellen Ausgabe als Icon verwendet werden kann. Payments lassen sich über das StoreKit abwickeln. Zur Anzeige von Content sind WebViews ungeeignet, das sich mit WebViews nur schwer die Anmutung einer Zeitung oder eines Magazins nachahmen lässt. Besser geeignet dazu ist CoreText und der UIPageViewController.
Torsten Drees präsentierte die MEAP (Mobile Enterprise Application Plattform), die mit einer Multi-Channel-Architektur die Herausforderung aktueller Enterprise Mobility Trends lösen soll. Eine Implementierung der MEAP ist die Magic Integration Plattform von Magic Software. Dieser Vortrag war ein reiner Marketing-Vortrag.
Georg Konjovic, der als Director Premium Content die Konzern-weite Paid Content-Stratgie bei Axel Springer verantwortet, präsentierte die Ziele des Verlags. ASV sieht sinkende Print-Reichweiten nicht als Gefahr sondern als neue Chance für den Qualitätsjournalismus. Die Paid Content-Stragie vom Axel Springer Verlag äußert sich in ca. 70 Apps (teilweise HD-Apps für das iPad), der Plattform iKosk (ePapers im Portable Document Format, der iKosk steht für andere Verlagshäuser offen), einem News-Aggregator (myEdition), der sich zurzeit in einer Closed Beta befindet, und zahlreichen News-Sites. Die größte Herausforderung ist die Schaffung neuer Abo-Modelle bzw. die Migration der Nutzer von kostenlosen Web-Diensten zu Nutzern kostenpflichtiger Dienste. Anders als in den USA entwickelt sich der Markt für Qualitätsjournalismus in Deutschland positiv. Vor allem Nutzer des iPads haben eine hohe Zahlungsbereitschaft. Alle zukünftigen Angebote bei Axels Springer sollen ein Preisschild bzw. einen Abo-Preis haben.
Rosemarie Wirtsmüller von Antenna International zeige Apps für Museumsbesucher. Diese Apps sind viel mehr als reine eGuides. Sie informieren den Nutzer schon vor dem Besuch des Museums (Pre-Visit-Kontakt) und unterstützen in bei der Nachbereitung (Post-Visit-Kontakt). Dies äußert sich auch in den Download-Zahlen. Diese Apps werden sogar von Nutzern verwendet, die gar nicht das Museum besuchen sondern sich mit der App über das Thema einer Ausstellung selbst lange nach der eigentlichen Ausstellung informieren möchen.