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