Lecture notes

Hosted at:
Available formats:
Source code provided at https://gitlab.mi.hdm-stuttgart.de/goik/GoikLectures
Published under the terms of the Creative Commons Attribution 4.0 International Public License.

Table of Contents
Preface
113105 Software development 1
Getting started
Lecture related resources
Using the exercises
Related resources
Coached exercises
Using plain Java
Play!
Hello, World and friends.
Simple calculations
A conditional
A loop
Using Intellij IDEA
Language Fundamentals
Integer, ASCII and Unicode
Primitive types
Variables
Literals
Arithmetic limitations
Conversions
Operators and expressions
Arithmetic and logical operators
Assignment operators
Unary operators
Comments
Statements
The if conditional statement
if-then-else
Using else if
The switch statement
Loops
while
do ... while
for
Logic related external exercises
Using automated tests.
Objects and Classes
Working with objects
Packages
Object methods
Encapsulation and access control
Getter and setter methods
Signatures
Method overloading
Constructors
Scopes
Class members and methods
A mathematical table.
Interest calculations
Programmer's favourite expression
Lotteries revisited
The greatest common divisor and the common multiple
Project dependencies and Maven
Maven command line usage
Intellij IDEA on top of Maven
Building a library of mathematical functions.
Maximum and absolute value
Factorial, the direct way
Factorial, the recursive way
Binomials, the recursive way
Implementing exponentials.
Adding sine
Strange things happen
Unit testing
Tests and implementation
Improving the algorithm
Helpful Junit methods
Technical details
Example: A class representing fractions
Value types and reference types
Method calls, the details
Enumerations (enum)
Enumeration by integer representation
Enumeration by dedicated class
Defining a private constructor
enum replacing class
Using git
Working with git locally.
Shared development with centralized remote.
Conflicts
Core Classes
Objects, equals() and hash-values
Using class Math
String exercises
Analyzing file pathnames
Arrays
Reconsidering System.out.format().
java.util.Arrays helpers
Extending arrays
Storing integer values
Understanding static public int main(String[] args)
Multi-dimensional arrays
Tic-tac-toe
Tic-tac-toe using a two-dimensional array
Changing the game's internal representation
Tic-tac-toe, Computer vs. human
Providing statistical data
Prime numbers revisited
A simple algorithm
Improving performance
The median of a given sample.
Plotting functions
Inheritance
Overriding equals() and hashCode()
Overriding toString()
final methods
Abstract methods
Geometry classes reconsidered
protected access
final classes
The instanceof operator
The @Override annotation.
Error Handling
Checked vs unchecked exceptions
Exceptions and Junit
Variants
Class java.lang.Exception
Working with Numbers
Boxing and Unboxing
Number Parsing
Number Formatting
Working with Money
Generating Random Numbers
interface definitions and abstract Classes
Interfaces and sorting
A nonsense generator
An interface based plotter
Application deployment I
Preparations
Exercises
Part II, Exercises
Reading character streams
Preparations
Exercises
Collections
Preparations
Collections I, Exercises
A Set of Strings
A List of Strings
Defining a Coordinate class
A Set of Coordinate instances
Collections I, Exercises
Getting a Set of strings from a text file
Result string ordering
Sorting strings in an unusual way
Result string ordering
Collections III, Exercises
Collections IV, Exercises
Maps 1, Preparations
Exercises
Towns and country names
Creating an overview of grades
Appendix
Examination bonus point projects
Weather forecast
Reverse Polish notation (RPN) calculator
Currency converter, Summer 2017
An address database, Winter 2016
Poor man's UNIX grep, Summer 2016
Project Euler's sieve, Winter 2015
Exercising past examinations
Starting an exam
Implementing the project skeleton
Finish the exam
Examination hints
Past Software Development 1 examinations
SD1 examination summer 2024
SD1 examination winter 2023
SD1 examination summer 2023
Sd1 examination winter 2022
SD1 examination winter 2021
SD1 examination summer 2021
SD1 examination winter 2020/1
SD1 examination winter 2020/2
SD1 examination summer 2020
SD1 examination winter 2019
SD1 examination summer 2019
SE1 Klausur Winter 2018
SE1 Klausur Sommer 2018
Past Software Development 1 exam preparing tests
First test
Second test
Third test
Fourth test
Working with git
Apache Maven
The project object model pom.xml
Plugins
Dependencies
Lifecycle, phases and goals
List of Exercises
Technical Documentation
Software independent considerations
General remarks
Common building blocks
Block level elements
Docbook
Target formats
Selected elements
Schematron
Customizing
Assemblies
Styling the editor application
Modular documents
RelaxNG Schema
Transforming documents
Target format HTML
Target format print
Software
Frontends
Backends
TeX / LaTeX
Docbook
Exercises
LaTeX
LaTeX hello,... world
Important elements
Macro
A complete document
Docbook
Project proposals
Building a reveal.js editor
Authoring journey descriptions
Gitlab pages integration of Docbook
Codingbat reloaded
XML based exercise compilations
Past projects
List of Exercises
113473 Database and application development
Database features
Selected database products overview
Openldap
Installation
Features
Exercises
Mongodb
Installation
Features
High performance sharding cluster
Exercises
JDBC: Accessing Relational Data
Persistence in Object Oriented languages
Introduction to JDBC
Write access, principles
Write access, coding!
JDBC™ and security
Read Access
Dynamically load a JDBC™ driver
Handling surrogate keys
Transactions
JPA
Configuring a Maven based Eclipse Java™ project with Hibernate
Creating a JPA configuration
A round trip working with objects
Persisting objects
Loading Objects by primary key
Loading objects by queries
Criteria based queries
Mapping single entities and database tables
Transient properties
Properties and NULL values
Defining keys
Composed keys
Indexes (non-unique)
Renaming tables and attributes
Changing the default type mapping
Object states and transitions
XML to JPA using JAXB
Inheritance
Single table per class hierarchy
Joined subclasses
Table per concrete class
Mapping related Components and entities
Primary keys revisited
Entity and value types
Mapping components
Caching
orphanRemoval vs. CascadeType.DELETE
Project ideas
Extending UNIX grep to databases
Database copy tool
Database schema evolution tool
List of Exercises
Software defined Infrastructure
UNIX / LINUX Basics
Prerequisites
Ubuntu / Debian Package management
Prerequisites
Cloud provider
Hetzner cloud administration GUI
Working with Terraform
Cloud-init
Volumes
Private networks
SDI exercises related DNS server
Terraform and DNS
Generating web SSL certificates
Terraform modules
Terraform loops
Getting started
Accessing your virtual machine
Global configurations
DNS
Preliminaries
Exercises
Querying DNS data.
Installing and configuring Bind
Reverse lookups
Forwarders
Mail exchange record
LDAP
Recommended Preparations
Exercises
Browse an existing LDAP Server
Set up an OpenLdap server
Populating your DIT.
Testing a bind operation as non - admin user
Extending an existing entry
Filter based search
Accessing LDAP data by a mail client
LDAP configuration
LDAP based user login
Backup and recovery / restore
Accessing LDAP by a Java™ application.
Apache web server
Preliminaries
Exercises
First Steps
Virtual hosts
SSL / TLS Support
LDAP authentication
Mysql™ database administration
Providing WEB based user management to your LDAP Server
Publish your documentation
File cloud
Exercises
Network file systems served by Samba
Prerequisites
Samba server installation
Mail
Recommended Preparations
Exercises
Install and send to local Users
Authentication Setup and Virtual Users
TLS
Spam and Virus defense
Docker
Introduction
Managing images
Running container
Volumes
Exercises
The simple way: Using SQLite
The real McCoy: Using Mariadb
Icinga
Functional checks
SNMP based checks
ssh based checks
List of Exercises
Persistence strategies and application development
Selected topics related to persistence in application development
Recommended reading
Getting started
Creating a Hibernate JPA project
Adding keys and AUTO_INCREMENT
Advocating simple key definitions
List of Exercises
Bibliographic links
Glossary
List of Figures
1. How much time to invest?
2. Recommended reading resources I
3. Recommended reading resources II
4. Your biggest enemies
5. German humour
6. 4 most imperative study objectives
7. Online tutorials
8. Unix and the terminal
9. Online programming, automated feedback
10. Online programming I
11. Online programming II
12. Openjdk source code repository
13. Java Visualizer
14. Live lecture additions
15. Remote lecture participation
16. Virtualbox / VMware player based virtualized Linux image
17. Virtualbox™ settings
18. Intellij IDEA IDE
19. Embedded exercises
20. Using the exercises
21. HdM mail server
22. Configure MI VPN client access
23. MI Cloud server
24. MI File server
25. MI Git versioning server
26. Coached exercises
27. Bonus points
28. Seminar rules and bonus points
29. Presenting exercise solutions
30. Edit - compile - execute
31. Editing Java™ files
32. Defining class HelloWorld
33. Compiling Java™ file
34. Command line Java™ file compilation
35. Java byte code file HelloWorld.class
36. Source code vs. bytecode
37. Executing byte code file HelloWorld.class
38. Command line byte code file HelloWorld.class execution
39. JDK™ installation options
40. Getting first Java™ impressions
41. Intellij IDEA installation
42. Idea »Ultimate« license types
43. Alternative: Using the HdM license server
44. Creating a new Java project
45. Manual calculation: Abacus
46. Mechanical calculation: Cash register
47. Electromechanical calculation: Zuse Z3
48. Vacuum Tube: Eniac
49. Transistor: Microprocessor ICs
50. Z80 8-bit data bus
51. Progress in hardware 1
52. Progress in hardware 2
53. Simple facts:
54. Unsigned 3 bit integer representation
55. Binary system addition
56. 3 bit two-complement representation
57. 3 bit two complement rationale: Usual addition
58. Signed 8 bit integer binary representation
59. 7-bit ASCII
60. 7-bit ASCII with even parity bit
61. Western European characters: ISO Latin 1 encoding
62. Unicode UTF-8 samples
63. Java types
64. Java primitive types, Part 1
65. Java primitive types, Part 2
66. Variables: Handles to memory
67. 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. Forcing conversions
81. Watch out!
82. Casting long to int
83. Don't worry, be happy ...
84. ... and watch the outcome
85. From the report
86. Maximum and minimum values
87. Dynamic typing in PERL
88. Dynamic typing in PERL, part 2
89. Using final
90. Two categories of variables
91. Reference type examples
92. float and double
93. Four ways representing 35
94. Choose your output representation
95. Know your limits!
96. Literal examples
97. int literals
98. int literals explained
99. Java™ primitive literals
100. JavaString and null literals
101. Just kidding ...
102. Strange things I
103. Strange things II
104. Arithmetic overflow pitfalls
105. Limited precision
106. Nearest float to 2.1
107. FloatConverter
108. Widening from byte literal to short
109. Narrowing from int literal to char variable
110. A widening «ladder»
111. A narrowing «ladder»
112. The binary plus operator
113. Binary operator output type
114. Detecting arithmetic overflow (Java 8+)
115. Dividing by zero
116. Generic binary operator
117. The modulus operator %
118. Binary operator type examples
119. No binary + operator yielding byte
120. int expression assignment
121. Constant expression assignment
122. The logical and operator &
123. The += operator
124. The &= operator
125. Assignment operators #1 / 2
126. Assignment operators #2 / 2
127. Increment operator ++
128. Different range behaviour!
129. Cast required
130. Prefix and postfix notation
131. Operator examples
132. Java™ comment flavors
133. Inline comments
134. Javadoc™ comments
135. Statements: General syntax
136. Statement examples: Declaring and assigning variables
137. Expression vs. statement
138. Multiple statements per line
139. Debugging multiple statements per line
140. Blocks
141. Conditional block execution
142. if syntax
143. if ... else
144. if ... else syntax
145. Best practices comparing for equality
146. Single statement branches
147. Nested if ... else
148. Enhanced readability: if ... else if ... else
149. if ... else if ... else syntax
150. User input recipe
151. Using a Scanner class collecting user input.
152. Converting numbers to day's names
153. Numbers to day's names: The hard way
154. Better: Using switch
155. switch Syntax
156. Switching on strings
157. Allowed types for switch statements
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 «helper»
270. Providing project «helper»
271. Install project «Common»
272. helper-0.9.jar archive content
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. Bogus index value
360. Pitfall: 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. Superclass Object
404. String literals
405. OpenJDK String implementation
406. String copy constructor
407. Copy constructor and heap
408. Operator == and equals()
409. Remarks == vs. equals()
410. Operator == and equals() implications
411. equals() is being defined within respective class!
412. Hashing principle
413. Quickly identify by simple value
414. Hashing in Java and equals()
415. Rectangle equals(...) and hashCode()
416. Rectangle hash values
417. Better hashCode() method
418. Math.sin(double x)
419. Motivating Arrays
420. Per member repeating tasks
421. Example: int array of primes
422. Loop prime values
423. Mind the limit!
424. Safer: Using length
425. Even better: for-each style loop
426. Mind the limit, part two
427. Primitive data one step initialization
428. Reference data one step initialization
429. Array
430. Two syntax variants
431. Array instances are special!
432. Array creation details
433. Array parameter passing
434. Parameter passing details
435. Value and reference types
436. Arrays.toString(...) and Arrays.sort(...)
437. Arrays.binarySearch(...)
438. Arrays.fill(...)
439. Arrays.copyOfRange(...)
440. Arrays.equals(...)
441. Lack of extendability
442. Extending an array
443. Extension result
444. Using Arrays.copyOf()
445. public static void main(String[] args)
446. Intellij IDEA run configuration
447. Intellij IDEA run configuration
448. Creating executable jar
449. Two-dimensional arrays
450. Behind the scenes
451. Memory allocation
452. Static array initialization
453. Static array initialization, variable lengths
454. Two Tic-tac-toe players fighting each other.
455. Two Tic-tac-toe players fighting each other.
456. Guess who's inheriting the money
457. Biology and inheritance
458. Duplicate code
459. Idea: Centralize common code
460. Common and specific properties
461. Basic shape inheritance
462. Inheritance
463. Implementing Shape hierarchy
464. Creating instances
465. Shape constructor
466. Creating Rectangle instances
467. Rectangle constructor
468. Shape.equals()
469. Rectangle.equals()
470. Printing a Shape's info
471. Overwriting toString()
472. Shape extending Object
473. Logging Rectangle instances
474. Override toString() in class Rectangle.
475. Rectangle extending Shape
476. Implementing Circle.toString()
477. Shape and toString()
478. Moving Shape instances
479. Implementing Shape movements
480. Fools are everywhere!
481. Solution: final prevents overriding
482. Calculating a shape's area
483. Desired: Polymorphic getArea() call
484. Problems:
485. abstract method getArea()
486. abstract method getArea()
487. What's a shape anyway?
488. No instances of abstract classes.
489. Mandatory getArea() implementation.
490. Facts about abstract fields, methods and classes.
491. Moving shapes
492. protected access
493. final classes
494. final classes rationale
495. Defeating polymorphism
496. Defining equals(...): Expectations
497. Defining equals(...) of Shape instances
498. Comparing center coordinates
499. Implementing Rectangle.equals()
500. Implementing Circle.equals()
501. Testing equality of Shape objects
502. Overriding Object.toString()
503. @Override: Easy compile time error detection
504. Compile- and runtime errors
505. NullPointerException (NPE for short)
506. NullPointerException is a class
507. Throwing an exception
508. Catching an exception by try {...} catch {...}
509. try {...} catch {...} syntax
510. Checked and unchecked exceptions
511. Checked and unchecked exceptions
512. Expected exceptions in Junit
513. Just finally, no catch
514. try-with-resources (Java™ 7)
515. Scanner implementing AutoCloseable
516. No close() method in e.g. class String
517. Method printStackTrace()
518. Ascending inheritance ordering
519. Descending inheritance ordering
520. Implementing convert
521. Problem: Silent errors
522. Step 1: Find exception base class
523. Step 2: Derive CardinalException
524. Step 3: Throwing CardinalException
525. Step 4: Unit test throwing CardinalException
526. Stack of integer values
527. Java™ collection features
528. Behind the scenes
529. Boxing and unboxing
530. Boxing syntax comparison
531. Parsing Integer user input
532. Parsing binary representation
533. Standard parse methods
534. Excerpt from java.util.Locale
535. Locale properties
536. Get a NumberFormat instance
537. Create a custom formatter
538. Polymorphic number parsing
539. Limited float precision
540. Limited double precision
541. Using BigDecimal
542. Chaining BigDecimal operations
543. BigDecimal features
544. Using static double random​()
545. Seeding a pseudo random generator
546. Interface examples
547. Observations
548. Writing strings to file
549. Using Text2File
550. Possible Text2File errors:
551. Employ try-with-resources
552. interface syntax
553. The AutoCloseable promise
554. abstract class replacement
555. interface vs. abstract class
556. interface MyAutoCloseable
557. Extending MyAutoCloseable to flush
558. Using MyFlushable
559. Inheritance hierarchy
560. Upcoming topics
561. Interfaces implemented by class String
562. The Comparable interface
563. class String and Comparable
564. Comparison examples
565. Ascending and descending names
566. API requirements
567. Sorting strings alphabetically
568. Situation dependent sorting criteria
569. Implementing flexible sorting
570. Comparator in action
571. Case insensitive sort
572. Sort descending by lambda expression
573. What's the use of hashing anyway?
574. Account hierarchy
575. Students and lecturers
576. An array of strings
577. An associative array describing month lengths
578. Grouping towns by country names
579. Collaborative efforts
580. Project rules
581. Internal code documentation
582. Internal code documentation hints
583. Javadoc™ mismatches
584. (Automated) tests
585. Deployment and execution
586. Marking criteria
587. Sample forecast session
588. Sample forecast invocation
589. Underlying data provider
590. cities.list.json.gz providing cities
591. ma/Copy URL result to file
592. Parse city data
593. Parse weather data
594. Requirements
595. Logging
596. Minimalist token scanner
597. Scanner output -1.34 0.34 + sqrt
598. Adding error detection
599. Error message
600. Running the currency converter terminal application.
601. Exam training by Guacamole
602. Environment hints:
603. Preparing an examination
604. Generating Javadoc™.
605. Programming hints
606. The implement - test - implement cycle
607. Finishing the exam
608. Personal examination cheat sheets
609. Unit tests in examinations
610. Example interface definition
611. Corresponding test
612. Don't cheat!
613. Unit tests strategy in examinations
614. Steps creating a new project
615. Creating a project at MI gitlab
616. Cloning a git project
617. Enter project folder, add Readme.md
618. Committing change set
619. Push to upstream repository
620. Inserting a Maven project
621. git status 1
622. Adding Maven files to repository
623. git status 2
624. Commit Maven project files
625. git status 3
626. Push to upstream again
627. Reverting changes
628. Pull changes from upstream
629. Maven: Recommended reading
630. What is Maven anyway?
631. Maven: Facts and benefits
632. Convention Over Configuration
633. Maven project layout
634. The project object model file
635. pom.xml characteristics
636. pom.xml vs. Makefile
637. «Hello, world» pom.xml
638. Executing «compile» phase
639. Examining the Java™ version culprit
640. Resolving encoding / Java™ version issues
641. POM inheritance
642. The Super POM
643. pom-4.0.0.xml content
644. Favour https in ~/.m2/settings.xml
645. Resolving to effective pom.xml
646. Plugin architecture
647. Sample plugins
648. Example: The maven-javadoc-plugin
649. Adding test capabilities
650. Dependency listing
651. Absence of hamcrest in pom.xml
652. ~/.m2/repository/junit/junit/4.12/junit-4.12.pom
653. Transitive dependencies
654. Oblivious to test implementation: TestNG
655. Phases
656. Maven lifecyles and phases
657. hooking into phase
658. Why XML based publishing?
659. XML features
660. Editors, compositors, designers ...
661. Promises in publishing
662. Publishing reality
663. Single source publishing
664. Separating Structure, content and format
665. Separating concerns
666. Content
667. Hierarchical structure
668. Hierarchical structure, XML source
669. Presentation
670. Example 1: HTML 5, pure structure
671. Example 2: TeX / LaTeX
672. Separating structure and presentation(s)
673. Sample technical document
674. Observations
675. Pros and cons of TeX / LaTeX
676. Tools of the trade
677. Inline formatting
678. Paragraphs
679. Lists
680. Tables
681. Images
682. Mathematical formulas
683. Cross references
684. Document sectioning
685. Modular document components
686. What is Docbook?
687. Authoring and publishing
688. Document representation
689. Software centric schema
690. Document targets
691. Docbook components
692. Target format overview
693. Tooling / Software
694. Different schema languages
695. Plain HTML
696. Web help
697. Eclipse help
698. Printed output
699. Paragraph
700. Itemized list
701. Ordered list
702. Glossary list
703. Nested lists
704. Reference
705. A table
706. A MathML equation
707. A TeX equation
708. Reference
709. Figure
710. Image map + calloutlist
711. Video
712. A warning
713. Reference
714. Recursive sections
715. Non-recursive sections
716. Two different link flavours
717. Choosing a top level element
718. Allowed 5.1 top level elements
719. Schematron on top of RelaxNG
720. Example: xml:id and permalink
721. Using Display #Anchors
722. Considerations author based permalink
723. Schematron permalink rule
724. HTML customization overview
725. Target specific configuration
726. Link stability
727. use.id.as.filename = 1
728. Parameter: use.id.as.filename
729. Customization parameter ulink.target
730. callout.unicode / callout.graphics
731. Links
732. Hooking into XSL
733. Categories
734. Example: videos
735. Links
736. Customize by CSS
737. Example CSS modifications
738. Styling the editor
739. Motivating modular documents
740. Monolithic document problems
741. Document decomposition
742. A monolithic document
743. Decomposing documents
744. XML grammar defining languages
745. Address list schema
746. Format conversion problem
747. XSL template rules
748. Example: Formatting <title> elements
749. Basic FO introduction
750. XMLMind Editor
751. Oxygenxml Author
752. Vendor links
753. Inverse editing
754. Document representation
755. Components
756. BibTeX
757. Makeindex example
758. Makeindex work flow
759. Extension example: MusiXTeX
760. Flavours
761. Components
762. Editors
763. reveal.js authoring tools: Principle
764. reveal.js features #1 of 3
765. reveal.js features #2 of 3
766. reveal.js features #3 of 3
767. reveal.js observations
768. Authoring tool project goals
769. Principle
770. Required / to be acquired skills
771. Principle
772. Codingbat: Desired features
773. Desired features
774. CRUD operation
775. Query
776. Schema
777. Procedures / triggers
778. Transactions / recovery
779. Data access control
780. API support
781. Installing Docker
782. Why LDAP?
783. LDAP introduction
784. Running a Docker container
785. Using docker-compose
786. Installing Apache Directory Studio
787. Administrator access to your DIT
788. Administrator access to your server's data tree
789. Administrator access to your server's configuration
790. Terminology
791. Adding an entry
792. Adding a new attribute
793. Replacing an attribute value
794. Deleting an attribute entirely
795. Multi valued attributes
796. Set semantics of multivalued attributes
797. Deleting selected attribute values
798. Query scope
799. Query filter
800. Schema support
801. Implementations
802. Implementations
803. Exercises
804. Why MongoDB?
805. Running a Docker container
806. Using docker-compose
807. Manual user creation (mongo-init.js fail)
808. Log in as user explorer
809. Using IntelliJ
810. Idea show all databases
811. Terminology / Hierarchy
812. Adding a document
813. Updating attributes
814. Deleting a document
815. Deleting multiple documents
816. Multi valued attributes
817. Set semantics of multivalued attributes
818. Deleting selected attribute values
819. Deleting an attribute
820. Query filter
821. Schema validation support
822. Violating required field
823. Schema types
824. Enforcing unique keys
825. On the downside
826. Implementations
827. Implementations
828. Sharding rationale
829. Sharding rationale
830. Exercises
831. Prerequisite knowledge
832. Persistence [Bauer2015]
833. Java™ transient instances
834. RDBMS persistent records
835. Persisting transient User instances
836. Observations
837. Networking between clients and database server
838. JDBC™ features
839. JDBC™ in a three-tier application
840. JDBC™ connecting application server and database.
841. JDBC™ connection parameter
842. Components of a JDBC™ URL
843. IETF Uniform Resource Identifier
844. URL examples
845. Sub protocol examples
846. No standard port assignments ...
847. ... but Postgresql made it into Linux
848. JDBC™ architecture
849. DriverManager: Bootstrapping connections
850. Example: Mysql connection implementation
851. Driver libraries
852. Driver libraries by Maven
853. Driver unavailable
854. Connection interface
855. Statement interface
856. JDBC™ instances and relationships.
857. Important Connection methods
858. Important Statement methods
859. JDBC™ and threading.
860. JDBC™ connection pooling
861. pom.xml driver runtime scope
862. Person table
863. Objective: insert person record
864. JDBC™ backed data insert
865. Result
866. Two JDBC™ configurations
867. Figure 864, “JDBC™ backed data insert ” deficiencies
868. Why properties?
869. message.properties string externalization
870. Properties code sketch
871. Intellij IDEA settings, preconditions
872. Database related unit test phases
873. Implementing unit tests
874. Spring is your friend
875. Project layout
876. Closing connections
877. Employ AutoCloseable
878. Sniffing a JDBC™ connection by an intruder.
879. Setting up Wireshark
880. Capturing results
881. Mysql™ security
882. Mysql™ security
883. Assembling SQL
884. SQL injection principle
885. Preventing traffic tickets
886. Trouble at school
887. SQL injection impact
888. SQL injection relevance, [Clarke2009]
889. Handling injection attacks, part 1
890. Handling injection attacks, part 2
891. Input filtering
892. Validating user input prior to dynamically composing SQL statements.
893. Error message being presented to the user.
894. SQL statements in Java™ applications get parsed at the database server
895. Two questions
896. Addressing performance
897. Addressing performance mitigation
898. Restating the SQL injection problem
899. Solution: Use java.sql.PreparedStatement
900. PreparedStatement principle.
901. Three phases using parameterized queries
902. PreparedStatement example
903. Injection attempt example
904. Limitation: No dynamic table support!
905. JDBC™ read and write
906. Server / client object's life cycle
907. JDBC™ record container
908. Reading data from a database server.
909. Names and birth dates of friends
910. Accessing friend's database records
911. Important ResultSet states
912. JDBC™ to Java™ type conversions
913. Java™ to JDBC™ type conversions
914. Error prone type accessors!
915. Polymorphic accessor
916. Access by column name
917. Access by column index
918. Problem: null value ambiguity
919. Resolving null value ambiguity
920. Problem: Dynamic driver configuration
921. Shim driver (facade)
922. Users and groups
923. Isolation level
924. JDBC™ Isolation level
925. Setting the isolation level
926. Reasons for using Maven
927. Transitive dependencies
928. A basic persistence.xml JPA configuration file.
929. JPA persistence provider
930. Mapping hibintro.v1.model.User instances to a database.
931. A basic User class.
932. Mapping properties to attributes.
933. Annotating integrity constraints
934. Database schema mapping instances of hibintro.v1.model.User.
935. Loading a single object by a primary key value.
936. Retrieving hibintro.v1.model.User instances by HQL.
937. Business rules for projects
938. Persistence related object states
939. Introducing inheritance mapping
940. Modelling payment.
941. A single relation mapping.
942. Mapping the inheritance hierarchy.
943. Inserting payment information
944. Figure subclasses
945. Joined subclass mapping.
946. Implementing Object.equals(Object) by natural keys
947. JPA caches.
948. Common project steps #1/3
949. Common project steps #2/3
950. Common project steps #3/3
951. UNIX grep sample
952. Database grep requirements
953. Connection profile handling
954. Search level specification
955. Property based searches
956. Shell / Bash
957. Secure Shell
958. Working with files
959. Gathering network related information
960. Handle processes
961. vim text editor introduction
962. Creating a ssh public/private key pair
963. Configuration file permissions on windows network file systems
964. Resulting permissions and configuration test
965. Suggested readings:
966. .deb packages
967. The dpkg command
968. The apt command
969. Rationale using PPA's
970. Create and publish a Hetzner account
971. Current server security flaws
972. Preliminary: Create an ssh key pair
973. Cleaning up!
974. What's it all about?
975. Terraform resources
976. Hetzner API token
977. Minimal Terraform configuration
978. Terraform init
979. Terraform plan
980. Terraform apply
981. Credentials by E-Mail
982. Problems: 😟
983. ssh access, firewall
984. ssh access, public key
985. Apply ssh key access
986. Output data details #1/2
987. Output data details #2/2
988. Problem 2: VCS and visible provider API token 😱
989. Solution by variable
990. Solution by file
991. Introduction and reference
992. In a nutshell
993. Configuration options
994. Terraform interface to Cloud Init
995. »hello, world ...« userData.yml file
996. Using and debugging template files
997. Template files demo
998. Validation
999. Watch out for your enemies!
1000. Problem: Duplicate known_hosts entry on re-creating server
1001. Solution: Generating known_hosts ...
1002. ... and ssh wrapper
1003. Failsafe console login
1004. Avoiding Yaml parsing issues
1005. A volume: The easy way
1006. Volume details
1007. Providing a mount point's name
1008. Solution: Independent resource creation
1009. Private subnet overview
1010. Terraform subnet creation
1011. Gateway host
1012. intern host
1013. Lack of internet access
1014. Possible solutions
1015. http proxy apt-cacher-ng
1016. Cloud-init problem
1017. Service ready query script
1018. Terraform service ready dependency hook
1019. Subdomain per group
1020. Key file location
1021. Querying DNS by zone transfer
1022. Creating an A record
1023. Modify by delete/create
1024. Bind server ns1.sdi.hdm-stuttgart.cloud
1025. DNS provider
1026. Defining an A record
1027. Understanding web certificates
1028. Certificate trust level
1029. Certificates by Terraform
1030. dns_challenge provider
1031. rfc2136 provider configuration
1032. Bind server logfile
1033. Terraform module Documentation
1034. Example: Creating bin/ssh and gen/known_hosts
1035. Local file generation by module
1036. Module implementation
1037. Careful: local vs. parent context
1038. Loop documentation
1039. Using count
1040. ssh-keygen generating an elliptic key
1041. Result of ssh-keygen execution
1042. Extended ACLs, ways too open
1043. Revoking permissions using setfacl
1044. Corrected permissions
1045. Logging in
1046. Documentation links
1047. DNS query commands
1048. DNS forward lookup
1049. Display A-record result only
1050. Important record types
1051. Name Servers: Query type NS
1052. Recommended readings
1053. Openldap server documentation
1054. What is LDAP anyway?
1055. LDAP Server cli bind
1056. Document Information Tree (DIT)
1057. Relative and absolute DNs
1058. User example
1059. objectClass
1060. objectClass clarifications
1061. Augmenting inetOrgPerson by posixAccount
1062. Structural objectClass definitions
1063. Search scopes
1064. Predicate based queries
1065. LDAP bind types
1066. LDIF exchange format
1067. LDIF sample
1068. OpenLdap server architecture
1069. An example LDAP Tree
1070. External documentation
1071. URI to filesystem mapping
1072. Virtual hosting
1073. Implementing virtual hosting
1074. IP based virtual hosting
1075. IP based, pros / cons
1076. Name based virtual hosting
1077. Name based, pros / cons
1078. LDAP backed authentication
1079. PHP FPM server
1080. File services
1081. Customer demands
1082. Driving factors
1083. Selected cloud file services
1084. Selected self hosting products
1085. Nextcloud features
1086. Lightning integration
1087. Installation
1088. Docker hub
1089. Search images
1090. Pull image using CLI
1091. Pull Nextcloud image
1092. Nextcloud based on Alpine
1093. Inspect image
1094. Search an image's tags
1095. Nextcloud image by version
1096. List images by CLI
1097. Nextcloud latest image
1098. Duplicate Nextcloud images
1099. Maven ringing a bell?
1100. Un tag image by version
1101. Remove image by version
1102. Starting Nextcloud container
1103. List running containers
1104. Enter running container
1105. Remove container
1106. List volumes
1107. List orphaned volumes
1108. Remove volumes