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