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