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