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