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