Ziel dieses Moduls ist die Verbesserung des Verständnisses darüber, wie Stichproben entstehen. Dafür werden Methoden des erfahrungsbasierten Lernens eingesetzt, die in einer linear erzählten Geschichte eingebettet sind.
|
|
il y a 5 ans | |
|---|---|---|
| doc | il y a 5 ans | |
| public | il y a 5 ans | |
| src | il y a 5 ans | |
| tasks | il y a 5 ans | |
| .babelrc | il y a 5 ans | |
| .editorconfig | il y a 5 ans | |
| .eslintrc.yml | il y a 5 ans | |
| .gitignore | il y a 5 ans | |
| .htmlhintrc | il y a 5 ans | |
| .sass-lint.yml | il y a 5 ans | |
| config.js | il y a 5 ans | |
| gulpfile.babel.js | il y a 5 ans | |
| package.json | il y a 5 ans | |
| readme.md | il y a 5 ans | |
| readme.pdf | il y a 5 ans |
Das Projekt RisikoAtlas hat die Förderung der Risikokompetenz zum Ziel. Zu diesem Zweck wurden am Harding-Zentrum für Risikokompetenz am Max-Planck-Institut für Bildungsforschung digitale Werkzeuge entwickelt, die auf wissenschaftlichen Erkenntnissen beruhen. Neben interaktiven Visualisierungen evidenzbasierter Risikokommunikation, einer App zur Entscheidungsunterstützung und einer Browser-Erweiterung als Leseassistenz sind Lernvisualisierungen zur Verbesserung der Risikokompetenz Teil des Projektes. Das vorliegende Modul ist eines dieser sechs Lernmodule.
Die Lernmodule wurden ursprünglich entwickelt von kf interactive.
Die folgende Liste gibt einen Überblick über die Ziele der Module:
Alle mit einem * versehenen Module greifen über eine API auf eine Datenbank zu. Auf diese Weise rufen sie die benötigten Daten ab, und speichern andererseits Antworten der Benutzer, um ihnen den Vergleich zu Anderen zu ermöglichen. Für jedes dieser Module existiert auch eine offline-Version, die ausschließlich auf lokale Daten zugreift.
Im Wurzelverzeichnis liegen die für den Build Prozess notwendigen
Konfigurationsdateien. Das Verzeichnis doc/ enthält detailliertere
Dokumentationen zu einzelnen Aspekten des Projekts. Alle für die WebApp
benötigten Dateien werden in public/ erstellt bzw. dorthin kopiert. Im
src/ Verzeichnis befinden sich alle Quelldateien, Bilder und Fonts.
Der tasks/ Ordner enthält Javascript-Dateien, die die Teilschritte des
Build-Prozesses definieren.
Die grobe Struktur sieht folgendermaßen aus:
├── .editorconfig // Konfiguration für Texteditoren
├── .babelrc // Konfiguration von babel
├── .eslintrc.yml // Konfiguration des Javascript Linters
├── .htmlhintrc // Konfiguration des HTML Linters
├── .sass-lint.yml // Konfiguration des Sass Linters
├── config.js // Konfiguration des Build-Systems
├── gulpfile.babel.js // gulp Datei, verwendet Definitionen unter `tasks/`
├── package.json // npm Abhängigkeiten, Shortcuts für gulp tasks
├── doc/ // Dokumentation in markdown
├── public/ // Zielverzeichnis für den Build-Prozess
├── src/ // Quellverzeichnis
│ ├── fonts // Font Dateien
│ ├── html // HTML 'Templates'
│ ├── img // Bilder und Sprites
│ ├── js // Javascript Quelldateien
│ └── scss // Sass stylesheets
└── tasks/ // Definitionen für den gulp Build-Prozess
Ziel dieses Moduls ist die Verbesserung des Verständnisses darüber, wie Stichproben entstehen.\ Dafür werden Methoden des erfahrungsbasierten Lernens eingesetzt, die in in einer linear erzählten Geschichte eingebettet sind.
Für einen schnellen Überblick sind hier die Quell-Dateien mit kurzen Beschreibungen aufgelistet:
├── main.jsx // Einstiegspunkt für App
├── config.js // Globale Konfiguration der WebApp
├── components // (p)react Komponenten
│ ├── Index.jsx // Web App Haupt-Komponente
│ ├── FinalScreen.jsx // Abschließende Ansicht
│ ├── PollScreen.jsx // View für die interaktive Visualisierung
│ ├── TitleScreen.jsx // Einleitende Ansicht
│ └── partials
│ ├── AnimItem.jsx // d3 Visualisierungen
│ ├── HeaderLightItem.jsx // Kopfzeile
│ ├── LegendItem.js // Legende der Graphen
│ ├── QuestionItem.jsx // Multiple Choice Fragen
│ └── TextItem.jsx // Begleitende Texte
├── content
│ ├── data.json // Geordnete Liste von Klassendefinitionen, aus denen Stichproben gezogen werden
│ ├── module.json // Allgemeine Texte, Texte und Daten der Abschnitte
│ └── questions.json // Definition der Mutiple Choice Fragen
├── d3
│ ├── init-barcharts.js
│ ├── init-circles.js
│ ├── init-countertext.js
│ ├── init-pollresults.js
│ ├── poll-color.js
│ ├── poll-count.js
│ ├── poll-dopoll-falling.js
│ ├── poll-dopoll-update.js
│ ├── poll-dopoll.js
│ ├── poll-generator.js
│ ├── poll-moveup.js
│ ├── poll-showdiff.js
│ ├── poll-sort.js
│ ├── poll-sortbars.js
│ └── poll.js // d3 Einstiegsmodul
└── utilities
├── enableTouch.js
├── fonts.js
├── formatter.js
└── math.js
In module.json sind Texte und Labels definiert, auch solche, die nicht
direkt Teil WebApp sind. Dies umfasst den Titel ("title") der WebApp,
den einleitenden Text ("introtext") und das Label des Start-Buttons:
"title": "Glaube keiner Statistik…",
"introtext": "..deren Zustandekommen du nicht verstanden hast. …",
"start": "Start",
"sections": [
{
"headline": "Amerikanische Forscher haben gezeigt...",
"text": "Bargeldabschaffung als Beispiel um wissenschaftliche Studien zu erklären. …",
"swap": false,
"question": null,
"next": [ "Weiter" ]
}, …
Darüberhinaus ist die Abfolge der einzelnen Abschnitte definiert. Diese
verfügen über Überschrift, erklärenden Text, und gegebenenfalls die ID
einer multiple Choice Frage. Diese sind in questions.json definiert
und sehen folgendermaßen aus:
{
"intro": "Eine Zwischenfrage",
"title": "Worauf ist denn zu achten, wenn man so eine kleine Gruppe befragt?",
"answers": [
{
"id": 1,
"antwort": "Vorab festzulegen, wen das Abbild repräsentieren soll",
"korrekt": true,
"feedback": "Sie legen unbedingt vorab fest, …"
}, …
]
}
Hier werden Einleitungstext, Titel und Antworten der Fragen festgelegt.
Jede Frage verfügt über mehrere Antwortoptionen. Diese bestehen aus
einem initialen Text ("antwort"), die Information, ob diese Option
richtig ist ("korrekt") und einen (optionalen) zusätzlichen Text
("feedback"), der eingeblendet wird, wenn die Option fälschlicherweise
ausgewählt bzw. nicht ausgewählt wurde.
Die Daten, auf der dieses Modul basiert, beschreiben Ereignisse und deren Eintrittswahrscheinlichkeiten:
[
{ "label": "klar dafür", "score": 4.1, "cumul": 4.1, "color": "#4a90e2" },
{ "label": "eher dafür", "score": 7.6, "cumul": 11.7, "color": "#90CFEB" },
{ "label": "unentschieden", "score": 1, "cumul": 12.7, "color": "#969696" },
{ "label": "eher dagegen", "score": 3.3, "cumul": 16, "color": "#FD8C33" },
{ "label": "klar dagegen", "score": 84, "cumul": 100, "color": "#FC4C2D" }
]
Der beschreibende Text des Ereignisses wird unter "label" definiert.
"score" bezeichnet die Wahrcheinlichkeit in Prozent. Mit "cumul"
wird die kumulierte Wahrscheinlichkeit angegeben und unter "color"
wird die Farbe festgelegt. Erignisse sind aufsteigend nach ihrer
Eintrittswahrscheinlichkeit sortiert. Alle Stichproben werden auf
Grundlage dieser Klassendefinitionen gezogen. Wichtig ist, dass es sich
hierbei um disjunkte Ereignisse handelt und sich alle
Wahrscheinlichkeiten zu 1 (100 %) aufsummieren müssen.
In diesem Abschnitt werden die technischen Voraussetzungen für die Erstellung von im Browser lauffähigem Code und und die Installation und Verwendung der Entwicklungsumgebung erläutert.
Dieses Projekt wurde entwickelt auf Basis von nodejs unter Verwendung von npm als Paket-Manager. Mit den folgenden Versionen wurde zuletzt getestet:
nodejs: v14.4.0
npm: 6.14.4
Alle Abhängigkeiten sind definiert in der npm Konfigurations-Datei
package.json. Wie üblich werden diese installiert mit dem Befehl
npm install. Als Task-Manager dieses Projekts wird
gulp dabei global installiert.
Für das Erstellen der Dokumentation aus den einzelnen
Markdown-Dateien, die im Verzeichnis doc/ liegen, wird
pandoc verwendet. Dieses ist für viele
Betriebssysteme und Distributionen verfügbar, muss aber gesondert
installiert werden.
Die Build Konfiguration ist in config.js im Wurzelverzeichnis
definiert. Außerdem sind in der Datei package.json die zu
unterstützenden Browser-Versionen für autoprefixer angegeben.
Konfigurationen für Babel, Editoren und Linter sind ebenfalls im Wurzelverzeichnis zu finden:
babel: .babelrc
editorconfig: .editorconfig
html: .htmlhintrc
javascript: .eslintrc.yml
sass: .sass-lint.yml
Alle Schritte zum Erstellen von Builds sind in den Javascript-Dateien
unter tasks/ definiert und werden von der gulp Konfigurationsdatei
gulpfile.babel.js importiert. Dort sind die Teilschritte in Tasks
zusammengefasst, die man am häufigsten benötigt.
$ gulp # Default task, Kurzform für 'gulp watch'
$ gulp build # Erstellt einen Development Build
$ gulp watch # Erstellt einen Development Build und startet den Entwicklungsserver
Die Unterscheidung zwischen Development und Production Build wird anhand
der nodejs Umgebungsvariable NODE_ENV vorgenommen. Ohne diese Angabe
wird immer ein Development Build erstellt (siehe config.js). Für das
Development Target werden Javascript und CSS zusätzlich mit Sourcemaps
versehen, für die Produktiv-Version dagegen werden die Dateien von
unnötigem Ballast befreit (terser für Javascript, cssnano für CSS).
# Erstellen eines Production Build
$ NODE_ENV=production gulp build
Zusätzlich gibt es für dieses Projekt die Unterscheidung zwischen
'online' und 'offline' Versionen. Im Fall der 'online' Version wird auf
eine API zugegriffen, um die benötigten Inhalte zu laden, und um die
Antworten der Benutzer zu speichern, um ihnen einen Vergleich mit
Anderen zu ermöglichen. Diese Unterscheidung kann beim Aufruf von gulp
auf der Kommandozeile mit einem Parameter getroffen werden. Soweit
verfügbar, wird standardmäßig der 'online' Modus verwendet, (siehe
config.js).
# Erstellen eines Development Build für den 'offline' Modus
$ gulp --api-mode=offline
Da die Handhabung mit dem Setzen der Umgebungsvariable und das Übergeben
des Parameters etwas umständlich ist, sind in package.json npm ein
paar Shortcuts definiert, z.B.:
# Erstellen eines Production Build für den 'offline' Modus per gulp Script
$ NODE_ENV=production gulp build --api-mode=offline
# Erstellen eines Production Build für den 'offline' Modus per npm Script
$ npm run build:prod:offline
Die Dokumentation in einzelne Markdown-Dateien aufgeteilt, die im
Verzeichnis doc/ liegen. Zum Erstellen einer zusammenhängender
Dokumentation sind folgende npm Scripts definiert, die auf pandoc
basieren:
npm build:doc // Kurzform für das Erstellen der Dokumentation im bevorzugten Ausgabeformat (Standard: Markdown)
npm build:doc:html // Erstellt eine HTML Dokumentation als `index.html` in `doc/html`
npm build:doc:md // Erstellt eine zusammenhängende Dokumentation als `readme.md` im Wurzelverzeichnis
Der Javascript Code ist in ES6 (bzw. ES2015) verfasst. Als
CSS-Preprocessor wird Sass mit der scss Syntax verwendet. Die Code
Style Konventionen wurden von den ursprünglichen Entwicklern übernommen
und nur an wenigen Stellen leicht angepasst.
Das Projekt verwendet editorconfig für die
Integration dieser Konventionen in Editoren, die entsprechende Datei
heißt .editorconfig.
Für die statische Überprüfung des Quellcodes werden folgende Linter verwendet:
Die zugehörigen Konfigurationsdateien befinden sich im Root-Verzeichnis, wie oben in der Auflistung angegeben.
Die grundlegende Architektur der WebApp wurde implementiert auf Basis von preact, von den Entwicklern beworben mit
Fast 3kB alternative to React with the same modern API.
Es ist allerdings keine exakte Reimplementierung, weswegen ein eigener Teil der Dokumentation der Erläuterung der Unterschiede zu React gewidmet ist.
Für Visualisierungen wird die großartige und weit verbreitete Bibliothek D3.js verwendet.
Die folgende Auflistung gibt einen groben Überblick über die
Verzeichnisstruktur der Javascript Quelldateien in src/js/. Als
Einstieg dient main.jsx bzw. main-offline.jsx für den "offline"
Modus. config.js ist die zentrale Konfigurationsdatei der WebApp. In
components liegen die Komponenten der preact-WebApp. Der Quellcode
für die D3-Visualisierungen befindet sich unter d3.
├── main.jsx // Einstiegspunkt für App in "online" Modus
├── main-offline.jsx // Einstiegspunkt für App in "offline" Modus
├── config.js // Konfiguration der WebApp
├── components/ // Verzeichnis für (p)react Komponenten
│ ├── Index.jsx // Web App Haupt-Komponente
│ └── partials/ // Vezeichnis für Teilkomponenten
├── content/ // Verzeichnis für "offline" Inhalte
├── d3/ // d3 Module
└── utilities/ // Verzeichnis für Hilfs-Bibliotheken und Werkzeuge
Zum Kompilieren von Sass zu CSS wird gulp-sass verwendet, das
node-sass benutzt, welches wiederum auf libsass basiert. node-sass
hat sich beim wiederholten gedankenlosen Aktualisieren von nodejs und
/ oder npm als notorischer Nerventöter herausgestellt, daher an dieser
Stelle der Verweis zur Troubleshooting
Dokumentation
von node-sass. Meist reichte im Falle eines Problems aber ein
npm rebuild node-sass.
In der Datei main.scss werden alle Stile eingebunden, die in den
Partials definiert werden, woraus die endgültige CSS-Datei generiert
wird. Die Struktur des src/scss Verzeichnisses sieht folgendermaßen
aus:
├── base // Stile für HTML Elemente
├── config // Globale Variable
├── modules // Stile für Module
└── tools // Definierte *mixins* und Funktionen
Generell wird eine "mobile first" Strategie verfolgt. Als
Standard-Einheit wird rem verwendet, auf deren Grundlage die
Basis-Einheit definiert ist. Da sich alle Größen auf diese Einheit
beziehen sollten, wird so das Skalieren des Layouts erleichtert.
Sass wird in diesem Projekt mit der scss-Syntax verwendet. Stilistisch ist es in "oldschool BEM-Style" gehalten, Zitat der ursprünglichen Entwickler. Sie beziehen sich zudem auf bestimmte Guidelines:
Hugo Giraudel wrote an awesome piece on everything you need to know about Sass, it's called Sass Guidelines and you should really have a look at it. I agree with this guideline in almost all points, but I try to keep something more simple, and some things more strict, the linter will let you know :)
ʕ̡̢̡ॢ•̫͡ॢ•ʔ̢̡̢
Regeln mit Browser-spezifischen Präfixen (vendor prefixes) werden dem
CSS automatisch durch
autoprefixer hinzugefügt. Die
Liste der zu unterstützenden Browser ist in package.json unter
browserslist zu finden.
Alle in diesem Projekt verwendeten Bilddateien befinden sich unter
src/img/.
Icons in Form von SVG-Dateien befinden sich im Unterordner
src/img/sprites und werden im Build-Prozess mittels gulp-svg-sprite
zu einem Sprite zusammengefasst. Sie wie folgt in HTML referenziert
werden:
<svg class="icon icon--arrow-left">
<use xlink:href="assets/img/sprites.svg#icon--arrow-left"/>
</svg>
Stil-Definitionen für Icons sind unter src/scss/modules/_icons.scss zu
finden. Für die Unterstützung von Fragmentbezeichnern (fragment
identifier) in Internet Explorer wird
svgxuse verwendet.