Lecture notes

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
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
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 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
Representing and editing BiBTeX data
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
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
Filter based search
Extending an existing entry
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. Prefix and postfix notation
153. Operator examples
154. Java™ comment flavors
155. Inline comments
156. Javadoc™ comments
157. Statements: General syntax
158. Statement examples: Declaring and assigning variables
159. Expression vs. statement
160. Multiple statements per line
161. Debugging multiple statements per line
162. Blocks
163. Conditional block execution
164. if syntax
165. if ... else
166. if ... else syntax
167. Best practices comparing for equality
168. Single statement branches
169. Aside: Corporate network security
170. Online banking
171. DNS Spoofing
172. Turn DNS name into IP address
173. SSL Certificate error
174. The Apple goto fail SSL bug
175. Static code analysis
176. Nested if ... else
177. Enhanced readability: if ... else if ... else
178. if ... else if ... else syntax
179. User input recipe
180. Using a Scanner class collecting user input.
181. Converting numbers to day's names
182. Numbers to day's names: The hard way
183. Better: Using switch
184. switch Syntax
185. Switching on strings
186. Why loops?
187. Arbitrary number of repetitions
188. A while loop
189. Combining increment and termination condition
190. while syntax
191. Empty while body
192. A do ... while loop
193. do ... while syntax
194. Frequent usage of while
195. Replacing while by for
196. for syntax
197. for variable scope
198. for variable scope equivalence
199. for vs. while relationship
200. Nested loops
201. Better readability: Use row and column in favour of i and j
202. Calculating values
203. Response to coding errors
204. Unit test concept
205. alarmClock(...) with errors
206. Testing alarmClock(...)
207. Testing alarmClock(...) details
208. Instances of a Class
209. General class structure
210. What's a class anyway?
211. Rectangle objects
212. A class describing rectangles
213. Rectangle class and instances
214. Generated diagrams
215. The new operator: Creating rectangle instances
216. Syntax creating instances
217. Assigning attribute values to class instances
218. Instance memory representation
219. References and null
220. Checking for object presence
221. Why packages ?
222. Rules and conventions
223. Fully qualified class name vs. import
224. Don't be too lazy!
225. Special: Classes in package java.lang
226. Class, package and file system
227. Source hierarchy view
228. Object methods
229. Scaling a rectangle
230. Scaling method implementation
231. Scaling method signature
232. Using the scale(...) method
233. Method definition syntax
234. A rectangle's perimeter
235. getPerimeter() method implementation
236. Using Rectangle.getPerimeter()
237. Access control: Overall objectives
238. Example: Implementing time and date
239. Access violation
240. Access rules
241. Tips on Choosing an Access Level
242. Direct access vs. setter method
243. Why adding setter methods?
244. Implementation by minutes only
245. Defining type signatures
246. Type signature examples
247. Defining method signatures
248. Method signature examples
249. Method overloading: Same name, different signature
250. Overloading, alternate names
251. No such concept in C
252. What about return type?
253. Method signatures rationale
254. Method signatures rationale
255. Example: System.out.print(...)
256. Creating and initializing rectangles
257. Defining a constructor
258. Constructor syntax
259. Constructors
260. Multiple overloaded constructors
261. Constructor calls within constructor
262. Instances by overloaded constructors
263. No constructor vs. default constructor
264. Non - default constructor, but no default constructor
265. Employee example package hierarchy
266. Circle and variable scopes
267. Documenting classes and methods
268. Generated Javadoc
269. Refactoring «r» ⇒ «radius»
270. Scope assignment problem
271. this overriding method scope
272. Club membership objectives
273. Implementing club members.
274. Showing membership info.
275. Implementing membership numbers.
276. Showing membership numbers.
277. Member creation steps
278. Accessing the club's overall member count?
279. Accessing the club's member count
280. Do we really require an instance?
281. static: Favour class method over instance method
282. Syntax accessing class members
283. static / non-static wrap up
284. Finally understanding System.out.print(ln)
285. Newton's letter to Robert Hooke
286. Project «lottery» depending on «helper»
287. Providing project «helper»
288. Install project «Helper»
289. helper-0.9.jar archive content
290. Consuming project «Lottery»
291. External libraries view
292. Using Helper.factorial(...) computing ( n k ) = n ! k ! ( n - k ) !
293. Maven artifact dependency.
294. Maven repositories
295. Pascal's triangle representing binomial coefficients.
296. An implementation sketch for the exponential
297. Comparing exponential and approximation
298. Comparing sin(x) and its approximation.
299. Recommended reading
300. Test categories
301. Example: Computing prime numbers
302. Unit test principle
303. Test driven development
304. Steps in Unit Testing
305. Step 1 + 2: Specify method, write skeleton
306. Execution yet being flawed
307. Sample test data
308. Step 3: Junit based specification test
309. Junit skeleton test result (Maven CLI)
310. Junit skeleton test result (IDE)
311. Step 3: Providing more prime tests
312. Step 3: Prime mass testing
313. Step 4: Implement skeleton
314. Step 5: Testing our first implementation
315. Implementation observation
316. Changing the implementation
317. Regression test
318. Systematic error debugging
319. Error correction in detail
320. Available comparison methods
321. Caution comparing float / double !!
322. Weird arithmetics?
323. Limited representation precision
324. Solving the issue
325. The @Test annotation
326. The Assert class
327. Importing dependencies
328. Dependency archive content
329. Value vs. reference type variables
330. Different behaviour!
331. Value variable Details
332. Reference variable Details
333. Only «call-by-value» in Java
334. «call-by-value» details
335. «call-by-reference» for objects?
336. «call-by-reference» details
337. No «call-by-reference» in Java™!
338. No «call-by-reference» details
339. C++ offers «call-by-reference» by virtue of &
340. C++ «call-by-reference» details
341. Method calling
342. Three variable scopes
343. Scope lifetimes
344. Two runtime memory categories
345. Stack: Four operations
346. Example: Storing integer values
347. Method calling
348. Call stack trace
349. IDE debugger
350. Motivation
351. Weekly offered lectures
352. Weekly offered lectures by simple numbers
353. Weekdays int representation
354. Weekly offered lectures using constants
355. Converting index values to day names
356. Providing lecture info
357. Sample lectures
358. Bogus index value
359. Pitfall: Method argument order mismatch
360. Enumeration by class instances
361. Class instance per enumeration value
362. switch no longer works
363. Re-writing getPrice()
364. Compile time argument mismatch error
365. Pitfall: Creating an undesired instance
366. Define a private Day constructor
367. Preventing undesired Day instance creation
368. Adding a day name attribute
369. enum Day replacing public class Day
370. switch statements working again
371. enum constructor being implicitly private
372. From https://www.urbandictionary.com
373. Useful links
374. Initialize git project
375. Configure author related data.
376. Adding resources to project index and staging area
377. Committing change set
378. Project versioning status
379. Adding a comment
380. git diff tracing changes
381. Reverting individual file.
382. Compiling, Math.class and Print.class.
383. Math.class, Print.class and versioning.
384. Show project's log
385. Switch to an older revision ...
386. ... and forth to current master's HEAD
387. Centralized remote repository
388. Step 1: Create remote repository
389. Step 2: Retrieve remote repository address
390. Step 2: Connect to remote repository
391. Step 3: Push local to remote
392. Step 3: Pull remote to local
393. Alternative: Create remote, then clone
394. Conflicting changes
395. Commit schedule
396. User B: git push fails
397. User B: git pull fails as well
398. Merge conflict details
399. Struggling for resolution
400. Merging Print.java manually
401. Commit and push merge
402. Superclass Object
403. String literals
404. OpenJDK String implementation
405. String copy constructor
406. Copy constructor and heap
407. Operator == and equals()
408. Remarks == vs. equals()
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. Motivating Arrays
416. Per member repeating tasks
417. Example: int array of primes
418. Loop prime values
419. Mind the limit!
420. Safer: Using length
421. Even better: for-each style loop
422. Mind the limit, part two
423. 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. Shape log info
466. Overwriting toString()
467. Shape extending Object
468. Logging Rectangle instances
469. Override toString() again.
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. Method printStackTrace()
511. Ascending inheritance ordering
512. Descending inheritance ordering
513. Implementing convert
514. Problem: Silent errors
515. Step 1: Find exception base class
516. Step 2: Derive CardinalException
517. Step 3: Throwing CardinalException
518. Step 4: Unit test throwing CardinalException
519. Stack of integer values
520. Java™ collection features
521. Behind the scenes
522. Boxing and unboxing
523. Boxing syntax comparison
524. Parsing Integer user input
525. Parsing binary representation
526. Standard parse methods
527. Excerpt from java.util.Locale
528. Locale properties
529. Get a NumberFormat instance
530. Create a custom formatter
531. Polymorphic number parsing
532. Limited float precision
533. Limited double precision
534. Using BigDecimal
535. BigDecimal features
536. Using static double random​()
537. Seeding a pseudo random generator
538. Interface examples
539. Observations
540. Writing strings to file
541. Using Text2File
542. Possible Text2File errors:
543. Employ try-with-resources
544. interface syntax
545. The AutoCloseable promise
546. abstract class replacement
547. interface vs. abstract class
548. interface MyAutoCloseable
549. Extending MyAutoCloseable to flush
550. Using MyFlushable
551. Inheritance hierarchy
552. Upcoming topics
553. Interfaces implemented by class String
554. The Comparable interface
555. class String and Comparable
556. Comparison examples
557. Ascending and descending names
558. API requirements
559. Sorting strings alphabetically
560. Situation dependent sorting criteria
561. Implementing flexible sorting
562. Comparator in action
563. Case insensitive sort
564. Sort descending by lambda expression
565. What's the use of hashing anyway?
566. Account hierarchy
567. Students and lecturers
568. An array of strings
569. An associative array describing month lengths
570. Grouping towns by country names
571. Personal examination cheat sheets
572. Unit tests in examinations
573. Example interface definition
574. Corresponding test
575. Don't cheat!
576. Unit tests strategy in examinations
577. Collaborative efforts
578. Project rules
579. Internal code documentation
580. Internal code documentation hints
581. Javadoc™ mismatches
582. (Automated) tests
583. Deployment and execution
584. Marking criteria
585. Sample forecast session
586. Sample forecast invocation
587. Underlying data provider
588. cities.list.json.gz providing cities
589. ma/Copy URL result to file
590. Parse city data
591. Parse weather data
592. Requirements
593. Logging
594. Minimalist token scanner
595. Scanner output -1.34 0.34 + sqrt
596. Adding error detection
597. Error message
598. Running the currency converter terminal application.
599. Steps creating a new project
600. Creating a project at MI gitlab
601. Cloning a git project
602. Enter project folder, add Readme.md
603. Committing change set
604. Push to upstream repository
605. Inserting a Maven project
606. git status 1
607. Adding Maven files to repository
608. git status 2
609. Commit Maven project files
610. git status 3
611. Push to upstream again
612. Reverting changes
613. Pull changes from upstream
614. Maven: Recommended reading
615. What is Maven anyway?
616. Maven: Facts and benefits
617. Convention Over Configuration
618. Maven project layout
619. The project object model file
620. pom.xml characteristics
621. pom.xml vs. Makefile
622. «Hello, world» pom.xml
623. Executing «compile» phase
624. Examining the Java™ version culprit
625. Resolving encoding / Java™ version issues
626. POM inheritance
627. The Super POM
628. pom-4.0.0.xml content
629. Favour https in ~/.m2/settings.xml
630. Resolving to effective pom.xml
631. Plugin architecture
632. Sample plugins
633. Example: The maven-javadoc-plugin
634. Adding test capabilities
635. Dependency listing
636. Absence of hamcrest in pom.xml
637. ~/.m2/repository/junit/junit/4.12/junit-4.12.pom
638. Transitive dependencies
639. Oblivious to test implementation: TestNG
640. Phases
641. Maven lifecyles and phases
642. hooking into phase
643. Why XML based publishing?
644. XML features
645. Editors, compositors, designers ...
646. Promises in publishing
647. Publishing reality
648. Single source publishing
649. Separating Structure, content and format
650. Separating concerns
651. Content
652. Hierarchical structure
653. Hierarchical structure, XML source
654. Presentation
655. Example 1: HTML 5, pure structure
656. Example 2: TeX / LaTeX
657. Separating structure and presentation(s)
658. Sample technical document
659. Observations
660. Pros and cons of TeX / LaTeX
661. Tools of the trade
662. Inline formatting
663. Paragraphs
664. Lists
665. Tables
666. Images
667. Mathematical formulas
668. Cross references
669. Document sectioning
670. Modular document components
671. What is Docbook?
672. Authoring and publishing
673. Document representation
674. Software centric schema
675. Document targets
676. Docbook components
677. Target format overview
678. Tooling / Software
679. Different schema languages
680. Plain HTML
681. Web help
682. Eclipse help
683. Printed output
684. Paragraph
685. Itemized list
686. Ordered list
687. Glossary list
688. Nested lists
689. Reference
690. A table
691. A MathML equation
692. A TeX equation
693. Reference
694. Figure
695. Image map + calloutlist
696. Video
697. A warning
698. Reference
699. Recursive sections
700. Non-recursive sections
701. Two different link flavours
702. Choosing a top level element
703. Allowed 5.1 top level elements
704. Schematron on top of RelaxNG
705. Example: xml:id and permalink
706. Using Display #Anchors
707. Considerations author based permalink
708. Schematron permalink rule
709. HTML customization overview
710. Target specific configuration
711. Link stability
712. use.id.as.filename = 1
713. Parameter: use.id.as.filename
714. Customization parameter ulink.target
715. callout.unicode / callout.graphics
716. Links
717. Hooking into XSL
718. Categories
719. Example: videos
720. Links
721. Customize by CSS
722. Example CSS modifications
723. Styling the editor
724. Motivating modular documents
725. Monolithic document problems
726. Document decomposition
727. A monolithic document
728. Decomposing documents
729. XML grammar defining languages
730. Address list schema
731. Format conversion problem
732. XSL template rules
733. Example: Formatting <title> elements
734. Basic FO introduction
735. XMLMind Editor
736. Oxygenxml Author
737. Vendor links
738. Inverse editing
739. Document representation
740. Components
741. BibTeX
742. Makeindex example
743. Makeindex work flow
744. Extension example: MusiXTeX
745. Flavours
746. Components
747. Editors
748. Example BiBTeX data
749. BiBTeX: Tasks
750. Codingbat: Desired features
751. Desired features
752. CRUD operation
753. Query
754. Schema
755. Procedures / triggers
756. Transactions / recovery
757. Data access control
758. API support
759. Installing Docker
760. Why LDAP?
761. LDAP introduction
762. Running a Docker container
763. Using docker-compose
764. Installing Apache Directory Studio
765. Administrator access to your DIT
766. Administrator access to your server's data tree
767. Administrator access to your server's configuration
768. Terminology
769. Adding an entry
770. Adding a new attribute
771. Replacing an attribute value
772. Deleting an attribute entirely
773. Multi valued attributes
774. Set semantics of multivalued attributes
775. Deleting selected attribute values
776. Query scope
777. Query filter
778. Schema support
779. Implementations
780. Implementations
781. Exercises
782. Why MongoDB?
783. Running a Docker container
784. Using docker-compose
785. Manual user creation (mongo-init.js fail)
786. Log in as user explorer
787. Using IntelliJ
788. Idea show all databases
789. Terminology / Hierarchy
790. Adding a document
791. Updating attributes
792. Deleting a document
793. Deleting multiple documents
794. Multi valued attributes
795. Set semantics of multivalued attributes
796. Deleting selected attribute values
797. Deleting an attribute
798. Query filter
799. Schema validation support
800. Violating required field
801. Schema types
802. Enforcing unique keys
803. On the downside
804. Implementations
805. Implementations
806. Sharding rationale
807. Sharding rationale
808. Exercises
809. Prerequisite knowledge
810. Persistence [Bauer2015]
811. Java™ transient instances
812. RDBMS persistent records
813. Persisting transient User instances
814. Observations
815. Networking between clients and database server
816. JDBC™ features
817. JDBC™ in a three-tier application
818. JDBC™ connecting application server and database.
819. JDBC™ connection parameter
820. Components of a JDBC™ URL
821. IETF Uniform Resource Identifier
822. URL examples
823. Sub protocol examples
824. No standard port assignments ...
825. ... but Postgresql made it into Linux
826. JDBC™ architecture
827. DriverManager: Bootstrapping connections
828. Example: Mysql connection implementation
829. Driver libraries
830. Driver libraries by Maven
831. Driver unavailable
832. Connection interface
833. Statement interface
834. JDBC™ instances and relationships.
835. Important Connection methods
836. Important Statement methods
837. JDBC™ and threading.
838. JDBC™ connection pooling
839. pom.xml driver runtime scope
840. Person table
841. Objective: insert person record
842. JDBC™ backed data insert
843. Result
844. Two JDBC™ configurations
845. Figure 842, “JDBC™ backed data insert ” deficiencies
846. Why properties?
847. message.properties string externalization
848. Properties code sketch
849. Intellij IDEA settings, preconditions
850. Database related unit test phases
851. Implementing unit tests
852. Spring is your friend
853. Project layout
854. Closing connections
855. Employ AutoCloseable
856. Sniffing a JDBC™ connection by an intruder.
857. Setting up Wireshark
858. Capturing results
859. Mysql™ security
860. Mysql™ security
861. Assembling SQL
862. SQL injection principle
863. Preventing traffic tickets
864. Trouble at school
865. SQL injection impact
866. SQL injection relevance, [Clarke2009]
867. Handling injection attacks, part 1
868. Handling injection attacks, part 2
869. Input filtering
870. Validating user input prior to dynamically composing SQL statements.
871. Error message being presented to the user.
872. SQL statements in Java™ applications get parsed at the database server
873. Two questions
874. Addressing performance
875. Addressing performance mitigation
876. Restating the SQL injection problem
877. Solution: Use java.sql.PreparedStatement
878. PreparedStatement principle.
879. Three phases using parameterized queries
880. PreparedStatement example
881. Injection attempt example
882. Limitation: No dynamic table support!
883. JDBC™ read and write
884. Server / client object's life cycle
885. JDBC™ record container
886. Reading data from a database server.
887. Names and birth dates of friends
888. Accessing friend's database records
889. Important ResultSet states
890. JDBC™ to Java™ type conversions
891. Java™ to JDBC™ type conversions
892. Error prone type accessors!
893. Polymorphic accessor
894. Access by column name
895. Access by column index
896. Problem: null value ambiguity
897. Resolving null value ambiguity
898. Users and groups
899. Isolation level
900. JDBC™ Isolation level
901. Setting the isolation level
902. Reasons for using Maven
903. Transitive dependencies
904. A basic persistence.xml JPA configuration file.
905. JPA persistence provider
906. Mapping hibintro.v1.model.User instances to a database.
907. A basic User class.
908. Mapping properties to attributes.
909. Annotating integrity constraints
910. Database schema mapping instances of hibintro.v1.model.User.
911. Loading a single object by a primary key value.
912. Retrieving hibintro.v1.model.User instances by HQL.
913. Business rules for projects
914. Persistence related object states
915. Introducing inheritance mapping
916. Modelling payment.
917. A single relation mapping.
918. Mapping the inheritance hierarchy.
919. Inserting payment information
920. Figure subclasses
921. Joined subclass mapping.
922. Implementing Object.equals(Object) by natural keys
923. JPA caches.
924. Shell / Bash
925. Secure Shell
926. Working with files
927. Gathering network related information
928. Handle processes
929. vim text editor introduction
930. Creating a ssh public/private key pair
931. Configuration file permissions on windows network file systems
932. Resulting permissions and configuration test
933. Suggested readings:
934. .deb packages
935. The dpkg command
936. The apt command
937. Rationale using PPA's
938. Result of ssh-keygen execution
939. Extended ACLs, ways too open
940. Revoking permissions using setfacl
941. Corrected permissions
942. Logging in
943. Documentation links
944. DNS query commands
945. DNS forward lookup
946. Display A-record result only
947. Important record types
948. Name Servers: Query type NS
949. Recommended readings
950. Openldap server documentation
951. What is LDAP anyway?
952. LDAP Server cli bind
953. Document Information Tree (DIT)
954. Relative and absolute DNs
955. User example
956. objectClass
957. objectClass clarifications
958. Augmenting inetOrgPerson by posixAccount
959. Structural objectClass definitions
960. Search scopes
961. Predicate based queries
962. LDAP bind types
963. LDIF exchange format
964. LDIF sample
965. OpenLdap server architecture
966. An example LDAP Tree
967. External documentation
968. URI to filesystem mapping
969. Virtual hosting
970. Implementing virtual hosting
971. IP based virtual hosting
972. IP based, pros / cons
973. Name based virtual hosting
974. Name based, pros / cons
975. LDAP backed authentication
976. PHP FPM server
977. File services
978. Customer demands
979. Driving factors
980. Selected cloud file services
981. Selected self hosting products
982. Nextcloud features
983. Lightning integration
984. Installation
985. Docker hub
986. Search images
987. Pull image using CLI
988. Pull Nextcloud image
989. Nextcloud based on Alpine
990. Inspect image
991. Search an image's tags
992. Nextcloud image by version
993. List images by CLI
994. Nextcloud latest image
995. Duplicate Nextcloud images
996. Maven ringing a bell?
997. Un tag image by version
998. Remove image by version
999. Starting Nextcloud container
1000. List running containers
1001. Enter running container
1002. Remove container
1003. List volumes
1004. List orphaned volumes
1005. Remove volumes