diff options
Diffstat (limited to 'de-de')
-rw-r--r-- | de-de/coffeescript-de.html.markdown | 106 | ||||
-rw-r--r-- | de-de/css-de.html.markdown | 179 | ||||
-rw-r--r-- | de-de/go-de.html.markdown | 318 | ||||
-rw-r--r-- | de-de/haskell-de.html.markdown | 425 | ||||
-rw-r--r-- | de-de/javascript-de.html.markdown | 4 | ||||
-rw-r--r-- | de-de/markdown-de.html.markdown | 256 |
6 files changed, 1196 insertions, 92 deletions
diff --git a/de-de/coffeescript-de.html.markdown b/de-de/coffeescript-de.html.markdown new file mode 100644 index 00000000..98a452ba --- /dev/null +++ b/de-de/coffeescript-de.html.markdown @@ -0,0 +1,106 @@ +--- +language: coffeescript +contributors: + - ["Tenor Biel", "http://github.com/L8D"] + - ["Xavier Yao", "http://github.com/xavieryao"] +translators: + - ["Frederik Ring", "https://github.com/m90"] + - ["Philipp Fischbeck", "https://github.com/PFischbeck"] +filename: coffeescript-de.coffee +lang: de-de +--- + +CoffeeScript ist eine kleine Sprache, die eins zu eins nach JavaScript übersetzt wird - es findet keine Interpretation zur Laufzeit statt. +Als Nachfolger von JavaScript konzipiert, gibt CoffeeScript sein Bestes, lesbaren, gut formatierten und sauber laufenden JavaScript-Code zu erzeugen, der in jeder JavaScript-Laufzeit einwandfrei funktioniert. + +Auf [der CoffeeScript Website](http://coffeescript.org/) gibt es ein ausführliches Tutorial. + +``` coffeescript +# CoffeeScript ist eine dieser Sprachen für "Hipster" +# und folgt daher vielen Trends und Einflüssen aus modernen Sprachen. +# Kommentare werden daher wie in Ruby und Python mit Hashes gekennzeichnet + +### +Kommentarblöcke sehen aus wie diese und werden direkt nach '/ *'s und '* /'s +im erzeugten JavaScript umgewandelt. + +Vorweg: bevor du mit CoffeeScript anfängst, solltest du bereits einen guten +Überblick über die Sprache JavaScript haben. +### + +# Zuweisung: +number = 42 #=> var number = 42; +opposite = true #=> var opposite = true; + +# Bedingungen: +number = -42 if opposite #=> if(opposite) { number = -42; } + +# Funktionen: +square = (x) -> x * x #=> var square = function(x) { return x * x; } + +fill = (container, liquid = "Kaffee") -> + "#{container} wird mit #{liquid} gefüllt..." +#=>var fill; +# +#fill = function(container, liquid) { +# if (liquid == null) { +# liquid = "Kaffee"; +# } +# return container + " wird mit " + liquid + " gefüllt..."; +#}; + +# "Ranges": +list = [1..5] #=> var list = [1, 2, 3, 4, 5]; + +# Objekte: +math = + root: Math.sqrt + square: square + cube: (x) -> x * square x +#=> var math = { +# "root": Math.sqrt, +# "square": square, +# "cube": function(x) { return x * square(x); } +#} + +# "Splats": +race = (winner, runners...) -> + print winner, runners +#=>race = function() { +# var runners, winner; +# winner = arguments[0], runners = 2 <= arguments.length ? __slice.call(arguments, 1) : []; +# return print(winner, runners); +#}; + +# Existenz-Operator: +alert "Hab ich's nicht gesagt?" if elvis? +#=> if(typeof elvis !== "undefined" && elvis !== null) { alert("Hab ich's nicht gesagt?"); } + +# Listen-Abstraktion: +cubes = (math.cube num for num in list) +#=>cubes = (function() { +# var _i, _len, _results; +# _results = []; +# for (_i = 0, _len = list.length; _i < _len; _i++) { +# num = list[_i]; +# _results.push(math.cube(num)); +# } +# return _results; +# })(); + +foods = ['Brokkoli', 'Spinat', 'Schokolade'] +eat food for food in foods when food isnt 'Schokolade' +#=>foods = ['Brokkoli', 'Spinat', 'Schokolade']; +# +#for (_k = 0, _len2 = foods.length; _k < _len2; _k++) { +# food = foods[_k]; +# if (food !== 'Schokolade') { +# eat(food); +# } +#} +``` + +## Weiterführende Links + +- [Smooth CoffeeScript](http://autotelicum.github.io/Smooth-CoffeeScript/) +- [CoffeeScript Ristretto](https://leanpub.com/coffeescript-ristretto/read) diff --git a/de-de/css-de.html.markdown b/de-de/css-de.html.markdown index 8909b251..23c1df94 100644 --- a/de-de/css-de.html.markdown +++ b/de-de/css-de.html.markdown @@ -8,107 +8,106 @@ lang: de-de filename: learncss-de.css --- -In den frühen Tagen des Internets gab es keine visuellen Elemente, alles war nur reiner Text. Aber mit der Weiterentwickliung von Browsern wurden auch vollständig visuelle Webseiten zu einem Standard. -CSS ist die allgemeine Sprache, die dazu da ist, damit man den HTML-Code und die Designelemente von Webseiten (strikt) unterscheiden kann. +In den frühen Tagen des Internets gab es keine visuellen Elemente, alles war nur reiner Text. Aber mit der Weiterentwicklung von Browsern wurden auch vollständig visuelle Webseiten zu einem Standard. +Durch Verwendung von CSS lässt sich eine strikte Trennung zwischen HTML-Code und Designelementen erreichen. -Kurzgefasst, CSS ermöglicht es, verschiedene HTML-Elemente anzuvisieren und ihnen stilistische Eigenschaften zu geben. +Kurzgefasst, CSS ermöglicht es, verschiedene HTML-Elemente innerhalb eines Dokuments auszuwählen und ihnen visuelle Eigenschaften zu geben. CSS hat wie jede andere Sprache viele Versionen. Hier fokussieren wir uns auf CSS2.0, welche nicht die neueste, aber die am weitesten verbreitete und unterstützte Version ist. -**NOTE:** Weil die Ausgabe von CSS visuelle Eigenschaften sind, wirst du wahrscheinlich eine CSS-Sandbox wie [dabblet](http://dabblet.com/) benutzen müssen, um die Sprache richtig zu lernen. +**HINWEIS:** Weil die Ausgabe von CSS visuelle Eigenschaften sind, wirst du wahrscheinlich eine CSS-Sandbox wie [dabblet](http://dabblet.com/) benutzen müssen, um die Sprache richtig zu lernen. In diesem Artikel wird am meisten auf generelle Hinweise und die Syntax geachtet. ```css -/* kommentare werden in sternchen-schrägstrichkombinationen gepackt (genauso wie hier!) */ +/* Kommentare werden in Sternchen-Schrägstrichkombinationen gepackt (genauso wie hier!) */ /* #################### ## SELEKTOREN ####################*/ -/* Eigentlich ist die häufigste Anwendungsweise von CSS sehr simpel */ +/* Eigentlich ist das grundlegende CSS-Statement sehr simpel */ selektor { eigenschaft: wert; /* mehr eigenschaften...*/ } -/* der selektor wird dazu benutzt, ein element auf der seite anzuvisieren +/* Der Selektor wird dazu benutzt, ein Element auf der Seite auszuwählen. -Aber man kann auch alle Elemente auf einer Seite anvisieren! */ +Man kann aber auch alle Elemente auf einer Seite auswählen! */ * { color:red; } /* farbe:rot */ /* -Wenn wir so ein Element auf einer Seite haben: +Angenommen wir haben folgendes Element auf einer Seite: <div class='eine-klasse klasse2' id='eineId' attr='wert' /> */ -/* kann man es so bei seiner klasse anvisieren */ +/* kann man es so über seine Klasse auswählen */ .eine-klasse { } -/*oder bei beiden klassen! */ +/* oder über beide Klassen! */ .eine-klasse.klasse2 { } -/* oder beim namen des tags */ +/* oder über den Namen des Tags */ div { } -/* oder bei seiner id */ +/* oder über seine Id */ #eineId { } -/* oder daran, dass es ein Attribut hat! */ +/* oder darüber, dass es ein Attribut hat! */ [attr] { font-size:smaller; } -/* oder daran, dass das attribut einen bestimmten wert hat*/ +/* oder auch darüber, dass das Attribut einen bestimmten Wert hat */ [attr='wert'] { font-size:smaller; } -/* beginnt mit einem wert*/ -[attr^='wert'] { font-size:smaller; } +/* beginnt mit dem übergebenen Wert */ +[attr^='we'] { font-size:smaller; } -/* oder endet mit */ +/* endet damit */ [attr$='rt'] { font-size:smaller; } -/* oder sogar nur beinhaltet */ +/* oder beinhaltet einen Teil davon */ [attr~='er'] { font-size:smaller; } -/* was aber noch wichtiger ist, ist dass man alle diese kombinieren -kann - man sollte nur mit der leerzeichensetzung vorsichtig sein, -da es mit einem leerzeichen zwei verschiedene selektoren wären*/ +/* Noch wichtiger ist aber die Möglichkeit, all das miteinander kombinieren +zu können - man sollte hierbei nur mit der Leerzeichensetzung vorsichtig sein, +ein Leerzeichen macht es zu zwei verschiedenen Selektoren */ + div.eine-klasse[attr$='rt'] { } /* so ist es richtig */ -/* man kann auch ein element daran festmachen, wie sich die übergeordneten -elemente verhalten!*/ +/* Man kann auch ein Element über seine Elternelemente auswählen */ -/*es muss allerdings ein direktes kind sein */ +/* > wählt ein direktes Kind aus */ div.ein-elternteil > .klassen-name {} -/* oder jeder seiner eltern in der struktur */ -/* das folgende heißt also, dass jedes element mit der klasse 'klassen-name' -und dem elternteil IN JEDER TIEFE ausgewählt wird */ +/* Mit einem Leerzeichen getrennt kann man alle Elternelemente ansprechen */ +/* Das folgende heißt also, dass jedes Element mit der Klasse 'klassen-name' +und dem Elternteil IN JEDER TIEFE ausgewählt wird */ div.ein-elternteil .klassen-name {} -/* achtung: dasselbe ohne das leerzeichen hat eine andere bedeutung, +/* Achtung: das selbe ohne das Leerzeichen hat eine andere Bedeutung, kannst du mir sagen, was? */ div.ein-elternteil.klassen-name {} -/* man kann auch ein element nach seinem direkten vorherigen zwilling +/* Man kann ein Element auch nach seinem direkten Nachbarelement auswählen */ .ich-bin-vorher + .dieses-element { } -/* oder jeden zwilling davor */ +/* Oder über jedes Geschwisterelement davor */ .ich-kann-jeder-davor-sein ~ .dieses-element {} -/* es gibt ein paar pseudoklassen, die sich basierend auf dem -seitenverhalten, nämlich nicht auf der seitenstruktur auswählen -lassen können */ +/* Mit Pseudoklassen lassen sich Elemente anhand ihres momentanen Zustands +auf der Seite auswählen (anstatt über die Seitenstruktur) */ -/* zum beispiel, wenn über ein element mit dem mauszeiger gefahren wird */ +/* Zum Beispiel, wenn über ein Element mit dem Mauszeiger gefahren wird */ :hover {} -/* oder einen bereits besuchten link*/ +/* Oder einen bereits besuchten Link*/ :visited {} -/* oder einen noch nicht besuchten link*/ +/* Oder einen noch nicht besuchten Link*/ :link {} -/* oder ein eingabeelement, das zurzeit im fokus steht */ +/* Oder ein Eingabeelement, das zurzeit im Fokus steht */ :focus {} @@ -117,64 +116,64 @@ lassen können */ ####################*/ selector { - - /* einheiten */ - width: 50%; /* in prozent */ - font-size: 2em; /* mal der derzeitigen schriftgröße */ - width: 200px; /* in pixeln */ - font-size: 20pt; /* in punkten */ - width: 5cm; /* in zentimetern */ - width: 50mm; /* in millimetern */ - width: 5in; /* in zoll */ - - /* farben */ - background-color: #F6E /* in kurzem hex */ - background-color: #F262E2 /* in langem hex */ - background-color: tomato /* kann auch eine genannte farbe sein */ - background-color: rgb(255, 255, 255) /* in rgb */ - background-color: rgb(10%, 20%, 50%) /* in rgb prozent */ - background-color: rgba(255, 0, 0, 0.3); /* in semi-transparentem rgb */ - - /* bilder */ + + /* Einheiten */ + width: 50%; /* in Prozent */ + font-size: 2em; /* mal der derzeitigen Schriftgröße */ + width: 200px; /* in Pixeln */ + font-size: 20pt; /* in Punkten */ + width: 5cm; /* in Zentimetern */ + width: 50mm; /* in Millimetern */ + width: 5in; /* in Zoll */ + + /* Farben */ + background-color: #F6E /* in kurzem Hex */ + background-color: #F262E2 /* in langem Hex */ + background-color: tomato /* kann auch eine benannte Farbe sein */ + background-color: rgb(255, 255, 255) /* in RGB */ + background-color: rgb(10%, 20%, 50%) /* in RGB Prozent */ + background-color: rgba(255, 0, 0, 0.3); /* in semi-transparentem RGB */ + + /* Bilder */ background-image: url(/pfad-zum-bild/image.jpg); - - /* schriften */ + + /* Schriften */ font-family: Arial; - font-family: "Courier New"; /* wenn der name ein leerzeichen beinhält, kommt er in - apostrophe */ - font-family: "Courier New", Trebuchet, Arial; /* wenn der erste nicht gefunden wird, wird - der zweite benutzt, und so weiter */ + font-family: "Courier New"; /* wenn der Name ein Leerzeichen beinhält, kommt er in + Anführungszeichen */ + font-family: "Courier New", Trebuchet, Arial; /* wird die erste Schriftart + nicht gefunden, wird die zweite benutzt, usw. */ } ``` ## Benutzung -speichere das css, das du benutzen willst mit der endung '.css'. +Speichere das CSS, das du benutzen willst mit der endung '.css'. ```xml -<!-- du musst die css-datei im <head>-bereich der seite erwähnen --> +<!-- du musst die CSS-Datei im <head>-bereich der seite einbinden --> <link rel='stylesheet' type='text/css' href='filepath/filename.css' /> -<!-- es geht allerdings auch direkt, wobei diese methode nicht +<!-- Einbindung funktioniert auch inline, wobei diese Methode nicht empfohlen ist --> <style> selector { property:value; } </style> -<!-- oder direkt am element (sollte aber gelassen werden) --> +<!-- Oder direkt auf einem Element (sollte aber vermieden werden) --> <div style='property:value;'> </div> ``` -## Wichtigkeit +## Spezifität -ein element kann von mehr als einem selektoren angezielt werden. -und kann auch eine eigenschaft mehr als einmal zugewiesen bekommen. -in diesen fällen gibt es regeln, die die wichtigkeit von selektoren einführen. +Ein Element kann natürlich auch von mehr als einer Regel in einem Stylesheet +angesprochen werdenm und kann eine Eigenschaft auch öfters als einmal zugewiesen +bekommen. In diesen Fällen gibt es Regeln, die die Spezifität von Selektoren regeln. -wie haben dieses CSS: +Wir haben dieses CSS: ```css /*A*/ @@ -194,34 +193,34 @@ p { property: wert !important; } ``` -und das folgende markup: +und das folgende Markup: ```xml <p style='/*F*/ property:value;' class='class1 class2' attr='value'> </p> ``` -die wichtigkeit der stile ist wie folgt: -(die wichtigkeit gilt nur für **eigenschaften**, nicht für ganze blöcke) - -* `E` hat die größte wichtigkeit wegen dem schlüsselwort `!important`. - man sollte diese form aber vermeiden. -* `F` ist als nächstes, da es direkt an dem element definiert ist. -* `A` ist als nächstes, da es "spezifischer" als alle anderen ist. - spezifischer = mehr zuweisungen: 1 tagname `p` + - klassenname `klasse1` + 1 attribut `attr='value'` -* `C` ist als nächstes obwohl es genau so ist wie `B` - aber es erscheint als letztes. -* dann ist `B` +Die Spezifität der Stile ist wie folgt: +(die Spezifität gilt nur für **einzelne Eigenschaften**, nicht für ganze Blöcke) + +* `E` hat die größte Spezifität wegen dem Schlüsselwort `!important`. + man sollte diese Form aber vermeiden. +* `F` ist als nächstes dran, da es direkt an dem element definiert ist. +* Dann folgt `A`, da es "spezifischer" als alle anderen ist. + spezifischer = mehr Zuweisungen: 1 Tagname `p` + + Klassenname `klasse1` + 1 Attribut `attr='value'` +* `C` kommt als nächstes, obwohl es genau so ist wie `B`, + es erscheint aber später im Stylesheet. +* dann kommt `B` * und als letztes `D`. -## Kompabilität +## Kompatibilität -die meisten features von CSS sind in allen browsern verfügbar. -man sollte jedoch immer darauf achten, wenn man etwas mit CSS -programmiert. +Die meisten Features von CSS sind in allen Browsern verfügbar. Man sollte +jedoch immer darauf achten die benutzten Features auf Verfügbarkeit in den +vom Projekt unterstützten Browser zu überprüfen. -[QuirksMode CSS](http://www.quirksmode.org/css/) ist eine der besten quellen dafür. +[QuirksMode CSS](http://www.quirksmode.org/css/) oder [Can I Use](http://caniuse.com/) sind zwei der besten Quellen dafür. ## Weiterlesen diff --git a/de-de/go-de.html.markdown b/de-de/go-de.html.markdown new file mode 100644 index 00000000..ca27fdc7 --- /dev/null +++ b/de-de/go-de.html.markdown @@ -0,0 +1,318 @@ +--- +language: Go +filename: learngo-de.go +contributors: + - ["Joseph Adams", "https://github.com/jcla1"] +lang: de-de +--- +Go wurde entwickelt um probleme zu lösen. Sie ist zwar nicht der neuste Trend in +der Informatik, aber sie ist eine der neusten und schnellsten Wege um Aufgabe in +der realen Welt zu lösen. + +Sie hat vertraute Elemente von imperativen Sprachen mit statisher Typisierung +und kann schnell kompiliert und ausgeführt werden. Verbunden mit leicht zu +verstehenden Parallelitäts-Konstrukten, um die heute üblichen mehrkern +Prozessoren optimal nutzen zu können, eignet sich Go äußerst gut für große +Programmierprojekte. + +Außerdem beinhaltet Go eine gut ausgestattete standard bibliothek und hat eine +aktive community. + +```go +// Einzeiliger Kommentar +/* Mehr- + zeiliger Kommentar */ + +// Eine jede Quelldatei beginnt mit einer Packet-Klausel. +// "main" ist ein besonderer Packetname, da er ein ausführbares Programm +// einleitet, im Gegensatz zu jedem anderen Namen, der eine Bibliothek +// deklariert. +package main + +// Ein "import" wird verwendet um Packte zu deklarieren, die in dieser +// Quelldatei Anwendung finden. +import ( + "fmt" // Ein Packet in der Go standard Bibliothek + "net/http" // Ja, ein Webserver. + "strconv" // Zeichenkettenmanipulation +) + +// Es folgt die Definition einer Funktions, in diesem Fall von "main". Auch hier +// ist der Name wieder besonders. "main" markiert den Eintrittspunkt des +// Programms. Vergessen Sie nicht die geschweiften Klammern! +func main() { + // Println gibt eine Zeile zu stdout aus. + // Der Prefix "fmt" bestimmt das Packet aus welchem die Funktion stammt. + fmt.Println("Hello world!") + + // Aufruf einer weiteren Funktion definiert innerhalb dieses Packets. + beyondHello() +} + +// Funktionen können Parameter akzeptieren, diese werden in Klammern deklariert, +// die aber auch bei keinen Parametern erforderlich sind. +func beyondHello() { + var x int // Deklaration einer Variable, muss vor Gebrauch geschehen. + x = 3 // Zuweisung eines Werts. + // Kurze Deklaration: Benutzen Sie ":=" um die Typisierung automatisch zu + // folgern, die Variable zu deklarieren und ihr einen Wert zu zuweisen. + y := 4 + + // Eine Funktion mit mehreren Rückgabewerten. + sum, prod := learnMultiple(x, y) + + fmt.Println("sum:", sum, "prod:", prod) // Simple Ausgabe + learnTypes() // In < y Minuten lernen Sie mehr! +} + +// Funktionen können mehrere Parameter und (mehrere!) Rückgabewerte haben. +func learnMultiple(x, y int) (sum, prod int) { + return x + y, x * y // Wiedergabe zweier Werte +} + +// Überblick ueber einige eingebaute Typen und Literale. +func learnTypes() { + // Kurze Deklarationen sind die Norm. + s := "Lernen Sie Go!" // Zeichenketten-Typ + + s2 := `Eine "raw" Zeichenkette kann +Zeilenumbrüche beinhalten.` // Selber Zeichenketten-Typ + + // nicht-ASCII Literal. Go Quelltext ist UTF-8 kompatibel. + g := 'Σ' // Ein Runen-Typ, alias int32, gebraucht für unicode code points. + + f := 3.14195 // float64, eine IEEE-754 64-bit Dezimalzahl + c := 3 + 4i // complex128, besteht intern aus zwei float64-er + + // "var"-Syntax mit Initalwert + var u uint = 7 // Vorzeichenlos, aber die Größe ist implementationsabhängig + var pi float32 = 22. / 7 + + // Umwandlungs-Syntax mit kurzer Deklaration + n := byte('\n') // byte ist ein Alias für uint8 + + // Arrays haben bei Kompile-Zeit festgelegte Größen + var a4 [4]int // Ein Array mit 4 ints, alle mit Initialwert 0 + a3 := [...]int{3, 1, 5} // Ein Array mit 4 ints, Initialwerte wie angezeigt + + // "slices" haben eine dynamische Größe. Arrays und Slices haben beide ihre + // Vorzüge, aber slices werden viel häufiger verwendet + s3 := []int{4, 5, 9} // Vergleichen Sie mit a3, hier: keine Ellipse + s4 := make([]int, 4) // Weist Speicher für 4 ints zu, alle mit Initialwert 0 + var d2 [][]float64 // Nur eine Deklaration, keine Speicherzuweisung + bs := []byte("eine slice") // Umwandlungs-Syntax + + p, q := learnMemory() // Deklariert p & q als Zeiger zu einer int. + fmt.Println(*p, *q) // Die gibt die zwei Werte aus. "*" für den Zugriff + + // "Maps" sind dynamische Datenstrukturen mit variabler Größe. Sie sind wie + // "hashs" oder "dictionaries" aus anderen Sprachen. + m := map[string]int{"drei": 3, "vier": 4} + m["eins"] = 1 + + // Ungebrauchte Variablen sind Fehler in Go + // Der Unterstrich wird verwendet um einen Wert zu verwerfen. + _, _, _, _, _, _, _, _, _ = s2, g, f, u, pi, n, a3, s4, bs + // Die Ausgabe zählt natürlich auch als Gebrauch + fmt.Println(s, c, a4, s3, d2, m) + + learnFlowControl() // Auf zum Kontrollfluss! +} + +// Go ist komplett "garbage collected". Sie unterstützt Zeiger (pointers) aber +// keine Zeiger-Rechnungen. Fehler können sich durch "nil" einschleichen, jedoch +// nicht durch erhöhen eines Zeigers. +func learnMemory() (p, q *int) { + // Die bennanten Rückgabewerte p & q sind vom Typ *int + p = new(int) // Eingebaute Funktion "new" weist neuen Speicherplatz zu + // Der zugewiesene Speicher ist mit 0 initialisiert, p ist nicht länger nil + s := make([]int, 20) // So weist man 20 ints nebeneinander (im Speicher) zu + s[3] = 7 // Einer von ihnen wird ein Wert zugewiesen + r := -2 // Deklaration einer weiteren lokalen Variable + return &s[3], &r // & gibt die Addresse einer Variable +} + +func expensiveComputation() int { + return 1e6 +} + +func learnFlowControl() { + // Bedingte Anweisungen verlangen nach geschweiften Klammern, normale + // Klammern um die Bedingung werden aber nicht gebraucht. + if true { + fmt.Println("hab's dir ja gesagt!") + } + // Die Formattierung ist durch den Befehl "go fmt" standardisiert + if false { + // nicht hier + } else { + // sonder hier! spielt die Musik + } + + // Benutzen Sie ein "switch" Statement anstatt eine Anreihung von if-s + x := 1 + switch x { + case 0: + case 1: + // Einzelne Fälle fallen nicht zum nächsten durch! + case 2: + // wird nicht ausgeführt + } + // Wie bei "if", braucht "for" auch keine Klammern um die Bedingung + for x := 0; x < 3; x++ { // ++ ist ein Statement + fmt.Println(x, "-te Iteration") + } + // Ab hier gilt wieder: x == 1 + + // For ist die einzige Schleifenform in Go, sie hat aber mehrere Formen: + for { // Endloschleife + break // nur ein Spaß + continue // wird nie ausgeführt + } + + // Wie bei for, bedeutet := in einer Bedingten Anweisung zunächst die + // Zuweisung und erst dann die Überprüfung der Bedingung. + if y := expensiveComputation(); y > x { + x = y + } + // Funktionsliterale sind "closures" + xBig := func() bool { + return x > 100 // Verweist auf x, deklariert vor dem switch + } + fmt.Println("xBig:", xBig()) // true (im moment gilt: x == 1e6) + x /= 1e5 // dies macht x == 10 + fmt.Println("xBig:", xBig()) // jetzt: false + + // Wenn Sie's brauchen, werden Sie's lieben! + goto love +love: + + learnInterfaces() // Jetzt zum interessanten Teil! +} + +// Definiere "Stringer" als ein Interface mit einer Methode: String +type Stringer interface { + String() string +} + +// Definiere ein Paar als struct mit zwei Feldern, Integers mit Namen x & y. +type pair struct { + x, y int +} + +// Definiere eine Methode von "pair". Dieser Typ erfüllt jetzt das Stringer interface. +func (p pair) String() string { // p ist der Empfänger + // Sprintf ist eine weitere öffentliche Funktion von fmt. + // Der Syntax mit Punkt greift auf die Felder zu. + return fmt.Sprintf("(%d, %d)", p.x, p.y) +} + +func learnInterfaces() { + // Der Klammer-Syntax ist ein "struct literal". Es ist ein vollkommen + // initialisiertes struct. Der := Syntax deklariert und initialisiert p. + p := pair{3, 4} + fmt.Println(p.String()) // Aufruf der String() Methode von p. + var i Stringer // Deklariere i vom Typ: Stringer + i = p // Ok, weil p auch vom Typ Stringer ist. + // Aufruf der String Methode von i, gleiche Ausgabe wie zuvor. + fmt.Println(i.String()) + + // Funktionen des fmt-Packets rufen die String() Methode auf um eine + // druckbare variante des Empfängers zu erhalten. + fmt.Println(p) // gleiche Ausgabe wie zuvor + fmt.Println(i) // und wieder die gleiche Ausgabe wie zuvor + + learnErrorHandling() +} + +func learnErrorHandling() { + // Das ", ok" Idiom wird häufig verwendet um zu überprüfen ob etwas schief + // gegangen ist. + m := map[int]string{3: "drei", 4: "vier"} + if x, ok := m[1]; !ok { // ok wird false sein, da 1 nicht in der map ist. + fmt.Println("keine eins gefunden") + } else { + fmt.Print(x) // x wäre der Wert, wenn er in der map wäre. + } + // Ein Fehler-Wert (error value) gibt mehr Informationen über den Grund für + // das Problem an. + if _, err := strconv.Atoi("nicht-int"); err != nil { // _ verwirft den Wert + // Gibt: "strconv.ParseInt: parsing "nicht-int": invalid syntax" aus + fmt.Println(err) + } + // Wir kommen bald nochmal auf Interfaces zurück. Aber inzwischen: + learnConcurrency() +} + +// c ist ein Kannal, ein sicheres Kommunikationsmedium. +func inc(i int, c chan int) { + c <- i + 1 // <- ist der "send" Operator, wenn ein Kannal auf der Linken ist +} + +// Wir verwenden "inc" um Zahlen parallel zu erhöhen. +func learnConcurrency() { + // Die selbe "make"-Funktion wie vorhin. Sie initialisiert Speicher für + // maps, slices und Kannäle. + c := make(chan int) + // Starte drei parallele "Goroutines". Die Zahlen werden parallel (concurrently) + // erhöht. Alle drei senden ihr Ergebnis in den gleichen Kannal. + go inc(0, c) // "go" ist das Statement zum Start einer neuen Goroutine + go inc(10, c) + go inc(-805, c) + // Auslesen und dann Ausgeben der drei berechneten Werte. + // Man kann nicht im voraus feststellen in welcher Reihenfolge die Werte + // ankommen. + fmt.Println(<-c, <-c, <-c) // mit dem Kannal rechts ist <- der Empfangs-Operator + + cs := make(chan string) // ein weiterer Kannal, diesmal für strings + cc := make(chan chan string) // ein Kannal für string Kannäle + + // Start einer neuen Goroutine, nur um einen Wert zu senden + go func() { c <- 84 }() + go func() { cs <- "wortreich" }() // schon wider, diesmal für + // "select" hat eine Syntax wie ein switch Statement, aber jeder Fall ist + // eine Kannaloperation. Es wählt eine Fall zufällig aus allen die + // kommunikationsbereit sind aus. + select { + case i := <-c: // der empfangene Wert kann einer Variable zugewiesen werden + fmt.Printf("es ist ein: %T", i) + case <-cs: // oder der Wert kann verworfen werden + fmt.Println("es ist eine Zeichenkette!") + case <-cc: // leerer Kannal, nicht bereit für den Empfang + fmt.Println("wird nicht passieren.") + } + // Hier wird eine der beiden Goroutines fertig sein, die andere nicht. + // Sie wird warten bis der Wert den sie sendet von dem Kannal gelesen wird. + + learnWebProgramming() // Go kann es und Sie hoffentlich auch bald. +} + +// Eine einzige Funktion aus dem http-Packet kann einen Webserver starten. +func learnWebProgramming() { + // Der erste Parameter von "ListenAndServe" ist eine TCP Addresse an die + // sich angeschlossen werden soll. + // Der zweite Parameter ist ein Interface, speziell: ein http.Handler + err := http.ListenAndServe(":8080", pair{}) + fmt.Println(err) // Fehler sollte man nicht ignorieren! +} + +// Wir lassen "pair" das http.Handler Interface erfüllen indem wir seine einzige +// Methode implementieren: ServeHTTP +func (p pair) ServeHTTP(w http.ResponseWriter, r *http.Request) { + // Senden von Daten mit einer Methode des http.ResponseWriter + w.Write([]byte("Sie habe Go in Y Minuten gelernt!")) +} +``` + +## Weitere Resourcen +Alles zu Go finden Sie auf der [offiziellen Go Webseite](http://golang.org/). +Dort können sie der Tutorial folgen, interaktiv Quelltext ausprobieren und viel +Dokumentation lesen. + +Auch zu empfehlen ist die Spezifikation von Go, die nach heutigen Standards sehr +kurz und auch gut verständlich formuliert ist. Auf der Leseliste von Go-Neulingen +ist außerdem der Quelltext der [Go standard Bibliothek](http://golang.org/src/pkg/). +Gut documentiert, demonstriert sie leicht zu verstehendes und im idiomatischen Stil +verfasstes Go. Erreichbar ist der Quelltext auch durch das Klicken der Funktions- +Namen in der [offiziellen Dokumentation von Go](http://golang.org/pkg/). + diff --git a/de-de/haskell-de.html.markdown b/de-de/haskell-de.html.markdown new file mode 100644 index 00000000..2c548961 --- /dev/null +++ b/de-de/haskell-de.html.markdown @@ -0,0 +1,425 @@ +--- +language: Haskell +lang: de-de +contributors: + - ["Adit Bhargava", "http://adit.io"] +translators: + - ["Henrik Jürges", "https://github.com/santifa"] +filename: haskell-de.hs + +--- + +Haskell wurde als praktische und funktionale Sprache entworfen. +Es ist berühmt für das Schema der Monaden und des Typsystems, aber +es sticht vor allem die Einfachheit und Eleganz hervor. + +```haskell +-- Einfache Kommentare beginnen mit 2 Bindestriche. +{- So wird ein Kommentar +über mehrere Zeilen angelegt. +-} + +---------------------------------------------------- +-- 1. Primitive Datentypen und Operatoren +---------------------------------------------------- + +-- Normale Zahlen. +3 -- 3 + +-- Einfache Rechenoperationen. +1 + 1 -- 2 +8 - 1 -- 7 +10 * 2 -- 20 +35 / 5 -- 7.0 + +-- Die Division ist per se auf Fließkommazahlen. +35 / 4 -- 8.75 + +-- Ganzzahlige Division +35 `div` 4 -- 8 + +-- Boolesche Werte sind Primitiven. +True +False + +-- Logik Operationen +not True -- False +not False -- True +1 == 1 -- True +1 /= 1 -- False +1 < 10 -- True + +-- `not` ist eine Funktion die ein Argument entgegenimmt. +-- Haskell benötigt keine Klammern um Argumente. +-- Sie werden einfach aufgelistet: func arg1 arg2 arg3... +-- Wie man Funktionen definiert kommt weiter unten. + + +-- Strings und Zeichen +"Das ist ein String." +'a' -- Zeichen +'Einfache Anfuehrungszeichen gehen nicht.' -- error! + +-- Strings können konkateniert werden. +"Hello " ++ "world!" -- "Hello world!" + +-- Ein String ist eine Liste von Zeichen. +"Das ist eine String" !! 0 -- 'D' + + +---------------------------------------------------- +-- Listen und Tupel +---------------------------------------------------- + +-- Jedes Element einer Liste muss vom gleichen Typ sein. +-- Zwei gleiche Listen +[1, 2, 3, 4, 5] +[1..5] + +-- Haskell unterstuetzt unendliche Listen! +[1..] -- Die Liste aller natuerlichen Zahlen + +-- Unendliche Listen funktionieren in Haskell, da es "lazy evaluation" +-- unterstuetzt. Haskell evaluiert erst etwas, wenn es benötigt wird. +-- Somit kannst du nach dem 1000. Element fragen und Haskell gibt es dir: + +[1..] !! 999 -- 1000 + +-- Haskell evaluiert nun die ersten 1 - 1000 Elemente, aber der Rest der Liste +-- bleibt unangetastet. Haskell wird sie solange nicht weiterevalieren +-- bis es muss. + +-- Zwei Listen konkatenieren +[1..5] ++ [6..10] + +-- Ein Element als Head hinzufuegen +0:[1..5] -- [0, 1, 2, 3, 4, 5] + +-- Gibt den 5. Index zurueck +[0..] !! 5 -- 5 + +-- Weitere Listenoperationen +head [1..5] -- 1 +tail [1..5] -- [2, 3, 4, 5] +init [1..5] -- [1, 2, 3, 4] +last [1..5] -- 5 + +-- list comprehensions | Listen erschaffen +[x*2 | x <- [1..5]] -- [2, 4, 6, 8, 10] + +-- Mit Bedingungen +[x*2 | x <- [1..5], x*2 > 4] -- [6, 8, 10] + +-- Tupel haben eine feste Länge, jedes Element darf aber ein anderen Typ haben. +-- Ein Tupel: +("haskell", 1) + +-- Auf Elemente eines Tupels zugreifen: +fst ("haskell", 1) -- "haskell" +snd ("haskell", 1) -- 1 + +---------------------------------------------------- +-- 3. Funktionen +---------------------------------------------------- +-- Eine einfache Funktion die zwei Argumente hat. +add a b = a + b + +-- Wenn man ghci (den Haskell Interpreter) benutzt, muss ein `let` davor. +-- let add a b = a + b + +-- Eine Funktion aufrufen +add 1 2 -- 3 + +-- Man kann eine Funktion auch Infix verwenden, +-- wenn man sie mit backticks umgibt +1 `add` 2 -- 3 + +-- So sieht die Definition eines eigenen Operators aus. +-- Also einer Funktion deren Name aus Symbolen besteht. +-- Die Integer Division: +(//) a b = a `div` b +35 // 4 -- 8 + +-- Guards sind eine einfache Möglichkeit fuer Fallunterscheidungen. +fib x + | x < 2 = x + | otherwise = fib (x - 1) + fib (x - 2) + +-- Pattern Matching funktioniert ähnlich. +-- Hier sind drei Definitionen von fib. Haskell wird automatisch +-- die erste Funktionen nehmen die dem Pattern der Eingabe entspricht. +fib 1 = 1 +fib 2 = 2 +fib x = fib (x - 1) + fib (x - 2) + +-- Pattern matching auf Tupeln: +foo (x, y) = (x + 1, y + 2) + +-- Pattern matching auf Listen. +-- `x` ist das erste Element der Liste und `xs` der Rest der Liste. +-- Damit können wir unsere eigene map Funktion bauen: +myMap func [] = [] +myMap func (x:xs) = func x:(myMap func xs) + +-- Anonyme Funktionen (Lambda-Funktionen) werden mit einem +-- Backslash eingeleitet, gefolgt von allen Argumenten. +myMap (\x -> x + 2) [1..5] -- [3, 4, 5, 6, 7] + +-- Fold (`inject` in einigen Sprachen) +-- Foldl1 bedeutet: fold von links nach rechts und nehme den ersten +-- Wert der Liste als Basiswert f[r den Akkumulator. +foldl1 (\acc x -> acc + x) [1..5] -- 15 + +---------------------------------------------------- +-- 4. Mehr Funktionen +---------------------------------------------------- + +-- currying: Wenn man nicht alle Argumente an eine Funktion uebergibt, +-- so wird sie eine neue Funktion gebildet ("curried"). +-- Es findet eine partielle Applikation statt und die neue Funktion +-- nimmt die fehlenden Argumente auf. + +add a b = a + b +foo = add 10 -- foo ist nun Funktion die ein Argument nimmt und 10 addiert +foo 5 -- 15 + +-- Ein alternativer Weg +foo = (+10) +foo 5 -- 15 + +-- Funktionskomposition +-- Die (.) Funktion verkettet Funktionen. +-- Zum Beispiel, die Funktion Foo nimmt ein Argument addiert 10 dazu und +-- multipliziert dieses Ergebnis mit 5. +foo = (*5) . (+10) + +-- (5 + 10) * 5 = 75 +foo 5 -- 75 + + +-- Haskell hat eine Funktion `$`. Diese ändert den Vorrang, +-- so dass alles links von ihr zuerst berechnet wird und +-- und dann an die rechte Seite weitergegeben wird. +-- Mit `.` und `$` kann man sich viele Klammern ersparen. + +-- Vorher +(even (fib 7)) -- true + +-- Danach +even . fib $ 7 -- true + +---------------------------------------------------- +-- 5. Typensystem +---------------------------------------------------- + +-- Haskell hat ein sehr starkes Typsystem. +-- Alles hat einen Typ und eine Typsignatur. + +-- Einige grundlegende Typen: +5 :: Integer +"hello" :: String +True :: Bool + +-- Funktionen haben genauso Typen. +-- `not` ist Funktion die ein Bool annimmt und ein Bool zurueckgibt: +-- not :: Bool -> Bool + +-- Eine Funktion die zwei Integer Argumente annimmt: +-- add :: Integer -> Integer -> Integer + +-- Es ist guter Stil zu jeder Funktionsdefinition eine +-- Typdefinition darueber zu schreiben: +double :: Integer -> Integer +double x = x * 2 + +---------------------------------------------------- +-- 6. If-Anweisung und Kontrollstrukturen +---------------------------------------------------- + +-- If-Anweisung: +haskell = if 1 == 1 then "awesome" else "awful" -- haskell = "awesome" + +-- If-Anweisungen können auch ueber mehrere Zeilen verteilt sein. +-- Das Einruecken ist dabei äußerst wichtig. +haskell = if 1 == 1 + then "awesome" + else "awful" + +-- Case-Anweisung: Zum Beispiel "commandline" Argumente parsen. +case args of + "help" -> printHelp + "start" -> startProgram + _ -> putStrLn "bad args" + +-- Haskell nutzt Rekursion anstatt Schleifen. +-- map wendet eine Funktion auf jedes Element einer Liste an. + +map (*2) [1..5] -- [2, 4, 6, 8, 10] + +-- So kann man auch eine for-Funktion kreieren. +for array func = map func array + +-- und so benutzt man sie: +for [0..5] $ \i -> show i + +-- wir hätten sie auch so benutzen können: +for [0..5] show + +-- foldl oder foldr reduziren Listen auf einen Wert. +-- foldl <fn> <initial value> <list> +foldl (\x y -> 2*x + y) 4 [1,2,3] -- 43 + +-- die Abarbeitung sieht so aus: +(2 * (2 * (2 * 4 + 1) + 2) + 3) + +-- foldl ist linksseitig und foldr rechtsseitig. +foldr (\x y -> 2*x + y) 4 [1,2,3] -- 16 + +-- die Abarbeitung sieht so aus: +(2 * 3 + (2 * 2 + (2 * 1 + 4))) + +---------------------------------------------------- +-- 7. Datentypen +---------------------------------------------------- + +-- So kann man seine eigenen Datentypen in Haskell anlegen: + +data Color = Red | Blue | Green + +-- Nun können wir sie in einer Funktion benutzen. + +say :: Color -> String +say Red = "You are Red!" +say Blue = "You are Blue!" +say Green = "You are Green!" + +-- Datentypen können auch Parameter aufnehmen: + +data Maybe a = Nothing | Just a + +-- Diese sind alle vom Typ Maybe: +Just "hello" -- vom Typ `Maybe String` +Just 1 -- vom Typ `Maybe Int` +Nothing -- vom Typ `Maybe a` fuer jedes `a` + +---------------------------------------------------- +-- 8. Haskell IO +---------------------------------------------------- + +-- IO kann nicht völlig erklärt werden ohne Monaden zu erklären, +-- aber man kann die grundlegenden Dinge erklären. + +-- Wenn eine Haskell Programm ausgefuehrt wird, so wird `main` aufgerufen. +-- Diese muss etwas vom Typ `IO ()` zurueckgeben. Zum Beispiel: + +main :: IO () +main = putStrLn $ "Hello, sky! " ++ (say Blue) +-- putStrLn hat den Typ String -> IO () + +-- Es ist am einfachsten, wenn man sein Programm als Funktion von +-- String nach String implementiert. +-- Zum Beispiel die Funktion interact :: (String -> String) -> IO () +-- nimmt einen Text, tut etwas damit und gibt diesen wieder aus. + +countLines :: String -> String +countLines = show . length . lines + +main' = interact countLines + +-- Man kann den Typ `IO ()` als Repräsentation einer Sequenz von +-- Aktionen sehen, die der Computer abarbeiten muss. +-- Wie bei einem Programm das in einer Imperativen Sprache geschreiben wurde. +-- Mit der `do` Notation können Aktionen verbunden werden. + +sayHello :: IO () +sayHello = do + putStrLn "What is your name?" + name <- getLine -- eine Zeile wird geholt und + -- an die Variable "name" gebunden + putStrLn $ "Hello, " ++ name + +-- Uebung: Schreibe deine eigene Version von `interact`, +-- die nur eine Zeile einliest. + +-- `sayHello` wird niemals ausgefuehrt, nur `main` wird ausgefuehrt. +-- Um `sayHello` laufen zulassen kommentiere die Definition von `main` +-- aus und ersetze sie mit: +-- main = sayHello + +-- Lass uns untersuchen wie `getLine` arbeitet. +-- Der Typ ist: getLine :: IO String +-- Man kann sich vorstellen das der Wert vom Typ `IO a` ein +-- Programm repräsentiert das etwas vom Typ `a` generiert. +-- Der Wert wird mit `<-` gespeichert und kann wieder benutzt werden. +-- Wir könne auch eigene Funktionen vom Typ `IO String` definieren: + +action :: IO String +action = do + putStrLn "This is a line. Duh" + input1 <- getLine + input2 <- getLine + -- Der Typ von `do` ergibt sich aus der letzten Zeile. + -- `return` ist eine Funktion und keine Schluesselwort + return (input1 ++ "\n" ++ input2) -- return :: String -> IO String + +-- Nun können wir `action` wie `getLine` benutzen: + +main'' = do + putStrLn "I will echo two lines!" + result <- action + putStrLn result + putStrLn "This was all, folks!" + +-- Der Typ `IO` ist ein Beispiel fuer eine Monade. +-- Haskell benutzt Monaden Seiteneffekte zu kapseln und somit +-- eine rein funktional Sprache zu sein. +-- Jede Funktion die mit der Außenwelt interagiert (z.B. IO) +-- hat den Typ `IO` in seiner Signatur. +-- Damit kann man zwischen "reinen" Funktionen (interagieren nicht +-- mit der Außenwelt oder ändern ihren Zustand) und Anderen unterscheiden. + +-- Nebenläufigkeit ist in Haskell sehr einfach, da reine Funktionen +-- leicht nebenläufig arbeiten können. + +---------------------------------------------------- +-- 9. Die Haskell REPL +---------------------------------------------------- + +-- Starte die REPL mit dem Befehl `ghci` +-- Nun kann man Haskell Code eingeben. +-- Alle neuen Werte muessen mit `let` gebunden werden: + +let foo = 5 + +-- `:t` zeigt den Typen von jedem Wert an: + +>:t foo +foo :: Integer + +-- Auch jede `IO ()` Funktion kann ausgefuehrt werden. + +> sayHello +What is your name? +Friend! +Hello, Friend! + +``` + +Es gibt noch viel mehr in Haskell, wie zum Beispiel Typklassen und Monaden. +Dies sind die Ideen durch die Haskell Programmierung zum Spaß wird. +Mit dem folgenden kleinen Beispiel werde ich euch verlassen: +Quicksort in Haskell: + +```haskell +qsort [] = [] +qsort (p:xs) = qsort lesser ++ [p] ++ qsort greater + where lesser = filter (< p) xs + greater = filter (>= p) xs +``` + +Haskell ist sehr einfach zu installieren. +Hohl es dir von [hier](http://www.haskell.org/platform/). + +Eine sehr viele langsamere Einfuehrung findest du unter: +[Learn you a Haskell](http://learnyouahaskell.com/) oder +[Real World Haskell](http://book.realworldhaskell.org/). diff --git a/de-de/javascript-de.html.markdown b/de-de/javascript-de.html.markdown index 0418b2b6..38ce28e2 100644 --- a/de-de/javascript-de.html.markdown +++ b/de-de/javascript-de.html.markdown @@ -397,8 +397,8 @@ var myNumberObj = new Number(12); myNumber == myNumberObj; // = true
// Genau genommen: Sie sind nicht exakt äquivalent.
-typeof(myNumber); // = 'number'
-typeof(myNumberObj); // = 'object'
+typeof myNumber; // = 'number'
+typeof myNumberObj; // = 'object'
myNumber === myNumberObj; // = false
if (0){
// Dieser Teil wird nicht ausgeführt, weil 0 'falsy' ist.
diff --git a/de-de/markdown-de.html.markdown b/de-de/markdown-de.html.markdown new file mode 100644 index 00000000..6a90980b --- /dev/null +++ b/de-de/markdown-de.html.markdown @@ -0,0 +1,256 @@ +--- +language: markdown +contributors: + - ["Dan Turkel", "http://danturkel.com/"] +translators : + - ["Frederik Ring", "https://github.com/m90"] + - ["Philipp Fischbeck", "https://github.com/PFischbeck"] +filename: markdown-de.md +lang: de-de +--- + +Markdown wurde im Jahr 2004 von John Gruber kreiert. Ziel ist und war eine +Syntax, in der sich Dokumente leicht schreiben *und* lesen lassen. Außerdem +sollte Markdown sich leicht nach HTML (und in andere Formate) konvertieren +lassen. + +```markdown +<!-- Markdown ist eine Obermenge von HTML - jede valide HTML-Datei ist also +automatisch valides Markdown - was heisst dass wir jedes HTML-Element (also auch +Kommentare) in Markdown benutzen können, ohne dass der Parser sie verändert. +Jedoch kann man innerhalb eines solchen HTML-Elements dann kein Markdown +mehr verwenden. --> + +<!-- Es existieren unterschiedliche Markdown-Parser und -Dialekte, die sich in +manchen Punkten unterscheiden. Diese Einführung wird versuchen, zu erläutern, +welche Features überall verfügbar sind, und welche davon parser-spezifisch sind --> + +<!-- Überschriften --> +<!-- HTML-Überschriften <h1> bis <h6> lassen sich einfach durch ein Voranstellen +der entsprechenden Anzahl an Hashes (#) auszeichnen --> +# Das ist eine <h1> +## Das ist eine <h2> +### Das ist eine <h3> +#### Das ist eine <h4> +##### Das ist eine <h5> +###### Das ist eine <h6> + +<!-- Für die Elemente <h1> und <h2> gibt es in Markdown noch Sonderformen --> +Das ist eine h1 +============= + +Das ist eine h2 +------------- + +<!-- Einfaches Textstyling --> +<!-- Jeglicher Text lässt sich mit Markdown leicht als kursiv oder +auch als fett auszeichnen --> + +*Dieser Text ist kursiv.* +_Genau wie dieser._ + +**Dieser Text ist fett.** +__Genau wie dieser.__ + +***Dieser Text ist beides*** +**_Dieser auch!_** +*__Und dieser genau so!__* + +<!-- In "Github Flavored Markdown", dem von Github verwendeten Dialekt / Parser, +gibt es auch noch durchgestrichenen Text: --> + +~~Dieser Text wird durchgestrichen dargestellt.~~ + +<!-- Absätze sind eine oder mehrere zusammenhängende Zeilen Text, und werden +durch eine oder mehrere Leerzeilen voneinander abgesetzt. --> + +Das ist ein Absatz. Ich kann immer noch nicht glauben, wie viel Spaß das macht !?! + +Jetzt bin ich schon bei Absatz 2. +Hier ist dann immer noch Absatz 2! + + +Jetzt ist das dann Nummer drei! + +<!-- Sollte man jemals ein <br />-Tag einfügen wollen, kann man einen Absatz +mit zwei oder mehr Leerzeichen beenden, und danach einen neuen Absatz beginnen. --> + +Ich höre mit zwei Leerzeichen auf (markiere mich, und du siehst es). + +Über mir ist wohl ein <br />! + +<!-- Zitate werden ganz einfach mit einem > ausgezeichnet. --> + +> Das ist ein Zitat. Du kannst Zeilenumbrüche +> entweder manuell hinzufügen und ein `>` vor jeder Zeile einfügen, oder du kannst deine Zeilen einfach immer länger und länger werden lassen, die Umbrüche werden dann automatisch erzeugt. +> Solange sie mit einem `>` beginnen, macht das keinen Unterschied. + +> Auch möglich ist es, den Text +>> mehrstufig einzurücken. +> Nicht schlecht, oder? + +<!-- Listen --> +<!-- <ul>s können mit Sternen, Pluszeichen oder Minuszeichen erzeugt werden --> + +* Punkt auf der Liste +* Punkt auf der Liste +* Anderer Punkt auf der Liste + +oder + ++ Punkt auf der Liste ++ Punkt auf der Liste ++ Noch ein Punkt auf der Liste + +oder + +- Punkt auf der Liste +- Punkt auf der Liste +- Ein letzter Punkt auf der Liste + +<!-- <ol>s werden mit einer Zahl gefolgt von einem Punkt erzeugt --> + +1. Punkt eins +2. Punkt zwei +3. Punkt drei + +<!-- Auch wenn es keine gute Idee sein mag: du müsstest die einzelnen Punkte +nicht mal korrekt numerieren --> + +1. Punkt eins +1. Punkt zwei +1. Punkt drei +<!-- (Das sieht genau so aus wie das Beispiel eins weiter oben) --> + +<!-- Man kann Listen auch verschachteln --> + +1. Punkt eins +2. Punkt zwei +3. Punkt drei + * Unterpunkt + * Unterpunkt +4. Punkt vier + +<!-- Code-Blöcke --> +<!-- Blöcke von Programmcode (also ein <code>-Element) kannst du auszeichnen, +indem du eine Zeile mit vier Leerzeichen oder einem Tabulator einrückst --> + + Das ist Quellcode + Das hier auch + +<!-- Der Code kann natürlich auch wiederum eingerückt sein --> + + my_array.each do |item| + puts item + end + +<!-- Innerhalb normalen Texts kannst du Code mit Backticks ` auszeichnen --> + +Hermann hatte nicht die leiseste Ahnung, was dieses `go_to()` bedeuten könnte! + +<!-- In "Github Flavored Markdown" gibt es für Code nocheinmal eine +besondere Syntax --> + +\`\`\`ruby <!-- in "echt" musst du die Backslashes entfernen: ```ruby ! --> +def foobar + puts "Hallo Welt!" +end +\`\`\` <!-- hier auch keine Backslashes, nur ``` --> + +<-- der obige Block muss nicht extra eingerückt werden, außerdem fügt Github +Syntax-Highlighting für die nach dem ``` angegebene Sprache hinzu --> + +<!-- Horizontale Linie (<hr />) --> +<!-- Trenner lassen sich einfach mit drei (oder mehr) Sternen oder Bindestrichen +erzeugen (egal ob mit oder ohne Leerzeichen dazwischen)--> + +*** +--- +- - - +**************** + +<!-- Hyperlinks --> +<!-- Eines der besten Features von Markdown ist das kinderleichte Erzeugen von +Hyperlinks: Einfach den Linktext in eckige Klammern [] setzen, gefolgt von +einer mit runden Klammern () umschlossenen URL. --> + +[Klick mich!](http://test.de/) + +<!-- Man kann dem Link auch noch ein title-Attribut geben --> + +[Klick mich!](http://test.at/ "Link zu Test.at") + +<!-- Relative Pfade funktionieren natürlich auch --> + +[Zu meiner Musiksammlung](/music/). + +<!-- URLs lassen sich auch über Referenzen festlegen --> + +[Klick mich][link1], um mehr über mich herauszufinden! +[Hier kannst du auch mal draufklicken][foobar], wenn es dich interessiert. + +[link1]: http://test.de/ "Wahnsinn!" +[foobar]: http://foobar.ch/ "Erstaunlich!" + +<!-- Das title-Attribut wird entweder mit Anführungszeichen oder Klammern +umschlossen (oder gleich ganz weggelassen). Die Referenzen können an jeder +Stelle im gesamtem Dokument vorkommen, als ID kann alles verwendet werden, solange +es dokumentweit eindeutig ist. --> + +<!-- Man kann den Linktext auch als implizite Referenz benutzen --> + +[Das][] ist ein Link. + +[das]: http://dasisteinlink.at/ + +<!-- Das ist aber eher unüblich. --> + +<!-- Bilder --> +<!-- Bilder funktionieren genau wie Links, nur dass man noch ein Ausrufezeichen +voranstellt! --> + +![Das ist das alt-Attribut für mein Bild](http://imgur.com/myimage.jpg "Hier noch ein title-Attribut") + +<!-- Referenzen funktionieren auch hier genau wie erwartet --> + +![Das ist das alt-Attribut][meinbild] + +[meinbild]: relative/urls/gehen/auch.jpg "hier wäre noch Platz für einen title" + +<!-- Bonusfeatures --> +<!-- Auto-Links --> + +<http://testwebseite.de/> ist das selbe wie +[http://testwebseite.de/](http://testwebseite.de/) + +<!-- Automatische Links für E-Mail-Addressen --> + +<foo@bar.com> + +<!-- Maskieren --> + +Ich würde *diesen Teil gerne mit Sternen umschließen*, doch ohne dass er kursiv +wird. Also mache ich folgendes: \*Ich umschließe diesen Text mit Sternen\*! + +<!-- Tabellen --> +<!-- Tabellen gibt es bis jetzt nur in "Github Flavored Markdown". +Zudem sind sie ziemlich mühselig, aber wenn du es wirklich wissen willst: --> + +| Spalte1 | Spalte2 | Spalte3 | +| :----------- | :------: | ------------: | +| linksbündig | mittig | rechtsbündig | +| blah | blah | blah | + +<!-- oder das selbe in grün: --> + +Spalte1 | Spalte2 | Spalte3 +:-- | :-: | --: +Ganz schön hässlich | vielleicht doch lieber | wieder aufhören + +<!-- Das war's! --> + +``` + +Mehr Informationen gibt es in [John Gruber's offiziellem Blog-Post](http://daringfireball.net/projects/markdown/syntax) +und bei Adam Pritchards [grandiosem Cheatsheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet). +Infos zu Github Flavored Markdown [gibt es hier](https://help.github.com/articles/github-flavored-markdown).
\ No newline at end of file |