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