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