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