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