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