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