Table of Contents
Preface
113105 Software development 1
Getting started
Lecture related resources
Using the exercises
Related resources
Coached exercises
Using plain Java
Using Intellij IDEA
Play!
Hello, World and friends.
Simple calculations
A conditional
A loop
Language Fundamentals
Integer, ASCII and Unicode
Primitive types
Variables
Literals
Integer
char
Float
String
Arithmetic limitations
Conversions
Operators and expressions
Arithmetic and logical operators
Assignment operators
Unary operators
Operator precedence
Comments
Statements
The if conditional statement
if-then-else
Using else if
The switch statement
From blocks to methods
Loops
while
do ... while
for
Logic related external exercises
Using automated tests.
Arrays
Multi-dimensional arrays
Objects and Classes
Static methods
Working with objects
Packages
Object methods
Encapsulation and access control
Getter and setter methods
Signatures
Method overloading
Constructors
Scopes
Class members and methods
A mathematical table.
Interest calculations
Programmer's favourite expression
Lotteries revisited
The greatest common divisor and the common multiple
Maven project dependencies
Maven command line usage
Intellij IDEA on top of Maven
Building a library of mathematical functions.
Maximum and absolute value
Factorial, the direct way
Factorial, the recursive way
Binomials, the recursive way
Implementing exponentials.
Adding sine
Strange things happen
Unit testing
Tests and implementation
Improving the algorithm
Parameterized testing
Helpful Junit methods
Technical details
Example: A class representing fractions
Value types and reference types
Arrays reconsidered
Varargs method parameter
Reconsidering System.out.format().
java.util.Arrays helpers
Extending arrays
Understanding static int main(String[] args)
Tic-tac-toe
Providing statistical data
Prime numbers revisited
The median of a given sample.
Plotting functions
Method calls, the details
Enumerations (enum)
Enumeration by integer representation
Enumeration by dedicated class
Defining a private constructor
enum replacing class
Core Classes
Using class Math
String exercises
Analyzing file pathnames
Inheritance
Overriding equals()
Overriding toString()
final methods
Abstract methods
Geometry classes reconsidered
protected access
final classes
The instanceof operator
The @Override annotation.
Runtime polymorphism
Error Handling
Checked vs unchecked exceptions
Exceptions and Junit
Variants
Class java.lang.Exception
Working with Numbers
Boxing and unboxing
Number Parsing
Number Formatting
Working with Money
Generating Random Numbers
Advanced topics
interface definitions and abstract Classes
Interfaces and sorting
A nonsense generator
An interface based plotter
Application deployment I
Preparations
Exercises
Part II, Exercises
Reading character streams
Preparations
Exercises
Collections
Preparations
Collections I, Exercises
Collections I, Exercises
Collections III, Exercises
Collections IV, Exercises
Maps 1, Preparations
Exercises
Towns and country names
Creating an overview of grades
Appendix
Examination bonus point projects
Weather forecast
Reverse Polish notation (RPN) calculator
Currency converter, Summer 2017
An address database, Winter 2016
Poor man's UNIX grep, Summer 2016
Project Euler's sieve, Winter 2015
Exercising past examinations
Starting an exam
Implementing the project skeleton
Finish the exam
Examination hints
Past Software Development 1 examinations
2026 summer
2025 winter
2025 summer
2024 winter
2024 summer
2023 winter
2023 summer
2022 winter
2021 winter
2021 summer
2020/1 winter
2020/2 winter
2020 summer
2019 winter
2019 summer
2018 winter
2018 summer
2017 winter
2017 winter
2015 winter
2015 Sommer
2014 Winter
Past Software Development 1 exam preparing tests
Test 01
Test 02
Test 03
Test 04
Test 05
Working with git
Using git
Working with git locally.
Shared development with centralized remote.
Conflicts
Apache Maven
The project object model pom.xml
Plugins
Dependencies
Lifecycle, phases and goals
List of software development 1 lecture exercises
113492 Technical Documentation
Software independent considerations
General remarks
Common building blocks
Block level elements
Docbook
Target formats
Selected elements
Schematron
Customizing
Assemblies
Styling the editor application
Modular documents
RelaxNG Schema
Transforming documents
Target format HTML
Target format print
Software
Frontends
Backends
TeX / LaTeX
Docbook
Exercises
LaTeX
LaTeX hello,... world
Important elements
Macro
A complete document
Docbook
Project proposals
Building a reveal.js editor
Authoring journey descriptions
Gitlab pages integration of Docbook
Codingbat reloaded
XML based exercise compilations
Past projects
List of software development 1 lecture exercises
113473 Database and application development
Database features
Selected database products overview
Openldap
Installation
Features
Exercises
Mongodb
Installation
Features
High performance sharding cluster
Exercises
JDBC: Accessing Relational Data
Persistence in Object Oriented languages
Introduction to JDBC
Write access, principles
Write access, coding!
JDBC™ and security
Read Access
Dynamically load a JDBC™ driver
Handling surrogate keys
Transactions
JPA
Configuring a Maven based Eclipse Java™ project with Hibernate
Creating a JPA configuration
A round trip working with objects
Persisting objects
Loading Objects by primary key
Loading objects by queries
Criteria based queries
Mapping single entities and database tables
Transient properties
Properties and NULL values
Defining keys
Composed keys
Indexes (non-unique)
Renaming tables and attributes
Changing the default type mapping
Object states and transitions
XML to JPA using JAXB
Inheritance
Single table per class hierarchy
Joined subclasses
Table per concrete class
Mapping related Components and entities
Primary keys revisited
Entity and value types
Mapping components
Caching
orphanRemoval vs. CascadeType.DELETE
Project ideas
Extending UNIX grep to databases
Database copy tool
Creating data samples
Database schema evolution tool
List of Database and application development lecture exercises
113475 Software defined Infrastructure
Manual server management
Preliminaries
Hetzner cloud administration GUI
Using ssh
Public / private key pair
Pass phrases and ssh agent
Agent forwarding
Port forwarding
X11 forwarding
Network data transfer using scp, rsync and ssh
Prerequisites
Ubuntu / Debian Package management
Prerequisites
Cloud provider
Terraform
Working with Terraform
Cloud-init
Terraform modules
Volumes
Terraform loops
Terraform and DNS
Generating web SSL certificates
Private networks
Pulumi
Appendix
DNS
Preliminaries
Exercises
LDAP
Recommended Preparations
Exercises
Apache web server
Preliminaries
Exercises
File cloud
Exercises
Network file systems served by Samba
Prerequisites
Samba server installation
Mail
Recommended Preparations
Exercises
Docker
Introduction
Exercises
Icinga
Functional checks
SNMP based checks
ssh based checks
List of Software defined Infrastructure lecture exercises
Common topics
Project documentation
Bibliographic links
Glossary
List of Figures
1. How much time to invest?
2. Your biggest enemies
3. German humour
4. AI tools and learning
5. 4 most imperative study objectives
6. Tuition attendance and exam results summer 2025
7. Examinations and result
8. Moodle and tuition groups
9. BW Lehrpool pool rooms
10. Recommended reading resources I
11. Recommended reading resources II
12. Online tutorials
13. Unix and the terminal
14. Online programming, automated feedback
15. Online programming I
16. Online programming II
17. Choosing the SD1 bwLehrpool VM
18. Intellij IDEA IDE
19. Live lecture additions
20. Embedded exercises
21. Using the exercises
22. HdM mail server
23. Configure MI VPN client access
24. MI Cloud server
25. MI File server
26. MI Git versioning server
27. Coached exercises
28. Edit - compile - execute
29. Defining class Hello
30. Compiling Java™ file
31. Command line Java™ file compilation
32. Java byte code file Hello.class
33. Source code vs. bytecode
34. Executing byte code file Hello.class
35. Command line byte code file Hello.class execution
36. Wrap up: The edit - compile - execute cycle
37. Intellij IDEA requires a JDK
38. Intellij IDEA installation
39. Idea »Ultimate« license types
40. Alternative: Using the HdM license server
41. Creating a new Java project
42. Getting first Java™ impressions
43. Manual calculation: Abacus
44. Mechanical calculation: Cash register
45. Electromechanical calculation: Zuse Z3
46. Vacuum Tube: Eniac
47. Transistor: Microprocessor ICs
48. Z80 8-bit data bus
49. Progress in hardware 1
50. Progress in hardware 2
51. Simple facts:
52. Unsigned 3 bit integer representation
53. Binary system addition
54. 3 bit two-complement representation
55. 3 bit two complement rationale: Usual addition
56. Signed 8 bit integer binary representation
57. 7-bit ASCII
58. 7-bit ASCII with even parity bit
59. Western European characters: ISO Latin 1 encoding
60. Unicode UTF-8 samples
61. Java types
62. Java signed integer primitive types
63. Four int literals representing decimal 29
64. Java unsigned integer, floating point and boolean primitive types
65. Variables: Handles to memory
66. Local variable declaration
67. Declare, assign and use
68. Combining declaration and initialization
69. Compound declarations
70. Identifier in Java™:
71. Identifier name examples:
72. Java™ keywords.
73. Note on contextual keywords
74. Variable naming conventions
75. Constant variables
76. Case sensitivity
77. Define before use
78. Type safety
79. Compile time analysis
80. Type inference (JDK™ 10)
81. Forcing conversions by cast
82. Watch out!
83. Casting long to int
84. Casting double to short
85. «C» programming language liberal assignment policy:
86. Consequences
87. From the report
88. Dynamic typing in PERL
89. Dynamic typing in PERL, part 2
90. Using final
91. Reference type examples
92. Literal examples
93. Definition of literal
94. Type and value
95. Four ways representing 35 by discriminator
96. Representations by base
97. Know your limits!
98. int vs. long
99. Binary literal representation
100. Just kidding ...
101. char
102. float and double
103. Precision difference
104. String literal
105. Multi line String literal (Java 15)
106. Strange things I
107. Strange things II
108. Limited floating point arithmetic precision
109. Nearest float to 0.1F
110. FloatConverter
111. Integer division: Take care!
112. Widening from byte to short
113. Narrowing from int literal to char variable
114. A widening «ladder»
115. A narrowing «ladder»
116. The binary plus operator
117. Binary operator output type
118. Detecting arithmetic overflow (Java 8+)
119. Dividing by zero
120. Generic binary operator
121. The modulus operator %
122. Binary operator type examples
123. No binary + operator yielding byte
124. int expression assignment
125. Constant expression assignment
126. The logical and operator &
127. The += operator
128. The &= operator
129. Arithmetic assignment operators
130. Logical assignment operators
131. Increment operator ++
132. Different range behaviour!
133. Cast required
134. Prefix and postfix notation
135. Operator examples
136. Precedence of * and / + over + and -
137. A binary operator's operands evaluation priority
138. left to right or right to left
139. Operator precedence references
140. + acting as string concatenation operator
141. Implicit string conversion and concatenation
142. Java™ comment flavors
143. Inline comments by /* ... */
144. Javadoc™ comments
145. Statements: General syntax
146. Statement examples: Declaring and assigning variables
147. Expression vs. statement
148. Multiple statements per line
149. Debugging multiple statements per line
150. Method local variable scope
151. Nested blocks and variable scopes
152. Block purposes
153. Principle of swapping two variables
154. Swapping two variables
155. Swapping two variables using a block
156. Conditional block execution
157. if syntax
158. if ... else
159. if ... else syntax
160. Best practices comparing for equality
161. Single statement branches
162. Nested if ... else
163. Enhanced readability: if ... else if ... else
164. if ... else if ... else syntax
165. User input recipe
166. Using a Scanner class collecting user input.
167. Converting numbers to day's names
168. Numbers to day's names: The hard way
169. Better: Using switch
170. switch Syntax
171. Switching on strings
172. switch expressions
173. Assigning switch expressions
174. Allowed types for switch statements
175. Labels must be constant expressions
176. Two blocks, same logic
177. Replacing two blocks by one method
178. Passing values to methods
179. Passing values to methods
180. Why loops?
181. Number of repetitions given by user input
182. A while loop
183. Combining increment and termination condition
184. while syntax
185. Empty while body
186. A do ... while loop
187. do ... while vs. while
188. do ... while syntax
189. Frequent usage of while
190. Replacing while(...) by for(...;...;...)
191. for syntax
192. for variable scope
193. for variable scope equivalence
194. for vs. while relationship
195. Nested loops 1
196. Nested loops 2
197. Better readability: row and column in favour of i and j
198. Calculating values
199. Response to coding errors
200. Unit test concept
201. alarmClock(...) with errors
202. Testing alarmClock(...)
203. Testing alarmClock(...) details
204. Motivating Arrays
205. Per member repeating tasks
206. Example: int array of primes
207. Java Visualizer
208. Loop prime values
209. Mind the limit!
210. Safer: Using length
211. Even better: for-each style loop
212. Mind the limit, part two
213. Primitive data one step initialization
214. Array
215. Two syntax variants
216. Passing an anonymous array to a method
217. Two-dimensional arrays
218. Behind the scenes
219. Memory allocation
220. Nested array initialization
221. Nested »ragged« array initialization
222. A method adding two values
223. Syntax of method definition
224. The static modifier matters!
225. Documentation: Javadoc™ is your friend!
226. Separating usage and definition
227. Representing two-dimensional points
228. General class structure
229. What's a class anyway?
230. Rectangle objects
231. A class describing rectangles
232. Rectangle class and instances
233. Generated diagrams
234. The new operator: Creating rectangle instances
235. Syntax creating instances
236. Assigning attribute values to class instances
237. Instance memory representation
238. References and null
239. Checking for object presence
240. Why packages ?
241. Rules and conventions
242. Fully qualified class name vs. import
243. Don't be too lazy!
244. Special: Classes in package java.lang
245. Class, package and file system
246. Source hierarchy view
247. Object methods
248. Get a rectangle's area
249. Currently: rectangle's area by class method
250. OO: rectangle's area by instance method
251. Transition to OO
252. Scaling a rectangle
253. Scaling method implementation
254. Scaling method signature
255. Using the scale(...) method
256. Method definition syntax
257. A rectangle's perimeter
258. getPerimeter() method implementation
259. Using Rectangle.getPerimeter()
260. Access control: Overall objectives
261. Example: Two ways implementing a day's time
262. private modifier access violation
263. Absent access modifier, access violation
264. Access rules
265. Tips on Choosing an Access Level
266. Direct access vs. setter method
267. Why adding setter methods?
268. Implementation change: Minutes only, no hours
269. Defining type signatures
270. Type signature examples
271. Defining method signatures
272. Method signature examples: Ignore return type!
273. Method overloading: Same name, different signature
274. Overloading, alternate names
275. No overloading in »C«
276. »C« requires unique function names
277. No distinction on return type
278. Method signatures rationale
279. Method signatures rationale
280. Example: IO.print(...)
281. Creating and initializing rectangles
282. Defining a constructor
283. Constructor syntax
284. Constructors
285. Multiple overloaded constructors
286. Constructor calls within constructor
287. Instances by overloaded constructors
288. No constructor vs. default constructor
289. Non - default constructor, but no default constructor
290. Employee example package hierarchy
291. Circle and variable scopes
292. Documenting classes and methods
293. Generated Javadoc
294. Refactoring «r» ⇒ «radius»
295. Scope assignment problem
296. this overriding method scope
297. Why should we require an instance?
298. Solution: Replace instance method by class method using static
299. Club membership objectives
300. Step 1: Implementing club member names.
301. Showing membership info.
302. Step 2: Adding membership numbers.
303. Showing membership numbers.
304. Member creation steps
305. Accessing the club's overall member count?
306. Accessing the club's member count
307. Syntax accessing class members
308. static / non-static wrap up
309. Finally understanding IO.print(ln)
310. Newton's letter to Robert Hooke
311. Application execution prerequisites
312. Why Maven project management?
313. Example: Creating PDF using iText7
314. Maven iText library pom.xml definition
315. Itext transitive dependencies
316. Class location in iText library
317. Class location in iText library
318. Maven repositories
319. Maven archetypes
320. Project «lottery» depending on «common»
321. Providing project «common»
322. Publish project «Common»'s library
323. Content of archive common-1.0.jar
324. Consuming project «lottery»
325. External libraries view
326. Using Helper.factorial(...) computing ( n k ) = n ! k ! ( n - k ) !
327. Maven artifact dependency.
328. Using the MI Sd1 project template
329. CLI example
330. Supplementary MI Maven archetypes
331. CLI testing mi-maven-archetype-quickstart
332. CLI archetype details
333. Generated project layout
334. Maven compile
335. Compilation file view
336. Maven package
337. Executing Java™ archive second-0.9.jar
338. Maven javadoc:javadoc
339. Maven clean
340. Intellij IDEA Maven support
341. Adding MI Maven server
342. New MI archetype project
343. pom.xml content changes
344. Intellij IDEA generating Javadoc
345. Pascal's triangle representing binomial coefficients.
346. An implementation sketch for the exponential
347. Comparing exponential and approximation
348. Comparing sin(x) and its approximation.
349. Recommended reading
350. Test categories
351. Example: Computing prime numbers
352. Unit test principle
353. Test driven development
354. Steps in Unit Testing
355. Step 1 + 2: Specify method, write skeleton
356. Execution yet being flawed
357. Sample test data
358. Step 3: Junit based specification test
359. Junit skeleton test result (Maven CLI)
360. Junit skeleton test result (IDE)
361. Providing explanatory failure messages:
362. Step 3: Providing more prime tests
363. Step 3: Prime mass testing
364. Step 4: Implement skeleton
365. Step 5: Testing our first implementation
366. Implementation observation
367. Changing the implementation
368. Regression test
369. Systematic error debugging
370. Error correction in detail
371. Parameterized tests
372. Required Junit dependency
373. CSV parameter testing
374. CSV parameter testing results
375. CSV parameter file based testing
376. Available comparison methods
377. Caution comparing float / double !!
378. Weird arithmetics?
379. Limited representation precision
380. Solving the issue
381. The @Test annotation
382. The Assertions class
383. Importing dependencies
384. Dependency archive content
385. Value vs. reference type variables
386. Different behaviour!
387. Value variable Details
388. Reference variable Details
389. Only «call-by-value» in Java
390. «call-by-value» details
391. «call-by-reference» for objects?
392. «call-by-reference» details
393. No «call-by-reference» in Java™!
394. No «call-by-reference» details
395. C++ reference operator &
396. C++ offers «call-by-reference» by virtue of &
397. C++ «call-by-reference» details
398. Arrays of object references
399. Array instances are not objects
400. Array creation details
401. Array parameter passing
402. Parameter passing details
403. Array initializer: Value and reference types
404. Expecting one int argument
405. One, two or three int arguments by overloading
406. Observations
407. Arbitrary number of arguments by array
408. Observations
409. Vararg: Syntactic sugar by ellipsis »...«
410. Varargs: Generalizing arrays
411. Using varargs
412. Further reading on varargs
413. Arrays.toString(...) and Arrays.sort(...)
414. Arrays.binarySearch(...)
415. Arrays.fill(...)
416. Arrays.copyOfRange(...)
417. System.arraycopy(...)
418. Arrays.equals(...)
419. Lack of extendability
420. Extend array using a block
421. Replacing extending block by method
422. Extension result
423. Replacing copying loop by Arrays.copyOf()
424. static void main(String[] args)
425. Intellij IDEA run configuration
426. Intellij IDEA run configuration
427. Creating executable jar
428. Two Tic-tac-toe players fighting each other.
429. Two Tic-tac-toe players fighting each other.
430. Method calling
431. Three variable scopes
432. Scope lifetimes
433. Two runtime memory categories
434. IDE debugger
435. Motivation
436. Weekly offered lectures
437. Weekly offered lectures by simple numbers
438. Weekdays int representation
439. Weekly offered lectures using constants
440. Converting index values to day names
441. Providing lecture info
442. Sample lectures
443. Pitfall #1 of 2: Bogus day index value
444. Pitfall #2 of 2: Method argument order mismatch
445. Enumeration by class instances
446. Class instance per enumeration value
447. switch no longer works
448. Re-writing getPrice()
449. Pitfall: Creating an undesired instance
450. Define a private Day constructor
451. Preventing undesired Day instance creation
452. Adding a day name attribute
453. enum Day replacing public class Day
454. switch statements back working again
455. enum constructor being implicitly private
456. A minimal enum
457. An enum's parent class
458. Iterate over all enum values
459. Definition order matters!
460. Get an enum instance by its ordinal value
461. Get an enum instance by its constant's textual name
462. Openjdk source code repository
463. Superclass Object
464. String literals
465. OpenJDK String implementation
466. String copy constructor
467. Copy constructor and heap
468. Operator == and equals()
469. Remarks == vs. equals()
470. Operator == and equals() implications
471. equals() is being defined within respective class!
472. Math.sin(double x)
473. Guess who's inheriting the money
474. Biology and inheritance
475. Duplicate code
476. Idea: Centralize common code
477. Common and specific properties
478. Basic shape inheritance
479. Inheritance
480. Implementing Shape hierarchy
481. Creating instances
482. Shape constructor
483. Creating Rectangle instances
484. Rectangle constructor
485. Shape.equals()
486. Rectangle.equals()
487. Printing a Shape's info
488. Overwriting toString()
489. Shape extending Object
490. Overriding toString() in class Shape.
491. Logging Rectangle instances
492. Overriding toString() in Rectangle.
493. Rectangle extending Shape
494. Implementing Circle.toString()
495. Shape inheritance hierarchy and toString()
496. Moving Shape instances
497. Implementing Shape movements
498. Fools are everywhere!
499. Solution: final prevents overriding
500. Calculating a shape's area
501. Desired: Polymorphic getArea() call
502. Problems:
503. abstract method getArea()
504. abstract method getArea()
505. What's a shape anyway?
506. No instances of abstract classes.
507. Mandatory getArea() implementation.
508. Facts about abstract fields, methods and classes.
509. Moving shapes
510. protected access
511. final classes
512. final classes rationale
513. Defeating polymorphism
514. Defining equals(...): Expectations
515. Defining equals(...) of Shape instances
516. Comparing center coordinates
517. Implementing Rectangle.equals()
518. Implementing Circle.equals()
519. Testing equality of Shape objects
520. Overriding Object.toString()
521. @Override: Compile time error detection
522. Remarks on @Override
523. Polymorphism: Iteration over Object instances
524. Meta info of an instance
525. Instance meta info
526. Polymorphic dispatch / late binding
527. Example: Executing move()
528. Implementing getArea()
529. Implementing getArea() in class Shape ?
530. Solution: Abstract method getArea() in abstract class Shape
531. Polymorphic getArea() call
532. Runtime polymorphic dispatch
533. Polymorphic dispatch pseudo implementation
534. Compile- vs. runtime errors
535. NullPointerException (NPE for short)
536. NullPointerException is a class
537. Throwing an exception
538. Catching an exception by try {...} catch {...}
539. try {...} catch {...} syntax
540. Checked and unchecked exceptions
541. Further readings
542. Checked and unchecked exceptions
543. Expected exceptions in Junit
544. Just finally, no catch
545. try-with-resources (Java™ 7)
546. Scanner implementing AutoCloseable
547. No close() method in e.g. class String
548. Method printStackTrace()
549. Ascending inheritance ordering
550. Wrong ordering
551. Implementing convert
552. Problem: Silent errors
553. Step 1: Find exception base class
554. Step 2: Derive CardinalException
555. Step 3: Throwing CardinalException
556. Step 4: Unit test throwing CardinalException
557. Stack of integer values
558. Java™ collection features
559. Behind the scenes
560. Boxing and unboxing
561. Boxing syntax comparison
562. Parsing Integer user input
563. Parsing binary representation
564. Standard parse methods
565. Excerpt from java.util.Locale
566. Locale properties
567. Get a NumberFormat instance
568. Create a custom formatter
569. Polymorphic number parsing
570. Limited float precision
571. Limited double precision
572. Using BigDecimal
573. Chaining BigDecimal operations
574. BigDecimal features
575. Using static double random​()
576. Seeding a pseudo random generator
577. Interface examples
578. Observations
579. Writing strings to file
580. Using Text2File
581. Possible Text2File errors:
582. Employ try-with-resources
583. interface syntax
584. The AutoCloseable promise
585. abstract class replacement
586. interface vs. abstract class
587. interface MyAutoCloseable
588. Extending MyAutoCloseable to flush
589. Using MyFlushable
590. Inheritance hierarchy
591. Upcoming topics
592. Interfaces implemented by class String
593. The Comparable interface
594. class String and Comparable
595. Comparison examples
596. Ascending and descending names
597. API requirements
598. Sorting strings alphabetically
599. Situation dependent sorting criteria
600. Implementing flexible sorting
601. Comparator in action
602. Case insensitive sort
603. Sort descending by lambda expression
604. Account hierarchy
605. Students and lecturers
606. An array of strings
607. An associative array describing month lengths
608. Grouping towns by country names
609. Collaborative efforts
610. Project rules
611. Internal code documentation
612. Internal code documentation hints
613. Javadoc™ mismatches
614. (Automated) tests
615. Deployment and execution
616. Marking criteria
617. Sample forecast session
618. Sample forecast invocation
619. Underlying data provider
620. cities.list.json.gz providing cities
621. ma/Copy URL result to file
622. Parse city data
623. Parse weather data
624. Requirements
625. Logging
626. Minimalist token scanner
627. Scanner output -1.34 0.34 + sqrt
628. Adding error detection
629. Error message
630. Running the currency converter terminal application.
631. Exam training by Guacamole
632. Environment hints:
633. Preparing an examination
634. Generating Javadoc™.
635. Programming hints
636. The implement - test - implement cycle
637. Finishing the exam
638. Personal examination cheat sheets
639. Unit tests in examinations
640. Example interface definition
641. Corresponding test
642. Don't cheat!
643. Unit tests strategy in examinations
644. Steps creating a new project
645. Creating a project at MI gitlab
646. Cloning a git project
647. Enter project folder, add Readme.md
648. Committing change set
649. Push to upstream repository
650. Inserting a Maven project
651. git status 1
652. Adding Maven files to repository
653. git status 2
654. Commit Maven project files
655. git status 3
656. Push to upstream again
657. Reverting changes
658. Pull changes from upstream
659. From https://www.urbandictionary.com
660. Useful links
661. Initialize git project
662. Configure author related data.
663. Adding resources to project index and staging area
664. Committing change set
665. Project versioning status
666. Adding a comment
667. git diff tracing changes
668. Reverting individual file.
669. Compiling, Math.class and Print.class.
670. Math.class, Print.class and versioning.
671. Show project's log
672. Switch to an older revision ...
673. ... and forth to current master's HEAD
674. Centralized remote repository
675. Step 1: Create remote repository
676. Step 2: Retrieve remote repository address
677. Step 2: Connect to remote repository
678. Step 3: Push local to remote
679. Step 3: Pull remote to local
680. Alternative: Create remote, then clone
681. Conflicting changes
682. Commit schedule
683. User B: git push fails
684. User B: git pull fails as well
685. Merge conflict details
686. Struggling for resolution
687. Merging Print.java manually
688. Commit and push merge
689. Maven: Recommended reading
690. What is Maven anyway?
691. Maven: Facts and benefits
692. Convention Over Configuration
693. Maven project layout
694. The project object model file
695. pom.xml characteristics
696. pom.xml vs. Makefile
697. «Hello, world» pom.xml
698. Executing «compile» phase
699. Examining the Java™ version culprit
700. Resolving encoding / Java™ version issues
701. POM inheritance
702. The Super POM
703. pom-4.0.0.xml content
704. Favour https in ~/.m2/settings.xml
705. Resolving to effective pom.xml
706. Plugin architecture
707. Sample plugins
708. Example: The maven-javadoc-plugin
709. Adding test capabilities
710. Dependency listing
711. Absence of hamcrest in pom.xml
712. ~/.m2/repository/junit/junit/4.12/junit-4.12.pom
713. Transitive dependencies
714. Oblivious to test implementation: TestNG
715. Phases
716. Maven lifecyles and phases
717. hooking into phase
718. Why XML based publishing?
719. XML features
720. Editors, compositors, designers ...
721. Promises in publishing
722. Publishing reality
723. Single source publishing
724. Separating Structure, content and format
725. Separating concerns
726. Content
727. Hierarchical structure
728. Hierarchical structure, XML source
729. Presentation
730. Example 1: HTML 5, pure structure
731. Example 2: TeX / LaTeX
732. Separating structure and presentation(s)
733. Sample technical document
734. Observations
735. Pros and cons of TeX / LaTeX
736. Tools of the trade
737. Inline formatting
738. Paragraphs
739. Lists
740. Tables
741. Images
742. Mathematical formulas
743. Cross references
744. Document sectioning
745. Modular document components
746. What is Docbook?
747. Authoring and publishing
748. Document representation
749. Software centric schema
750. Document targets
751. Docbook components
752. Target format overview
753. Tooling / Software
754. Different schema languages
755. Plain HTML
756. Web help
757. Eclipse help
758. Printed output
759. Paragraph
760. Itemized list
761. Ordered list
762. Glossary list
763. Nested lists
764. Reference
765. A table
766. A MathML equation
767. A TeX equation
768. Reference
769. Figure
770. Image map + calloutlist
771. Video
772. A warning
773. Reference
774. Recursive sections
775. Non-recursive sections
776. Two different link flavours
777. Choosing a top level element
778. Allowed 5.1 top level elements
779. Schematron on top of RelaxNG
780. Example: xml:id and permalink
781. Using Display #Anchors
782. Considerations author based permalink
783. Schematron permalink rule
784. HTML customization overview
785. Target specific configuration
786. Link stability
787. use.id.as.filename = 1
788. Parameter: use.id.as.filename
789. Customization parameter ulink.target
790. callout.unicode / callout.graphics
791. Links
792. Hooking into XSL
793. Categories
794. Example: videos
795. Links
796. Customize by CSS
797. Example CSS modifications
798. Styling the editor
799. Motivating modular documents
800. Monolithic document problems
801. Document decomposition
802. A monolithic document
803. Decomposing documents
804. XML grammar defining languages
805. Address list schema
806. Format conversion problem
807. XSL template rules
808. Example: Formatting <title> elements
809. Basic FO introduction
810. XMLMind Editor
811. Oxygenxml Author
812. Vendor links
813. Inverse editing
814. Document representation
815. Components
816. BibTeX
817. Makeindex example
818. Makeindex work flow
819. Extension example: MusiXTeX
820. Flavours
821. Components
822. Editors
823. reveal.js authoring tools: Principle
824. reveal.js features #1 of 3
825. reveal.js features #2 of 3
826. reveal.js features #3 of 3
827. reveal.js observations
828. Authoring tool project goals
829. Principle
830. Required / to be acquired skills
831. Principle
832. Codingbat: Desired features
833. Desired features
834. CRUD operation
835. Query
836. Schema
837. Procedures / triggers
838. Transactions / recovery
839. Data access control
840. API support
841. Installing Docker
842. Why LDAP?
843. LDAP introduction
844. Running a Docker container
845. Using docker-compose
846. Installing Apache Directory Studio
847. Administrator access to your DIT
848. Administrator access to your server's data tree
849. Administrator access to your server's configuration
850. Terminology
851. Adding an entry
852. Adding a new attribute
853. Replacing an attribute value
854. Deleting an attribute entirely
855. Multi valued attributes
856. Set semantics of multivalued attributes
857. Deleting selected attribute values
858. Query scope
859. Query filter
860. Schema support
861. Implementations
862. Implementations
863. Exercises
864. Why MongoDB?
865. Running a Docker container
866. Using docker-compose
867. Manual user creation
868. Log in as user explorer
869. Using IntelliJ
870. Idea show all databases
871. Terminology / Hierarchy
872. Adding a document
873. Updating attributes
874. Deleting a document
875. Deleting multiple documents
876. Multi valued attributes
877. Set semantics of multivalued attributes
878. Deleting selected attribute values
879. Deleting an attribute
880. Query filter
881. Schema validation support
882. Violating required field
883. Schema types
884. Enforcing unique keys
885. On the downside
886. Implementations
887. Implementations
888. Sharding rationale
889. Sharding rationale
890. Exercises
891. Prerequisite knowledge
892. Persistence [Bauer2015]
893. Java™ transient instances
894. RDBMS persistent records
895. Persisting transient User instances
896. Observations
897. Networking between clients and database server
898. JDBC™ features
899. JDBC™ in a three-tier application
900. JDBC™ connecting application server and database.
901. JDBC™ connection parameter
902. Components of a JDBC™ URL
903. IETF Uniform Resource Identifier
904. URL examples
905. Sub protocol examples
906. No standard port assignments ...
907. ... but Postgresql made it into Linux
908. JDBC™ architecture
909. DriverManager: Bootstrapping connections
910. Example: Mysql connection implementation
911. Driver libraries
912. Driver libraries by Maven
913. Driver unavailable
914. Connection interface
915. Statement interface
916. JDBC™ instances and relationships.
917. Important Connection methods
918. Important Statement methods
919. JDBC™ and threading.
920. JDBC™ connection pooling
921. pom.xml driver runtime scope
922. Person table
923. Objective: insert person record
924. JDBC™ backed data insert
925. Result
926. Two JDBC™ configurations
927. Figure 924, “JDBC™ backed data insert ” deficiencies
928. Why properties?
929. message.properties string externalization
930. Properties code sketch
931. Intellij IDEA settings, preconditions
932. Database related unit test phases
933. Implementing unit tests
934. Spring is your friend
935. Project layout
936. Closing connections
937. Employ AutoCloseable
938. Sniffing a JDBC™ connection by an intruder.
939. Setting up Wireshark
940. Capturing results
941. Mysql™ security
942. Mysql™ security
943. Assembling SQL
944. SQL injection principle
945. Preventing traffic tickets
946. Trouble at school
947. SQL injection impact
948. SQL injection relevance, [Clarke2009]
949. Handling injection attacks, part 1
950. Handling injection attacks, part 2
951. Input filtering
952. Validating user input prior to dynamically composing SQL statements.
953. Error message being presented to the user.
954. SQL statements in Java™ applications get parsed at the database server
955. Two questions
956. Addressing performance
957. Addressing performance mitigation
958. Restating the SQL injection problem
959. Solution: Use java.sql.PreparedStatement
960. PreparedStatement principle.
961. Three phases using parameterized queries
962. PreparedStatement example
963. Injection attempt example
964. Limitation: No dynamic table support!
965. JDBC™ read and write
966. Server / client object's life cycle
967. JDBC™ record container
968. Reading data from a database server.
969. Names and birth dates of friends
970. Accessing friend's database records
971. Important ResultSet states
972. JDBC™ to Java™ type conversions
973. Java™ to JDBC™ type conversions
974. Error prone type accessors!
975. Polymorphic accessor
976. Access by column name
977. Access by column index
978. Problem: null value ambiguity
979. Resolving null value ambiguity
980. Problem: Dynamic driver configuration
981. Shim driver (facade)
982. Users and groups
983. Isolation level
984. JDBC™ Isolation level
985. Setting the isolation level
986. Reasons for using Maven
987. Transitive dependencies
988. A basic persistence.xml JPA configuration file.
989. JPA persistence provider
990. Mapping hibintro.v1.model.User instances to a database.
991. A basic User class.
992. Mapping properties to attributes.
993. Annotating integrity constraints
994. Database schema mapping instances of hibintro.v1.model.User.
995. Loading a single object by a primary key value.
996. Retrieving hibintro.v1.model.User instances by HQL.
997. Business rules for projects
998. Persistence related object states
999. Introducing inheritance mapping
1000. Modelling payment.
1001. A single relation mapping.
1002. Mapping the inheritance hierarchy.
1003. Inserting payment information
1004. Figure subclasses
1005. Joined subclass mapping.
1006. Implementing Object.equals(Object) by natural keys
1007. JPA caches.
1008. Common project steps #1/3
1009. Common project steps #2/3
1010. Common project steps #3/3
1011. Common technologies
1012. UNIX grep sample
1013. Similarities and differences
1014. Database grep requirements
1015. Connection profile handling
1016. Search level specification
1017. Property based searches
1018. Source and target database
1019. Copy process
1020. Considerations
1021. Sample data creation
1022. Schema evolution
1023. Techniques
1024. Subscribe to lecture
1025. Versioned code and documentation content
1026. Online documentation samples
1027. Create and publish a Hetzner account
1028. Your cloud project
1029. Server creation prerequisite: A Firewall
1030. Your first server
1031. Server access by ssh
1032. No ssh password based login
1033. Server access by web gui
1034. Current server security flaws
1035. Safety considerations
1036. ssh-keygen for elliptic key creation
1037. An elliptic ssh public / private key pair
1038. Result of ssh-keygen execution (client side)
1039. Transfer public key from client to server
1040. Cleaning up!
1041. Tedious: Passphrase required for each remote login
1042. Solving the passphrase issue
1043. Behind the scenes: How does it work?
1044. Intermediate host hopping
1045. Intermediate host hopping fails
1046. Intermediate host hopping options
1047. Enable ssh agent forwarding
1048. Forwarding port 80 to 2000 at localhost
1049. Frequent use e.g. connecting to remote database server
1050. X11 browser application forwarding
1051. Network file copy using scp
1052. Network file copy using rsync and ssh.
1053. Shell / Bash
1054. Choosing a text editor
1055. Secure Shell
1056. Working with files
1057. Network
1058. Processes handling
1059. Suggested readings:
1060. .deb packages
1061. The dpkg command
1062. The apt command
1063. Rationale using PPA's
1064. What's it all about?
1065. Terraform resources
1066. Creating databases
1067. Creating cloud resources
1068. Your course documentation: Code structure
1069. The env.template file
1070. Getting started: The Hetzner API token
1071. Minimal Terraform configuration
1072. Terraform init
1073. Terraform plan
1074. Terraform apply
1075. Credentials by E-Mail
1076. Problems: 😟
1077. ssh access, firewall
1078. ssh access, public key
1079. Apply ssh key access
1080. Output data details #1/2
1081. Output data details #2/2
1082. Storing secrets
1083. Problem 2: VCS and visible secrets 😱
1084. Addressing secrets by variable
1085. Addressing secrets by file
1086. Addressing secrets by Bash .env file
1087. Managing Terraform states
1088. Introduction and reference
1089. In a nutshell
1090. Configuration options
1091. Bash DIY
1092. Terraform interface to Cloud Init
1093. Using template files
1094. cloud-init file validation
1095. Yaml syntax quirk 1: Missing indentation
1096. Yaml missing indentation resolution
1097. Yaml syntax quirk 2: Wrong indentation
1098. Cloud-init configuration file validation
1099. Watch out for your enemies!
1100. Problem: Duplicate known_hosts entry on re-creating server
1101. Solution: Generating known_hosts ...
1102. ... cloud-init config using yamlencode / JSON
1103. ... and ssh wrapper
1104. Failsafe console login
1105. Avoiding Yaml parsing issues
1106. Terraform module Documentation
1107. Example: Creating a JSON host meta data file
1108. Parent module / sub module layout
1109. Parent module implementation
1110. Sub module implementation
1111. Sub module, JSON template file Tpl/hostdata.json and result
1112. Parent module vs. sub module context
1113. A volume: The easy way
1114. Unix mount
1115. Volume details
1116. Providing a mount point's name
1117. De-coupling server and volume creation
1118. Loop documentation
1119. Using count
1120. Subdomain per group
1121. Key file location
1122. Querying DNS by zone transfer
1123. Creating an »A« record with TTL=10
1124. Modify by delete/create
1125. Mind record caching
1126. Bind server ns1.hdm-stuttgart.cloud
1127. DNS provider
1128. DNS provider configuration
1129. Defining an A record
1130. Understanding web certificates
1131. Certificate trust level
1132. Certificates by Terraform
1133. dns_challenge provider
1134. rfc2136 provider configuration
1135. Bind server log file
1136. Private subnet overview
1137. Terraform network and subnetwork creation
1138. Gateway: External and internal interface
1139. intern host
1140. Lack of internet access
1141. Possible solutions
1142. http proxy apt-cacher-ng
1143. Cloud-init problem
1144. Service ready query script
1145. Terraform service ready dependency hook
1146. Pulumi facts
1147. Sample
1148. Architecture
1149. Asynchronous execution
1150. Executing plan
1151. Execution result
1152. Using cloud-init
1153. Login by public key
1154. A minimal system of hosts
1155. Firewall
1156. Importing Terraform DNS provider
1157. DNS provider
1158. DNS record
1159. Server
1160. Documentation links
1161. DNS query commands
1162. DNS forward lookup
1163. Display A-record result only
1164. Important record types
1165. Name Servers: Query type NS
1166. Recommended readings
1167. Openldap server documentation
1168. What is LDAP anyway?
1169. LDAP Server cli bind
1170. Document Information Tree (DIT)
1171. Relative and absolute DNs
1172. User example
1173. objectClass
1174. objectClass clarifications
1175. Augmenting inetOrgPerson by posixAccount
1176. Structural objectClass definitions
1177. Search scopes
1178. Predicate based queries
1179. LDAP bind types
1180. LDIF exchange format
1181. LDIF sample
1182. OpenLdap server architecture
1183. An example LDAP Tree
1184. External documentation
1185. URI to filesystem mapping
1186. Virtual hosting
1187. Implementing virtual hosting
1188. IP based virtual hosting
1189. IP based, pros / cons
1190. Name based virtual hosting
1191. Name based, pros / cons
1192. LDAP backed authentication
1193. PHP FPM server
1194. File services
1195. Customer demands
1196. Driving factors
1197. Selected cloud file services
1198. Selected self hosting products
1199. Nextcloud features
1200. Lightning integration
1201. Installation
1202. Docker hub
1203. Search images
1204. Pull image using CLI
1205. Pull Nextcloud image
1206. Nextcloud based on Alpine
1207. Inspect image
1208. Search an image's tags
1209. Nextcloud image by version
1210. List images by CLI
1211. Nextcloud latest image
1212. Duplicate Nextcloud images
1213. Maven ringing a bell?
1214. Un tag image by version
1215. Remove image by version
1216. Starting Nextcloud container
1217. List running containers
1218. Enter running container
1219. Remove container
1220. List volumes
1221. List orphaned volumes
1222. Remove volumes
1223. Technical features
1224. Documentation tool chain proposal