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