Skip to content
Snippets Groups Projects
Commit 06a2db57 authored by Hallvard Trætteberg's avatar Hallvard Trætteberg
Browse files

More slides and simpleexample project.

parent 664f2bc4
No related branches found
No related tags found
No related merge requests found
Pipeline #46474 passed
Showing
with 542 additions and 7 deletions
......@@ -61,7 +61,7 @@ asciidoctorRevealJs {
outputDir file('build/docs/revealjs')
resources {
from('revealjs') {
include '**/*.png'
include 'images/*'
include '**/*.css'
}
into '.'
......
......@@ -63,7 +63,7 @@ Hva har dette å si for verktøystøtte?
== `gitlab.stud.idi...`
[.smaller]
[.smaller-80]
* profesjonelt støtteverktøy for smidig utvikling
* IDI har egen installasjon (tas kanskje over av NTNU IT)
** innlogging med NTNU-navn og -passord
......@@ -93,7 +93,7 @@ Oppgavesporing er viktig for transparens
== Oppgavesporing forts.
[.smaller]
[.smaller-80]
* oppgaver opprettes ifm. planlegging av iterasjon, f.eks. fra _brukerhistorier_, _funksjonsønsker_ eller _feilrapporter_
* oppgaver knyttes til
** _milepæl_ for iterasjon
......
= CI
= Kontinuerlig integrasjon
:customcss: slides.css
:icons: font
== Kontinuerlig integrasjon (CI)
Automatisering av alt som fremmer kvalitet, men som tar tid, f.eks.
* kompilering og bygging av jar-filer (generelt avledete artifakter)
* kjøring av enhets- og integrasjonstester
* analyser av ulike typer kvalitet (formatering, kodingsstandarder, vanlige feil, ...)
* bygging av kjørbart system og kjøring av systemtester
== Smidig utfordring
[.smaller-60]
* Hvordan iterere raskt?
** skrive korrekt kode raskt
** være trygg på kvaliteten
** levere ofte, for å få tilbakemelding fra brukere
[.smaller-60]
* Mange nivåer av testing
** egen kode - enhetstesting
** koden innen teamet - integrasjonstesting
** hele systemet - systemtesting (og evt. deployment)
== Smidig løsning
[.smaller-80]
* Kontinuerlig - bygg, sett sammen og test
* Innimellom - lever (release) og sett i drift/prod. (deploy)
* Alt for mye arbeid uten støtte
** _byggeverktøy_ automatiserer prosessen
** _byggetjenere_ sikrer reproduserbar prosess
== Byggeverktøy
[.smaller-80]
* strukturert tilnærming basert på meta-informasjon
** prosjekt-type (språk, plattform, ...)
** struktur og avhengigeter
** rammeverk og bibliotek automatisk lastet fra nettet
* sekvens av byggetrinn med innbyrdes avhengigheter
* mange konfigurasjonsmuligheter med gode standardinnstillinger (convention over configuration)
* prosjektmaler gjør initiell rigging enklere
* i stor grad styrt av tillegg (plugins) til et generell system
== Byggeverktøy forts.
[.smaller-60]
* to hovedalternativer: *gradle* og *maven*
** litt ulik terminologi og logikk, men forskjellene er tildels overfladiske
** begge kan mye det samme, så valget er i stor grad pragmatisk (!)
** masse materiale å lære fra, uansett valg
* *maven*
** mer modent og strukturert, men også mer krevende og tungvint
* *gradle*
** konfigurerbare byggetrinn sekvensieres basert på avhengigheter
** konfig.filene (*settings.gradle* og *build.gradle*) er forståelige
== Enkelt prosjektoppsett
[.smaller-60]
Enkle prosjekter består av én modul og mappe
[.smaller-60]
* *settings.gradle* og *build.gradle* konfigurerer bygg
* *gradlew*/*gradlew.bat* og *gradle*-mappe må inkluderes
[.smaller-60]
Eksempel:
[.smaller-60]
* desktop-app med javafx og fxml
* ikke noe behov for gjenbruk av kjernelogikk i andre prosjekter
== simpleexample
[.smaller]
[.left-60]
* eksempel på én-modul-prosjekt
** javafx+fxml-app
** standard mapper for java
** gradle-filer
[.right]
image::../images/simpleexample-structure.png[width=300]
== simpleexample forts.
[.smaller]
* standard innhold i *build.gradle*
** plugins - tillegg som passer til typen prosjekt, f.eks.
** repositories - hvor finnes tillegg og bibliotek (jar-filer)
** dependencies - hvilke bibliotek brukes og til hva/når
* tillegg-spesifikk konfigurasjon, f.eks.
** oppstartsklasse for java
** javafx-versjon og -moduler som brukes
== simpleexample forts.
* build.gradle *plugins*
** application - java-app med main-metode, som kan pakkes som kjørbar jar
** org.openjfx.javafxplugin - javafx-app
[source]
----
plugins {
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.8'
}
----
== Modulært prosjektoppsett
[.smaller-60]
_Flermodul_-prosjekter har delmoduler i undermapper
[.smaller-60]
* *settings.gradle* i hovedmappa navngir hovedprosjektet og delmodulene
* *gradlew*/*gradlew.bat* og *gradle*-mappe må inkluderes i hovedmappa
* delmodulene (i undermappene) trenger (bare) egen *build.gradle*-fil
[.smaller-60]
Eksempel:
[.smaller-60]
* klient-tjener-app
* (noe) felles kjernelogikk i klient og tjener
* kan ha flere klienter, f.eks. desktop og mobil (og web)
== Modularitet
[.smaller-60]
* et modulært system er mer oversiktlig
** moduler er relativt selvstendige enheter
** eksplisitte avhengigheter mellom moduler
** gjenbrukes på tvers av prosjekter
* tilsvarer i java et sett pakker
** skiller mellom API og interne pakker
** distribueres som jar-fil (zip-fil med meta-data)
== multiexample
[.smaller]
[.left-60]
* eksempel på fler-modul-prosjekt
** core - kjernelogikk
** fx - javafx+fxml-app
** jaxrs - REST API
** jersey - web-server-app
** webreact - web-klient
lectures/revealjs/images/git-branching.png

112 KiB

lectures/revealjs/images/git-local-remote-repo.png

110 KiB

lectures/revealjs/images/git-repo-commands.png

37.8 KiB

lectures/revealjs/images/git-repo-copies.png

193 KiB

lectures/revealjs/images/git-repositories-view.png

90.3 KiB

lectures/revealjs/images/git-staging-view.png

179 KiB

lectures/revealjs/images/simpleexample-structure.png

26.9 KiB

= SCM
= SCM - Source Code Management
:customcss: slides.css
:icons: font
== Kildekodehåndtering
* lagring av kode
* sporing av endringer
* versionering
* distribusjon
[.grid-left-right-50-50]
== `git`
[.smaller-60]
[.area-left]
* sporing og deling av kodeendringer i såkalte _repo_ (repository)
* både sentrale og lokale repo har all endringshistorikk
* initiell kopi hentes ved å _kloning_ (clone)
* endringer (i filer) registreres i _commits_
* commits deles med andre ved å _dytte_ (push) til en server
* andre kan da _dra_ (pull) endringene inn i lokalt repo
[.area-right]
image::../images/git-local-remote-repo.png[]
[.grid-left-right-50-50]
== 4 repo-"kopier"
[.smaller-60]
[.area-left]
* originalen (_origin_), hentet fra server (`pull`)
* arbeidsområdet (_working directory_), lokale filer som kan være endret
* indeksen (_staging area_ eller _index_), endringer du har lagt til med (`add`)
* lokalt repo, endringene du har commitet (`commit`)
[.area-right]
image::../images/git-repo-copies.png[]
== repo-kommandoer
image::../images/git-repo-copies.png[width="400px"]
image::../images/git-repo-commands.png[width="500px"]
== Typisk sekvens
[.smaller-80]
* `git pull` (eller `clone` første gang) - henter ned endringer fra serveren
* gjør egne endringer
* `git status` - viser hva som er endret
* `git add <fil eller mappe>` - legger endringer til fremtidig commit
* `git commit -m <melding, m/oppgavenummer>` - registrerer all endringene (lagt til med `add`)
* `git pull` - henter andres endringer, i tilfelle konflikt
* `git push` - deler endringer med andre via serveren
== Forgreining (branching)
[.smaller-60]
[.left-70]
* greiner (branches)
** sporer egne utviklingstråder
** gjør jobbing i parallell ryddigere
* sammenslåing (merging)
** en (hoved)grein slås gjerne sammen med en annen, når den andre er ferdig (nok)
** etter sammenslåing, så deles gjerne resultatet med andre
** andre henter så ned for å være oppdatert
[.right]
image::../images/git-branching.png[width="200px"]
== Sekvens m/forgreining
[.smaller-80]
* `git pull` - henter ned endringer fra serveren
* `git checkout -b <navn på (ny) grein>` - lager ny grein, med utgangspunkt i den du jobber med
* gjør egne endringer
* `git add ...` og `git commit ...` - registrerer all endringene
* `git checkout master` - bytter til hovedgrein
* `git merge <navn på grein>` - slår annen grein (den nye) sammen med denne (hovedgreina)
* ...
== Eclipse-støtte for git
[.smaller-60]
* Egne Eclipse-tillegg - JGit (git-impl) og EGit (UI)
* Git Repositories-panel - oversikt over repo
** klone repo fra server eller registrere lokalt repo
** utføre `pull` og `push`
** utføre `checkout` inkl. lage ny grein
** ...
image::../images/git-repositories-view.png[height="200px"]
== Eclipse-støtte forts.
[.smaller-60]
* Git Staging - statusoversikt
** filer i arbeidsområdet som er endret
** filene i indeksen
** legge til (`add`) eller fjerne (`remove`) fra indeksen
image::../images/git-staging-view.png[width="800px"]
== Endringsforespørsler
[.smaller-60]
* en `pull`/`merge`-forespørsel (request) brukes for mer formell godkjenning av endringer
** Pull Request er github-termen, mens Merge Request brukes i gitlab
* brukes ofte for å inkludere endringer utenfra, f.eks.
** utviklere utenfor kjerne-teamet
** brukere av åpen kildekode som har fikset feil
* forenkler administrasjon av åpne prosjekter
== PR/MR-prosedyre
[.smaller-60]
* (utenforstående oppretter kopi på egen server)
* lager en grein for endringene og utfører dem lokalt
* i stedet for å slå sammen med egen hovedgrein
** `push` grein til egen server
** lag en `pull`/`merge`-forespørsel (PR/MR), som (potensielt) kan inkluderes i hovedgreina
** UI for dette finnes på github/i gitlab
** forespørselen får en egen dialog/diskusjonstråd
** en utvikler med rettigheter kan så godkjenne evt. avslå forespørsel
......@@ -10,6 +10,166 @@
text-align: center;
}
.smaller {
font-size: 80%
.smaller-80 {
font-size: 80%;
}
.smaller-60 {
font-size: 60%;
}
.left {
float: left;
}
.left-90 {
float: left;
width: 90%;
}
.left-80 {
float: left;
width: 80%;
}
.left-70 {
float: left;
width: 70%;
}
.left-60 {
float: left;
width: 60%;
}
.left-50 {
float: left;
width: 50%;
}
.left-40 {
float: left;
width: 40%;
}
.left-30 {
float: left;
width: 30%;
}
.right {
float: right;
}
.right-80 {
float: right;
width: 80%;
}
.right-70 {
float: right;
width: 70%;
}
.right-60 {
float: right;
width: 60%;
}
.right-50 {
float: right;
width: 50%;
}
.right-40 {
float: right;
width: 40%;
}
.right-30 {
float: right;
width: 30%;
}
section h2 {
grid-area: slide-title;
}
.reveal h2 {
text-transform: none;
}
.width-10 {
width: 10%;
}
.width-20 {
width: 20%;
}
.width-30 {
width: 30%;
}
.width-40 {
width: 40%;
}
.width-50 {
width: 50%;
}
.width-60 {
width: 60%;
}
.width-70 {
width: 70%;
}
.width-80 {
width: 80%;
}
.width-90 {
width: 90%;
}
.grid-left-right {
display: grid !important;
grid-template-areas: 'slide-title slide-title' 'left right';
}
.grid-left-right-50-50 {
display: grid !important;
grid-template-areas: 'slide-title slide-title' 'left right';
grid-template-columns: 50% 50%
}
.area-left {
grid-area: left;
}
.area-right {
grid-area: right;
}
.grid-compass {
display: grid !important;
grid-template-areas: 'slide-title slide-title slide-title' 'north-west north north-east' 'west middle east' 'south-west south south-east';
}
.area-north-west {
grid-area: north-west;
}
.area-north {
grid-area: north;
}
.area-north-east {
grid-area: north-east;
}
.area-west {
grid-area: west;
}
.area-east {
grid-area: east;
}
.area-south-west {
grid-area: south-west;
}
.area-south {
grid-area: south;
}
.area-south-east {
grid-area: south-east;
}
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="bin/main" path="src/main/java">
<attributes>
<attribute name="gradle_scope" value="main"/>
<attribute name="gradle_used_by_scope" value="main,test"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="bin/main" path="src/main/resources">
<attributes>
<attribute name="gradle_scope" value="main"/>
<attribute name="gradle_used_by_scope" value="main,test"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="bin/test" path="src/test/java">
<attributes>
<attribute name="gradle_scope" value="test"/>
<attribute name="gradle_used_by_scope" value="test"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="bin/test" path="src/test/resources">
<attributes>
<attribute name="gradle_scope" value="test"/>
<attribute name="gradle_used_by_scope" value="test"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-12/"/>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
<classpathentry kind="output" path="bin/default"/>
</classpath>
# Ignore Gradle project-specific cache directory
.gradle
# Ignore Gradle build output directory
build/
bin/
# Ignore Gradle project-specific cache directory
.gradle
# Ignore Gradle build output directory
build
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>simpleexample</name>
<comment>Project simpleexample created by Buildship.</comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
</projectDescription>
connection.project.dir=
eclipse.preferences.version=1
plugins {
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.8'
}
repositories {
jcenter()
maven {
url "https://plugins.gradle.org/m2/"
}
mavenLocal()
}
mainClassName = 'simpleex.ui.FxApp' // application plugin
// javafx specific way of specifying dependencies
javafx {
version = '12'
modules = [ 'javafx.controls', 'javafx.fxml' ]
// run with --debug-jvm flag and
// launch debugger using Remove Java Application debug launch configuration
}
dependencies {
compile "com.fasterxml.jackson.core:jackson-databind:2.9.8"
compile 'fischer.clemens:FxMapControl:1.0'
testImplementation 'junit:junit:4.12'
testImplementation "org.testfx:testfx-core:4.0.16-alpha"
testImplementation "org.testfx:testfx-junit:4.0.16-alpha"
testImplementation "org.mockito:mockito-core:2.28.2"
}
File added
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment