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