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