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