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