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