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