#CodeTask
CodeTask ist ein Programm das interaktives Lernen von Scala ermöglicht. User können videos sehen, koans lösen und eigene codeaufgaben einreichen. Der Fortschritt der User wird auf dem Server gespeichert.
##Course erstellen
Course basieren auf einem festgelegten format das als .json an den Server gesendet wird. Zur erstellung von Coursen steht ein Hilfsscript codetask bereit. Das Script wird folgendermaßen benutzt:
help | show help
create course "Course Title" /path/to/scala/tests | create course
update course 100001 "Course Title" /path/to/scala/tests | update course
delete course 100001 | delete course
create course /path/to/file.json | create course from json file
update course 100001 /path/to/file.json | update course from json file
parse "Course Title" /path/to/scala/tests ./to/file.json | create json file of course
create user | create user
update user 200001 | update user
delete user 200001 | delete user
show users | show users
show courses | show courses
Das Script übersetzt mit create und update die .scala Dateien von
CodeTaskSuite
Klassen in eine .json Datei und sendet diese an den Server.
Einzelne CodeTaskSuite
Klassen bilden die Chapter eines Courses. Beispiel:
/folder
/scala1course
ChapterOne.scala
ChapterTwo.scala
ChapterThree.scala
Die oben beschriebene Ordnerstruktur würde in einen Course mit drei Chaptern übersetzt.
##CodeTaskSuite
Im Ordner /CodeTask
befindet sich ein Eclipse Projekt das die CodeTaskSuite
Klasse beinhaltet. Diese erbt von org.scalatest.FunSuite
und kann als test
ausgeführt werden. Außerdem verfügt sie über die Methoden video
, koan
und
codetask
mit denen die Aufgaben der einzelenen Chaptern definiert werden.
Eine Suite könnte zum Beispiel so aussehen:
/*
TITLE:Listen in Scala
RANK:1
*/
// Inhalt von AboutLists.scala
package tasks
import support.CodeTaskSuite
import org.scalatest.Matchers
// CodeTaskSuites werden als chapters in courses hinzugefügt
class AboutLists extends CodeTaskSuite {
// keine tabs und indentation 2 space oder nur tabs bei multiline kommentaren
video("Viedeo zu Scala-Listen.", "U23j6yH21W4")
koan("""Mit der Funktion <b>contains</b> kann geprüft werden ob eine Liste ein bestimmtes Element enthält.
| Mit der Funktion <b>map</b> können funktionen auf listen angewendet werden, die
| Ergebnisse werden in einer neuen Liste gespeichert.
| Versuch in dem folgenden <b>Koan</b> die richtigen Werte einzutragen""") {
val l = List(1, 2, 3, 4)
val l2 = l.map { x => x + 1 }
val l3 = l.map { x => x * x }
l should be (List(1, 2, 3, 4))
l2 should be(List(2, 3, 4, 5))
l3 shouldBe List(1, 4, 9, 16)
}
koan("Zu Listen können auch Werte hinzugefügt werden.<br>Dies kann mit <b>++</b> geschehen.") {
val l = List(1, 3, 5)
val l2 = l ++ List(6)
l2 shouldBe List(1, 3, 5, 6)
}
codetask("""schreiben sie eine function reverse die eine umgekehrte liste zurück geben.
| Nutzen Sie nicht die bereits vorhandenen Möglichkeit
| <b>List.reverse</b>""") {
def rvrs(l: List[Any]): List[Any] = {
//solve
l match {
case h :: tail => rvrs(tail) ::: List(h)
case _ => Nil
}
//endsolve
}
//test
rvrs(List(1, 2, 3)) should be(List(3, 2, 1))
//endtest
}
}
###Title und Rank Der Kommentar ist optional. Mit dem Ersten Kommentar kann der Titel des Kapitels unabhängig von dem Dateinamen gewählt werden. Wichtig ist, dass der Kommentar ein /**/ Block-Kommentar ist. der RANK-Wert gibt die Position in der Reihenfolge der Kapitel an.
###Videos
Videos werden mit der Methode video
definiert und haben eine Description und
eine Youtube-URL oder den Video-Key.
###Koans
Koans werden mit der koan
Methode definiert. Koans sind Code-Lückentexte bei
denen die Assertion vom User eingegeben werden
muss. Für die folgenden Assertions werden Ergebnise ersetzt:
result should equal (x) // -> result should equal (__)
result should === (x) // -> result should === (__)
result should be (x) // -> result should be (__)
result shouldEqual x // -> result shouldEqual __
result shouldBe x // -> result shouldBe __
###Codetask
Mit der Methode codetask
werden Codetasks definiert.
Codetasks sind Aufgaben bei denen der User einen Code schreiben muss der
bestimmte assertions erfüllen muss. Die Aufgabe kann formuliert werden so dass
der Test ausführbar is. Bei der umwandlung in .json wird die Lösung die
zwischen einzeiligen //solve
und //endsolve
Kommentaren geschrieben wird,
aus dem code herausgenommen.
Die Assertions die zutreffen sollen werden zwischen einzeilige //test
und
//endtest
Kommentare geschrieben.
Um den Server zu Starten:
- compilieren mit ./activator dist
- compilierte zip entpacken in /target/universal
- application datei in /target/universal/entpackt/ ausführbar machen mit chmod +x codetask
- ./codetask -Dhttp.port=9000 -Dplay.crypto.secret="19;Yb1AVDOWOcxmYqmv^F5M?<=dqt;I<ApsTX5=[1FmDRD5X0ZYb<8qECZYFhRQR" &
falls bereits ein server auf dem port 9000 läuft kann dieser mit lsof -i -P | grep "9000" ausfindig und mit kill gestoppt werden.