Lecture notes

Available 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
Common software development related resources
Coached exercises
Using plain Java
Play!
Hello, World and friends.
Simple calculations
A conditional
A loop
Using Maven and Intellij IDEA
Maven command line usage
Intellij IDEA on top of Maven
Examination hints.
Starting an exam
Implementing the project skeleton
Finish the exam
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
Building a library of mathematical functions.
Unit testing
Tests and implementation
Improving the algorithm
Helpful Junit methods
Technical details
A class representing fractions
Value types and reference types
Method calls, the details
Enumerations (enum).
Enumeration by integer representation
Enumeration by dedicated class
Defining a private constructor
enum replacing class
Using git
Working with git locally.
Shared development with centralized remote.
Conflicts
Core Classes
Objects, equals() and hash-values
Using class Math
String exercises
Analyzing file pathnames
Arrays
Reconsidering System.out.format().
java.util.Arrays helpers
Extending arrays
Storing integer values
Understanding static public int main(String[] args)
Multi-dimensional arrays
Tic-tac-toe
Tic-tac-toe using a two-dimensional array
Changing the game's internal representation
Tic-tac-toe, Computer vs. human
Providing statistical data
Prime numbers revisited
A simple algorithm
Improving performance
The median of a given sample.
Plotting functions
Inheritance
Overriding equals() and hashCode()
Overriding toString()
final methods
Abstract methods
Geometry classes reconsidered
protected access
final classes
The instanceof operator
The @Override annotation.
Error Handling
Checked vs unchecked exceptions
Exceptions and Junit
Variants
Class java.lang.Exception
Working with Numbers
Boxing and Unboxing
Number Parsing
Number Formatting
Working with Money
Generating Random Numbers
interface definitions and abstract Classes
Interfaces and sorting
A nonsense generator
An interface based plotter
Application deployment I
Preparations
Exercises
Part II, Exercises
Reading character streams
Preparations
Exercises
Collections
Preparations
Collections I, Exercises
A Set of Strings
A List of Strings
Defining a Coordinate class
A Set of Coordinate instances
Collections I, Exercises
Getting a Set of strings from a text file
Result string ordering
Sorting strings in an unusual way
Result string ordering
Collections III, Exercises
Collections IV, Exercises
Maps 1, Preparations
Exercises
Towns and country names
Creating an overview of grades
Appendix
Examination 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
Working with git
Apache Maven
The project object model pom.xml
Plugins
Dependencies
Lifecycle, phases and goals
Past Software Development 1 examinations
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
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
Possible projects
Gitlab pages integration of Docbooc
Codingbat reloaded
XML based exercise compilations
Representing and editing BiBTeX data
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
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
Database copy tool
Database schema evolution tool
Extending UNIX grep to databases
List of Exercises
Software defined Infrastructure
UNIX / LINUX Basics
Prerequisites
Ubuntu / Debian Package management
Prerequisites
Getting started
Accessing your virtual machine
Global configurations
DNS
Preliminaries
Exercises
Querying DNS data.
Installing 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
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. Intellij IDEA IDE (See installation details)
15. Virtualbox / VMware player based virtualized Linux image
16. Virtualbox™ settings
17. Embedded exercises
18. Using the exercises
19. HdM mail server
20. Configure MI VPN client access
21. MI Cloud server
22. E-examination resources
23. MI File server
24. MI Git versioning server
25. Coached exercises
26. Bonus points
27. Seminar rules / bonus points
28. Edit - compile - execute
29. Editing Java™ files
30. Defining class HelloWorld
31. Compiling Java™ file
32. Command line Java™ file compilation
33. Java byte code file HelloWorld.class
34. Source code vs. bytecode
35. Executing byte code file HelloWorld.class
36. Shell byte code file HelloWorld.class execution
37. JDK™ installation options
38. Downloading IntelliJ idea
39. Idea »Ultimate« license types
40. HdM license server
41. Using Maven
42. Maven archetypes
43. Supplementary MI Maven archetypes
44. CLI archetype test
45. CLI archetype details
46. Generated project layout
47. Maven compile
48. Compilation file view
49. Execution
50. Maven package
51. Executing Java™ archive first-0.9.jar
52. Maven javadoc:javadoc
53. Maven clean
54. Intellij IDEA Maven support
55. Intellij IDEA Maven archetype catalog plugin
56. Intellij IDEA MI archetype repository configuration
57. New MI archetype project
58. Selecting an archetype
59. Providing project identifier
60. Your project's root
61. pom.xml content changes
62. Intellij IDEA generating Javadoc
63. Exam training by Guacamole
64. Environment hints:
65. Preparing an examination
66. Generating Javadoc™.
67. Programming hints
68. The implement - test - implement cycle
69. Finishing the exam
70. Manual calculation: Abacus
71. Mechanical calculation: Cash register
72. Electromechanical calculation: Zuse Z3
73. Vacuum Tube: Eniac
74. Transistor: Microprocessor ICs
75. Z80 8-bit data bus
76. Progress in hardware
77. Simple facts:
78. Unsigned 3 bit integer representation
79. Binary system addition
80. 3 bit two-complement representation
81. 3 bit two complement rationale: Usual addition
82. Signed 8 bit integer binary representation
83. 7-bit ASCII
84. 7-bit ASCII with even parity bit
85. Western European characters: ISO Latin 1 encoding
86. Unicode UTF-8 samples
87. Java types
88. Java primitive types, Part 1
89. Java primitive types, Part 2
90. Variables: Handles to memory
91. Variable declaration
92. Declare, assign and use
93. Combining declaration and initialization
94. Multiple variables of same type
95. Identifier in Java™:
96. Identifier name examples:
97. Java™ keywords.
98. Variable naming conventions
99. Constant variables
100. Case sensitivity
101. Define before use
102. Type safety
103. Compile time analysis
104. Forcing conversions
105. Watch out!
106. Casting long to int
107. Don't worry, be happy ...
108. ... and watch the outcome
109. From the report
110. Maximum and minimum values
111. Dynamic typing in PERL
112. Dynamic typing in PERL, part 2
113. Using final
114. Two categories of variables
115. Reference type examples
116. float and double
117. Four ways representing 35
118. Choose your output representation
119. Know your limits!
120. Literal examples
121. int literals
122. int literals explained
123. Java™ primitive literals
124. JavaString and null literals
125. Just kidding ...
126. Strange things I
127. Strange things II
128. Arithmetic overflow pitfalls
129. Limited precision
130. Nearest float to 2.1
131. FloatConverter
132. Widening from byte literal to short
133. Narrowing from int literal to char variable
134. A widening «ladder»
135. A narrowing «ladder»
136. The binary plus operator
137. Binary operator output type
138. Detecting arithmetic overflow (Java 8+)
139. Dividing by zero
140. Generic binary operator
141. The modulus operator %
142. Binary operator type examples
143. No binary + operator yielding byte
144. int expression assignment
145. Constant expression assignment
146. The logical and operator &
147. The += operator
148. The &= operator
149. Assignment operators #1 / 2
150. Assignment operators #2 / 2
151. Increment operator ++
152. Different range behaviour!
153. Cast required
154. Prefix and postfix notation
155. Operator examples
156. Java™ comment flavors
157. Inline comments
158. Javadoc™ comments
159. Statements: General syntax
160. Statement examples: Declaring and assigning variables
161. Expression vs. statement
162. Multiple statements per line
163. Debugging multiple statements per line
164. Blocks
165. Conditional block execution
166. if syntax
167. if ... else
168. if ... else syntax
169. Best practices comparing for equality
170. Single statement branches
171. Nested if ... else
172. Enhanced readability: if ... else if ... else
173. if ... else if ... else syntax
174. User input recipe
175. Using a Scanner class collecting user input.
176. Converting numbers to day's names
177. Numbers to day's names: The hard way
178. Better: Using switch
179. switch Syntax
180. Switching on strings
181. Why loops?
182. Arbitrary number of repetitions
183. A while loop
184. Combining increment and termination condition
185. while syntax
186. Empty while body
187. A do ... while loop
188. do ... while syntax
189. Frequent usage of while
190. Replacing while by for
191. for syntax
192. for variable scope
193. for variable scope equivalence
194. for vs. while relationship
195. Nested loops
196. Better readability: Use row and column in favour of i and j
197. Calculating values
198. Response to coding errors
199. Unit test concept
200. alarmClock(...) with errors
201. Testing alarmClock(...)
202. Testing alarmClock(...) details
203. Instances of a Class
204. General class structure
205. What's a class anyway?
206. Rectangle objects
207. A class describing rectangles
208. Rectangle class and instances
209. Generated diagrams
210. The new operator: Creating rectangle instances
211. Syntax creating instances
212. Assigning attribute values to class instances
213. Instance memory representation
214. References and null
215. Checking for object presence
216. Why packages ?
217. Rules and conventions
218. Fully qualified class name vs. import
219. Don't be too lazy!
220. Special: Classes in package java.lang
221. Class, package and file system
222. Source hierarchy view
223. Object methods
224. Scaling a rectangle
225. Scaling method implementation
226. Scaling method signature
227. Using the scale(...) method
228. Method definition syntax
229. A rectangle's perimeter
230. getPerimeter() method implementation
231. Using Rectangle.getPerimeter()
232. Access control: Overall objectives
233. Example: Implementing time and date
234. Access violation
235. Access rules
236. Tips on Choosing an Access Level
237. Direct access vs. setter method
238. Why adding setter methods?
239. Implementation by minutes only
240. Defining type signatures
241. Type signature examples
242. Defining method signatures
243. Method signature examples
244. Method overloading: Same name, different signature
245. Overloading, alternate names
246. No overloading in »C«
247. »C« requires unique function names
248. No distinction on return type
249. Method signatures rationale
250. Method signatures rationale
251. Example: System.out.print(...)
252. Creating and initializing rectangles
253. Defining a constructor
254. Constructor syntax
255. Constructors
256. Multiple overloaded constructors
257. Constructor calls within constructor
258. Instances by overloaded constructors
259. No constructor vs. default constructor
260. Non - default constructor, but no default constructor
261. Employee example package hierarchy
262. Circle and variable scopes
263. Documenting classes and methods
264. Generated Javadoc
265. Refactoring «r» ⇒ «radius»
266. Scope assignment problem
267. this overriding method scope
268. Club membership objectives
269. Implementing club members.
270. Showing membership info.
271. Implementing membership numbers.
272. Showing membership numbers.
273. Member creation steps
274. Accessing the club's overall member count?
275. Accessing the club's member count
276. Do we really require an instance?
277. static: Favour class method over instance method
278. Syntax accessing class members
279. static / non-static wrap up
280. Finally understanding System.out.print(ln)
281. Newton's letter to Robert Hooke
282. Project «lottery» depending on «helper»
283. Providing project «helper»
284. Install project «Helper»
285. helper-0.9.jar archive content
286. Consuming project «Lottery»
287. External libraries view
288. Using Helper.factorial(...) computing ( n k ) = n ! k ! ( n - k ) !
289. Maven artifact dependency.
290. Maven repositories
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. Hashing principle
406. Quickly identify by simple value
407. Hashing in Java and equals()
408. Rectangle equals(...) and hashCode()
409. Rectangle hash values
410. Better hashCode() method
411. Motivating Arrays
412. Per member repeating tasks
413. Example: int array of primes
414. Loop prime values
415. Mind the limit!
416. Safer: Using length
417. Even better: for-each style loop
418. Mind the limit, part two
419. One step initialization
420. Array
421. Two syntax variants
422. Array instances are special!
423. Array creation details
424. Array parameter passing
425. Parameter passing details
426. Value and reference types
427. Arrays.toString(...) and Arrays.sort(...)
428. Arrays.binarySearch(...)
429. Arrays.fill(...)
430. Arrays.copyOfRange(...)
431. Arrays.equals(...)
432. Lack of extendability
433. Extending an array
434. Extension result
435. Using Arrays.copyOf()
436. public static void main(String[] args)
437. Intellij IDEA run configuration
438. Intellij IDEA run configuration
439. Creating executable jar
440. Two-dimensional arrays
441. Behind the scenes
442. Memory allocation
443. Static array initialization
444. Static array initialization, variable lengths
445. Two Tic-tac-toe players fighting each other.
446. Two Tic-tac-toe players fighting each other.
447. Guess who's inheriting the money
448. Biology and inheritance
449. Duplicate code
450. Idea: Centralize common code
451. Common and specific properties
452. Basic shape inheritance
453. Inheritance
454. Implementing Shape hierarchy
455. Creating instances
456. Shape constructor
457. Creating Rectangle instances
458. Rectangle constructor
459. Shape.equals()
460. Rectangle.equals()
461. Shape log info
462. Overwriting toString()
463. Shape extending Object
464. Logging Rectangle instances
465. Override toString() again.
466. Rectangle extending Shape
467. Implementing Circle.toString()
468. Shape and toString()
469. Moving Shape instances
470. Implementing Shape movements
471. Fools are everywhere!
472. Solution: final prevents overriding
473. Calculating a shape's area
474. Desired: Polymorphic getArea() call
475. Problems:
476. abstract method getArea()
477. abstract method getArea()
478. What's a shape anyway?
479. No instances of abstract classes.
480. Mandatory getArea() implementation.
481. Facts about abstract fields, methods and classes.
482. Moving shapes
483. protected access
484. final classes
485. final classes rationale
486. Defeating polymorphism
487. Defining equals(...): Expectations
488. Defining equals(...) of Shape instances
489. Comparing center coordinates
490. Implementing Rectangle.equals()
491. Implementing Circle.equals()
492. Testing equality of Shape objects
493. Overriding Object.toString()
494. @Override: Easy compile time error detection
495. Compile- and runtime errors
496. NullPointerException (NPE for short)
497. NullPointerException is a class
498. Throwing an exception
499. Catching an exception by try {...} catch {...}
500. try {...} catch {...} syntax
501. Checked and unchecked exceptions
502. Checked and unchecked exceptions
503. Expected exceptions in Junit
504. Just finally, no catch
505. try-with-resources (Java™ 7)
506. Method printStackTrace()
507. Ascending inheritance ordering
508. Descending inheritance ordering
509. Implementing convert
510. Problem: Silent errors
511. Step 1: Find exception base class
512. Step 2: Derive CardinalException
513. Step 3: Throwing CardinalException
514. Step 4: Unit test throwing CardinalException
515. Stack of integer values
516. Java™ collection features
517. Behind the scenes
518. Boxing and unboxing
519. Boxing syntax comparison
520. Parsing Integer user input
521. Parsing binary representation
522. Standard parse methods
523. Excerpt from java.util.Locale
524. Locale properties
525. Get a NumberFormat instance
526. Create a custom formatter
527. Polymorphic number parsing
528. Limited float precision
529. Limited double precision
530. Using BigDecimal
531. BigDecimal features
532. Using static double random​()
533. Seeding a pseudo random generator
534. Interface examples
535. Observations
536. Writing strings to file
537. Using Text2File
538. Possible Text2File errors:
539. Employ try-with-resources
540. interface syntax
541. The AutoCloseable promise
542. abstract class replacement
543. interface vs. abstract class
544. interface MyAutoCloseable
545. Extending MyAutoCloseable to flush
546. Using MyFlushable
547. Inheritance hierarchy
548. Upcoming topics
549. Interfaces implemented by class String
550. The Comparable interface
551. class String and Comparable
552. Comparison examples
553. Ascending and descending names
554. API requirements
555. Sorting strings alphabetically
556. Situation dependent sorting criteria
557. Implementing flexible sorting
558. Comparator in action
559. Case insensitive sort
560. Sort descending by lambda expression
561. What's the use of hashing anyway?
562. Account hierarchy
563. Students and lecturers
564. An array of strings
565. An associative array describing month lengths
566. Grouping towns by country names
567. Personal examination cheat sheets
568. Unit tests in examinations
569. Example interface definition
570. Corresponding test
571. Don't cheat!
572. Unit tests strategy in examinations
573. Collaborative efforts
574. Project rules
575. Internal code documentation
576. Internal code documentation hints
577. Javadoc™ mismatches
578. (Automated) tests
579. Deployment and execution
580. Marking criteria
581. Sample forecast session
582. Sample forecast invocation
583. Underlying data provider
584. cities.list.json.gz providing cities
585. ma/Copy URL result to file
586. Parse city data
587. Parse weather data
588. Requirements
589. Logging
590. Minimalist token scanner
591. Scanner output -1.34 0.34 + sqrt
592. Adding error detection
593. Error message
594. Running the currency converter terminal application.
595. Steps creating a new project
596. Creating a project at MI gitlab
597. Cloning a git project
598. Enter project folder, add Readme.md
599. Committing change set
600. Push to upstream repository
601. Inserting a Maven project
602. git status 1
603. Adding Maven files to repository
604. git status 2
605. Commit Maven project files
606. git status 3
607. Push to upstream again
608. Reverting changes
609. Pull changes from upstream
610. Maven: Recommended reading
611. What is Maven anyway?
612. Maven: Facts and benefits
613. Convention Over Configuration
614. Maven project layout
615. The project object model file
616. pom.xml characteristics
617. pom.xml vs. Makefile
618. «Hello, world» pom.xml
619. Executing «compile» phase
620. Examining the Java™ version culprit
621. Resolving encoding / Java™ version issues
622. POM inheritance
623. The Super POM
624. pom-4.0.0.xml content
625. Favour https in ~/.m2/settings.xml
626. Resolving to effective pom.xml
627. Plugin architecture
628. Sample plugins
629. Example: The maven-javadoc-plugin
630. Adding test capabilities
631. Dependency listing
632. Absence of hamcrest in pom.xml
633. ~/.m2/repository/junit/junit/4.12/junit-4.12.pom
634. Transitive dependencies
635. Oblivious to test implementation: TestNG
636. Phases
637. Maven lifecyles and phases
638. hooking into phase
639. Why XML based publishing?
640. XML features
641. Editors, compositors, designers ...
642. Promises in publishing
643. Publishing reality
644. Single source publishing
645. Separating Structure, content and format
646. Separating concerns
647. Content
648. Hierarchical structure
649. Hierarchical structure, XML source
650. Presentation
651. Example 1: HTML 5, pure structure
652. Example 2: TeX / LaTeX
653. Separating structure and presentation(s)
654. Sample technical document
655. Observations
656. Pros and cons of TeX / LaTeX
657. Tools of the trade
658. Inline formatting
659. Paragraphs
660. Lists
661. Tables
662. Images
663. Mathematical formulas
664. Cross references
665. Document sectioning
666. Modular document components
667. What is Docbook?
668. Authoring and publishing
669. Document representation
670. Software centric schema
671. Document targets
672. Docbook components
673. Target format overview
674. Tooling / Software
675. Different schema languages
676. Plain HTML
677. Web help
678. Eclipse help
679. Printed output
680. Paragraph
681. Itemized list
682. Ordered list
683. Glossary list
684. Nested lists
685. Reference
686. A table
687. A MathML equation
688. A TeX equation
689. Reference
690. Figure
691. Image map + calloutlist
692. Video
693. A warning
694. Reference
695. Recursive sections
696. Non-recursive sections
697. Two different link flavours
698. Choosing a top level element
699. Allowed 5.1 top level elements
700. Schematron on top of RelaxNG
701. Example: xml:id and permalink
702. Using Display #Anchors
703. Considerations author based permalink
704. Schematron permalink rule
705. HTML customization overview
706. Target specific configuration
707. Link stability
708. use.id.as.filename = 1
709. Parameter: use.id.as.filename
710. Customization parameter ulink.target
711. callout.unicode / callout.graphics
712. Links
713. Hooking into XSL
714. Categories
715. Example: videos
716. Links
717. Customize by CSS
718. Example CSS modifications
719. Styling the editor
720. Motivating modular documents
721. Monolithic document problems
722. Document decomposition
723. A monolithic document
724. Decomposing documents
725. XML grammar defining languages
726. Address list schema
727. Format conversion problem
728. XSL template rules
729. Example: Formatting <title> elements
730. Basic FO introduction
731. XMLMind Editor
732. Oxygenxml Author
733. Vendor links
734. Inverse editing
735. Document representation
736. Components
737. BibTeX
738. Makeindex example
739. Makeindex work flow
740. Extension example: MusiXTeX
741. Flavours
742. Components
743. Editors
744. Principle
745. Codingbat: Desired features
746. Desired features
747. Example BiBTeX data
748. BiBTeX: Tasks
749. CRUD operation
750. Query
751. Schema
752. Procedures / triggers
753. Transactions / recovery
754. Data access control
755. API support
756. Installing Docker
757. Why LDAP?
758. LDAP introduction
759. Running a Docker container
760. Using docker-compose
761. Installing Apache Directory Studio
762. Administrator access to your DIT
763. Administrator access to your server's data tree
764. Administrator access to your server's configuration
765. Terminology
766. Adding an entry
767. Adding a new attribute
768. Replacing an attribute value
769. Deleting an attribute entirely
770. Multi valued attributes
771. Set semantics of multivalued attributes
772. Deleting selected attribute values
773. Query scope
774. Query filter
775. Schema support
776. Implementations
777. Implementations
778. Exercises
779. Why MongoDB?
780. Running a Docker container
781. Using docker-compose
782. Manual user creation (mongo-init.js fail)
783. Log in as user explorer
784. Using IntelliJ
785. Idea show all databases
786. Terminology / Hierarchy
787. Adding a document
788. Updating attributes
789. Deleting a document
790. Deleting multiple documents
791. Multi valued attributes
792. Set semantics of multivalued attributes
793. Deleting selected attribute values
794. Deleting an attribute
795. Query filter
796. Schema validation support
797. Violating required field
798. Schema types
799. Enforcing unique keys
800. On the downside
801. Implementations
802. Implementations
803. Sharding rationale
804. Sharding rationale
805. Exercises
806. Prerequisite knowledge
807. Persistence [Bauer2015]
808. Java™ transient instances
809. RDBMS persistent records
810. Persisting transient User instances
811. Observations
812. Networking between clients and database server
813. JDBC™ features
814. JDBC™ in a three-tier application
815. JDBC™ connecting application server and database.
816. JDBC™ connection parameter
817. Components of a JDBC™ URL
818. IETF Uniform Resource Identifier
819. URL examples
820. Sub protocol examples
821. No standard port assignments ...
822. ... but Postgresql made it into Linux
823. JDBC™ architecture
824. DriverManager: Bootstrapping connections
825. Example: Mysql connection implementation
826. Driver libraries
827. Driver libraries by Maven
828. Driver unavailable
829. Connection interface
830. Statement interface
831. JDBC™ instances and relationships.
832. Important Connection methods
833. Important Statement methods
834. JDBC™ and threading.
835. JDBC™ connection pooling
836. pom.xml driver runtime scope
837. Person table
838. Objective: insert person record
839. JDBC™ backed data insert
840. Result
841. Two JDBC™ configurations
842. Figure 839, “JDBC™ backed data insert ” deficiencies
843. Why properties?
844. message.properties string externalization
845. Properties code sketch
846. Intellij IDEA settings, preconditions
847. Database related unit test phases
848. Implementing unit tests
849. Spring is your friend
850. Project layout
851. Closing connections
852. Employ AutoCloseable
853. Sniffing a JDBC™ connection by an intruder.
854. Setting up Wireshark
855. Capturing results
856. Mysql™ security
857. Mysql™ security
858. Assembling SQL
859. SQL injection principle
860. Preventing traffic tickets
861. Trouble at school
862. SQL injection impact
863. SQL injection relevance, [Clarke2009]
864. Handling injection attacks, part 1
865. Handling injection attacks, part 2
866. Input filtering
867. Validating user input prior to dynamically composing SQL statements.
868. Error message being presented to the user.
869. SQL statements in Java™ applications get parsed at the database server
870. Two questions
871. Addressing performance
872. Addressing performance mitigation
873. Restating the SQL injection problem
874. Solution: Use java.sql.PreparedStatement
875. PreparedStatement principle.
876. Three phases using parameterized queries
877. PreparedStatement example
878. Injection attempt example
879. Limitation: No dynamic table support!
880. JDBC™ read and write
881. Server / client object's life cycle
882. JDBC™ record container
883. Reading data from a database server.
884. Names and birth dates of friends
885. Accessing friend's database records
886. Important ResultSet states
887. JDBC™ to Java™ type conversions
888. Java™ to JDBC™ type conversions
889. Error prone type accessors!
890. Polymorphic accessor
891. Access by column name
892. Access by column index
893. Problem: null value ambiguity
894. Resolving null value ambiguity
895. Users and groups
896. Isolation level
897. JDBC™ Isolation level
898. Setting the isolation level
899. Reasons for using Maven
900. Transitive dependencies
901. A basic persistence.xml JPA configuration file.
902. JPA persistence provider
903. Mapping hibintro.v1.model.User instances to a database.
904. A basic User class.
905. Mapping properties to attributes.
906. Annotating integrity constraints
907. Database schema mapping instances of hibintro.v1.model.User.
908. Loading a single object by a primary key value.
909. Retrieving hibintro.v1.model.User instances by HQL.
910. Business rules for projects
911. Persistence related object states
912. Introducing inheritance mapping
913. Modelling payment.
914. A single relation mapping.
915. Mapping the inheritance hierarchy.
916. Inserting payment information
917. Figure subclasses
918. Joined subclass mapping.
919. Implementing Object.equals(Object) by natural keys
920. JPA caches.
921. Shell / Bash
922. Secure Shell
923. Working with files
924. Gathering network related information
925. Handle processes
926. vim text editor introduction
927. Creating a ssh public/private key pair
928. Configuration file permissions on windows network file systems
929. Resulting permissions and configuration test
930. Suggested readings:
931. .deb packages
932. The dpkg command
933. The apt command
934. Rationale using PPA's
935. Result of ssh-keygen execution
936. Extended ACLs, ways too open
937. Revoking permissions using setfacl
938. Corrected permissions
939. Logging in
940. Documentation links
941. DNS query commands
942. DNS forward lookup
943. Display A-record result only
944. Important record types
945. Name Servers: Query type NS
946. Recommended readings
947. Openldap server documentation
948. What is LDAP anyway?
949. LDAP Server cli bind
950. Document Information Tree (DIT)
951. Relative and absolute DNs
952. User example
953. objectClass
954. objectClass clarifications
955. Augmenting inetOrgPerson by posixAccount
956. Structural objectClass definitions
957. Search scopes
958. Predicate based queries
959. LDAP bind types
960. LDIF exchange format
961. LDIF sample
962. OpenLdap server architecture
963. An example LDAP Tree
964. External documentation
965. URI to filesystem mapping
966. Virtual hosting
967. Implementing virtual hosting
968. IP based virtual hosting
969. IP based, pros / cons
970. Name based virtual hosting
971. Name based, pros / cons
972. LDAP backed authentication
973. PHP FPM server
974. File services
975. Customer demands
976. Driving factors
977. Selected cloud file services
978. Selected self hosting products
979. Nextcloud features
980. Lightning integration
981. Installation
982. Docker hub
983. Search images
984. Pull image using CLI
985. Pull Nextcloud image
986. Nextcloud based on Alpine
987. Inspect image
988. Search an image's tags
989. Nextcloud image by version
990. List images by CLI
991. Nextcloud latest image
992. Duplicate Nextcloud images
993. Maven ringing a bell?
994. Un tag image by version
995. Remove image by version
996. Starting Nextcloud container
997. List running containers
998. Enter running container
999. Remove container
1000. List volumes
1001. List orphaned volumes
1002. Remove volumes