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