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