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