Samstag, 14. Dezember 2013
Spontane Abstimmungen durchführen - mit kostenloses Online Tool TEDzi
Ja, für einige ist das ein Teil der Moderation. Für andere aber ein Hindernis.
AdHoc eine TED (Abstimmung) starten, das wäre jetzt nicht schlecht. Alle Anwesende verfügen über ein SmartPhone und Internet. Warum nicht dies nutzen?
Ob Hochschule oder private "Wer wird Millionär"-Runde. Ein eigenes TED-System ist nützlich. Bei www.tedzi.com kann man ohne Registrierung eine TED-Session eröffnen. Die Teilnehmer verbinden sich über den TED-Session Code, der dem Moderator angezeigt wird.
Man kann beliebig viele TEDs starten. Das geht total einfach. Mit dem Daumen auf dem Smartphone, aber auch im Browser. Die Webseite ist für das Display eines Smartphones optimiert und damit muss man auch keine App installieren.
Die Optionenwahl bietet alles:
- Ja, Nein, Vielleicht, Enthaltung
- Option A..F
- Werte 1..12
Die Abstimmung kann im Singlemode laufen, also nur eine Wahlmöglichkeit anwählbar für die Teilnehmer, oder auch Multiplichoice TEDs sind möglich. Die Entscheidung kann jederzeit im laufenden TED mit einem Klick geändert werden.
Die Benutzerführung ist sehr aufgeräumt und intuitiv. Schön ist auch die Möglichkeit die Auswertung in der laufenden Abstimmung an alle Teilnehmer live zu senden. Damit kann man sich leichter für eine Option entscheiden, wenn es um einen Termin oder eine Location geht.
Probiert es aus:
www.tedzi.com
Sonntag, 8. September 2013
Schluss mit der unmenschlichen Politik in Deutschland
Die Regierung besteht nur aus bestochenen und geschmierten Politikern. Der Wähler wird nicht gefragt und belogen solange es geht und darüber hinaus.
Bestechungen und Lobbytum ist sehr einfach. In Deutschland wird die Macht auf wenige nicht direkt gewählte Personen verteilt. Ihr Handeln ist durch Immunität geschützt.
Deutschland hatte genug Führer. Wir brauchen Volksvertreter. Politiker sollten Verwaltungsbeamte sein, die den Volkswillen umsetzen. Dieser Wille kann heute mit den neuen Mitteln sicher und zuverlässig ermittelt werden. Politiker sollten die von der Mehrheit erwünschten Themen gesetzeskonform formulieren und Umsetzung verantworten.
Der egoistische Wille eines Einzelnen sollte nicht unser Leben bestimmen. Es gibt immer wieder Menschen, die Wähler als unmündig und als Untermenschen ansehen, welche nicht richtig entscheiden könnten und die Tatsachen nicht verstehen würden. Diese selbsternannten Übermenschen wollen uns vor uns selbst schützen.
Genau dies findet in Deutschland statt. Wir sollten dieses Verhalten beenden. Alle Macht der echten und wahren Demokratie. Ich bin für die direkte Demokratie und die Abschaffung der über bezahlten Lobby-Politiker und das marode Anti-Demokratie System.
Dienstag, 27. August 2013
Scrum for One - Scrum alleine einsetzen Teil 3
Hier möchte ich meinen Weg aufzeigen. Mit den Scrum Mittel kann sich jeder sein eigenes System erstellen.
Startphase
Release-Planung
Schätzung der Userstories
Sprint vorbereiten
Zeitschätzung jederzeit möglich
Sprint machen
Daily Scrum
Sprint Review
Sprint Retrospektive
Fazit
Freitag, 16. August 2013
Scrum for One - Scrum alleine einsetzen Teil 2
Definition of Done
Daily Scrum
- Was habe ich seit der letzten Besprechung erreicht?
- Was wird bis zur nächsten Besprechung erledigt?
- Welche Hindernisse stehen im Weg?
- Sprint Backlog
- Sprint Burndown
- Impediment Backlog (Hindernisse)
Sprint Burndown
Inkrement
Sprint Review
Sprint Retrospektive
Grooming
Release Burndown
Ähnlich wie der Sprint Burndown wird auch der Release Burndown erstellt. Vor jedem Sprint trägt der Product Owner die zu erreichenden Storypoints ein. Auf der vertikalen Achse steht die verbleibenden Arbeit für das Release. Auf der horizontalen Achse stehen die Sprints. Damit kann die Abarbeitungsgeschwindigkeit ermittelt werden. Je mehr Sprints gemacht wurden, desto genauer wird die Zeitplanung.
Im Teil 3 folgt:
Umsetzung von Scrum mit nur einer Person
Montag, 12. August 2013
Scrum for One - Scrum alleine einsetzen Teil 1
Scrum Zyklen
Scrum Team besteht aus mehreren Rollen
Alle Scrum Rollen in Einer
Ohne Disziplin geht Scrum nicht
Anforderungen einsammeln bevor Scrum beginnt
Wie erstellt man Userstories?
- Wer möchte welches Feature, damit Was erreicht wird
- Als Nutzer will ich Ziel/Wunsch damit Nutzen entsteht
- Als User benötige ich eine Kontoübersicht, damit ich meinen Kontostand einsehen kann
- Als Administrator benötige ich eine Liste mit geblockten Accounts, um schneller einen Überlick zu erhalten
- Der Service benötigt eine Backup-Option, um Datensicherungen von Kunden erstellen zu können
Die Userstory erklärt auch den Grund für das Bedürfnis.
Damit kann der Entwickler besser verstehen, was mit diesem Feature erreicht werden soll. So ist er in der Lage die erwartete Funktionalität optimaler umzusetzen. Es entstehen weniger Missverständnisse.Product Backlog von Scrum
Product RoadMap bietet Übersicht des kompletten Produkts
Die Product RoadMap enthält das Product Backlog. Die Backlog Einträge werden hier in Pakete gepackt. Diese Packet entsprechen den Versionen des Products. Jedes Packet kann in mehrere Bereiche unterteilt werden. In diese Bereiche kommen die Product Backlog Einträge. Damit kann man schnell erkennen, was das Produkt wann können wird. Dabei zeichnet man am Besten eine Kreuztabelle.Beispiel:
| Nutzerverwaltung | Verkauf | ... | |
| Skeleton | Kunden erstellen, Löschen, Bearbeiten Kunden listen |
... | |
| Version 1 | Kunden sperren | Newsletter erfassen Newsletter versenden Shop verlinken, Affiliate tracken |
... |
| ... |
Scrum Sprint
Scrum Sprint Planung 1
Scrum Sprint Backlog
Scrum Sprint Ziel
Scrum Sprint Planung 2
Die Einträge aus dem Sprint Backlog werden in kleinere Tasks umgeschrieben und entsprechend in der Umsetzungsreihenfolge erfasst. Durch diese Übersicht, verliert man das Ziel nicht aus den Augen und verhindert, dass man sich in kleine Aufgaben verzettelt. Auch werden so nicht immer wieder neue Baustellen begonnen. Die Vorbereitung der umzusetzenden Aufgaben ist sehr wichtig.Im Teil 2 folgt:
Definition of Done
Daily Scrum
Sprint Burndown
Inkrement
Sprint Review
Sprint Retrospektive
Grooming
Release Burndown
Mittwoch, 17. Juli 2013
Lernen für Klausuren mit Struktur
Vorteile
- Man gewinnt Zeit
- Befasst sich mit dem Stoff mehrmals
- Es bleibt was hängen
- Für die Klausur wird der "Spickzettel" meist nicht mehr benötigt, da die Infos sich in das Gehirn eingebrannt haben
Vorgehen
- Überblick verschaffen
- Lerneinheit lesen und sich Stichpunkte mit einer Erklärung aufschreiben. Stichpunkte können auch unterstrichen werden und die Erklärung folgt nach dem Doppelpunkt
- 2 Tage später diese Zusammenfassung durch Umformulierungen auf eine halbe DIN A4 Seite bringen
- Vor der Prüfung, also in der Lernphase diese halben Seiten nochmal um die Hälfte reduzieren
- Diese reduzierten Bereiche auf die "Spickzettel" übertragen
- Beim Übertragen kann man sich die Bereiche entsprechend arrangieren, dass beim darauf schauen eine Gedankenstütze sein kann
- Jeden Tag diese Informationen durch Umformulierungen kürzen und damit auf immer weniger Blätter verteilen
- Vorgang wiederholen bis 2 Seiten DIN A4 alle Informationen enthalten
- Keine Rückseite nutzen. Damit kann man die komplette Information auf dem vor sich Tisch liegen haben, ohne Blättern zu müssen
- Extra-Tipp: Lernen auf dem Weg zur Arbeit oder Schule.
Überblick verschaffen
Lerneinheit lesen
Zusammenfassung Ihre Notizen
Spickzettel beginnen
Reduzieren ist Lernen
Keine Rückseite
Lerntipp
Donnerstag, 27. Juni 2013
Texte effektiver formulieren - Erreichen Sie dadurch mehr Akzeptanz bei Ihren Lesern
Nutzen Sie die aktive Stimme
Setzen Sie starke Verben ein
Aktive und Passive Stimme
Beispiel der aktiven Stimme:Der Vater weckt seine Tochter.
Beispiel passiver Stimme:
Die Tochter wird vom Vater geweckt
Die passive Stimme benötigt Hilfsverben. Das eigentliche Subjekt rückt in den Hintergrund. Die ausführende Person wird durch das Wort "vom" eingeführt. Manchmal wird auch der Ausführer weggelassen. Dann kann man nicht mehr erkennen wer was macht.
Verbannen Sie nicht die passive Stimme, nutzen Sie diese sparsam
Die passive Stimme macht durchaus Sinn. Untergeordnete Personen können damit in den Vordergrund des Satzes gebracht werden. Nutzen Sie die passive Stimme nur, wenn Sie einen guten Grund haben. Im Zweifel wählen Sie die aktive Stimme.Vermeiden Sie überflüssige Wörter
Wörter sind überflüssig, wenn diese durch weniger Wörter ersetzt werden können, die das Gleiche bedeuten. Manchmal gibt es einfachere Wörter für bestimmte FormulierungenStatt: "um zu erreichen"
Besser: "damit"
Schreiben Sie positiv
Positive Sätze sind kürzer und leichter zu verstehen, als die negativen Gegenstücke. Zum Beispiel:vorher
Anders als die Hauptakteure werden die B-Aktionäre vermutlich keine Dividenden erhalten.
nachher
Nur die Hauptakteure erhalten vermutlich eine Dividende.
Die Sätze weden kürzer und leichter verstanden, wenn Sie negative Teile durch ein einziges Wort, welches das Gleiche bedeutet, ersetzen.
Beispiel:
Nicht möglich wird zu unmöglich
Fazit
Buchempfehlung
Dieses Werk zeigt Ihnen, wie Sie einfache und klare Texte verfassen. Dabei sollen nicht die komplexen Sachverhalten vereinfacht werden, sondern die Art und Weise, wie diese präsentiert werden. Schreiben Sie Texte die auch verstanden werden.
Mittwoch, 19. Juni 2013
FFMPEG - Thumbnails aus Filme erstellen und Filme schneiden mit ffmpeg
Kleine Auswahl was FFMPEG kann:
- Streaming Server
- Video schneiden
- Thumbnails, also Screenshots heraus holen
- Videoaufnahme
- Videos konvertieren, also in andere Formate umwandeln
FFMPEG für jedes Betriebssystem
- FFMPEG Download-Seite für alles
http://www.ffmpeg.org/download.html - Als ausführbares Windows Programm (Binäries)
http://ffmpeg.zeranoe.com/builds/ - Für die Mac-User
http://www.evermeet.cx/ffmpeg/
Viele FFMPEG Parameter
- Direkt die FFMPEG Parameter
http://www.ffmpeg.org/ffmpeg.html - Hier ist die grosse Übersicht für alle FFMPEG Parameter:
http://www.ffmpeg.org/documentation.html
Mit FFMPEG einen Screenshot aus einem Video erstellen
ffmpeg -ss SEKUNDEN_START|HH:MM:SS -i PFAD_ZUM_VIDEO -t 0.001 -s WIDTHxHEIGHT pic.jpg
- -ss Startpunkt im Film als Zeitangabe
Entweder Sekunden oder eine Uhrzeit - -i Pfad zum Film selbst
- -t Dauer der Aufnahme in Sekunden.
Wir benötigen ja nur ein Bild, also die kleinste Dauer - -s Die Ausgabegrösse für das Bild in Pixel
Breite mal Höhe - Der Bilddateiname muss eine bekannte Bildformat-Dateiendung haben!
Am besten .jpg nehmen
Beispiel für einen Screen nach 20 Sekunden im Film
ffmpeg -ss 20 -i meinFilm.mp4 -t 0.001 -s 320x240 pic.jpg
Mit FFMPEG einen kleines Vorschauvideo aus einem Video schneiden
ffmpeg -ss SEKUNDEN_START|HH:MM:SS -i PFAD_ZUM_VIDEO -t DAUER -s WIDTHxHEIGHT pre.mp4
- -ss Startpunkt im Film als Zeitangabe
Entweder Sekunden oder eine Uhrzeit - -i Pfad zum Film selbst
- -t Dauer der Aufnahme in Sekunden.
Wir benötigen nur 20 Sekunden, also die kleinste Dauer - -s Die Ausgabegrösse für das Bild in Pixel
Beispiel für einen 20 Sekunden Schnitt nach 20 Sekunden im Film
ffmpeg -ss 20 -i meinFilm.mp4 -t 20 -s 320x240 pre.mp4
Mit FFMPEG sich selbst über Webcam aufnehmen
Video mit der Webcam aufnehmen für 10 Sekunden:
ffmpeg -f dshow -i video="Integrated Camera" -t 10 output.flv
Foto (320x240 gross) mit der Webcam aufnehmen nach 10 Sekunden:
ffmpeg -f dshow -i video="Integrated Camera" -ss 10 -s 320x240 -t 0.001 output.jpg
Buchtipps
Wenn man seinen eigenen Video-Server betreiben will, könnte dieses Wissen nützlich sein:Fazit
http://sasonikolov.blogspot.de/2013/03/youtube-clone-selber-gemacht-mit.html
Montag, 17. Juni 2013
CAS Single SignOn SSO verstehen
Die Implementierung wird durch viele Klassen und Bibliotheken abgebildet. Doch manchmal möchte man einfacher und simpler an die Sache heran gehen. Dazu ist das grundlegende Verständnis wichtig. Wie funktioniert das mit SSO und CAS?
Grundsätzlich wozu braucht man SSO?
CAS Server bietet den Zugang zum SingleSignOn (SSO)
- Loginverfahren
- Daten über den User für die Anwendungen und Programme
Anwendung
Ablauf technisch
Mittwoch, 29. Mai 2013
IRC-Bot mit NodeJS
Was wird erstellt?
Ein IRC-Client, der auch bestimmte Befehle reagieren kann. Dieser ruft eine Webseite auf und liefert das Ergebnis als Chatnachricht zurück.Erkenntnisse
Vorarbeiten
- NodeJS (installiert oder auch nur die ausführbare Datei)
http://nodejs.org/download/ - IRC Account auf einem Server
- Webseite, die einem was interessantes liefern
Konstrukt
Hier sind einige Elemente verbaut.Mehrer Hilfsfunktionen und viele anonyme Funktionen.
Das Konstrukt soll auch zeigen, was alles möglich mit Javascript ist.
Zuerst generieren wir uns ein Objekt mit den Server-Zugangsdaten.
Der ganze Server ist einer Funktion eingebettet.
Die Hilfsbereiche sind zum Teil direkt in der Daten-Funktion eingebunden und zum Teil in einem Hilfsobjekt ausgelagert. Das soll zeigen, dass mehrer Methoden möglich sind.
Ablauf
- Verbindung zum Server
- Login
- Registrieren von Event-Handler für den eingehenden Datenverkehr
- Auswerten der eingehenden Texte
- Aufrufen von entsprechenden Funktionen
- Antworten in den Chat senden
Code
var config = {
user: {
nick: 'sasobotli',
user: 'Saso_T_2013',
real: 'saso Bot - SN2013',
pass: '20cC12#'
},
server: {
addr: 'testirc.MEINSERVERNAME.de',
port: 6697
},
chans: ['#team-chat']
//chans: ['#chan1','#chan2']
, keywords:{}
}
// http://www.ietf.org/rfc/rfc1459.txt
irc3(); // startet den IRC-Bot
function irc3() {
// SSL Verbindung
var tls = require('tls');
var cleartextStream = tls.connect(
config.server.port,
config.server.addr,
null,
// anonyme Funktion, die das Anmelden auf dem Server macht
function(){
irc.stream = cleartextStream;
// ein paar Log-Ausgaben, um mehr zu verstehen
console.log("client connected mit "+
cleartextStream.remoteAddress+":"+
cleartextStream.remotePort);
console.log("meine adresse: ",
cleartextStream.address());
console.log('client connected',
cleartextStream.authorized ? 'authorized' : 'unauthorized');
// nun senden wir unsere Zugangsdaten
irc.senden('PASS '+config.user.pass);
irc.senden('NICK '+config.user.nick);
irc.senden('USER '+config.user.user+
' localhost '+config.server.addr+
' '+config.user.real);
// in alle channels anmelden
for (var a=0;a<config.chans.length;a++) {
irc.senden('JOIN '+config.chans[a]);
}
// kommandozeile einbinden,
// so können wir auch direkt mit dem Server sprechen :)
process.stdin.setEncoding('utf8');
process.stdin.pipe(cleartextStream);
process.stdin.resume();
}
);
// das Encoding setzen
cleartextStream.setEncoding('utf8');
// nun registrieren wir eine Funktion,
// die auf eingehende Daten reagieren soll
cleartextStream.on('data', function(data){
console.log("incoming");
// daten zeilenweise abarbeiten
data = data.split('\n');
for (var i = 0; i < data.length; i++) {
// leere zeilen überspringen
if (data[i].trim() == "")
continue;
console.log('RECV -', data[i]);
if (data !== '') {
// anforderungen / request vom Server sich zu melden
var pos = data[i].indexOf(":");
var key = data[i].substr(0,pos).trim().toUpperCase();
var value = data[i].substr(pos+1).trim();
if (key != "") {
switch (key) {
case "PING":
irc.senden('PONG :'+value);
break;
default:
console.log("Nicht abgefangen: "+key);
}
} else {
// antwort oder info vom Server
var teile = value.split(" ");
//console.log(teile);
switch(teile[1]) {
case '353': // name reply, für NAMES,
// also alle Chatter in einem Raum erhalten
//console.log("Namen eingetroffen");
var namen = value.split(":")[1].trim().split(" ");
//console.log("gefunden: "+namen.length, namen);
for (var a=0;a<namen.length;a++){
var oname = namen[a].replace(/@/,"");
var admin = false;
if (namen[a].match(/@/))
admin = true;
// irc ist unten als Objekt definiert
irc.users[oname] = {'name':oname, 'admin':admin, 'nachrichten':[]};
}
//console.log(irc.users);
break;
case 'JOIN': // Raum beigetreten
var raum = teile[2].substr(1);
// ein paar Begrüssungen
var sp = ['Hallo', 'Hey', 'hi', 'Wie gehts?',
'huhu','Toll, dass du da bist'];
// eine Begrüssung per Zufall auswählen
var pos = Math.round(Math.random()*(sp.length-1));
// begrüssen
irc.senden("PRIVMSG "+raum+" "+sp[pos]);
// alle Namen im Raum abrufen
irc.senden("NAMES "+raum);
break;
case 'PRIVMSG':
// nachricht eingetroffen
// wir speicher wann zuletzt was gesagt wurde
irc.zaehler.lastword = time();
// ermittel ob direkt oder raum chat
var sender = teile[0];
var empfaenger = teile[2];
var user_sender = sender.split("!")[0];
var antwort = teile.slice(3)
.join(" ").trim()
.substr(1); // ohne führendes :
// wir speichern den User in unsere Liste
if (!irc.users[user_sender]) {
irc.users[user_sender] = {
'name':user_sender,
'admin':false,
'nachrichten':[], keywords:{}};
}
// speichern die Nachricht in seine History
irc.users[user_sender].nachrichten.push(antwort);
//console.log("nachricht eingegangen. Von "+sender, antwort);
// wurden wir direkt angesproche? also privatchat?
if (empfaenger.toLowerCase() ==
config.user.nick.toLowerCase()) {
var meineantwort = "danke, selber";
// senden unsere Antwort
irc.senden('PRIVMSG '+user_sender+" "+meineantwort);
} else {
// channel message eingetroffen
//irc.senden('PRIVMSG '+empfaenger+" Roger that");
console.log("wuerden senden: "+'PRIVMSG '+empfaenger+" Roger that");
}
// hier können wir nun das Gesagt analysieren und
// dementsprechend antworten
// hat jemand geschrieben: sag was,
// starten wir den Sprüchemodus
if (antwort.toLowerCase() == "sag was"){
console.log("sprueche intervall modus aktiv");
// einen Spruch holen und senden
irc.sagwas();
}
if (antwort.toLowerCase() == "sag sofort was"){
irc.sagwas(true);
}
if (antwort.toLowerCase() == "stopp"){
console.log("sprueche modus deaktiviert");
irc.zaehler.aktiv = false;
}
if (antwort.toLowerCase() == "saso start"){
console.log("sprueche modus aktiviert");
irc.zaehler.aktiv = true;
}
// wenn jemand fragt, woher die Sprüche kommen
// geben wir die URL als Antwort
// diese Bereich kann man gut ausbauen und
// dem Bot Befehle zum Auswerten von anderen Diensten
// geben. So dass er die Ergebnisse hier postet
if (antwort.toLowerCase().match(/woher\s+sind\s+die/)){
irc.senden("PRIVMSG "+empfaenger+" http://sprueche.woxikon.de");
}
// wenn jemand die History haben will ...
if (antwort.toLowerCase().match(/history:/)) {
// könnten wir hier diese auswerten und posten...
}
break;
}
}
}
}
});
cleartextStream.on('end', function(){
console.log("session beendet");
process.exit(0);
});
// Objekt, dass uns als zwischenspeicher dient
// und auch hilfsfunktionen enthält
var irc = {
zaehler: {
'aktiv':false,
'lastword':time()
},
stream: null,
// sendet die Nachrichten an den IRC-Server
senden: function(text) {
console.log("SEND -", text);
this.stream.write(text+'\n');
if (text.match(/^JOIN/i)) {
// hole die benutzer
this.senden("NAMES"+text.substr(4));
}
},
// hilfsfunktion, die später für das Chatten genutzt wird
sagwas: function(force){
if (!force) {
// zufall, wann wieder ein neuer Spruch gesagt wird
var nextcall = Math.round(Math.random()*(10))+3; // minuten
setTimeout(irc.sagwas, nextcall*1000*60);
console.log("nächster spruch ca. in "+nextcall+" minuten");
}
// nur wenn vor 2 minuten niemand was gesagt hat
if (!force && irc.zaehler.lastword > time()-(2*1000*60))
return;
if (!force && !irc.zaehler.aktiv)
return;
irc.zaehler.lastword = time();
// ein paar sprüche seiten
var urls = [
{'url':'http://sprueche.woxikon.de/poesiealbum','satz':'Das hier find ich gut:'},
{'url':'http://sprueche.woxikon.de/emo', 'satz':'kennt ihr den?'}];
var pos = Math.round(Math.random()*(urls.length-1));
var spruchurl = urls[pos];
// hier holen wir die Sprüche ab und
// senden diese dann direkt als Message
URLLaden(spruchurl.url, function(html) {
// suchen im HTML nach den Sprüchen
var treffer = html.match(/<div\s+class="jingle-content">([\S\s]*?)<\/div>/gi);
var sprueche = [];
for (var a=0;a<treffer.length;a++) {
//console.log(treffer[a]);
sprueche.push(treffer[a].replace(/(<\/?[^>]+>)/gi, ''));
}
// wenn es einige Treffer gibt, wählen wir per zufall einen aus
if (sprueche.length>0) {
//console.log(sprueche);
var pos = Math.round(Math.random()*(sprueche.length-1));
var spruch = sprueche[pos].trim().replace(/\s/," ");
//console.log("kennt ihr den? "+spruch);
irc.senden('PRIVMSG '+config.chans[0]+" "+spruchurl.satz+" "+spruch);
}
});
},
users: {}
}
}
function time(onlyseconds) {
var datum = new Date();
var milliseconds = datum.getTime();
if (onlyseconds)
return intval(milliseconds/1000);
return milliseconds;
}
// diese Funktion, lädt eine HTML Seite
function URLLaden(url, cbfkt) {
if (url.match("://")) {
var http;
if (url.match("s://")){
http = require('https'); // die URL verlangt SSL
} else {
http = require('http');
}
http.get(url, function(res) {
//console.log("Got response: " + res.statusCode);
var html = "";
res.on("data", function(chunk){
html += chunk; // inhaltteile der Seite zusammen kleben
});
res.on("end", function(){
// alle Teile sind angekommen und wir haben die HTML-Seite
// cbfkt ist eine anonyme Fkt, die wir aufrufen
// als ergebnis, senden wir das HTML
cbfkt(html);
});
res.on("close", function(err) {
// verbindung beendet
cbfkt(html);
console.log("Error holen "+url);
});
}).on('error', function(e) {
// verbindung getrennt
console.log("Got error: " + e.message);
});
} else {
// falls die URL auf eine lokale Datei zeigt, laden wir diese halt
fs.readFile(url, function(err, data){
if (err){
console.log(err);
} else {
cbfkt(data);
}
});
}
}
Weiterführende Lektüre:
- Node.js & Co: Skalierbare, hochperformante und echtzeitfähige Webanwendungen professionell in JavaScript entwickeln
- IRC Hacks: 100 Industrial-Strength Tips & Tools
Fazit
Saso