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