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