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
Project dependencies and Maven
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 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
First test
Second test
Third test
Fourth test
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
UNIX / LINUX Basics
Prerequisites
Ubuntu / Debian Package management
Prerequisites
Cloud provider
Hetzner cloud administration GUI
SDI exercises related DNS server
Working with Terraform
Cloud-init
Volumes
Private networks
Terraform and DNS
Generating web SSL certificates
Terraform modules
Terraform loops
Getting started
Accessing your virtual machine
Global configurations
DNS
Preliminaries
Exercises
Querying DNS data.
Installing and configuring Bind
Reverse lookups
Forwarders
Mail exchange record
LDAP
Recommended Preparations
Exercises
Browse an existing LDAP Server
Set up an OpenLdap server
Populating your DIT.
Testing a bind operation as non - admin user
Extending an existing entry
Filter based search
Accessing LDAP data by a mail client
LDAP configuration
LDAP based user login
Backup and recovery / restore
Accessing LDAP by a Java™ application.
Apache web server
Preliminaries
Exercises
First Steps
Virtual hosts
SSL / TLS Support
LDAP authentication
Mysql™ database administration
Providing WEB based user management to your LDAP Server
Publish your documentation
File cloud
Exercises
Network file systems served by Samba
Prerequisites
Samba server installation
Mail
Recommended Preparations
Exercises
Install and send to local Users
Authentication Setup and Virtual Users
TLS
Spam and Virus defense
Docker
Introduction
Managing images
Running container
Volumes
Exercises
The simple way: Using SQLite
The real McCoy: Using Mariadb
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. Openjdk source code repository
13. Java Visualizer
14. Live lecture additions
15. Remote lecture participation
16. Virtualbox / VMware player based virtual Linux image
17. Virtualbox™ settings
18. Intellij IDEA IDE
19. Embedded exercises
20. Using the exercises
21. HdM mail server
22. Configure MI VPN client access
23. MI Cloud server
24. MI File server
25. MI Git versioning server
26. Coached exercises
27. Bonus points
28. Seminar rules and bonus points
29. Presenting exercise solutions
30. Tuition attendance and exam results
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 primitive types, Part 1
66. Java primitive types, Part 2
67. Variables: Handles to memory
68. Variable declaration
69. Declare, assign and use
70. Combining declaration and initialization
71. Multiple variables of same type
72. Identifier in Java™:
73. Identifier name examples:
74. Java™ keywords.
75. Variable naming conventions
76. Constant variables
77. Case sensitivity
78. Define before use
79. Type safety
80. Compile time analysis
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. Maximum and minimum values
88. Dynamic typing in PERL
89. Dynamic typing in PERL, part 2
90. Using final
91. Two categories of variables
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. int literals explained
100. Java™ primitive literals
101. JavaString and null literals
102. Just kidding ...
103. Strange things I
104. Strange things II
105. Arithmetic overflow pitfalls
106. Limited precision
107. Nearest float to 2.1
108. FloatConverter
109. Widening from byte literal to short
110. Narrowing from int literal to char variable
111. A widening «ladder»
112. A narrowing «ladder»
113. The binary plus operator
114. Binary operator output type
115. Detecting arithmetic overflow (Java 8+)
116. Dividing by zero
117. Generic binary operator
118. The modulus operator %
119. Binary operator type examples
120. No binary + operator yielding byte
121. int expression assignment
122. Constant expression assignment
123. The logical and operator &
124. The += operator
125. The &= operator
126. Arithmetic assignment operators
127. Logical assignment operators
128. Increment operator ++
129. Different range behaviour!
130. Cast required
131. Prefix and postfix notation
132. Operator examples
133. Java™ comment flavors
134. Inline comments
135. Javadoc™ comments
136. Statements: General syntax
137. Statement examples: Declaring and assigning variables
138. Expression vs. statement
139. Multiple statements per line
140. Debugging multiple statements per line
141. Blocks
142. Conditional block execution
143. if syntax
144. if ... else
145. if ... else syntax
146. Best practices comparing for equality
147. Single statement branches
148. Nested if ... else
149. Enhanced readability: if ... else if ... else
150. if ... else if ... else syntax
151. User input recipe
152. Using a Scanner class collecting user input.
153. Converting numbers to day's names
154. Numbers to day's names: The hard way
155. Better: Using switch
156. switch Syntax
157. Switching on strings
158. Allowed types for switch statements
159. Why loops?
160. Arbitrary number of repetitions
161. A while loop
162. Combining increment and termination condition
163. while syntax
164. Empty while body
165. A do ... while loop
166. do ... while syntax
167. Frequent usage of while
168. Replacing while by for
169. for syntax
170. for variable scope
171. for variable scope equivalence
172. for vs. while relationship
173. Nested loops 1
174. Nested loops 2
175. Better readability: row and column in favour of i and j
176. Calculating values
177. Response to coding errors
178. Unit test concept
179. alarmClock(...) with errors
180. Testing alarmClock(...)
181. Testing alarmClock(...) details
182. Instances of a Class
183. General class structure
184. What's a class anyway?
185. Rectangle objects
186. A class describing rectangles
187. Rectangle class and instances
188. Generated diagrams
189. The new operator: Creating rectangle instances
190. Syntax creating instances
191. Assigning attribute values to class instances
192. Instance memory representation
193. References and null
194. Checking for object presence
195. Why packages ?
196. Rules and conventions
197. Fully qualified class name vs. import
198. Don't be too lazy!
199. Special: Classes in package java.lang
200. Class, package and file system
201. Source hierarchy view
202. Object methods
203. Scaling a rectangle
204. Scaling method implementation
205. Scaling method signature
206. Using the scale(...) method
207. Method definition syntax
208. A rectangle's perimeter
209. getPerimeter() method implementation
210. Using Rectangle.getPerimeter()
211. Access control: Overall objectives
212. Example: Two ways implementing a day's time
213. Access violation
214. Access rules
215. Tips on Choosing an Access Level
216. Direct access vs. setter method
217. Why adding setter methods?
218. Implementation change: Minutes only, no hours
219. Defining type signatures
220. Type signature examples
221. Defining method signatures
222. Method signature examples
223. Method overloading: Same name, different signature
224. Overloading, alternate names
225. No overloading in »C«
226. »C« requires unique function names
227. No distinction on return type
228. Method signatures rationale
229. Method signatures rationale
230. Example: System.out.print(...)
231. Creating and initializing rectangles
232. Defining a constructor
233. Constructor syntax
234. Constructors
235. Multiple overloaded constructors
236. Constructor calls within constructor
237. Instances by overloaded constructors
238. No constructor vs. default constructor
239. Non - default constructor, but no default constructor
240. Employee example package hierarchy
241. Circle and variable scopes
242. Documenting classes and methods
243. Generated Javadoc
244. Refactoring «r» ⇒ «radius»
245. Scope assignment problem
246. this overriding method scope
247. Why do we require an instance?
248. Solution: Replace instance method by class method using static
249. Club membership objectives
250. Step 1: Implementing club member names.
251. Showing membership info.
252. Step 2: Adding membership numbers.
253. Showing membership numbers.
254. Member creation steps
255. Accessing the club's overall member count?
256. Accessing the club's member count
257. Syntax accessing class members
258. static / non-static wrap up
259. Finally understanding System.out.print(ln)
260. Newton's letter to Robert Hooke
261. Application execution prerequisites
262. Why Maven project management?
263. Example: Creating PDF using iText7
264. Maven iText library pom.xml definition
265. Itext transitive dependencies
266. Class location in iText library
267. Class location in iText library
268. Maven repositories
269. Maven archetypes
270. Project «lottery» depending on «helper»
271. Providing project «helper»
272. Install project «Common»
273. helper-0.9.jar archive content
274. Consuming project «Lottery»
275. External libraries view
276. Using Helper.factorial(...) computing ( n k ) = n ! k ! ( n - k ) !
277. Maven artifact dependency.
278. Using the MI Sd1 project template
279. CLI example
280. Supplementary MI Maven archetypes
281. CLI testing mi-maven-archetype-quickstart
282. CLI archetype details
283. Generated project layout
284. Maven compile
285. Compilation file view
286. Execution
287. Maven package
288. Executing Java™ archive first-0.9.jar
289. Maven javadoc:javadoc
290. Maven clean
291. Intellij IDEA Maven support
292. Adding MI Maven server
293. New MI archetype project
294. pom.xml content changes
295. Intellij IDEA generating Javadoc
296. Pascal's triangle representing binomial coefficients.
297. An implementation sketch for the exponential
298. Comparing exponential and approximation
299. Comparing sin(x) and its approximation.
300. Recommended reading
301. Test categories
302. Example: Computing prime numbers
303. Unit test principle
304. Test driven development
305. Steps in Unit Testing
306. Step 1 + 2: Specify method, write skeleton
307. Execution yet being flawed
308. Sample test data
309. Step 3: Junit based specification test
310. Junit skeleton test result (Maven CLI)
311. Junit skeleton test result (IDE)
312. Step 3: Providing more prime tests
313. Step 3: Prime mass testing
314. Step 4: Implement skeleton
315. Step 5: Testing our first implementation
316. Implementation observation
317. Changing the implementation
318. Regression test
319. Systematic error debugging
320. Error correction in detail
321. Available comparison methods
322. Caution comparing float / double !!
323. Weird arithmetics?
324. Limited representation precision
325. Solving the issue
326. The @Test annotation
327. The Assert class
328. Importing dependencies
329. Dependency archive content
330. Value vs. reference type variables
331. Different behaviour!
332. Value variable Details
333. Reference variable Details
334. Only «call-by-value» in Java
335. «call-by-value» details
336. «call-by-reference» for objects?
337. «call-by-reference» details
338. No «call-by-reference» in Java™!
339. No «call-by-reference» details
340. C++ reference operator &
341. C++ offers «call-by-reference» by virtue of &
342. C++ «call-by-reference» details
343. Method calling
344. Three variable scopes
345. Scope lifetimes
346. Two runtime memory categories
347. Stack: Four operations
348. Example: Storing integer values
349. Method calling
350. Call stack trace
351. IDE debugger
352. Motivation
353. Weekly offered lectures
354. Weekly offered lectures by simple numbers
355. Weekdays int representation
356. Weekly offered lectures using constants
357. Converting index values to day names
358. Providing lecture info
359. Sample lectures
360. Pitfall #1 of 2: Bogus day index value
361. Pitfall #2 of 2: Method argument order mismatch
362. Enumeration by class instances
363. Class instance per enumeration value
364. switch no longer works
365. Re-writing getPrice()
366. Compile time argument mismatch error
367. Pitfall: Creating an undesired instance
368. Define a private Day constructor
369. Preventing undesired Day instance creation
370. Adding a day name attribute
371. enum Day replacing public class Day
372. switch statements working again
373. enum constructor being implicitly private
374. From https://www.urbandictionary.com
375. Useful links
376. Initialize git project
377. Configure author related data.
378. Adding resources to project index and staging area
379. Committing change set
380. Project versioning status
381. Adding a comment
382. git diff tracing changes
383. Reverting individual file.
384. Compiling, Math.class and Print.class.
385. Math.class, Print.class and versioning.
386. Show project's log
387. Switch to an older revision ...
388. ... and forth to current master's HEAD
389. Centralized remote repository
390. Step 1: Create remote repository
391. Step 2: Retrieve remote repository address
392. Step 2: Connect to remote repository
393. Step 3: Push local to remote
394. Step 3: Pull remote to local
395. Alternative: Create remote, then clone
396. Conflicting changes
397. Commit schedule
398. User B: git push fails
399. User B: git pull fails as well
400. Merge conflict details
401. Struggling for resolution
402. Merging Print.java manually
403. Commit and push merge
404. Superclass Object
405. String literals
406. OpenJDK String implementation
407. String copy constructor
408. Copy constructor and heap
409. Operator == and equals()
410. Remarks == vs. equals()
411. Operator == and equals() implications
412. equals() is being defined within respective class!
413. Hashing principle
414. Quickly identify by simple value
415. Hashing in Java and equals()
416. Rectangle equals(...) and hashCode()
417. Rectangle hash values
418. Better hashCode() method
419. Math.sin(double x)
420. Motivating Arrays
421. Per member repeating tasks
422. Example: int array of primes
423. Loop prime values
424. Mind the limit!
425. Safer: Using length
426. Even better: for-each style loop
427. Mind the limit, part two
428. Primitive data one step initialization
429. Reference data one step initialization
430. Array
431. Two syntax variants
432. Array instances are special!
433. Array creation details
434. Array parameter passing
435. Parameter passing details
436. Value and reference types
437. Arrays.toString(...) and Arrays.sort(...)
438. Arrays.binarySearch(...)
439. Arrays.fill(...)
440. Arrays.copyOfRange(...)
441. Arrays.equals(...)
442. Lack of extendability
443. Extending an array
444. Extension result
445. Using Arrays.copyOf()
446. public static void main(String[] args)
447. Intellij IDEA run configuration
448. Intellij IDEA run configuration
449. Creating executable jar
450. Two-dimensional arrays
451. Behind the scenes
452. Memory allocation
453. Static array initialization
454. Static array initialization, variable lengths
455. Two Tic-tac-toe players fighting each other.
456. Two Tic-tac-toe players fighting each other.
457. Guess who's inheriting the money
458. Biology and inheritance
459. Duplicate code
460. Idea: Centralize common code
461. Common and specific properties
462. Basic shape inheritance
463. Inheritance
464. Implementing Shape hierarchy
465. Creating instances
466. Shape constructor
467. Creating Rectangle instances
468. Rectangle constructor
469. Shape.equals()
470. Rectangle.equals()
471. Printing a Shape's info
472. Overwriting toString()
473. Shape extending Object
474. Logging Rectangle instances
475. Override toString() in class Rectangle.
476. Rectangle extending Shape
477. Implementing Circle.toString()
478. Shape and toString()
479. Moving Shape instances
480. Implementing Shape movements
481. Fools are everywhere!
482. Solution: final prevents overriding
483. Calculating a shape's area
484. Desired: Polymorphic getArea() call
485. Problems:
486. abstract method getArea()
487. abstract method getArea()
488. What's a shape anyway?
489. No instances of abstract classes.
490. Mandatory getArea() implementation.
491. Facts about abstract fields, methods and classes.
492. Moving shapes
493. protected access
494. final classes
495. final classes rationale
496. Defeating polymorphism
497. Defining equals(...): Expectations
498. Defining equals(...) of Shape instances
499. Comparing center coordinates
500. Implementing Rectangle.equals()
501. Implementing Circle.equals()
502. Testing equality of Shape objects
503. Overriding Object.toString()
504. @Override: Easy compile time error detection
505. Meta info of an instance
506. Getting instance meta info
507. Implementing getArea()
508. Polymorphic getArea() call
509. Runtime polymorphic dispatch
510. Conventional getArea() implementation
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 (mongo-init.js fail)
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. Shell / Bash
964. Secure Shell
965. Working with files
966. Gathering network related information
967. Handle processes
968. vim text editor introduction
969. Creating a ssh public/private key pair
970. Configuration file permissions on windows network file systems
971. Resulting permissions and configuration test
972. Suggested readings:
973. .deb packages
974. The dpkg command
975. The apt command
976. Rationale using PPA's
977. Create and publish a Hetzner account
978. Current server security flaws
979. Preliminary: Create an ssh key pair
980. Cleaning up!
981. Subdomain per group
982. Key file location
983. Querying DNS by zone transfer
984. Creating an A record
985. Modify by delete/create
986. What's it all about?
987. Terraform resources
988. Hetzner API token
989. Minimal Terraform configuration
990. Terraform init
991. Terraform plan
992. Terraform apply
993. A word on storing secrets
994. Credentials by E-Mail
995. Problems: 😟
996. ssh access, firewall
997. ssh access, public key
998. Apply ssh key access
999. Output data details #1/2
1000. Output data details #2/2
1001. Problem 2: VCS and visible provider API token 😱
1002. Solution by variable
1003. Solution by file
1004. Introduction and reference
1005. In a nutshell
1006. Configuration options
1007. Terraform interface to Cloud Init
1008. »hello, world ...« userData.yml file
1009. Using template files
1010. Validation
1011. Yaml syntax quirk 1: Missing indentation
1012. Yaml missing indentation resolution
1013. Watch out for your enemies!
1014. Problem: Duplicate known_hosts entry on re-creating server
1015. Solution: Generating known_hosts ...
1016. ... and ssh wrapper
1017. Failsafe console login
1018. Avoiding Yaml parsing issues
1019. A volume: The easy way
1020. Volume details
1021. Providing a mount point's name
1022. Solution: Independent resource creation
1023. Private subnet overview
1024. Terraform network and subnetwork creation
1025. Gateway: External and internal interface
1026. intern host
1027. Lack of internet access
1028. Possible solutions
1029. http proxy apt-cacher-ng
1030. Cloud-init problem
1031. Service ready query script
1032. Terraform service ready dependency hook
1033. Bind server ns1.sdi.hdm-stuttgart.cloud
1034. DNS provider
1035. Defining an A record
1036. Understanding web certificates
1037. Certificate trust level
1038. Certificates by Terraform
1039. dns_challenge provider
1040. rfc2136 provider configuration
1041. Bind server logfile
1042. Terraform module Documentation
1043. Example: Creating bin/ssh and gen/known_hosts
1044. Local file generation by module
1045. Module implementation
1046. Careful: local vs. parent context
1047. Loop documentation
1048. Using count
1049. ssh-keygen generating an elliptic key
1050. Result of ssh-keygen execution
1051. Extended ACLs, ways too open
1052. Revoking permissions using setfacl
1053. Corrected permissions
1054. Logging in
1055. Documentation links
1056. DNS query commands
1057. DNS forward lookup
1058. Display A-record result only
1059. Important record types
1060. Name Servers: Query type NS
1061. Recommended readings
1062. Openldap server documentation
1063. What is LDAP anyway?
1064. LDAP Server cli bind
1065. Document Information Tree (DIT)
1066. Relative and absolute DNs
1067. User example
1068. objectClass
1069. objectClass clarifications
1070. Augmenting inetOrgPerson by posixAccount
1071. Structural objectClass definitions
1072. Search scopes
1073. Predicate based queries
1074. LDAP bind types
1075. LDIF exchange format
1076. LDIF sample
1077. OpenLdap server architecture
1078. An example LDAP Tree
1079. External documentation
1080. URI to filesystem mapping
1081. Virtual hosting
1082. Implementing virtual hosting
1083. IP based virtual hosting
1084. IP based, pros / cons
1085. Name based virtual hosting
1086. Name based, pros / cons
1087. LDAP backed authentication
1088. PHP FPM server
1089. File services
1090. Customer demands
1091. Driving factors
1092. Selected cloud file services
1093. Selected self hosting products
1094. Nextcloud features
1095. Lightning integration
1096. Installation
1097. Docker hub
1098. Search images
1099. Pull image using CLI
1100. Pull Nextcloud image
1101. Nextcloud based on Alpine
1102. Inspect image
1103. Search an image's tags
1104. Nextcloud image by version
1105. List images by CLI
1106. Nextcloud latest image
1107. Duplicate Nextcloud images
1108. Maven ringing a bell?
1109. Un tag image by version
1110. Remove image by version
1111. Starting Nextcloud container
1112. List running containers
1113. Enter running container
1114. Remove container
1115. List volumes
1116. List orphaned volumes
1117. Remove volumes