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