# Ribomation
> Lärarledda kurser i programspråk, ramverk och utvecklingsverktyg för
> redan yrkesverksamma programmerare. Kurserna ges på svenska, både som
> fjärrkurser via Zoom och som företagsanpassade kurser på plats hos kund.
> Kursmaterialet är på engelska.
Ribomation drivs av Jens Riboe, senior mjukvaruutvecklare med över 40 års
erfarenhet. Företaget har funnits sedan 2009 och specialiserar sig på
kurser i C, C++, Java, JavaScript, webbramverk (Vue, Angular) och
DevOps-verktyg (Docker, CMake, Git, Jenkins).
## Kurser
### Angular grundkurs
Nivå: beginner | Målgrupp: Web-Apps programmerare | Förkunskaper: God erfarenhet av att programmera i JavaScript och HTML/CSS
https://www.ribomation.se/programmerings-kurser/angular/
Angular har på kort tid blivit industri-standard för att bygga moderna webbapplikationer baserade på
principen om single-page application (SPA). Denna kurs lär dig allt du behöver veta för att snabbt
komma igång och bygga moderna webbapplikationer med hjälp av Angular.
Angular har på kort tid blivit industri-standard för att bygga moderna webbapplikationer baserade på principen om
single-page application (SPA). Detta innebär att browsern laddar en enstaka HTML fil, som i sin tur laddar JavaScript
kod och CSS style-sheets. Alla logiska webbsidor byggs upp av JS funktioner, HTML template snippets och renderas med CSS
stylesheets.
Denna kurs lär dig allt du behöver veta för att snabbt komma igång och bygga moderna webbapplikationer med hjälp av
Angular.
- Generation of project files and artifacts using ng-cli
- Design of Angular components, with models and views
- The use of pipes to format data in HTML fragments
- The use of ng directives to manipulate DOM in an HTML snippet
- Design service classes to encapsulate business logic
- Be able to implement calls to REST-WS background services
- Building apps with many pages, using ng-router
- Generate a server-side rendered app with Angular Universal
#### Background and Overview
* Why Angular.js were created
* Misko Hevery
* Why Angular 2 was redesigned from the ground-up
* What happened to Angular version 3
* Angular version 6 and forward
### Preparation
In this section we are laying the ground and establishing a baseline for the remaining of the course.
#### What is an SPA?
- Classic web MPA architecture
- Browser DOM model
- What is AJAX?
- XMLHttpRequest vs. Fetch
- Hybrid web MPA architecture
- SPA architecture
- SPA components
- Deployment architecture for SPA
#### Using Node.js, NPM & NPX
- Installation of Node.js
- What is NPM?
- Installing a local package using NPM
- Installing a remote package using NPM
- Application vs. development dependencies
- Global NPM modules
- Command-line Node.js apps
- Understanding the merits of NPX
- Beware of the storage size of `node_modules/`
- Alternatives to NPM, `pnpm` and `yarn`
- What is a transpiler?
- What is pre-processing?
- What is post-processing?
- What is bundling?
- Typical operations of a bundler
#### Modern ES & TypeScript
* What is TypeScript
* Anders Hejlsberg
* Relation to JS, ES5, ES6
* Understanding the type support in TS
* Installation of TypeScript
* Modules
* Scalar type types
* Composite data types
* ES6 Lambda expressions
* Functions
* Classes and member variables and functions
* Visibility and accessor methods
* Static members
* Interfaces
* Generic classes
### Kick-Start
In this section are we creating a complete Angular app step-by-step, which will serve as a base
for understanding for the remaining of the course
#### Using the ng CLI
* Understanding the ng client
* Installing the Angular (ng) CLI
* Command syntax
* Command overview
* Showing help
* Documentation at `angular.io/cli`
* Creating a new project
* Project directory structure
* Bootstrap files
* Generating components and other artefacts
#### Your 1st ng App
* Overall instructions
* Generate a new project, using NPX
* Edit the `scripts` section of `package.json`
* Interface Product
* Product service
* Edit `app.component.*`
* Generate pages, using NPX
* Edit `welcome.page.*`
* Creating a navbar widget
* Shopping basket service and common state
* Edit `product.page.*`
* Creating a shopping basket widget
* Edit `shopping-basket.page.*`
### Angular Basics
Discussion of the most essential parts of Angular.
#### Modules
* TypeScript modules vs Angular modules
* The root module and its purpose
* ngModule annotation attributes
* Module dependencies
* Entry components and what they are used for
* Bootstrap components
#### Template Syntax
* HTML attributes vs DOM properties
* Understanding the DOM
* Interpolation with handlebar expressions
* Using the null-catch operator
* Template reference variables
#### Pipes
* What is an Angular pipe
* Use the json pipe for debugging
* Various text transformation
* Formatting numbers
* Formatting dates
* User-defined pipes
* Implementing the train-case pipe
#### Directives
* What is an Angular directive
* Understanding the ng attribute syntax
* Setting CSS classing with `[ngClass]`
* Setting CSS styles with `[ngStyle]`
* Usage of <`ng-container>`
* Usage of <`ng-template>`
* Parameterized <`ng-template>`
* Conditional inclusion with `*ngIf`
* Using template-snippets with *ngIf
* Conditional inclusion with `[ngSwitch]`
* Repeating elements with `*ngFor`
* Support variables to *ngFor
* What do the ‘`*`’ prefix mean
* User-defined directives
#### Services
* What is a service?
* Understanding dependency injection in Angular
* Service definition
* Generating a service
* Service usage, aka injection
* What is a provider
* Swapping service implementations
* Using constant value services
* Using a service factory
* Injecting a constant value service
#### Component I/O
- DOM property input `[prop]="..."`
- Defining inputs in a widget
- DOM event output `(event)="..."`
- Definng output emitters in a widget
- How to create two-way binding `[(xyz)]`
- Binding syntax summary
#### Components
- Usage of components
- Component categories
- Why you should differentiate based on categories
- Setting the category type, when generating a ng component
- Component architecture and data-flow
- Component attributes
- Life-cycle call-backs
- Member variable annotations
- Implementing nested components
- Generating lazy-loaded page modules
### Angular Intermediate
Discussion of slightly more complex parts of Angular
#### RxJS
* What is RxJS?
* Installation of RxJS
* The anatomy of a rx stream
* Filtering and transformation
* Creating an event source
* Temporal events
* Rx feed creator functions
* Rx filters
* Rx transformers
* Rx subject
* Using rx as a message bus
* Converting a Rx stream into a promise
* How to wait for two or more rx streams
* Replacing errors
* Subscription in Angular
* The ng async pipe
#### HttpClient
- Overview of the HttpClient service
- HTTP operations
- Single value rx observables
- Response handling
- Request headers
- Request query parameters
- Data interface
- Dealing with errors
#### Basic Routing
- What is routing?
- Mapping route path to component
- Injecting a routed page component into a template
- Navigation in template
- Programmatic navigation
- Redirection
- Default route
- Handling undefined routes
- Using a CSS class to indicate the current route
- Updating the page title
- Updating HTML meta data
- Static route data
- Router events
#### Parameterized Routes
- Defining route parameters
- How to respond to a chosen route parameter value
- Navigating to a stand-alone page, using a route parameter
- Dealing with query parameters
#### Child Routes
- What is a child route ?
- Route definitions
- Embedded page components
- Navigating to an embedded page components
#### Route Guards
- What is a route guards?
- Guard result variations
- Guard forms
- Generating a guard service
- Route configuration
### Forms
In this section we discuss HTML form fields and what support Angular provides for dealing with validation.
#### Form Fields
- Overview of HTML form fields
- Usage of `[(ngModel)]`
- Various types for ``
- Toggle buttons
- Multi-line text
- Item selection
- Numeric values
- Handling date fields in Angular
- Handling radio buttons
#### Angular Forms Support
- Different ways of defining forms in Angular
- Form modules
- Form related classes to know about
- Overview of class FormControl
- Overview of class FormGroup
- Angular form validation support
- Validation classes
#### Template-Oriented Forms
- Structure of a template-oriented form
- Definition of a form field
- Definition of a form element
- Setting validators
- Handling validation errors
#### Component-Oriented Forms
- Structure of a component-oriented form
- Definition of a form field
- Definition of a form element
- Nested form elements
- The form builder service
- Setting validators
- Handling validation errors
#### Interactive Form Fields
- What is an interactive field?
- Setting up the subscription logic
- Sample code snippets
#### User-Defined Validation
- What is user-defined validation?
- Sample validator
- Difference of applying a validation between component vs. template oriented forms
- Defining a multi-field validator
#### Brief about Authentication
- What is authentication?
- How authentication differs between SPA vs. MPA apps
- What is JWT?
- Registering claims
- Typical auth operations
- Installing `njwt`
- Usage of njwt on a node.js server
### Development
In this section we discuss various topics when developing Angular apps.
#### Development Advice
- Using the Angular Dev Tools
- Use a CSS pre-processor
- Use of the ng update tool
- Consider using `pnpm`
#### Configuration
- Workspace configuration files and folders
- Angular configuration
- Structure of `angular.json`
- Build configurations
- Environments
- Server redirection
- Brief about CORS
#### Using 3rd Party Libraries
- Incorporating JS only libraries
- Incorporating CSS/JS libraries
- Asset files
- Angular plugins
#### Build
- Building an app
- Configurations
- Preparing for routing
- How to run a production build
#### Angular Universal
- SPA boot time
- Understanding T2FMP
- Lazy loading pages
- Server-side rendering
- Reasons for SSR
- Different ways of provide SSR
- What is PWA?
- Overview of Angular Universal
- Installation of ng-universal
- Build for dynamic SSR
- Build for static SSR (pre-rendering)
### C programmering
Nivå: beginner | Målgrupp: Tekniska programmerare | Förkunskaper: Praktiska kunskaper i något kompilerande språk
https://www.ribomation.se/programmerings-kurser/c-programming-grundkurs/
Trots att språket C skapades i början på 70-talet är det fortfarande det naturliga
valet vid maskinnära programmering. Denna kurs lär dig allt du behöver veta för
att komma igång och bli produktiv med programmering i C oavsett om målsystemet är
en Arduino, Raspberry PI eller en vanlig PC.
I denna grundkurs om programspråket C får du lära dig allt du behöver
veta för att kunna omsätta dina nya kunskaper i praktiken direkt efter
kursen.
- Basic syntax in modern C, C11, C17, C23
- Understand and be able to use pointers
- Create linked data types
- Handle text strings securely
- Manage text files
- Build C applications
- Create and link library files
- Debug C program
- Look for memory leaks
- Manage binary block-divided files
- Manage dates and times and format them
#### Background and Overview
* The language B
* Why C was invented
* Kernighan & Ritchie C (K&R C)
* ANSI C
* C89
* C99
* C11
* C17
* C23
* Language properties
* Overview of the syntax
#### Scalar Types
* Integral types
* Floating-point types
* Boolean values
* Characters
* Type variations, such as short/long, signed/unsigned
* Variables
* The sizeof operator
* Scopes
#### Operators
* Arithmetic operators
* Relational operators
* Logical operators
* Assignment expression operators
* Increment & decrement operators
* Type alias
* Type casts
* The address operator
* Printing to the console
* Reading from the console
#### Composite Types
* Structs
* Unions
* Arrays
* Text strings
#### Statements
* If statements
* While loops
* For loops
* Foreach loops
* Switch statements
#### Functions
* Function syntax
* Specification vs. implementation
* Function main()
* Understanding exit codes
* Command-line arguments
* Global vs. local data
* Usage of static variables and their meaning
* Inline functions
#### Understanding Pointers
* What is a pointer
* Pointer declaration syntax
* The dereferencing operator
* Starred pointers
* Pointer arithmetics
* Array access
* Why arrays and pointers are the same
* Text strings are arrays of characters
* Struct access
* Understanding the address operator
* Pointer to a function
* Indirect function calls
#### Standard Library
* Overview
* Online documentation
#### Dynamic Memory Blocks
* What is dynamic memory
* Using `malloc()` and `free()`
* Why `calloc()` is better than `malloc()`
* Using `realloc()`
* Understanding briefly the structure of the system heap
* Memory block manipulating functions
* Linked list data-types
* Binary-tree data-types
* Allocating data on the call-stack using `alloca()`
#### Working with Text String
* Understanding that string literals are read-only
* Overview of string manipulating functions in the standard library
* Character oriented functions
* String oriented functions
* Conversion functions
* Allocating memory blocks for strings
* Copying strings
* Searching strings
* Tokenization of strings
#### Working with Files
* Opening files
* File opening modes
* Formatted writing
* Formatted reading
* Changing the read/write position in a file
* Line-oriented reading
* Byte-oriented read/write
#### Designing Data-Structures in C
* Basic principle
* Applying the style of "object-oriented C"
* Initialization vs. object creation
* Dealing with object destruction
* Header files vs. implementation files
* Creating static libraries
#### The Pre-Processor
* Including application files
* Including system files
* Constants
* Pre-defined constants
* Function macros
* Conditional compilation
* Include guards
* Stringification
* Name concatenation
* Variadic macros
* Assertions
#### Machine-Level Support
* Bit-oriented operators
* Shift operators
* Bit-field structs
* Inline ASM (assembler) code
#### Working with Date & Times
* The UNIX Epoc
* Timestamps
* Using struct tm
* Getting the current time
* Formatting date and time values
#### Concurrency Support
* Brief about POSIX Threads
* Concurrency types in functions in C11
* Creating threads
* Waiting for thread termination
* Using mutex locks
* Using condition variables
* Using thread-local storage
#### Building C Applications
* Program organization
* Understanding compilation units
* Compilation steps
* Useful GCC compiler options
* Dynamic vs. static linkage
* Creating static linked library file (*.a)
* Creating dynamic linked library file (*.so)
#### Dealing with Errors
* Compiling for a debugger
* Debugging inside CLion
* Brief about the command-line debugger GDB
* Finding memory-leaks using Valgrind
#### Unit Testing
* What is unit testing
* Installing cUnit
* Writing tests
* Compiling and linking tests
* Executing tests
* Brief about using Catch2 för testing C applications
### C++ för minnes-begränsade system
Nivå: advanced | Målgrupp: C++ programmerare | Förkunskaper: Stor vana att programmera i C++
https://www.ribomation.se/programmerings-kurser/cxx-memory-constrained-systems/
Denna kurs går på djupet om hur man på olika sätt optimerar och hanterar system som av olika skäl är minnesbegränsade.
Det kan vara inbyggda system eller transaktionsintensiva system. Kort sagt, programmering av system där
minneshanteringen kräver en alldeles speciell form av omsorg.
Denna kurs går på djupet om hur man på olika sätt optimerar och hanterar system som av olika skäl är minnesbegränsade.
Det kan vara inbyggda system eller transaktionsintensiva system. Kort sagt, programmering av system där
minneshanteringen kräver en alldeles speciell form av omsorg.
Du får lära dig om hur man designar system som inte använder sig av system heapen. Hur man bygger fler-trådade system
med effektiv minneshantering. Hur man bygger system av processer med delat minne. Hur man fångar och exekverar vidare
efter ett null pekar fel. Hur man kan generera en stack-trace i ett C/C++ program samband med ett kastat undantag.
Samt, mycket mer där till.
Välkommen till en spännande och inspirerande fördjupningskurs i Modern C++.
- Be able to use and implement smart pointers
- Be able to catch a zero pointing error and continue the execution
- Be able to generate a stack trace in a C / C ++ program
- Know how to allocate dynamic memory on the stack
- Be able to implement own memory allocation based on a block pool
- Be able to implement programs with memory management outside the heap
- Be able to use PMR (Polymorphic Memory Resource) which was introduced in C ++ 17
- Be able to implement multithreaded systems, where each thread has its own private heap
- Be able to implement a program that loads a file into memory with mmap
- Be able to implement systems with shared memory
#### Brief about Modern C++
Just a quick recap of some topics from newer C++ which are essential for this course.
- The new initialization syntax
- Default initialization
- Initialization trivial/primitive types
- Initialization of STL containers
- Type safety
- Automatic type inference, usage of auto
- For-each loops
- Functions with auto return type
- Multi-assignment, aka structured bindings
- Lambda expressions
- Captures by value and by reference
- Modern type aliases
#### Understanding RAII
Discussion of the idiom *Resource Acquisition Is Initialization* and how important it is for memory management.
- Principles of the idiom
- Implementation of a trace class
- Other examples of RAII
#### Usage of new & delete
Discussion of usage of new & delete, to lay the groundwork for the rest of the course.
- Allocation of a single object
- Disposing a single object
- When the heap become full, how to detect it
- Registering a heap-full hook
- Allocation of an object array
- Disposing an object array
- The hidden secret of an object array, or how can delete [] ptr invoke the destructor of all objects
- Placement new operator, the third form of new
- Usage of the placement new operator
- Overloading the new & delete operators
- Non-throwing version of the new operator
#### Smart Pointers
Understand how to implement smart pointers and what is supported in Modern C++.
- What is a smart pointer, anyway
- A simple (incomplete) implementation
- To delete or not to delete; that’s the question
- Different pointer semantics
- Single reference semantics using `MonoPtr`
- Copy semantics using `ClonePtr`
- Reference count semantics using `MultiPtr`
- Complete implementation of `MonoPtr`
- Implementation of a factory function for `MonoPtr`
- Smart pointer support in C++11
- Using `std::unique_ptr`
- Using `std::shared_ptr`
- Using a custom deleter
- Using a free deleter for malloc allocated memory blocks
- Understanding usage of `std::weak_ptr`
#### Address Space Organization
Understand where various data blocks get allocated in *NIX like systems.
- Virtual memory pages
- Page table
- Address translation
- Page fault
- Compiled program code: the text area
- Global static data: the data and bss areas
- Dynamic data: the system heap
- Local data: the call-stack
- Organization of a single stack-frame
- How a function call is performed on assembly level
- Memory mapped data segments
- C++ name mangling
- Demangling linker names
- Useful system commands such as size, nm, objdump, ldd, lsof
- Useful online resources, such as `cppinsights.io` and compiler explorer
- Classification of embedded systems
#### Understanding Alignment
Brief discussion of byte alignment and its support in C++.
- What is alignment
- The problem with unaligned memory access
- What is a cache line and how that is related to alignment
- Cache levels: L1, L2 and L3
- Understanding array allocation and alignment
- How the order of members within a struct (or class) affects padding and hence the struct size
- Explicit alignment
- Alignment of heap allocated objects
#### Understanding the System Heap
Discussion of the system heap.
- Allocation functions in std libc
- Allocation functions in *NIX OS, usage of `brk()` and `sbrk()`
- How the malloc and free usually are implemented
- Dealing with heap overflow
- Allocation of very large memory blocks
- Understanding usage of `MMAP_THRESHOLD` and how to configure using mallopt
- What is a memory leak
- Working with valgrind on the command-line and within JetBrains CLion
#### Usage of Exceptions
Deep-dive discussion of exceptions in C++.
- Simple usage of exceptions
- Catching different types
- Marking a function as not throwing
- Automatic destruction of local objects
- Tracing exception throw
- Usage of std exceptions, why you should always do that
- How to reveal the type of unknown exception
- Exceptions in terms of `setjmp()` and `longjmp()`
- Throwing an exception from a signal handler
- How to recover from a null pointer crash (`SIGSEGV`) and carry on executing
- Usage of an alternate signal stack
- Dealing with system errors in *NIX OS
- Brief discussion of how exceptions really is implemented in modern systems
- How to disable exception is you must to
#### Understanding RTTI
Deep-dive into RTTI, demangling and how to generate stack-traces in C++.
- RTTI - Run-Time Type Identification
- Usage of the `typeid` operator
- How to disable RTTI, if you need to
- Understanding C++ (link) name mangling
- How to suppress name mangling
- Programmatic de-mangling, for the Itanium ABI
- Implementation of C++ demangle function
- Principles of generating a stack-trace in C/C++ program
- Complete implementation of stack-traces in C++ with unit tests in Catch2
- Dealing with application exceptions
- Dealing with system error exceptions
- Dealing with crash exceptions and generate a stack-trace for a null pointer bug
#### Dealing with Text Strings
Short recap of the string support in Modern C++.
- Understanding `std::basic_string`
- String literals
- Raw strings
- What is SSO (*Short String Optimization*)
- Usage of string_view and why it’s a really nice addition to the library
#### Memory Behaviour of STL Containers
Understanding of happens behind the curtains of STL containers.
- The STL architecture
- Overview of algorithms
- What is a STL interval
- Sequence containers
- Associative containers
- Binary tree vs. hash table implementations
- Tracing new & delete usage
- Understanding the allocation behaviour of `std::vector`
- Why invoking `reserve()` is an excellent idea
- Understanding the key difference between copy insertion and in-place insertions
- Investigating the memory usage of `emplace_back()`
#### Stack Allocated Memory
The heap is not the only place to allocate data, here we discuss how to use the stack dynamic memory allocation.
- Memory allocation outside the system heap
- Using a stack-allocated buffer
- Understanding RVO (*Return Value Optimization*)
- Understanding move semantics
- Allocation of memory blocks on top of the call-stack using `alloca()`
#### User-Defined Memory Allocation
The moment you start to use areas outside the system heap, you need to implement your allocation and de-allocation
library, in this chapter we show you how.
- Primary allocation strategies
- Monotonic allocation
- Circular allocation
- Block-pool storage
- Implementation of a static block pool
- Limitations of the template system and how that might affect the usage of static pools
- Implementation of a dynamic block pool
- Using smart pointers with a block pool
- Implementation of a custom deleter for a block pool
- Implementation of factory function for a block pool with a deleter
#### Polymorphic Memory Resources
In this chapter we discuss the allocation support added in C++17 and available since GCC version 9.
- What is PMR (*Polymorphic Memory Resources*)
- Class & function overview
- Provided memory resource types and allocators
- Typical usage of a `std::pmr::monotonic_buffer_resource` with an upstream resource
- STL container support for PMR
- Usage of a `std::vector` using a `std::pmr::monotonic_buffer_resource`
- Understanding SSO with PMR
- How to implement your own memory resource
- Implementation of a cyclic_buffer_resource
- Understanding how to use `std::pmr::unsynchronized_pool_resource`
- Implementation of spy tracing PMR classes
- Using PMR in you own user-defined types
#### Multi-Threaded Applications
Brief discussion of the threading support in Modern C++, to serve as the basis for next chapter.
- Threading API in C++11
- Life-cycle methods
- Several ways of defining the body of a thread
- Mutex locks
- Lock guards
- Deadlock avoiding multi-locks
- Read-write locks
- Condition variables
- Promise and future
#### Memory Allocation in Multi-Threaded Systems
Discussion of how to in practice implement thread private heaps using PMR.
- Heap implementation in glibc
- How to support private heaps
- The minimum amount of code to send some data from one thread to another thread
- Heap storage for messages
- Implementation of a (blocking) message queue
- A simple generic message type
- Implementation a producer-consumer threaded system, using a private PMR based heap for incoming messages
- Implementation of a more complex message sending pipeline of threads, all using PMR based private heaps
- How to configure the stack-size in POSIX Threads
#### Shared Memory
Discussion of memory-mapped file and how to create a shared memory segment.
- How is memory-mapped I/O working
- Understanding `mmap()`, `munmap()` and `msync()`
- Implementation of `class MemoryMappedFile`
- What is shared memory and how is it working
- How to create a SHM file and map it into the virtual address space
- Usage of `shm_open()` and `shm_unlink()`
- Understanding `fork()` and `wait()`
- Implementation of `class SharedMemory`
#### Memory Allocation in Multi-Process Systems
Discussion of memory allocation and synchronization in shared memory between two processes.
- Why C++11 threading types cannot be used in shared memory
- Implementation of simple C++ wrappers around the POSIX Thread C API
- Configuration of mutex and condition variables for usage in shared memory
- A simple demo of a producer-consumer via shared memory using a static message queue
- Demo of a client server system using dynamic memory allocation of messages in shared memory
### C++ grundkurs
Nivå: beginner | Målgrupp: Tekniska programmerare | Förkunskaper: Praktiska kunskaper i något kompilerande språk
https://www.ribomation.se/programmerings-kurser/cxx-basics/
Nya standarden C++11/14/17 har tagit världen med storm och C++ har återtagit rollen som ett modernt
systemutvecklingsspråk. I denna kurs bygger vi effektivt upp dina nya kunskaper och färdigheter i Modern C++.
Den nya standarden C++11 har tagit världen med storm och C++ har återtagit rollen som ett modernt
systemutvecklingsspråk. Det publiceras en ny C++ standard vart tredje år. Den senaste är C++23.
I denna kurs bygger vi effektivt upp dina nya kunskaper och färdigheter i Modern C++.
- Programming in Modern C ++
- Use the standard library efficiently
- Design your own data types
- Understand and apply insights regarding memory management in C++
- Use auto (automatic type inference) almost always
- Use lambda expressions to improve and simplify your code
- Use std::string object productively
- Work with STL containers, iterators and algorithms
- Work file I/O and within the file system
- Understand how to use and implement template based functions and classes
- Understand how to use operator overloading
- Understand when to use derived classes and virtual functions
#### Background and Overview
- From `cfront`, Classic C++ and into Modern C++
- Design objectives
- Some myths and facts of C++
#### Scalar Types and Operators
- Integral types
- Floating-point types
- Boolean
- Characters
- Type variations, such as short/long, signed/unsigned
- Variables
- Lexical scopes
- Automatic type inference using `auto`
#### Composite Types
- Native arrays
- Struct
- Classes (briefly)
- Unions
- Enum types
- Name spaces
- Type aliases
#### Statements
- If statements
- While loops
- For loops
- Foreach loops
- Switch statements
#### Functions
- Function syntax
- Call by-value vs. call by-reference
- Return by reference
- Overloaded functions
- Default parameters
- Template functions
- Extern declarations
- Compilation units
- Program organization
- Linking C code
#### Lambda Expressions
- Lambda syntax
- Passing free variables by reference or value
- Functions taking lambdas as parameters and/or returning lambdas
#### Pointers and references
- Pointer declarations
- Dereferencing operator
- Address operator
- Pointer arithmetics
- Dangling pointers
- The illusion of arrays
- Nativ text strings and the danger of using them
- Pointers to struct/class objects
- Function pointers
- References
- Call-by reference
- Return by-reference
- What is move semantics
- Rvalue references
#### Text Strings and Regexs
- Why using std::string instead of nativ strings
- Overview of std::string and its functions/operators
- What is SSO (Short String Optimization) and how it is used
- Working with legacy strings
- Character oriented functions
- Multi-line string literals
- What is a regex
- The regex support in modern C++
- Matching text data to patterns
- Searching using patterns
- Replacing text fragments using patterns
- Using regex iterators
- Typical use cases
- Splitting and joining strings
#### I/O Streams and Files
- ostream / ofstream / ostringstream
- istream / ifstream / istringstream
- Bidirectional I/O with fstream
- Manipulators
- The input idiom
- Line-oriented input
- Word-oriented input
- Character-oriented input
#### Helper Types
- Pair
- Tuple
- Date-times
- Durations
- Clocks
- Date formatting
- Random number generators
#### STL Container Types
- Sequence containers and typical methods
- vector / dequeue / array
- list / forward_list
- Associative containers
- Tree vs. hash implementations
- Unique vs. multi-key versions
- set / unordered_set
- map / unordered_map
- Container adapters
#### STL Iterators and Intervals
- What is an iterator
- What is a range and how is it used
- Iterator categories
- I/O iterators
- End-point adapter functions
#### STL Algorithms
- What is a std::* algorithm
- The STL architecture
- How to pass the business logic into algorithm functions
- Understanding *_n and *_if suffixes of functions
- Using functions with predicates
- Using back_inserter iterators
- Transforming and aggregating
- Sorting
- Populating data into containers
#### Classes (*User Defined Types*)
- What is a user-defined type
- Specification vs. implementation
- Member variables and functions
- Object creation (instantiation)
- Visibility
- Constructors
- Destructor
- Inline member functions
- Member overloading
- The pointer `this`
#### Class Member Forms
- Class variables and functions
- Member references
- Read-only variables
- Const marked functions
- Inner classes
- Friend declarations
#### Constructors and Destructors
- Initialization
- Default constructor
- Destructor
- Copy constructor
- Assignment operator
- Pitfalls
- Standardized class form
- Enforcing compiler-generated members
- Deleting compiler-generated members
- Type conversion constructor
- Type conversion operator
- What is move semantics
- Move constructor
- Move assigment operator
#### Heap Allocated Objects
- What is dynamic memory anyway
- Using the new and delete operators
- Pitfalls
- The placement variant of new
#### Exceptions
- What is an exception
- Throwing exceptions
- Catching exceptions
- The merits of automatic destruction during throw
- Exceptions in the standard library
- Pitfalls
#### Templates
- What is a template
- Function templates
- Class Templates
- Member function templates
- Template parameter forms
- Type equivalence
- Template specialization
- Pitfalls
- Type traits
- Using `decltype()`
- Variadic templates
#### Operator Overloading
- What is operator overloading
- Syntax
- Overloadable operators
- Rule set
- Overloading of arithmetic operators
- Overloading of relational operators
- Overloading of I/O operators
- Overloading of ++/– operators
- Overloading of the index operator
- Overloading of the arrow operator
- Overloading of the function-call operator
#### Inheritance and Virtual Functions
- What is inheritance
- Syntax
- Protected visibility
- Invocation of super-class members
- References and pointers of root class type
- Performing down-casts using dynamic_cast
- Constructor initialization order
- Base class visibility
- Virtual member functions and why they are important
- Abstract functions
- Use of override and final specifiers
- Multiple inheritance and why you need to be careful
- Implementing Java-style interfaces in C++
#### The Pre-Processor
- Include files
- CPP constants
- Pre-defined constants
- Conditional compilation
- Include guards
- CPP macro functions
- Stringification and name-concatenation
- Assertions
#### Building C++ Applications
- Compilation steps
- What is an abstract syntax tree (AST)
- The assembler
- Inline assembly code
- The linker
- Name mangling of C++ names
- Inspecting the linker symbol table
- The loader
- Tracing executions
- Compiler flags for warnings
- Compiler flags for optimizations
- Compiler flags for debugging
- Creating a static archive file
- Creating a dynamic linked library
#### Build Tools and Open-Source Libraries
- Make
- GNU Autotools
- CMake
- Gradle
- Doxygen
- Google Test
- Catch2
- log4cxx
- Boost
- Poco
#### Standards and Guidelines
- Tracking the standard
- Tracking compilers and what they support
- Online compilers
- The big C++ conference (_CPPcon_)
- The C++ Core Guidelines
- GSL - The Guidelines Support Library
### C++ Linux systemprogrammering
Nivå: advanced | Målgrupp: C++ programmerare | Förkunskaper: Stor vana att programmera i C++
https://www.ribomation.se/programmerings-kurser/cxx-linux-systems-programming/
Hur omvandlar man en signal till en exception? Hur skapar man en process och fyller den med ny programkod. Vilka olika
sätt att kommunicera mellan processer finns det? Hur fixar man memory-mapped I/O?
Dessa och en lång rad andra frågeställningar besvarar vi i denna mycket uppskattade kurs.
Hur omvandlar man en signal till en exception? Hur skapar man en process och fyller den med ny programkod. Vilka olika
sätt att kommunicera mellan processer finns det? Hur fixar man memory-mapped I/O?
Dessa och en lång rad andra frågeställningar besvarar vi i denna mycket uppskattade kurs.
- How the address space for a process is organized and why this is interesting
- How function calls are made and how you can use that insight
- How to track library calls and system calls, respectively
- The special file system `/ proc`
- Asynchronous I / O and memory mapped I / O
- Signal handling
- Process management with fork (), exec () and wait ()
- Communication with pipe & fifo
- POSIX message queues
- POSIX shared memory segments
- POSIX semaphores
- TCP stream sockets
### Application
Understanding the concept of a Linux application
#### The Process Concept
- What is a process and how it differs from a thread
- Process meta-data
#### Virtual Address Space Organization
- Virtual memory pages
- Address translation
- What happens during a page fault
- Memory areas and their functions
#### Compilation and Linking
- Overview of the various compilation steps
- Understanding the magic number
- Creating statically linked libraries
- Creating dynamically linked libraries
- Using programs to inspect compiled files such as `string`, `nm`, `objdump`, `ldd`
#### Understanding Function Calls
- The call stack
- The content of stack frames
- The details of a single function call
- Implementing variable number of function arguments
- Using `setjmp()` & `longjmp()`
- Understanding how `longjmp` is used when C++ throws an exception
#### Library and System Calls
- What is call to a library
- What is a system call
- How is the kernel code invoked during a system call
- Tracing library and system calls
#### Memory Management
- What is dynamic memory anyway
- The C APIs for using the heap
- Brief about how to implement heap management
- Estimating the current heap size
- Implementing a C++ allocator for use with containers
- Allocating memory blocks on the call stack
- Tracking memory leaks with valgrind
- The C++ APIs for using the heap
#### Creating Processes
- Copying a process with fork
- Special process IDs
- Terminating a process
- What are zombies and daemons
- Loading a new executable with exec
- Implementing class Process
### Input / Output
Different forms of performing I/O
#### File Systems
- What is a file system
- FS types
- File types
- Basic operations on files, from the kernel’s perspective
- I-nodes
- Directory files
- File descriptors
- Devices
- Mounting devices
#### The /proc file system
- What is the /proc FS
- Top-level info files
- Process-specific info files
- Reading /proc info files using C++
#### Regular I/O
- How to use the system API of `open()` & `close()`
- Opening modes
- Setting file permissions
- How to use the kernel API of read/write
- Changing the file read/write position
- Manipulating files in the file system
- Using C++ fstream for binary record-oriented files
#### Advanced I/O
- Manipulation of file descriptors
- Using memory mapped I/O
- Using non-blocking I/O
- Using non-deterministic I/O
- Implementing class MemoryMappedFile
### Inter-process Communication (IPC)
Different forms of interchanging data between processes.
#### Signals
- What are signals
- Sending signals from the shell and from program code
- Implementing signal handlers
- Registering signals and signal masks
- Implementing timeouts
- Creating interval timers
- Invoking `longjmp()` from a signal handler
- Implementing `class GlobalSignalHandler`
- How to translate a signal, such as `SEGV` (*segmentation fault*) into a C++ exception
#### Channels
- What is a channel
- Pipes
- Fifos
- Implementing class Fifo
#### Message Queues
- What is a message queue and how do it differ from a channel
- Overview of the API
- Usages
- Implementing class MessageQueue
#### Shared Memory
- What is shared memory
- Overview of the API
- Usages
- Implementing `class SharedMemory` and use it as a C++ allocator
#### Semaphores
- What is a semaphore
- Memory vs file-system based semaphores
- Overview of the API
- Usages
- Implementing class Semaphore
- Implementing class FileSystemSemaphore
- Implementing a message queue with semaphores for use in shared memory
#### TCP Sockets
- What is a TCP socket
- API overview
- Network byte order (NBO)
- Creating client sockets
- Creating server-side sockets
- Implementing class Socket
- Implementing class ServerSocket
- Implementing an iostreams compatible socket type
### C++ påbyggnadskurs
Nivå: intermediate | Målgrupp: Nyblivna eller ringrostiga C++ programmerare | Förkunskaper: Praktiska kunskaper i C++
https://www.ribomation.se/programmerings-kurser/cxx-supplementary/
I denna påbyggnadskurs i C++, fördjupar vi dina kunskaper i språket och dess bibliotek, med fokus på Modern C++.
Kursen vänder sig till dig som nyligen börjat med C++ och vill gå vidare, eller till dig som arbetat i C++ men längre
tillbaka i tiden och vill friska upp detaljerna.
I denna påbyggnadskurs i C++, fördjupar vi dina kunskaper i språket och dess bibliotek, med fokus på Modern C++.
Kursen vänder sig till dig som nyligen börjat med C++ och vill gå vidare, eller till dig som arbetat i C++ men längre
tillbaka i tiden och vill friska upp detaljerna.
Du får lära dig om lambda uttryck, automatisk typ-inferens, move semantics med flera nya begrepp i språket. Men vi gör
också en djuplodande översikt av befintliga delar av språket, som olika former av klassmedlemmar, templates och operator
överlagring. Vidare, så gör vi en grundlig genomgång av standard biblioteket, såsom containers och algorithms och nya
tillägg såsom regex, smart pointers med flera.
- Lambda expression
- Automatic type identification with auto
- Move semantics
- Deep diving in different class member forms, templates and operator overlay
- STL container classes, iterators and STL algorithms
- Smart pointer types in stdlib ++
- Use of regular expressions for recognition and compensation
- Support for random number generation via stochastic distributions
- Management of dates, times and time intervals
- Write programs that use I / O streams and files
- Review and exemplification of common C ++ idioms, such as RAII, own iterators, for-each,
- How to implement separation of read / write with operator []
- How C ++ is translated into C similar constructions
### Modern C++
Presentation of syntax and library for Modern C++.
#### Evolution of C++
Quick recap how C++ have evolved over the years and what we and others mean with the phrase “Modern C++”.
- Stroustrup
- Evolution of Classic C++
- Evolution of Modern C++
- What is Modern C++, anyway
- Recommended online resources
#### Syntax Enhancements in C++ 11/14/17
Presentation of the most important syntactic improvements of the language.
- Automatic type inference
- Java-style for-each loop
- Uniform initializer syntax
- Strongly types enums
- Compile time constant expressions
- Null pointer literal
- Unicode support
- Raw strings
- Multi-line strings
- Right-value references
- Move semantics
#### Lambda Expressions
The most exciting syntax enhancement in Modern C++ is without doubt, lambda expressions.
- What is a lambda expression
- Basic syntax
- Capture of local variables in the surrounding scope
- Writing functions that accept lambda expressions
### C++ Language Topics
Review and discussion of common language topics.
#### More about Constructors & Members
Review of how to use constructors and declare class members.
- Constructor chaining
- Different ways of initialize member variables
- Friends
- Inline friend non-member functions
- Move constructor
- Move operator
- Understanding move-semantics
- Compiler generated members
- How to enforce a compiler generated member
- How to omit a compiler generated member
- Using override and final function modifiers
- Type conversion constructor
- How to prevent implicit type conversion
- Type conversion operator
- Base class visibility
- Default visibility of structs
- How to emulate Java style interfaces
#### More about Templates
Review of how to declare and use template functions and classes.
- What is a template
- Function templates
- Explicit type instantiation of functions
- Template classes
- Template methods
- Template parameters
- Template specialization
- Type aliases
- Type traits
- Using `decltype()`
- Variadic templates
- Recursive templates
#### More about Operator Overloading
Review of how to implement and use operator overloading.
- What is overloading operators
- Overloadable operators
- Cannot change the arity
- Cannot change the precedence
- Overloading of arithmetic operators
- Overloading of relational operators
- Overloading of increment operators
- Overloading of the index operator
- Overloading of the arrow operator
- Overloading of the function call operator
#### Heap Allocated Objects
Review of the new/delete operators and how to use the placement variant of new.
- The new & delete operators
- The new & delete operators for arrays
- The placement variant of new and how to use it
- Overloading new & delete for your own class
### Standard Library
Presentation of the standard library in C++ 11/14/17.
#### Text Strings & Regexes
Discussions about the string class and how to work with regex objects.
- The std::string class
- String API
- Useful functions/operators
- Type conversion functions
- String search
- Character oriented functions
- What is SSO (Short String Optimization)
- Working with legacy C/C++ code, using text strings
- Raw strings
- Using a regex object
- Regex match operation
- Regex replace operation
- Implementing split and join for text strings and list of strings
#### Helper Types
Presentation of some minor but still useful classes.
- Using pair
- Using tuple
- Min/Max values of scalar types
- Math functions
- Complex numbers
- Numeric array
- Rational numbers
- The std::chrono types
- Durations
- Time units
- Time literals
- Clocks
- Random number generation
- Supported stochastic distributions
- Random number engines
#### STL Container Types
Presentation of all container types in the standar library.
- What is a sequence container
- Typical methods of a sequence container
- vector
- deque
- array
- list
- forward_list
- What is an associative container
- Implicit binary tree vs. hash table
- Typical methods of an associative container
- set
- unordered_set
- multiset
- map
- unordered_map
- What is a container adapter
- stack
- queue
- priority_queue
- Container block allocators
- User-defined allocator
#### STL Iterators & Intervals
Presentation of the important concept of an interval and how this is represented by two iterators.
- What is an iterator
- What is an interval
- Iterator categories
- (In/Out)put iterators
- Forward iterators
- Bidirectional iterators
- Random access iterators
- End-point adapters
- I/O iterators
- Iterator adaptors
- Using a back-inserter
#### STL Algorithms
Presentation of STL algorithms used to operator on intervals, hence containers.
- The STL architecture
- Overview of STL algorithms
- Different ways of providing the business logic to an algorithm function
- Understand function suffixes
- Using functions that take predicates
- Using the `transform()` function
- Using the `accumulate()` function
- Sorting
- Different ways to populate a container
#### I/O Streams & Files
Presentation of the stream sub-library.
- The streams abstraction in C++
- Class ostream, ofstream, ostringstream
- Class istream, ifstream, istringstream
- Manipulators
- Bidirectional binary I/O
- Stream position
- Stream status
- Understanding the typed input idiom
- The line-oriented input idiom
- The word-oriented input idiom
- The character-oriented input idiom
### Idioms & Techniques
Discussion of some advanced topics of C++ usage.
#### Smart Pointers
Discussion and implementation of the smart pointer concept and presentation of the smart pointer support in the standard library.
- What is a smart pointer and which are the benefits
- Basic implementation
- Using a transfer class to make the compiler happy
- To delete or not delete, that’s question
- Different smart pointer concepts
- UniquePtr
- CopyPtr
- RefCountPtr
- Smart pointers in C++ 11
- unique_ptr
- shared_ptr
- weak_ptr
#### Common C++ Idioms
Discussion and implementation of a set of well-proven common idioms in C++.
- What is an idiom
- Understanding the for-each loop
- Supporting for-each in your own classes
- Implementation of class Range
- Implementation of class LineSlurper
- Understanding static initializers
- Supporting static initializers in your own classes
- Overriding the index operator
- How to differentiate between read and write for operator[]
- Understanding the RAII idiom
- Mutex locks
- Debug tracing
#### Translating C++ into C
Discussion of how C++ is represented internally and how you can see that C++ is just a thin compile-time layer around C.
- How the member variables of a class is represented
- How member functions are represented
- Understanding name-mangling
- How method invocation is represented
- How operators are represented
- How constructors/destructors are represented
- How class hierarchies are represented
- How virtual methods are represented and works in run-time
- How lambda expressions are represented
- How exceptions are represented
#### Standards & Guidelines
Presentation of the standardization work, and the official guidelines for Modern C++.
- The standardization process
- A new C++ standard every third year
- Online compilers and why they are of use
- The C++ Core Guidelines
- GSL - The Guidelins Support Library
### C++ Templates
Nivå: advanced | Målgrupp: C++ programmerare | Förkunskaper: Stor vana att programmera i C++
https://www.ribomation.se/programmerings-kurser/cxx-templates/
Den här kursen lär dig allt du behöver veta för att inte längre tveka att skriva egna templates.
Efter kursen kan du designa implementera egna templates till hjälp för dina kolleger och den
organisation du jobbar för.
Det går knappast att skriva ett (icke-trivialt = seriöst) program i C++ utan att använda sig av
färdiga templates. Huvuddelen av standardbiblioteket i C++ bygger på templates, såsom STL
algorithms, iterators och containers. Emellertid, anses också templates vara komplicerat, framförallt
att skriva egna funktioner eller klasser med hjälp av templates. Och för all del, helt trivialt är
det ju inte.
Den här kursen lär dig allt du behöver veta för att inte längre tveka att skriva egna templates.
Efter kursen kan du designa implementera egna templates till hjälp för dina kolleger och den
organisation du jobbar för.
- Function templates
- Class templates
- Variable templates
- Variadic templated
- Fold expressions
- Non-type template parameters
- Template template parameters
- Perfect forwarding
- Template instantiation vs. specialization
- Argument deduction
- SFINAE
- Type traits
- C++20 concepts
#### Evolution of C++
Just a quick overview where C++ came from, its design criteria, evolution and finally,
how to compile it for the exercises of the course.
- Bjarne Stroustrup, inventor of C++
- C++ versions
- What is Modern C++
- Compiling a Modern C++ program
- Building a program using CMake
- Online compilers
#### Highlights of Modern C++
Essentials of the new standard, required to follow along in the course syllabus.
* Initialization syntax
* Initialization of STL containers
* Automatic type inference (auto)
* Using auto as return type of functions
* For-each loops
* Type aliases
* `decltype`
* `nullptr`
* `noexcept`
* Enforcing or deleting special members
* Lambda expressions
* Rvalue references (`T&&`)
* Move semantics
* Move special members
#### System Tools
Quick presentation of some tool-chain programs we are using during the course.
* Linux process address space organization, briefly
* How a stack-frame gets built
* `size`
* `nm`
* `objdump`
* `c++filt`
* Compiler Explorer
* C++ Insights
#### C++ Terminology
Short discussion of essential terms used in the standard and in this course, to avoid any conceptual confusions later.
- Declaration vs. definition
- West vs. east, regarding const, return and variables
- What is a translation unit, why does it matter
- The role of the compiler's symbol table
- Using `nm` to inspect the symbol table
- The one definition rule (ODR)
- Template entity naming
#### Before Templates
Brief about how developers did implement generic code before templates was invented in C++.
* What is generic code/programming
* Usage of CPP macros
* Writing a generic function, using CPP macro
* Instantiating and using a generic function
* Writing a generic type, using CPP macro
* Instantiating several type variants and using a generic type
#### Function Templates
How to write function templates.
- The problem of not having function templates
- Function template syntax
- What is the compiler actually generating
- Let the compiler figure out the type
- Let the compiler show you the type
- What is type equivalence and why you need to understand it
- What happens if an operator or function is not supported
- Usage of `typename`
- Example of implementing some functions from STL
- Partial vs. full instantiation of a function template
- Template parameters with default types
#### Class Templates
How to write class templates.
- The problem of not having class templates
- Class template syntax
- What is the compiler actually generating
- Type equivalence for class templates
- Writing methods outside the class and the syntax
- Example code
- Subclasses and templates
- The problem with inherited methods and how to fix it
- Static member variables in class templates
- Inline static variables in C++17
- Generic instance counts
- The Curiously Recurring Template Pattern (CRTP)
#### Non-Type Template Parameters (NTTP)
Templates parameters can be lots of other things, besides of plain types. Here we discuss the all.
- Value template parameters
- Using auto for value parameters
- Example code
- Prefer east return
- How to pass a native string (aka C string) as a template argument
- Template member functions (TMF)
- Writing TMF outside its class
- Template template parameters (TTP)
- Syntax for TTP
- Example code of TTP
#### Variable Templates and `constexpr`
Since C++14 we can make read-only variables as template, which means the actual type can be determined at
instantiation time. In this chapter we also discuss compile-time functions (`constexpr`) and C++17 `if constexpr` statements.
- Compile-time values
- Compile-time functions
- Example code
- Variable templates and why we might need them
- Recursive variable template
- Compile-time assertions
- Simple type predicates
- Compile-time `if` statements and why it is really useful
#### Variadic Templates
Templates can be declared with an unspecified number of parameters. In this chapter we show you how
to deal with parameter and argument packs, as well as fold expressions.
- What is a variadic template
- Simple variadic function template
- The `sizeof...` operator
- Variadic member function template
- Implementing an emplacement member
- Fold expressions in C++17
- Syntax for all fold expression variants
- Example code
- Implementation of class `Record` (similar to std::tuple)
#### Template Specialization
How to write special versions of a template entity.
- What is a specialization
- Example code of a type-dependent equals function
- Specialization of a variable template
- Type-dependent values
- Specialization of a class template
- Partial vs. full specialization
- Example code of linked-list container type
#### Template Instantiation
Discussion of how the compiler decides of what code to generate. What we mean in more detail with
instantiation and specialization.
- Template specialization - more formally
- Template instantiation vs. OOP instantiation
- Implicit instantiation
- Explicit instantiation
- Explicit specialization
- The bigger picture of what we just discussed
- How the compiler and linker collaborates
- Cfront, greedy and queried instantiation
#### Argument Deduction
How the compiler performs pattern matching in order to figure out the actual types of a template invocation.
- Two-phase translation of templates
- Two-phase name lookup
- Dependent types
- Understanding the challenges of parsing template code
- The importance of prefixing dependent types with `typename`
- Understanding overload resolution
- Why you should avoid specialize function templates
- How you can implement specialized functions safely
- Template argument deduction (TAD)
- TAD initial scenario
- TAD pattern matching challenge
- Boost type-index library
- Type deduction for _pass-by-value_
- Type deduction for _pass-by-reference_
- Type deduction for _pass-by-forwarding-reference_
- Universal reference
- Recap of lvalue and rvalue
- About xvalue, prvalue and glvalue
- Understanding `std::move`
- Understanding `std::forward`
- Implementing _perfect forwarding_
- Writing a variadic function template with perfect forwarding
#### Programming with Types
In this chapter we step-by-step implements a generic print function, that uses type-dependent print strategies.
- Use cases
- Start with a baseline
- Supporting pointers and print what's pointed on
- Printing boolean values
- Printing floating-point values
- Printing the elements of a static array
- Printing a C string, which might come in several forms
- Printing the elements of a dynamic array, using a `span` object
- Printing the elements of an STL container
- Printing the elements of an STL associative container
- Printing the elements of an STL map container
- Printing the elements of an STL array
#### Type Traits
The standard library contains many utility functions for manipulating with types in template entities, such
as type predicates, type transformers and type inspectors. In this chapter we first show how to implement
some of them to understand how it works, then we present some of them in ``.
- Type predicates
- Type transforms
- Using `std::type_traits`
- Inspecting the source code of `std::type_traits`
- Overview of the contents in `std::type_traits`
- Understanding `std::decay`
- Understanding `std::conditional`
- Example: populating a vector with numeric random-generated values
#### SFINAE
The acronym SFINAE, which means Substitution Failure Is Not An Error, is an essential part of the toolbox
when implementing meta-functions.
- Function (template) overload resolution
- Example: getting the size of "something"
- Deduction is based on the function signature
- How to check if a template argument object has a specific member function
- Understanding SFINAE
- Using `std::enable_if`
- Example: writing constructors for initializing a container
- Inflating with the same value
- Inflating with a iterator range
- Iterator traits and tags
- Understanding and using `std::void_t`
- Unit tests of type-requirements
- Understanding and using `std::declval`
- Meta-functions
#### C++20 Concepts
With concepts in C++20, we can write generic functions much easier and safely. The compiler can also
much better tell us what is wrong when we use it wrongly. This is because with concepts we specify
the criteria of the allows argument types to a function or member function.
- What is a concept
- C++17 vs. C++20 regarding type-requirements
- Looking at error messages from failed concepts
- Overview of `std::concepts`
- Syntax for a `concept` definition
- Example: `concept is_numeric`
- Syntax for a `requires` clause
- Placement of requires clause at function templates
- Constrained template parameter
- Abbreviate function template (aka annotated auto)
- Usage of concepts with class templates
- Usage of concepts with member functions
### C++ Threads
Nivå: advanced | Målgrupp: C++ programmerare | Förkunskaper: Stor vana att programmera i C++
https://www.ribomation.se/programmerings-kurser/cxx-threads/
Buggar i fler-trådade program anses ofta vara det besvärligaste man kan råka ut för som programmerare.
Faktum är att det generella rådet är att inte stoppa in dem från början. Om man tycker det rådet är aningen
orealistiskt, så är det näst bästa att programmera enligt ett antal väl beprövade programmerings-idiom som
undviker problemen. I denna kurs, fokuserar vi på just den strategin.
Buggar i fler-trådade program anses ofta vara det besvärligaste man kan råka ut för som programmerare.
Faktum är att det generella rådet är att inte stoppa in dem från början. Om man tycker det rådet är aningen
orealistiskt, så är det näst bästa att programmera enligt ett antal väl beprövade programmerings-idiom som
undviker problemen. I denna kurs, fokuserar vi på just den strategin.
- Program with threads in C++20 and previous versions
- Understand and deal with problem areas such as critical sections, race conditions and deadlocks
- Use mutex and conditions in both POSIX and C++
- Implement message passing
- Implement thread pools
- Understand memory management to implement private heaps for threads
- Understand and use promises/futures in C++11
- Program with POSIX Threads directly in C
### Threads
#### What is a Thread?
- Concurrent vs. parallel
- Scheduling
- Thread types
- Synchronization
- Virtual adress space organization
- Overview of how a function-call is performed and why it’s relevant to threads
- Where do all the thread lives?
#### Creating Threads
- How to create a C++20 thread
- Sample hello thread
- Explicit join
- Obtaining the current thread
- Sleeping
- How to provide the thread body
- Lambda, function, functor, method pointer
- `std::thread` vs. `std::jthread`
- `AutoJoiner` helper class for std::thread
- Passing arguments to a thread
- The problem of mixed output and how to fix it
- Moving threads
- Swapping threads
- Thread base class
- Obtain the number of processing units
- Thread local storage
#### Cooperative Interruption
- How to stop a thread
- Implicit requesting stop
- Explicit requesting stop
- Register a stop call-back
- Using a stop source/token
### Concurrency Problems
#### The Critical Section Problem
- Understanding the problem and its solution
- The ATM problem
- Account class
- ATM class
- Bank program
- Failed execution
- Critical (code) section
- What is wrong?
- Three conditions for the critical-section problem
- How to prevent the critical-section problem
- Using a mutex lock
- C++ mutex type
- Thread-safe account class
- Using a lock guard
- How to prevent self-deadlock
- Using a recursive lock
- The problem of partial mutable operations
- How to make `getBalance` const, but retain `mutex::lock`
- Using lock with time-out
#### The Race-Condition Problem
- Understanding the problem and its solution
- The SWIFT problem
- Moneybox class
- SWIFT class
- Sender thread
- Receiver thread
- Failed execution
- What is wrong?
- Condition synchronization
- C++ condition variables
- Thread-safe moneybox
#### Monitors & Capsules
- The concept monitor
- Monitor semantics
- Flexible monitor design
- Simple monitor implementation
- The concept capsule
- Simple capsule implementation
#### The Deadlock Problem
- The concept resource
- The Kitchen problem
- Resource class
- Cook thread
- Failed execution
- The Dining Philosophers problem
- Ed Coffmans conditions for deadlock
- How to handle deadlocks
- Fixing the Kitchen problem
- The Account Transfer problem
- C++ scoped locks
- Implementation of the Account Transfer problem
### More Synchronization
#### Read-Write Locks
- What is a read-write lock?
- Using a `std::shared_mutex`
- Sample demo program
#### Latches & Barriers
- What is latch?
- Latch operations
- Usage of a latch
- What is barrier?
- Barrier operations
- Usage of a barrier
#### Semaphores
- What is a semaphore?
- Counting semaphore
- C++ semaphores
- C++ binary semaphore
- Using a semaphore as a mutex
- Implementing a queue with semaphores
- Problems with semaphores
- Semaphore can be more versatile than locks
- POSIX has two types of semaphores
#### Promises & Futures
- What are promises and futures?
- C++ promises and futures
- Sample usage
- Dealing with exceptions
- Asynchronous tasks
- Usage os `std::async`
- Execution policies
- Using s shared future
- Example; scanning the file system using async tasks
### Message Queues
#### Implementation of a Thread-Safe Queue
- Logical design of a queue
- Handling queue capacity
- Implementation advice for an unbounded queue
- Class `MessageQueueUnbounded`
- Sample execution
- Implementation advice for an bounded queue
- Class `MessageQueueBounded`
- Sample execution using a bounded queue
- Dropping messages when queue full
#### Unidirectional Message Passing
- What is message-passing
- Handling pointer based messages
- Implementing interface Receivable
- Implementing a threads pipeline
#### Bidirectional Message Passing
- What is bidirectional message-passing?
- What is _rendezvous_?
- Communication patterns
- Implementation of rendezvous
- Rendezvous message class
- RPC server
- Sample client
- Execution
- Some optimizations
- Inspecting thread stack frames
#### Thread Pools
- What is a thread pool?
- The simplest thread pool implementation
- Tasks that return a result
- Task type
- The submit function
- The worker loop
- Pool creation and shutdown
- Sample test program
### Misc. Library Parts
#### Parallel STL Algorithms
- What is a parallel STL algorithm
- Parallelized algorithms
- Execution policies
- Sequenced policy
- Parallel policy
- Parallel `unsequenced` policy
- `Unsequenced` policy
- Choosing a policy
- Changes to iterator requirements
- Changes in exception behaviour
- Replaced algorithms
- Do we get any speed-ups? For which work loads?
- The benchmark program
#### Atomic Variables
- What is an atomic type/variable?
- Using `std::atomic`
- Operations
- The ATM problem using an atomic int
### Under the Hood
#### POSIX Threads
- Rudimentary C API
- Creating a thread with `pthread_create`
- Passing arguments
- Thread configuration
- Setting the stack size
- PThread mutex
- The ATM problem as a C program, with pthreads
- PThread Condition
- PThread Read-Write locks
- PThread Barriers
#### Implementation of C++ Threads
- Wrapping pthreads
- Simple `thread` class
- Usage of the class
- Passing arguments
- Class `ThreadArgs`
- Usage of the modified class
- Class Mutex
- Usage of the mutex class
- Class Condition
- Usage of the condition class
### Memory Management
#### User-Defined Memory Allocation
- Limitations of using system heap for messages
- Allocation functions of the system heap
- How the system heap is implemented
- Why the heap is a large critical section
- Heap arenas in GNU glibc; multiple locks
- What is a private heap?
- Choosing storage for messages
- Possible implementation of a consumer's private heap
- Allocation strategies
- Allocation-only storage
- Monotonic allocation
- Circular allocation
- Block-pool storage
#### Understanding std::pmr
- What is a polymorphic memory resource?
- Class & function overview
- Provided memory resources
- Special-form allocators
- Usage of a `monotonic_buffer_resource`
- STL container support for std::pmr
- Usage of `unsynchronized_pool_resource`
#### Thread Private Heaps
- Basic principle for a private heap
- Sample implementation of a std::pmr based private heap
- How to organize heap storage for messages
- Sample implementation of a std::pmr based message heap
### Shared Memory
#### POSIX Processes
- What is a process?
- Understanding the system call `fork`
- Using `exit` and `wait`
- Understanding the system call `exec`
- Loading new program code
#### POSIX Shared Memory
- What is shared memory, really?
- How is it working
- Shared memory C API
- Using `mmap` to create memory segments
- Class `SharedMemory`
- Usage of the class
- Understanding the placement variant of operator `new`
- How to configure POSIX mutex and condition to work in shared memory
- Sample program; Producer-Consumer via shared memory
#### Processes with Threads & Shared Memory
- How to combine everything we discussed in this course
- Overview of the demo application
- The app part
- The Loader thread
- The Transformer thread
- The Consumer thread
- The Shared-Memory class
- The user-defined shared-memory enabled Mutex and Condition classes
- The Message-Queue class
- The Message class
- The FileSlurper class
### Catch2 - Testning i C++
Nivå: intermediate | Målgrupp: C++ programmerare | Förkunskaper: Vana att programmera i C++
https://www.ribomation.se/programmerings-kurser/catch2/
Catch2 är vår egna favorit vad gäller enhetstester för C++ program.
Det går enkelt att skriva testfall i given/when/then stil.
Skriv inte en rad produktionskod utan att ha ett tillhörande enhets-test. I denna kurs går vi rakt på sak och
lär dig hur du använder Catch2 för att skriva genomtänkta enhetstester.
Catch2 är vår egna favorit vad gäller enhetstester för C++ program. Skälet är flera; Det är header-only vilket
innebär bara en fil att ladda ned. Det går enkelt att skriva testfall i given/when/then stil. Det går enkelt
att nästla test funktioner, vilket på ett elegant sätt eliminerar behovet av test fixture klasser, vilket finns
i många andra test ramverk.
- Install and configure Catch2
- Write effective device tests
- Handle test data in nested test cases
- Be able to formulate test conditions and output comparators
- Write parameterized tests
#### Unit Testing and TDD
- Type of tests
- What is a unit test
- Write F.I.R.S.T. tests
- Structure of a unit test
- Given-when-then style
- What is test driven development (TDD)
#### Installation of Catch2
* Catch2 at GitHub
* Download the header-only library
* How to automatically download and configuration using CMake
* Configuration of CLion to run Catch2
#### Writing a Test Function
* Including Catch
* Defining a test runner
* Structure of a test function
* Usage of REQUIRE()
* Analyzing a failed test
#### Assertions
* REQUIRE vs. CHECK macros
* Dealing with floating-point comparisons
* Asserting exceptions
* Logging
#### Matchers
* What is a matcher?
* Using REQUIRE_THAT()
* String matchers
* Vector matchers
* Floating-point matchers
* Predicate lambda matchers
* User-defined matchers
#### Test Fixtures
* Defining a test function with nested SECTION blocks
* Defining test data (fixture)
* How nested test cases are executed and handed test data
* Tagged test cases
* Special tags
#### Scenarios and BDD-Style Test Cases
* Defining a SCENARIO
* Defining a test case using GIVEN / WHEN / THEN
* Conjunctions
#### Parameterized Tests
* Defining a TEMPLATE_TEST_CASE
* Type-parameterized tests
* Test-data generators
* Value generators
* Predicate-based generators
* Random value generators
* User-defined generators
#### Micro Benchmarks
* What is a benchmark?
* Enable benchmarking
* Defining a BENCHMARK
#### Configuration
* Writing your own main() function
* Command-line options
* Invoking the test runner
* Compile-time configuration properties
* Command-line options
* Log reporters
* CMake integration
### CMake
Nivå: intermediate | Målgrupp: C/C++ programmerare | Förkunskaper: Kunna skriva och kompilera C/C++ applikationer
https://www.ribomation.se/programmerings-kurser/cmake/
CMake har seglat upp som det mest populära byggnations-verktyget för C/C++ applikationer och bibliotek.
Skälet är att CMake egentligen är en generator för byggnations-verktyg såsom Make, Ninja, MSVSC++, Xcode
med flera, vilket skapar flexibilitet avseende både verktyg och editorer.
CMake är ett av de mest populära byggnations-verktyget för C/C++ applikationer.
Det är enkelt att hantera komplexa byggnationer med många bibliotek.
Bibliotek som länkas till en applikation kan vara i många former, såsom
archive (`.a`), shared-object (`.so`) och header-only.
Förutom att vara en del av aktuellt projekt, så kan bibliotek länkas från redan installerade
eller laddas ned automatiskt från en git repo eller webb-server.
Den här kursen lär dig allt du behöver veta för att snabbt komma igång med att skriva egna
CMake script för byggnation av C++ och C applikationer. Kursen är uppdaterad för CMake version 3.28
och innehåller ett nyskrivet kapitel om presets.
- Configure CMake for C/C++ projects
- Configure build of executables
- Configure build of static libraries
- Configure build of shared libraries
- Link external libraries
- Download automatically and link remote libraries
- Generate source code
- Generate API documentation with doxygen
- Execute various tools as part of the build
- How to perform cross-compilation
- Understand how to utilize presets
#### Background
- Why CMake was created
- Properties of CMake
- Compilers
- Build tools
- Build tool generators
### Application Build
#### Compilation & Linkage
- Using GCC
- Pre-processor
- Front-End compilation
- AST and RTL
- Back-end compilation
- Assembler
- Linker
- Loader
- Useful compiler flags
- Linking libraries
- Creating static libraries
- Creating shared libraries
- Executing with shared libraries
#### Archives
- What is an archive
- Creating a static archive file (`*.a`)
- Naming conventions of archive files
- Creating a dynamically linked archive file (`*.so`)
#### Brief about Makefiles
- What is make
- Structure of a Makefile
- Targets
- Actions
- Dependencies
- Rules
- Ninja instead of Make
### CMake Fundamentals
#### Installation of CMake
- Installation via a package manager
- Installation on Windows
- Installation via TAR.GZ archive
- Compiling from sources
- CMake executables
- CMake command-line help
- CMake documentation
#### CMake Syntax
- Structure of CMakeLists.txt
- CMake stages
- Comments
- Command syntax
- Text strings
- Quoted vs. unquotes strings
- Value lists
- Variables
- Conditional blocks
- Looping blocks
- CMake scopes
- Subdirectories and includes
- CMake GUI
#### Control Structures
- Conditional blocks
- Operators
- Loops
- Generator expressions
- Functions
### Executables
#### Building Executables
- Creating a CMake project
- Build steps and commands
- Programming language
- Language standard
- Compiler options
- Linking standard libraries
#### Build Variants
- Debug vs. Release build
- C++ vs. C sources
- GCC vs. CLang compiler
- Make vs. Ninja builder
- Linux vs. Windows build
### Libraries
#### Building Libraries
- Building a static library
- Where to find the *.a file
- Propagating header files to an executable
#### Building Header-Only Libraries
- Defining a header-only library
#### Building Dynamic Libraries
- Building a shared library
- Where to find the *.so file
#### Other Library Types
- Defining an object library
- Using an imported library
#### Linking External Libraries
- What is an external library
- Finding libraries
- Configuration variables
#### Linking Remote Libraries
- What is a remote library
- Downloading and linking a remote library
- Understanding FetchContent
- Fetching a GIT library
- Fetching a TAR.GZ file
### Tests & Docs
#### Configuring and Running Tests
- How cmake perceives a test
- Using CTest
- Configuring a simple test
- Configuring a test based on a header-only testing framework (Catch2)
- Configuring a test based on a linked testing framework (Google Test)
- Fetching and using a remote test framework
#### Generating API documentation using `doxygen`
- What is `doxygen`
- Invoking doxygen from CMake
- Configure tool properties
- How to generate fancy docs with custom CSS, tree-view and images
### Writing CMake Scripts
#### Running External Programs
- Custom targets
- Running the generated executable
- Running arbitrary scripts and programs
- Generating API documentation using doxygen
#### Working with Files
- Finding things in the file system
- Extracting path components
- The versatile `file()` command
- Copy a set of files to a directory
- Writing files
- Reading files
- HTTP(S) operations, i.e., GET and PUT
#### Generating Sources
- Copying files
- Variable substitution
- Managing application version
- Assembling build info
#### Recursive CMake
- How to structure a large C/C++ project
- Top-level CMakeLists.txt
- Dependencies
- Subsystems
- Tests
#### Cross-Compilation
- What is cross-compilation
- Toolchain identifier
- What is `sysroot`
- What is a multi-lib
- Using CMake for cross-compilation
- Toolchain file
- How to build applications for several toolchains (_i.e._, platforms)
#### Presets
- What are CMake presets
- Understanding the preset JSON format
- Top-level JSON properties
- Common structure of all presets objects
- Configure `configurePresents`
- Configure `buildPresents`
- Preset macros
- Preset inheritance
- Preset conditions
### CSS för programmerare
Nivå: beginner | Målgrupp: Web programmerare | Förkunskaper: Erfarenhet av att utveckla webbapplikationer
https://www.ribomation.se/programmerings-kurser/css-for-programmerare/
Du får lära dig allt du behöver veta om CSS & HTML för att förstå hur CSS
regler ska utformas och hur webbläsaren väljer ut vilka regler som ska användas.
Har du upplevt att du bara skulle göra en liten förändring i en CSS regel och hela webbsidas utseende förvandlades till
något som mer liknade en kubist målning? Har du tänkt tanken att CSS snarare är besläktat med alkemi än programmering?
Kanske du inte ens känner igen dig i frågeställningarna ovan.
Hursomhelst, så är detta en kurs som ger dig en solid grund avseende CSS & HTML, med ett stänk av JavaScript.
Du får lära dig allt du behöver veta för att förstå hur CSS regler ska utformas och hur webbläsaren väljer
ut vilka regler som ska användas.
Kursen är uppbyggd kring många korta teoriavsnitt, vilka avslutas med praktiska programmeringsövningar. Vi vill
understryka att kursen vänder sig till utvecklare som använder CSS som ett programspråk, för att realisera en design.
Med andra ord; det är inte en kurs om grafisk web design, utan om att förstå och kunna tillämpa CSS/HTML/JS.
- Be able to formulate powerful CSS rules
- Be able to design reusable CSS widgets
- Be able to place elements with flexbox
- Be able to design page layout with grid
- Be able to create effective backgrounds with gradients
- Understand how browsers choose exactly which CSS rules to apply
- Be able to select and configure construction tools for both pre- and post-processing
#### Overview & Background
* Why CSS was invented
* Version history
* Browser compatibility
### Web App Basics
Laying the foundation for the course
#### HTML Basics
* Basic syntax
* HTML page document
* Lenient HTML
* Heading tags
* Paragraph tags
* List tags
* Link tags
* Block vs. inline tags
* White space
* Pre-formatted and code tags
* Presentational tags
* Semantic tags
* Grouping tags
* Common attributes
* Special attributes
* Head section tags
* Meta tags
#### CSS Syntax
* Basic syntax
* Element selector
* Size units
* Colour properties
* Text properties
* Padding and margin
* Borders
* Embedding and linking to CSS code
* Tag link attributes
* The default style-sheet
### CSS Fundamentals
Presenting the corner stones of CSS
#### Fonts & Size Units
* Font categories
* Setting the font
* What is font-size relative?
* Using em size
* Nested elements with em size
* Using rem size
* Using viewport units
#### Colour Expressions
* Colour expression syntax
* Understanding RGB
* Understanding HSL
* Opacity / transparancy
* A little of colour theory
* Combinators & Selectors
#### Combinator syntax
* Universal selector
* Attribute selectors
* Pseudo classes
* Pseudo elements
* Variables
* The calc() function
* Special property values
#### CSS Box Model
* Block vs. inline elements
* Element box rendering
* Box shape structure
* Border properties
* Border radius
* Getting creative with think borders
* Inline images
* Floated images
* Floating around several paragraphs
* Stop floating
* Floating block elements
* The clearfix trick
* Using floated divs to define a columnar layout
* Understanding the box-sizing property
* Always set box-sizing to border-box
* Box shadows
* Simple card widget
#### Text Formatting
* Alignment
* Variations
* Spacing
* Columns
* Newspaper format
### Layouts
Discussion of various ways of placing content
#### Positioning
* What can property position achieve?
* Fixed
* Absolute
* Relative
* Sticky
* Z-index
#### Flexbox Layout
* What is flexbox?
* Terminology
* Properties
* Flex direction
* Justify content
* Align items
* Flex wrap
* Flex basis/grow/shrink
#### Grid Layout
* What is grid?
* Terminology & anatomy of a grid container
* Container properties
* Item properties
* Named grid lines
* Named grid areas
#### Page Layouts
* Base style
* Even out browser differences
* CSS concepts
* Common page layouts
* Dealing with a wide screen
* Usage of max-width
* Dealing with overflow
#### Device Queries
* Media query by device type
* Media query by device feature
* Logical operators of query expressions
* Using `mydevice.io`
* Handling media queries in JS
* Principles of responsive design
* Mobile first
* Fluid layout
* Size and resolution dependent image selection
### Fonts
Discussion of web fonts and icon fonts
#### Web Fonts
* What is a web font?
* Web font providers
* Using Google Fonts
* Using a font link
* Using a downloaded font
#### Icon Fonts
* What is an icon font?
* Icon font providers
* Using Font Awesome
* Linking to and applying Font Awesome
* Scaling icons
* Icon variations
* Combining and mixing icons
### Composite Elements
Styling tables and forms
#### Tables
* Basic table tags
* Cell borders
* Column formats
* Striped and hover rows
* Row groups
* Unstyled and styled row groups Merged cells
#### Forms & Fields
* Basic form tag
* Basic form field tags
* Using the input tag
* Input tag attributes
* Toggle buttons
* Item selection fields
* Multi-line text field
* Borders & corners of fields
* Styling labels
* Using `fieldset` to group fields
* Designing a modal popup form
### Advanced CSS
Deepening the understanding of CSS
#### Cascading & Specificity
* Understanding how to browser chooses a CSS rule to apply
* Different selectors have different specificities
* Specificity encoding into tuples
* How to deal with conflicting rules of the same specificity
* What is a cascaded value
* Property inheritance
#### Backgrounds
* Properties dealing with backgrounds
* Gradients
* Linear and radial gradients
* Repeating gradients
* Mixing and blending colors
* Mixing images
* Cut-out text over an image
#### Transitions & Transforms
* What is a transition?
* Transition properties
* Fading
* What is a *Cubic Bezier* function
* What is a transform?
* Rotate, translate, scale and skew
### Docker och Docker Compose
Nivå: beginner | Målgrupp: Programutvecklare | Förkunskaper: Erfarenhet av programmering i något språk
https://www.ribomation.se/programmerings-kurser/docker-och-compose/
I denna kurs får du lära dig allt du behöver veta om Docker för att bygga och driftsätta applikationer
i containrar. Du får lära dig om såväl Compose för att assemblera ihop flera images till ett
kluster av containrar, som Dockerfile för att designa egna applikations images.
I denna kurs får du lära dig allt du behöver veta om Docker för att bygga och driftsätta applikationer
i containrar. Du får lära dig om såväl Compose för att assemblera ihop flera images till ett
kluster av containrar, som Dockerfile för att designa egna applikations images.
- Create containers using existing docker images for your application
- Create container clusters using `docker compose`
- Create your own docker images using `Dockerfile` and `docker build`
- Combine _Compose_ with `Dockerfile`
- Configure web servers and database servers
- Utilize docker networks
- Create an Ubuntu image from scratch
#### Background / Overview
- History
- What is a (Docker) container?
- Containers vs. Virtual machines
- Fundamental concepts
- Docker Hub
- What is behind Docker?
- How does Docker run on Windows?
### Using Docker
In this section we will use the docker CLI to pull and launch
various ready-made docker applications.
#### Installation
- Docker Desktop
- System requirements Windows computers
- System requirements Mac computers
- System requirements Linux computers
- Installation of Docker Engine
- Extensions
#### Brief about Linux
- Linux distributions
- Distribution versions and their names
- Debian vs. Ubuntu vs. Alpine
- Installing program packages in Linux
- Essential Linux commands
#### Basic Docker Commands
- Using the Docker CLI - `docker`
- Getting help information
- Download an image - `docker pull`
- Pull from a different registry
- List images
- Remove an image
- Create/launch a container
- List containers
- How step into a container
- Copy files to/from a container
- Remove containers
- How container names are created
- Stopping/starting containers
- Obtain run-time information
- Port mapping
#### Docker Volumes
- Persisting data
- Volume types
- Create a named volume
- Local development using Docker
- Example: compile a C++ program without an installed compiler
- Volume maintenance actions
- Finding the volume file in the host file system
#### Configuration
- How to configure a server?
- How to pass environment variable values
- How to connect to a database
- Sample usage of an MySQL database
### Docker Cluster
In this section we will run more than one container and let them interact with each other.
You will learn about docker networks and docker compose.
#### Brief Network Theory
- How do a computer communicate with another computer
- What is an IP number
- What is a port number
- What is a hostname
- What is a network
- What is DNS
- What is IPv6
- How to use `ifconfig`
- What is a loopback address
- What is a private IP
- What is a subnet
- What is CIDR
- Special CIDR addresses
- Address allocation
- Route table
- What is a firewall
- What is NAT / IP masquerading
#### Docker Network
- What is a Docker network
- Network types
- Default networks
- Meta-data about a network
- Create a Docker network
- Associate a container with a network
- How to containers might interact
#### Docker Compose
- What is docker compose and its purpose
- Background
- What is YaML
- Elements of a compose script
- Creating a compose script
- Creating and running a compose service
- Commonly used compose actions
- Introspective compose actions
- Command-line options
- Dealing with configuration data
- Setting a simple WordPress system with a MySQL database
- Using so-called secrets
- Service dependency
- Health checks
- Restart policy
- YaML extensions used in compose scripts
### Creating Images
In this section we will learn how to create our own image, using a Dockerfile.
#### Dockerfile
- What is a `Dockerfile`
- Dockerfile syntax
- The most essential directives of a Dockerfile
- Create an image - `docker build`
- Simplest possible Dockerfile
- How to build and run it
- Understanding and settings Docker tags
- A still simple, but more realistic Dockerfile
- The Express.js server code
- Running the system outside Docker
- The Docker file
- Build the image
- Create and run a container with our Express.js app
#### More Dockerfile Directives
- Additional ways to feed the build
- Using a `.dockerignore` file
- More Dockerfile directives
- Two variants of _command_
- Change the default shell
- Different RUN command forms
- Understanding here-document syntax
- ENTRYPOINT vs. CMD
- COPY vs. ADD
- Environment variables (ENV)
- Configuration variables (ARG)
- How to create user and group on Debian/Ubuntu/Alpine
- Change the owner of files
- Tell Docker which user to run as
#### Multi-Stage Dockerfile
- Let's start with a simple Java application
- Sample build & run
- What is the container size?
- Understand build-time vs. run-time
- Setting up a multi-staged build
- Improved Dockerfile, with separation of build from runtime
- Much better image size
#### Dockerfile - Best Practices
- Why best practices
- Use official images
- Use version tag
- Pick a small/lean image
- Reorder to improve layer caching
- Reduce the layer count
- Remove stuff not needed any longer
- Use .dockerignore
- Use multi-staged build
- Create dedicated user
- Spell out options
- Utilize parallel stages
#### Image from Scratch
- How do we create a base/parent image
- Using `FROM scratch`
- Let's build an all-inclusive C++ application
- Sample build & run
- How to create Ubuntu image from scratch
- Usage of debootstrap
- Usage of `docker import`
- Using our own parent image
### Applications
#### Compose with Dockerfile
- Compose script with build directives
- Syntax for the build directive
- Recommendation
- Building compose images
#### Node.js: Express.js / TypeScript / Vite.js Application
- Walkthrough of the source code
#### Java: Spring-Boot / MySQL Application
- Walkthrough of the source code
#### C++: REST-WS Application
- Walkthrough of the source code
### _Section_: Publishing Images
In this section we discuss various ways of make your image available for others to use.
#### Registries & Repositories
- What is a registry and a repository
- Different forms
- Importance of tagging
- Generic step to publish and image
#### Docker Hub Registry
- Using Docker Hub
- Publish to Docker Hub
- Pulling from your own corner of Docker HUb
#### Private Registry
- What is a private registry
- Installation of a private/local registry
- Publishing to a local registry
- Pulling from a local registry
#### Google Cloud (GCP) Registry
- What is GCP
- How Google supports containers
- Publishing to a GCP registry
- Pulling from a GCP registry
### GIT grundkurs
Nivå: beginner | Målgrupp: Programutvecklare | Förkunskaper: Erfarenhet av programmering i något språk
https://www.ribomation.se/programmerings-kurser/git/
Den här kursen ger omfattande kunskaper i GIT och hur du använder det för att arbeta effektivt i både små och stora
programutvecklingsteam. Du får också lära dig att arbeta effektivt mot GIT fjärrservrar, samt kunna ta dig ur olika
misstag.
GIT är det helt dominerande versionshanteringssystemet för programkod, på grund av att det underlättar för team att
arbeta isolerat med delar av koden utan att störa arbetet med andra delar av koden. När det sen är dags att infoga
resultatet gör GIT det mesta av editeringsarbetet via en merge eller rebase operation.
Den här kursen ger omfattande kunskaper i GIT och hur du använder det för att arbeta effektivt i både små och stora
programutvecklingsteam. Du får också lära dig att arbeta effektivt mot GIT fjärrservrar, samt kunna ta dig ur olika
misstag.
- Be able to use BASH effectively
- Be able to write shell scripts to perform routine tasks and configure servers
- Be able to create pipelines of commands
#### Background and Overview
- History
- Properties
- How GIT differs from most other version control systems
#### Basic Operations
- Installation and configuration of a GIT client
- Creating a local GIT project
- Rudimentary configuration
- Viewing help info
- Staging files
- Checking the project status
- Commiting files
#### Working with Commits
- What is a commit
- Understanding HEAD
- Blobs and trees
- Understand the commit ID, i.e. SHA-1 hash
- The organization of the .git/ directory
- Commit messages
- How to pass multi-line commit messages on the command-line from other sources
- Quick commits
- Interactive add
- Viewing the commit history
- Tagging
- Simple vs. annotated tags
- How to view a file for a specific revision
- How to find out what has changed in a file
- How to find how much has changed in a commit
- How to find out who made a change
#### Configuration
- Setting and reading configuration properties
- Local and global properties
- How to exclude generated files, such as `*.class, *.o, *~`
- How to let GIT identify text files and separate out binary files
- How to prevent GIT from removing empty directories
- How to define your own GIT shortcuts
- Creating your own GIT macros with GIT aliases
#### Branching
- What is a branch
- Creating a branch
- Switching to branches
- Listing branches
- Renaming branches
- Deleting branches
- What is *detached HEAD*
#### Merging
- What is a merge operation
- Pre-merge scenarios
- Fast-forwarding merge
- True merge
- Non-conflicting and conflicting merge operations
- Initiating a merge
- Aborting a merge
- Resolving merge conflicts
#### GIT Flow
- Branch categories
- Development branches
- Understanding GIT Flow
- GIT Flow shell extensions
- GIT Flow steps and operations
#### Rebasing
- What is a rebase operation and how do it differs from a merge operation
- Performing a rebase operation, step-by-step
- Aligning branches
- Interactive rebase
- Editing commit messages
- Squashing commits
- Reorder commits
- Skipping commits
#### Using GitLab
- Setting up a GitLab account
- Creating a GitLab project
- Rudimentary configuration
#### Starting a Remote GIT Project
- What is a remote GIT repository
- SSH vs. HTTPS
- Generating SSH keys and register them with a server such as GitLab
- Cloning an existing repo
- Create a new repo and clone it
- Attach a local repo to a newly created remote repo
- Creating a bare repo and clone it locally
#### Working with Remote Repos
- Adding and removing associations to remote repos
- Understanding tracking of remote branches
- Uploading commits (push)
- Downloading commits (fetch)
- Understanding what happens during a fetch operation
- Merging a remote branch with a local branch
- Using pull
#### Collaboration between Remote Repos
- What is a fork operation
- What is a merge request, aka pull request
- Contributing code to a non-authorized repo
- Submitting a merge/pull request
#### Recovering from Mistakes
- Undo code changes
- Undo add
- Undo last commit
- Undo push
- Undo merge
- Undo rebase
- Undo merge commit
- Reset a project to specified commit point
- Fixing a commit to the wrong branch
- Preventing GIT from removing empty dirs
- Creating a source archive file, without its GIT history
#### Stashing
- What is GIT stashing
- Pushing to the stash stack
- Inspecting the stash stack
- Popping from the stash stack
#### GIT Hooks
- What is a GIT hook
- Hookable GIT events
- How to print a message before commit
- Preventing unwanted commit messages
#### Searching the Commit History
- Understanding the log command
- What is GIT bisect
- Bisect initialization
- Bisect bug hunting
- Finishing an active bisect operation
- Scripting bisect bug hunting
#### GIT Tools
- Graphical GIT clients
- Running you own GIT server
- Using the GitHub Desktop
- Show diffs and perform merge operations with Meld and Diffuse
- Incremental merge with `git-imerge`
- Running your own server in seconds with GitBlit
- Running your own full-scale server with GitLab
### Google Test/Mock, Benchmark, Coverage
Nivå: intermediate | Målgrupp: C++ programmerare | Förkunskaper: Stor vana att programmera i C++
https://www.ribomation.se/programmerings-kurser/gtest-gmock-gbench/
Skriv inte en rad produktionskod om du inte skriver testkod samtidigt. Denna kurs
lär dig allt du behöver veta om att skriva enhetstester med Google Test/Mock.
Plus mäta tidsåtgång med Google Benchmark, samt kontrollera hur mycket kodtäckning
du har med gcoc/lcov/genhtml.
I det första avsnittet behandlar vi Google Test fullständigt, inklusive hur man installerar
GTest & GMock (del av samma repo) och Hamcrest matchers (del av GMock).
I det andra avsnittet behandlar vi mock objects delen av GTest/GMock-repo.
Du får lära dig att skapa och konfigurera mock objects, så att ett dylikt kan
matcha förväntade anrop och förväntade argument.
I det tredje avsnittet behandlar vi Google Benchmark, som är relaterat med GTest
men utgör ett helt eget ramverk. Med GBench kan du skriva mikro-benchmarks att
upprätthålla och mäta prestanda för tidskritiska funktioner i ditt system eller
för att jämföra olika implementeringar av samma funktionalitet.
I det fjärde avslutande avsnittet tar vi upp ämnet testtäckning (test coverage),
som involverar instrumentering av test-programmet under kompileringen och kör
olika aggregeringsverktyg för att producera en täckningsrapport, antingen textuell
med `gcov` eller som en HTML-rapport med `lcov/genhtml`.
- Writing test functions with _Google Test_
- Understand how to use different forms of checks, based on target data types
- Writing user-defined predicate tests
- Know have to use Hamcrest matchers
- Using matchers for text comparison
- Using matchers for STL containers
- Know how to write failure tests for various forms of program crashed
- Writing tests with associated external test data
- Designing value-parameterized tests
- Creating and configure mock objects with _Google Mock_
- Writing micro-benchmarks with _Google Benchmark_
- Know how create data sets fo benchmarks
- Understand how to configure GCC for test coverage measurement
- Using `gcov` to generate text reports
- Using `lcov` and `genhtml` to generate multi-page HTML coverage reports
#### What is a Unit Test?
- Why do we write bugs?
- It's not always about bugs
- Time to market
- Cost of fixing bugs
- Eric Gamma & Kent Beck
- What is a unit test?
- Other forms of tests
- Structure of a unit test
- Check one aspect at a time
- The acronym F.I.R.S.T.
- Brief about test-driven development (TDD)
### Google Test
In this first section we cover Google Test completely, including how to install
GTest & GMock (part of same repo) and matchers (part of GMock).
#### Installation of GTest & GMock
- Overview of the package
- GitHub repo
- Steps and alternatives to install it
- (a) Download and build it yourself
- GTest directories
- How to compile a test executable
- Global installation
- Simple CMake file to locate GTest
- (b) Let CMake download and build it for you
- Using FetchContent
- A very simple unit test
- Test runner driver
- User-defined test driver
- _Exercise_: Use CMake to download GTest and write a simple test
#### Test Functions
- GTest is based on CPP macros
- The `TEST(group, name)` macro
- Generated function, as shown by `nm`
- How to inspect generated sources
- Failing a check, how it looks like
- Expectations vs. Assertions
- Failing a set of expections
- Failing a set of assertions
- Boolean checks
- Relational checks
- _Exercise_: Write tests for a simple Person class
#### More about Checks
- Checks fo native strings (C string)
- Comparing C++ strings vs. C strings
- Floating-point checks
- Floating-point operations - problems to be aware of
- Floating-point checks
- Custom error messages
- Predicate checks
- Sample predicate checks
- Explicit failure or success
- Usage of `ADD_FAILURE()`
- Printing values
- _Exercise_: C-style upper-case function
- _Exercise_: Approximate sin(x)
- _Exercise_: Character-unit palindrome
#### Matchers
- What is a matcher?
- How to use matchers
- Build instructions
- Basic usage of `EXPECT_THAT()`
- Relational matchers
- Matchers for primitive expressions
- Text matchers
- Regex matchers
- Floating-point matchers
- Composition matchers
- Container matchers
- Class/struct member matchers
- User-defined matchers
- _Exercise_: Rewrite your previous test, now using matchers instead
#### Failure Tests
- What is a failure test?
- Exception tests
- Checking for a thrown exception
- Checking for the wrong exception
- How to check for abnormal program termination
- _Death test_ checks
- _Death test_ predicates
- Checking for exit code
- Checking for internal signals
- Checking for null-pointer termination (`SEGV`)
- Checking for division by zero termination (`FPE`)
- Checking for invalid call to delete termination (`ABRT`)
- Failed death test
- _Exercise_: Implement and test factorial (n!), that throws fdor negative arguments
- _Exercise_: Implement and test factorial (n!), that terminates the program
#### Test Data & Life-Cycle Functions
- What is test-data?
- Using a fixture class
- Life-cycle methods
- Before/after every test-case
- Before/after a test-group
- Before/after a test-suite
- (a) Implement `testing::Environment `using a global variable
- (b) Implement `testing::Environment` using your own `main()`
- Showing all life-cycle methods in one program
- _Exercise_: Implement an write tests for a word count program that read text files
#### Value-Parameterized Tests
- What is a Value-Parameterized Test?
- How to create a value-parameterized test
- Value generators
- Value from a container
- Values from a numeric range
- Boolean values
- How to combine parameters with expected result
- Advanced value generators
- Cartesian product tuple values
- User-defined value generators
- _Exercise_: Implement and write tests for a left padding function
#### Type-Parameterized Tests
- What is a Type-Parameterized Test?
- How to create a type-parameterized test
- Target container with regular test
- Type fixture and type parameters
- Test macro functions
- _Exercise_: Complete the provided test suite
#### Command-Line Usage
- Running GTest on the command-line
- Selecting tests
- Sample filters
- Repeated tests
- Disabled tests
- Skipping elapsed time
- Skipping coloured lines
- Generate XML reports for post-processing
- _Exercise_: Investigate various CLI options, using your own tests
### Mock Objects
In this section we cover the mock objects part of the GTest/GMock repo.
#### Test Doubles Terminology
- What is and why do we need test doubles?
- Test double types
- Stub
- Spy
- Fake
- Mock
#### Using GMock
- Brief about installation
- Prerequisites on the target system
- Sample C++ interface
- Test-target system
- Test-target method
- How to generate a mock class
- Sample mock class
- A minimal unit test
- Default behaviour of a mock object
- How to hide "Uninteresting" warning printouts, using `NiceMock<>`
- How to do the opposite with `StrictMock<>`
- Be aware of limitations of the pre-processor (CPP)
- How to compensate for the CPP parsing limitation
- How to specify expected behaviour of mocked methods
- Simple configuration
- Argument matchers
- Return values
- Actions
- Invocation cardinality
- Cardinality failures
- _Exercise_: Write mock tests for the provided ATM system
#### Other Testing Frameworks
- Catch2, version 3
- Doctest
- CppUnit
- List of C/C++ testing frameworks
### Benchmarking
In this section we cover Google Benchmark, which related by still a separate framework from GTest/GMock.
With GBench you can write micro-benchmarks to keep track of performance for time-critical functions
in your system or to compare different implementations of the same functionality.
#### What is Benchmarking?
- Benchmarking - a definition
- Benchmarking - a motivation
- Types of benchmarks
- Benchmarking metrics
- Benchmarking tactics
- Pitfalls to be aware of
- A very simple benchmark
- Shortcomings of this implementation
- A slightly less simple benchmark
- The `benchmark()` function
- The `warmup()` function
- The `measure()` function
- Shortcomings of the second implementation
- _Exercise_: Implement the second version and populate a `std::vector`
#### Installation of Google Benchmark
- The GitHub repo of GBench
- Ways of installing GBench
- (a) Using FetchContent in CMake
- Sample JetBrains CLion setup
- (b) Download and build it yourself
- (1-2) Download & unpack
- (3-5) Build & install
- (6) Usage of `find_package()` in CMake
- (7) How to compile on the command-line
- Sample simple benchmark
- _Exercise_: Reimplement your previous benchmark, using GBench
#### Basic Usage of GBench
- Benchmark function(s)
- Registration of a measurement function
- How to provide the `main()` function
- What happens if you don't prevent compiler optimizations?
- Marking the variable as `volatile`
- Marking the variable with `DoNotOptimize()`
- What does `DoNotOptimize()` do?
- What is clobbering the memory?
- Using `ClobberMemory()`
- Excluding timings for a code snippet
- Comparative benchmarking
- Sample comparative benchmark
- _Exercise_: Benchmark `std::sort()`
#### Command-Line Usage of GBench
- Getting help info
- CLI <--> ENV
- Double-check the documentation, because not all is up-to-date
- Setting verbosity level
- Setting the time unit
- Available output formats
- The _console_ format
- Data --> `stdout` and context --> `stderr`
- The _json_ format
- The _csv_ format
- Adding extra context as _key=value_ pairs
- Sending data to an output file
- Re-run a subset of a benchmark suite
- Repeatedly re-run a benchmark
- Mixed output of results and stats
- How to suppress the individual result rows
- Aggregates to `stdout`, but full report to file
- _Exercise_: Investigating the command-line options
#### Benchmark Arguments
- Change of time unit
- Benchmark arguments forms
- Explicit arguments with `Arg()`
- Sparse range arguments with `Range()`
- Change of multiplicator with `RangeMultiplicator()`
- Dense range arguments with `DenseRange()`
- Composite arguments
- Composite arguments range
- Cartesian product of arguments
- Cartesian product of arguments, with generators
- Arbitrary arguments
- Sample usage of a parameter pack function
- Lice-cycle functions
- Setup & teardown hooks
- Fixtures
- User-defined counters
- _Exercise_: Investigate `std::sort()` with various collection sizes
- _Exercise_: Write a benchmark the reads a file using the provided WordIterator and finds the shortest and longest words
### Coverage
In this section we cover the topic of test coverage, which involves instrumenting the test executable
in compile-time and running various aggregating tools to produce a coverage report.
#### What is Test Coverage?
- What do we mean with coverage?
- What is its purpose?
- Types of test coverage
- Function coverage
- Line coverage
- Branch coverage
- Path coverage
- What are the benefits of high coverage percentage?
- Setting realistic coverage goals
- Common misconceptions of test coverage
#### Using GCOV
- Capturing tools for GCC
- How to compile with instrumentation
- What does option `--coverage` do?
- Files generated during compilation
- File generated - an overview
- Simple single-file project - source code
- Simple single-file project - commands
- Simple single-file project - output
- Coverage of project with several files
- Simple multi-file project - class Person
- Simple multi-file project - person generator
- Simple multi-file project - person app
- Simple multi-file project - build.sh
- Simple multi-file project - running the build
- Simple multi-file project - sample output `*.gcov` files
- Setting coloured lines
- _Exercise_: Generate coverage for the person app
#### Usijng LCOV
- What is LCOV?
- Installation of LCOV
- How to download and build LCOV
- Basic usage of this tool
- Simple multi-file and multi-folder project
- File structure
- Application build
- Application run
- Basic usage of program `lcov`
- Contens of `*.info` files
- Sources processed by `lcov`
- How to include just your project files - i.e., exclude stdlib++
- Basic invocation of `lcov`
- Reduce the log output
- Basic usage of program `genhtml`
- How to open an HTML file from the command-line or a shell script
- Using `wslview`
- Sumamry of running `lcov` and `genhtml`
- Remarks about the report HTML & CSS
- _Exercise_: Perform coverage of the project _Just RESTing_
### Java grundkurs
Nivå: beginner | Målgrupp: Programmerare | Förkunskaper: Praktiska kunskaper i något programmeringsspråk
https://www.ribomation.se/programmerings-kurser/java-grundkurs/
Denna kurs ger dig grunderna i språket och delar av det enorma standardbiblioteket, så att du snabbt kan
komma igång efter kursen med programutveckling på server-sidan.
Java är det största applikationsutvecklingsspråket och har utvecklats på ett imponerande sätt under de
två årtionden det har funnits.
Denna kurs ger dig grunderna i språket och delar av det enorma standardbiblioteket, så att du snabbt kan
komma igång efter kursen med programutveckling på server-sidan.
- Know the basic language components of Java
- Be able to write Java programs that use container types
- Understand the use of lambda expressions
- Be able to write programs that handle files
- Be able to create executable JAR files
#### Background and Overview
- Language evolution & Versions
- Editions & Distributions
- Vendors & Implementations
- Documentations
### 1 - THE LANGUAGE
The language syntax, data types and statements.
#### Compilation & Execution of a Java Program
- The syntax at a glance
- A typical Java program
- How to compile
- How to execute
- The directory structure of sources and classes
#### Data Types & Operators
- Line and block comments
- Identifiers
- Reserved words
- Variables
- Integral data-types and literals
- Floating-point data-types and literals
- Boolean
- Characters
- Strings
- Arrays
- Enums
- Arithmetic operators
- Assignment expression operators
- Relational operators
- Logical operators
- Conditional operator
- Printing to the console
#### Statements
- If statements
- While loops
- For loops
- For-each loops
- Break & continue
- Switch statements
- Imports of classes
- Reading data from the console
#### Functions
- Function declarations
- Static functions
- Overloaded functions
### 2 - CLASSES
Syntax and usage.
#### Class Syntax
- Data abstraction and the idea of classes
- Syntax
- Visibility
- Constructors
- Member variables
- Initialization
- Pointers in Java
- Pointer this
- Null pointers
- Function toString
- Static members
#### Extended Classes
- Extendable strategies and the idea of inheritance
- Syntax
- What do we mean by inheritance
- Creating sub-class objects
- Dynamic binding of function calls
- Usage of @override
- Final methods
- Abstract functions and classes
#### Interfaces
- The purpose of using interfaces in Java
- Interface constants
- Static interface functions
- Default interface functions
#### Exceptions
- What is an exception
- Throwing and catching exceptions
- Understanding the flow of control
- Stack traces
- Checked and unchecked exceptions
- JVM errors
- Standard exception classes
#### Inner Classes
- Static inner classes
- Anonymous classes
- Class constructors
- Anonymous constructors
- Function `finalize()`
#### Special Classes
- Enum classes
- Wrapper types
- Conversion functions
- Autoboxing
- Class `java.lang.Object`
- Class `java.lang.Class`
- Class loading
#### Generics
- Generic functions
- Generic classes
- Generic interfaces
- Type restrictions
#### Lambda Expressions
- What is a lambda expression
- What is a functional interface
- Basic syntax
- Various use cases
- Instance method reference
- Static method reference
- Constructor method reference
- Lambda oriented functional interfaces
#### Annotations
- What is an annotation
- Usage of annotations in various libraries
- Syntax
- Default values
- Single value attribute
- Specifing annotation placements
- Keeping annotations until run-time
### 3 - THE LIBRARY
The most used parts of the large standard library.
#### Text Manipulations
- String
- StringBuilder
- Pattern & Matcher
- Regex support in java.lang.String
- Class Formatter
- Class SimpleDateFormatter
#### Date & Times
- Date
- Calendar
- Typical idioms for date-time manipulations
- Overview of the date-time support in Java 8
- Calendar Builder
#### Collections
- Overview of interfaces and implementing classes
- List & Array-/LinkedList
- Map & HashMap & TreeMap
- Understanding the for-each loop
- Utility classes
- Ordering of objects
- Queue
- Iterator
- Class Properties
- Class PropertyResourceBundle
#### Input & Output
- Text-oriented I/O
- Reader & Writer
- File
- Typical I/O idioms
- Binary I/O
- Input-/OutputStream
- Serialization
- Class java.io.File
- Path & Paths
- Utility class java.nio.file.Files
#### Pipeline Streams
- What is a pipeline stream
- The anatomy of a pipeline
- Stream sources
- Bounded streams
- Aggregators
- Collectors
- Collection aggregation
- String element joining
- Understanding reduce()
- Function filter()
- Function map()
- Sorting
- Other filters
### 4 - DEVELOPMENT
Brief about how to develop Java applications.
#### JARs & DOCs
- Understanding JAR files
- Setting the class-path
- Packing a library into a JAR file
- Executable JARs
- Understanding JavaDocs
- Running javadoc
#### Build Tools
- What is a build toll
- Typical build tool tasks
- Evolution of Java build tools
- What is a dependency
- What is an artefact repository
- How to find 3rd party open-source libraries
- What is a Maven proxy server
- What is a Maven artefact repository server
- Contemporary development work-flow
- Brief introduction to Gradle
#### Application Types
- Applications with GUI
- Java Web Start
- Servlets & JSP
- EJB
- REST WS applications
- Tests
### JavaScript för programmerare
Nivå: beginner | Målgrupp: Web programmerare | Förkunskaper: Kunnande i något program/script-språk
https://www.ribomation.se/programmerings-kurser/javascript/
faktorer, såsom att JS finns på både klient-sidan (webbläsaren) och server-sidan (Node.js). Men också att
språket har evolverat till ett fullgott sådant under det senaste decenniet.
JavaScript (JS) är helt klart det primära programspråket för applikationsutveckling. Det finns flera bidragande
faktorer, såsom att JS finns på både klient-sidan (webbläsaren) och server-sidan (Node.js). Men också att
språket har evolverat till ett fullgott sådant under det senaste decenniet.
I denna kurs fokuserar vi på de
moderna aspekterna av JavaScript och hur du kan ta vara på den mångfald av alternativ som finns. Du får också
lära dig att använda transpilers som Babel och bundlers som Parcel, så att du kan programmer med moderna
förtecken men ändå kunna exekvera webbapplikationer på äldre webbläsare.
Du får också lära dig att använda
API:er i moderna webbläsare, såsom kunna använda kameran, ta bilder, ta reda på aktuell GEO position, veta
när app:en är offline, kunna utföra AJAX anrop och mycket annat.
- Manage functions and lambda expressions
- Work efficiently with arrays
- Be able to create and manage object literals
- JSON serialization
- Work with spread operator
- Can array destructuring
- Know object destructuring
- Define classes with fields and getters & setters
- Using BigInts
- Understand and be able to use the call-back (continuation) model
- Be able to handle promise object
- Understand the concept of promise chain
- Be able to implement async functions
- Know what an IIFE is
- Understand the module concept in Node.js
- Understand the module concept in ES6
- Be able to use NPM
- Be able to use CLI modules with NPX
- Use Parcel bundler
- Use Babel trans arrows
- Use Jasmine unit testing
- Be able to manipulate DOM nodes
- Be able to handle DOM events
- Be able to make AJAX calls
- Be able to copy to / from the clipboard
- Be able to read the current GEO position
- Configure network status notification
- Be able to take a photo in a web app
- Be able to handle local / session storage
- Know the basics of Indexed DB
#### Background & Overview
* Language properties
* EcmaScript
* ES versions
* Node.js
* Browser compatibility
#### 1 - LANGUAGE
#### Basic Syntax & Types
* Program structure
* Identifiers & variablers
* Function scope vs. block scope
* Scalar types
* Operators
* Statements
* Functions
* Functions statement & expression
* Default parameters
* Hoisting
* Lambda expressions (aka fat arrows)
#### Arrays
* Array literals
* Insertions & removals
* Iterations
* Manipulations
* Finder functions
* Predicate taking functions
* Sorting
* Inflating arrays
* Array streams
#### Objects
* Object literal
* Creating objects
* Constructor function
* Object properties
* Prototype chain
* The Object object
* Packing and unpacking objects
* Immutable objects
* Cloning objects
#### JSON
* JSON syntax and types
* JSON serialization
* JSON de-serialization
* Serialization hooks
#### Spreading & Destructuring
* The spread operator
* Rest parameters
* Simplified object construction
* Array destructuring
* Object destructuring
* Destructuring in function parameters
#### Classes
* Syntax
* Static variables & functions
* Getters & setters
* Public & private fields
* Subclasses
#### Library Types
* Number range and integral values
* Parsing text with numeric values
* Formatting numbers
* The Math object
* Large integers (BigInt)
* String creation functions
* String selectors
* Regex
* Date
* Parsing text with date values
* Set & Map
#### 2 - ASYNC
#### Call-backs
* The JS execution model
* JS event loop
* Node.js call-backs
* The continuation model
* Postponed computation
* Periodic computation
#### Promises
* Limitations of the call-back model
* What is a promise object?
* Creating promises
* Understanding resolve & reject
* Promise chains
* Waiting for many promises at once
* Using .catch()
* Call-back taking function to promise returning function
#### Async Functions
* What is an async function?
* Async & await
* Async lambda
* Invoking async functions in a loop
#### 3 - MODULES
#### IIFE - Immediately Invoked Function Expressions
* What is an IIFE?
* The module idiom
#### Node.js Modules
* Using require()
* Built-in modules
* User-defined modules
* Module folder
* Briefly about the internals of require()
#### NPM & NPX
* What is NPM?
* Installing a local package
* Installing a remote package
* Dependencies
* Useful NPM commands
* NVM - Node Version Manager
* Global NPM modules
* What is NPX?
* Recommendations
#### ES6 Modules
* What is ES modules?
* Export forms
* Import forms
* Path forms
* Using ES6 modules in Node.js
* Using ES6 modules in a modern browser
#### Transpilers & Bundlers
* What is a transpiler?
* What is a pre-processor?
* What is a post-processor?
* What is a bundler?
* Typical operations of a bundler
* What is a build tool?
* Gulp.js
* Parcel
* Usage of Parcel for development
* Usage of Parcel for application build
* Babel
* Configuration of Babel
* Translation examples of Babel
#### Unit Testing
* Using Jasmine
* Using Jest
* Test groups
* Test functions
* Matchers
* Life-cycle functions
* Test selection
#### 4 - BROWSER
#### Working with DOM
* What is DOM?
* Linking to JS files
* Script attributes
* Linking to CSS files
* Link attributes
* Finding DOM elements
* Node contents
* Manipulating CSS on DOM elements
* Structurally modifying DOM
* DOM element attributes
#### DOM Events
* What is a DOM event?
* Registering an event handler
* Common event properties
* Click events
* Form events
* Keyboard events
* Key event properties
* Mouse events
* Browser events
* Event propagation
* User-defined events
* Dispatching events
#### AJAX
* What is AJAX?
* The XMLHttpRequest API
* A generic AJAX function
* The Fetch API
#### The Browser API
* What is BOM?
* The window object
* The location object
* Implementing text selection
* Handling the clipboard
* Obtaining the current geo position
* Obtaining network status and information
* Capturing video and taking a photo
* Brief about service workers
#### Browser Storage
* Key:value storage API
* Indexed DB concepts
* Simple Indexed DB usage
### Jenkins konfiguration
Nivå: beginner | Målgrupp: Programutvecklare och dev-ops personal | Förkunskaper: Erfarenhet av driftsättning av applikationer
https://www.ribomation.se/programmerings-kurser/jenkins-usage/
Lär dig allt om att installera, konfigurera och hantera Jenkins CI/CD server.
Denna omfattande kurs erbjuder en djupgående inblick i Jenkins CI-server, ett
kraftfullt verktyg för bygg- och leveransautomatisering. Vi börjar med grunderna
och avancerar sedan till mer komplexa begrepp, täcker allt från installation,
konfiguration, till att skapa och hantera jobb.
En central del av vår undervisning fokuserar på integrationen av Jenkins med GIT
och användningen av olika plugins för att optimera ditt arbetsflöde. I kursens
många praktiska övningar får du installera och konfigurera Jenkins server i
Amazon-molnet AWS och koppla ihop med GitHub.
Kursen är utformad för att passa både programmerare och dev-ops personal, och
syftar till att hjälpa dig att implementera effektiva system för kontinuerlig
integration och leverans. Följ med oss och lär dig hur du kan utnyttja kraften i
Jenkins CI-servern i ditt eget arbete.
Glöm inte att kika på (_den kommande_) fortsättningskursen.
Du får då lära dig allt om Jenkins pipeline jobs, olika kategorier av pipeline jobs,
hur du enhetstestar pipeline kod. Vi börjar den kursen med att gå igenom språket
Groovy, som du behöver för att skriva pipeline kod.
- Deep understanding of Jenkins CI server and its core functionality.
- Step-by-step guidance on installing Jenkins on various operating systems, including Linux and macOS.
- Techniques for configuring Jenkins for optimal performance, including plugin selection and user management.
- Setting up and managing jobs in Jenkins, and understanding different job types.
- Comprehensive knowledge of version control systems (VCS), focusing on Git integration with Jenkins.
- Usage of private Git repositories within Jenkins and handling credentials securely.
- Setting up and configuring various notifications and remote build agents for enhanced collaboration.
- Detailed understanding of different job types including building an application, deployment jobs, and multi-configuration jobs.
- Management skills for Jenkins with topics covering Jenkins CLI usage, backup & restore procedures, and configuration of authentication & authorization.
- Lessons about securing Jenkins server access through forwarding proxies and HTTPS.
- Overview of the Amazon AWS cloud platform as the course is designed with practical exercises performed in AWS.
- Necessary AWS concepts for Jenkins management and deployment such as EC2, IAM, S3 among others.
- Monitoring Jenkins performance using tools like Prometheus and Grafana for proactive issue resolution.
- Best practices for Jenkins administration and troubleshooting.
- Encourages participants to think creatively about how they can tailor Jenkins to meet their own or their organization's specific needs.
#### Jenkins Overview
- Kohsuke Kawaguchi - The inventor
- How Hudson became Jenkins
- What is Jenkins CI server?
- What is _continuous integration_?
- What is _continuous deployment_?
- Typical developer workflow
- Architecture
- Terminology
- Job structure
#### Case Studies
Some case studies, from the trenches.
### Brief About AWS
We will deploy and manage Jenkins in the Amazon AWS cloud, so this section will
discuss just the absolute essentials of AWS in order to carry out the practical
exercises of the course.
#### Introduction to AWS
- What is _cloud computing_?
- What is _SaaS_?
- What is _XaaS_?
- Regions and zones
- Pricing model
- Virtual servers by EC2
- Firewall configuration by security groups
- SSH key pairs
- Authentication and authorization by IAM
- Static IP address allocation by EIP
- DNS using Route53
- Emails by SES
- AWS dev tools
- AWS CLI
#### How to launch an EC2 server
- More about EC2
- Steps to launch a server
- Choose region and zone
- Create SSH key-pair
- Create a security group (firewall rules)
- Choose an AMI
- Choose a machine instance type
- Configure instance details
- Configure a virtual hard-drive
- Attach the security group
- Attach the key-pair
- Connect to the server via the AWS browser console
- Connect to the server via SSH from the command-line
- Which username to login as (_depends on OS_)
- How to prevent losing the SSH connection
- How to get rid of the fingerprint SSH prompt
- Attaching a static IP
- Topics of AWS to be aware of, but not covered here
### Jenkins Fundamentals
How to install, configure and create jobs.
#### Installation
- Different installation forms
- Recommended hard-ware
- Steps to install on a Linux system (EC2)
- Preparation - installation of JDK
- Configure APT and install Jenkins
- How to recover, if something goes wrong
- How to control the jenkins server
- Using `systemctl`
- Installation on macOS
- Installation using Docker
#### Configuration
- Browse to the jenkins server
- How to unlock the server, to start the configuration
- Choose plugins
- Create an admin user
- Check its URL
- Overview of the configuration screens
- Light vs. dark mode
- Users
- View its home directory
- Some post-installation tasks
- How to change the TCP port, if needed
- How to reset/recover from lost admin password
#### Plugins
- What is a Jenkins plugin?
- Categories
- How to search for a plugin
- Check it activity and latest release date
- How to install a plugin
- Jenkins restart
- How to install a custom plugin
#### Simple Jobs
- Job list view
- Job types
- Single job view
- Job structure
- Build triggers
- Getting help
- Environment
- Steps and actions
- Post-build actions
- Output
- Workspace
- History
- Job folders
### GIT and Other VCS
In this section we discuss various topics related to fetching project files from
a VCS or GIT repo.
#### VCS Support in Jenkins
- What is a VCS (_Version Control System_)?
- VCS support in Jenkins
- List of available VCS plugins
- Understand the difference between the `Git` plugin and the `GitHub` (_or GitLab_) plugin
#### Fetching Files from GIT
- Git job configuration
- Branches
- Different triggers
- Setting up GitHub connections
- Manual builds
- Periodic builds
- Push triggered builds
#### Credentials
- What are credentials?
- How to use credentials in Jenkins
- Using the Credentials Manager
- Scopes
- Domain groups
- Types
- Secret text credentials
- GitHub access tokens
#### Cloning a private GIT repo via HTTPS
- How to access a private repo
- HTTPS vs. SSH
- GitHub clone using HTTPS
- Create an access token
- Create an HTTPS access credential
- Configure a build job with HTTPS clone
#### Cloning a private GIT repo via SSH
- GitHub clone using SSH
- Generate an SSH key-pair
- Register the public key with GitHub
- Create an SSH private key credential
- Configure a build job with SSH clone
### Notifications
In this section we discuss how to set up various notifications.
#### Notifications Overview
- What is a job notification?
- When can you perform a notify action?
- Notification types
#### Email Notifications
- What is email notification?
- Email notification plugins
- SMTP configuration
- Problems of email configuration
- SendGrid SMTP relay configuration
- Configure Jenkins to send emails
- Post build notification
#### CatLight Notifications
- What is CatLight?
- Installing CatLight
- Configure CatLight notification in Jenkins
#### Slack Notifications
- What is Slack notification?
- Slack notification steps
- Create a Slack app
- Configure bot token scopes
- Add Jenkins to a Slack channel
- Create a secret text credential for Slack
- Configure system Slack settings
- Using Slack notification in a build job
### Remote Agents
In this section we discuss why and how you set up remote build agents.
As a rule of thumb; never run build jobs on the main Jenkins controller,
always use build agents running on different server machines.
#### Build Agents Overview
- What are build agents?
- Why (always) use build agents?
- Static build agents
- Dynamic build agents
- Docker build agents
#### SSH Build Agents
- Using the _SSH Build Agent_ plugin
- Configure a SSH private key credential
- Launch a EC2 Linux instance
- Sign in and install Java JDK
- Configure agents on the main Jenkins server
- Agent labels
- Agent host key verification strategy
- Launch build jobs on an agent
- Launch build jobs based on labels
- Configuring a Ubuntu Linux agent (debian)
- Configuring an Alma Linux agent (redhat/centos)
- Launching a Linux build job
#### Windows Build Agents
- How a windows agent differ from a linux agent
- Launch a Windows EC2 instance
- How to log in to the Windows server (_N.B., has no SSH_)
- Using RDP
- Decrypting the Windows Administrator password
- Install Java JDK
- Configure the Jenkins controller to use the Windows agent
- Prepare the agent machine for Jenkins
- Download the `agent.jar` file
- Launch the agent directly
- Make the agent a Windows service
- Ensure the service runs as a non-privileged user
- Launching a Windows build job
#### Dynamic Build Agents
- How to utilize EC2 and create a dynamic number of agents
- Create an IAM account
- Create a key-pair
- Create a launch template
- Create an auto-scaling group
- Create a Jenkins credential with AWS access & secret keys
- Install the EC2-fleet Jenkins plugin
- Configure the EC2 agent fleet
- Launching a single job on the agent fleet
- Launching multiple jobs on the agent fleet
#### Docker Build Agents
- Setting up a Docker host, i.e., launch EC2 Linux machine and install Docker daemon
- What are the benefits of using Docker agents?
- Different ways of utilizing Docker in build jobs
- Prepare the Docker host for Jenkins
- Configure the Jenkins controller to use the Docker agent
- Launching a Docker build job
### Job Types
In this section we discuss various job types, such as building an application
vs. deploying an application, and more.
#### Parameterized Jobs
- What is a parameterized job?
- How is it defined?
- How is it working?
- Parameter types
#### Multi-Configuration Jobs
- What is a multi-configuration job?
- What is the purpose of such a job?
- How to create and configure a multi-configuration job
- Various multi-config axis and how to configure them
#### Application Build Jobs
- Commonly used build tools
- How to find and install build-tool plugins
- Tool configuration
- Let Jenkins download and install specific versions
- Sample Java Maven job
- Sample JavaScript Node.js NPM job
- Sample C++ CMake job
#### Artifact Storage Jobs
- What is an artifact
- Language specific artifact types
- What is an artifact storage server
- Installing and running Nexus as a Docker container
- Wait for a few minutes before browsing
- Obtain the temporary password
- Logging in and perform rudimentary configuration
- Install the _Nexus Artifact Uploader_ Jenkins plugin
- Configure the plugin
- Create a Maven freestyle job that uploads a JAR to Nexus
#### Deployment Jobs
- What do we mean by deployment?
- Accessing a service running on a remote server
- How to deploy a Java WAR to a Tomcat application server
- How to deploy a Node.js Express.js application to a server
- How to deploy a Vue.js PWA to a nginx server
#### PipeLine Jobs
This chapter just briefly touches on pipeline code, because we have a full
course devoted to writing Jenkins pipeline code.
- What is a pipeline job?
- What is Groovy?
- Inline pipeline code
- Remote `Jenkinsfile` code
### Administration Tasks
In this final section, we discuss various topics a Jenkins admin need to
understand and perform.
#### Jenkins CLI
- What is the Jenkins CLI?
- What is its purpose?
- Installation and configuration of the CLI
- Typical CLI tasks
#### Backup & Restore
- What do we mean with make a backup of a Jenkins server?
- What do we mean with performing a restore
- The importance to backing up to remote storage
- Various backup & restore alternatives
- Using the ThinBackup plugin
- Performing a backup, using thin-backup
- Performing a restore, using thin-backup
#### Authentication & Authorization
- What is authentication?
- What is Authorization?
- Various alternatives for Jenkins
- Matrix authorization
- GitHub Organization users
#### Secure Access
- How can we secure the access to our Jenkins server?
- What is a forwarding proxy and why might it be useful?
- Installing nginx
- Configure nginx to be a forwarding proxy to a Jenkins server
- Brief about HTTPS
- How to configure HTTPS on nginx
- How to use an AWS load balancer with HTTPS access
#### Supervision of the Jenkins Server
- Why do we need to monitor Jenkins?
- What is Prometheus?
- What is Grafana?
- Installation of the tools
- Configuration of Jenkins to send metrics to Prometheus
- Viewing metric data via Grafana
### JUnit enhetstestning
Nivå: intermediate | Målgrupp: Java programmerare | Förkunskaper: Stor erfarenhet av att skriva Java kod
https://www.ribomation.se/programmerings-kurser/junit/
Denna kurs vänder sig till Java utvecklare som ska börja eller precis börjat i ett Java projekt som använder sig av
enhetstestning med JUnit och önskar snabbt bli produktiv.
Enhetstestning (unit testing) är idag en förutsättning för att upprätthålla hög programkods-kvalitet. Du får lära dig om
JUnit version 5, AssertJ assertions, hur man använder mock-objects och mycket mera under denna fullmatade kursdag.
Denna kurs vänder sig till Java utvecklare som ska börja eller precis börjat i ett Java projekt som använder sig av
enhetstestning med JUnit och önskar snabbt bli produktiv.
- The principles of device testing
- The principles of test-driven-development (TDD)
- JUnit version 5
- Test method annotations
- Assertions and matches
- Use of AssertJ assertions
- Repeated tests
- Parameterized tests
- Parallel execution of test
- Dynamically generated tests
- Conditionally performed tests
- The principle of mock objects and the use of Mockito
- JUnit with construction tools such as Maven and Gradle
- Other frameworks based on JUnit
#### Unit Testing and Test-Driven Development
- Background of JUnit
- What is a unit test
- What is an integration test
- What other form of tests are there
- What is TDD (Test-Driven Development)
- Installation of JUnit
#### Basic JUnit Usage
* Installation of JUnit
* Test methods
* Test method annotations
* Using test assertions
* Using display names
* Running inside IntelliJ (or your favorite IDE)
* Compiling and running tests from the command-line
#### Assertions
* Assertions overview
* Optional messages
* Checking for equality of primitive types
* Checking for equality of objects
* Checking for equality of iterables
* Checking for matching lines
* Checking for thrown exceptions
* Checking for time-limited execution
* Grouped assertions
* Assertion guards
* Direct failure
#### Life-Cycle Methods
* Loading test data files
* @BeforeEach / @AfterEach annotations
* @BeforeAll / @AfterAll annotations
* Nested test classes
#### Conditional Test Execution
* Assumptions
* Enable/disable test based on OS
* Enable/disable test based on JRE version
* Enable/disable test based on JVM system property value
* Enable/disable test based on OS environment variable value
* Enable/disable test based on result of JavaScript expression
#### Build Tool Support
* Application builds
* Build tool evolution
* What is a dependency
* What is an artefact repository
* How to find 3rd party libraries
* What is transitive dependency
* Source code organization of a project directory
* What is Maven
* Sample POM
* Maven commands
* Maven build phases
* How to run tests in Maven
* Maven test results report
* What is Gradle
* Dependencies in Gradle
* Sample Gradle build file
* The Gradle wrapper
* Gradle test support
* How to run tests in Gradle
* Gradle test results report
#### Using Assertion Libraries
* What is an assertion library
* What is Hamcrest
* What is AssertJ
* Installation of AssertJ
* Usage of AssertJ
#### Mock Objects
* What is a mock object and why you want to use it
* Overview of some mock-objects libraries
* Using Mockito
* Creating mock objects
* Setting up the expected behaviour of the test’s surrounding
* Verifying the outcome
* Argument matchers
* Mock annotation
#### Test Variants
* JUnit 5 configuration
* Parallel test method execution
* Repeated tests
* Parameterized tests
* Parameterized based on simple values
* Parameterized based on enum values
* Parameterized based on values factory method
* Parameterized based on CSV values
* Dynamically generated tests
#### Other Testing Frameworks
* TestNG
* Spock
### Modern C++
Nivå: intermediate | Målgrupp: C++ programmerare | Förkunskaper: Stor vana att programmera i C++
https://www.ribomation.se/programmerings-kurser/cxx-modern/
Med nya standarden C++ har C++ blivit en stark utmanare till hippa moderna språk. C++ har egenskaper
som duck-typing, lambda uttryck och ett rikhaltigt standard-bibliotek, allt exekverat i en hastighet som alla
andra språk inte ens kan drömma om.
Vi är själva lyriska över hur C++ utvecklats som språk och systemutvecklingsplattform de senaste åren. Med nya standarden
C++ har C++ blivit en stark utmanare till hippa moderna språk. C++ har egenskaper som duck-typing, lambda
uttryck och ett rikhaltigt standard-bibliotek, allt exekverat i en hastighet som alla andra språk inte ens kan drömma
om.
Denna kurs vänder sig till dig som redan arbetar i C++, men vill förstå och sätta dig in vad begreppet Modern C++
verkligen innebär.
- Use duck typing with auto and Java-style for-each loops
- Immerse yourself in the application of lambda expressions
- Understand, use and realize move semantics yourself
- Use smart pointers
- Use regular expressions (regex) for search and substitution
#### Evolution of C++
- From `cfront`, Classic C++ and into Modern C++
- Design objectives
- Some myths and facts of C++
#### Syntactic improvements of the language
- For-each loops
- Uniform initializer
- Static initializer lists and collections
- Member variable initialization
- Usage of nullptr
- Variable initialization in if and switch statements
- Enforcing compiler generated members
- Deleting compiler generated members
- Grouping in integral literals
- Binary literals
- Nested namespaces
#### Automatic Type Inference (auto)
- Usage of auto
- Flexible variable declarations with auto
- Functions returning auto
- Pinpointing the return type of auto-return function
#### Handy Helper Types
- Usage of std::pair
- Usage of std::tuple
- Structured binding, a.k.a. multi-assignment
- Initializing more than a single variable of different types, in a for-loop
- Dealing with absence of data using std::optional
- Dynamically typed variable using std::any
- Type-safe unions with std::variant
- Using std::bitset
- Writing and reading bitset objects
- Working with compile-time rational numbers std::ratio
- Arithmetic and relational operations on ratio objects
#### Lambda Expressions
- What is a lambda expression?
- Lambda declaration syntax
- Invoking lambda expressions
- Understanding capturing to access variables in the surrounding lexical scope
- Writing functions that take lambdas as a parameter
- Returning lambdas from functions
#### Move Semantics
- Understanding references
- The key difference between rvalue and lvalue references
- What is move semantics?
- Implementing move constructors and assignment operators
- How is move semantics utilized in the standard library
#### Enhanced Templates
- Type traits
- Type operators
- Understanding constexpr functions
- Using static_assert
- Using constexpr if statements to guide the compiler
- Inline variables
- Using auto for non-type template parameters
- Variadic templates
- Fold expressions
#### User-Defined Suffix Literal Operators
- What is a suffix operator?
- Operator definition syntax
- Type restrictions
- Example, implementing suffix operators and operations for the length units kilometre and English mile
#### Improved String Handling
- SSO – Short string optimization
- The string suffix operator
- Numeric conversion functions
- Using to/from_chars
- Raw strings
- Unicode support
- Added functions
- Fast phrase searching using Boyer-Moore and similar algorithm implementations
- Using string_view projections
- What is string_view?
- Working with std::string_view objects
- The string_view suffix operator
- Converting to std::string objects
- Example, parsing a HTTP request string
#### Regex support
- What is a regex
- Creating std::regex objects
- Matching strings with patterns
- Searching with patterns
- Replacing string fragments based on patterns
- Iterating over a string, based on patterns
- Splitting and joining strings
#### Date/Time/Clock handling
- Working with clocks
- Understanding the difference between high_resolution/system/steady _clock
- Implementing a versatile function that computes the elapsed time
- Working with std::chrono::duration objects
- Duration literals and suffix operators
- Using std::chrono::duration_cast
- Working with std::chrono::time_point objects
- Time conversion functions
- Printing formatted date-time values
- Parsing formatted date-time values
- Setting the iostream locale
#### Smart pointers
- What is a smart pointer, and why should I bother
- Using std::unique_ptr objects to manage heap allocated blocks
- The convenience of using factory functions
- Adding a custom deleter to a smart pointer
- Working with legacy memory allocations and smart pointers
- Using std::shared_ptr objects to keep track of heap allocated objects using reference counting
#### Random Number Generation
- Random generation engines
- Stochastic distributions in the library
- Generating random numbers
- STL functions that uses random generator engines
#### Additional STL Container Types
- Compile-time sized container using std::array
- Hash-set based containers, std::unordered_set/map
- Understand the std::hash function
- User-defined hash function
- Single-linked list std::forward_list
- STL adapter iterator factory functions
#### Files and File Systems
- Working with fs::path objects
- Manipulating path objects
- Extracting path components
- Using path predicates
- Iterating over directory entries
- Using fs::directory_entry objects
- Recursively iterating over directory entries
- Working with POSIX permissions
- File manipulation operations
- Reading the content of a text file into a std::string object in one single step
- Typical file usage idioms
#### Threading Support
- What is a thread?
- What is the POSIX Threads API?
- Creating std::thread objects
- Waiting for thread termination
- Sleeping and yielding
- Obtain the number of processing units (aka CPU)
- Using std::mutex objects and locking
- Implementing an ostream synchronized output adapter
- Recursive and timed locks
- Lock adapters
- Read/Write locks
- Using std::condition_variable objects for inter-thread communication
- Deadlock avoiding multi-locking
- Atomic operations types
#### Asynchronous Tasks
- What are promises and futures?
- Sending data via a std::promise
- Receiving data via a std::future
- Launching std::async tasks
- Launch policies
- Broadcasting results using std::shared_future
#### Upcoming/Planned Features in the Standard
- Good support for user-defined memory management (std::pmr)
- Parallel versions of STL algorithms
- Pipeline data streams using STL ranges
- Compile-time validation of template arguments using concepts
- Synchronized output stream wrapper
- Calendar operations
- Time-zone operations
### Node.js grundkurs
Nivå: intermediate | Målgrupp: JavaScript programmerare | Förkunskaper: God erfarenhet av att programmera i JavaScript
https://www.ribomation.se/programmerings-kurser/nodejs/
I den här kursen får du lära dig grunderna i Node.js, såsom streams och event-emitter, samt praktisk
tillämpning av detta och bekantskap med några av de vanligaste ramverken, såsom Express, Jest med flera.
Node.js har på mindre än ett decennium fullständigt ändrat perceptionen av JavaScript och vad det kan användas för.
Plattformen har klart kommit att starkt utmana Java som applikations utvecklings platform.
Ett vanligt begrepp är full-stack development, som innebär användning av JS på browser-client sidan i form av SPA
ramverk som Angular eller Vue, användning av JS på server sidan i form av Express REST web services servrar
och användning av JS/JSON i databasen i form av Firestore med flera.
I den här kursen får du lära dig grunderna i Node.js, såsom streams och event-emitter, samt praktisk
tillämpning av detta och bekantskap med några av de vanligaste ramverken. Vidare, får du också lära
dig om de vanligaste ramverken i Node, såsom Express, Jest, fetch, med flera.
Node.js utvecklas i snabb takt, med två releaser per år, vilket ställer krav på att vara uppdaterad
med det senaste som Node stödjer.
Denna kurs har precis blivit uppdaterad och omarbetad till att innefatta Node version 18. Detta innebär
bland annat att vi i de större programexemplen använder ES modules (ESM), async functions och rent
allmänt använder språket till fullo.
- Understand how Node.js executes
- Write programs with event emitters
- Write programs that handle files
- Implement HTTP clients and servers
- Implement web applications with Express.js
- Implement REST web services with Express.js
- Implement REST web services with Fastify
- Using a MySQL database
- Using a PostgreSQL database
- Perform unit testing with Jest
- Perform unit testing with Vitest
- Handle servers with nodemon
#### Background and Overview
* History
* Ryan Dahl
* Properties
* Architecture
* Wrapping the LINUX system API
* Installation of NodeJS and NPM
* Running the REPL
* Running script files
* NodeJS API documentation
#### 1 - MODULES
#### Common.js Modules
- Modules in Node.js
- Understanding require()
- Usage of built-in (core) modules
- User-defined file modules
- User-defined folder modules
- Modules folder
- Understanding the module concept
- Scope
- IIFE
- The module design pattern
- How to implement a simple require()
- A glims beind Node's own implementation of require()
#### ES Modules (ESM)
- ES versions and Node.js
- What is ES modules?
- ESM support in Node and from which version
- How to apply ESM in modern Node
- Export forms
- Import forms
- Path forms
- Importing core API modules
#### Using TypeScript with Node.js
- Anders Hejlsberg
- Brief about strong typing
- Installation of TS
#### 2 - REMOTE MODULES
#### Using NPM
- Isaac Z Schluter
- What is NPM?
- Installation of a NPM local package
- Installation of a remote NPM package
- Dependencies, app vs. dev
- Useful commands
- Beware of the node-bloat problem
- Publishing a NPM package
- Using a private NPM registry
- Verdaccio
- Alternatives to NPM, such as PNPM and Yarn
#### Node Scripts
- Node shell scripts
- Deployment
- Installation
#### Using NPX
- The problem of globally installed Node scripts
- Install locally and use NPX
- How to install ephemerally and use NPX
- Usage of the package option
- NPX is really NPM exec
- Kick-starting a fresh project
- Script entries in package.json
#### 3 - ASYNCHRONOUS EXECUTION
#### Call-Backs
- How do JS execute?
- The JS event loop
- The JS call-back queue
- The event loop of Node
- Postponed and periodic computation
- The Node API is a wrapper around the Linux API
- Why you cannot translate a C program straight into Node
- Understanding the continuation style
#### Promises
- Limitations of the call-back model of design
- Understanding a JS promise
- Using promises
- Promise chain
- Usage of .then() and .catch()
- How to convert a function taking a call-back into a function returning a promise
#### Async Functions
- Similarity between a promise-chain and a try-catch block
- Async functions in ES2017
- Using async and await
- Async lambda
- Using await in a loop
- Top-level await in ES2020
#### 4 - Emitters and Streams
#### Event Emitters
- What is an event emitter in Node?
- Event types and listeners
- Emitter definition
- Simple emitter
- Receive events
- Receive an event just once
- Dealing with event errors
#### Buffers
- What is a Node buffer?
- Allocating a buffer
- Usage of a buffer
- Slicing a buffer
- Encodings
#### Streams
- What is a Node stream?
- Using .pipe()
- Stream types
- Implementing a Readable
- Implementing a Writable
- Implementing a stream transformer
- Assembly of stream pipeline
- The LineTransformer
- The SplitTransformer
- The Array2ObjectTransformer
- The JsonArrayTransformer
- Useful helper libraries
#### 5 - CORE API
#### Working with Processes
- Child processes in Node
- Using execFile()
- Using exec()
- Using spawn()
- Using fork() and send messages
- Handling POSIX signals
- Sending signals
#### Working with Files
- The fs module
- List of functions with Linux similarities
- Promised based functions
- The path module
- POSIX error codes
- Different ways writing to stdout
#### HTTP Server
- List of built-in network services
- A simple HTTP server
- Serving files
- A simple REST WS server
#### HTTP Client
- Simple GET request
- Handling errors
- Simple POST request, sending data
#### 6 - SELECTED FRAMEWORKS
#### Unit Testing with Jest
- Installation and configuration
- Jest and ESM and how to make it work
- Writing a test function
- Test suite execution
- Understanding matchers
- User-defined matcher
- Testing exceptions
- Testing async code
- Test code coverage
- Life-cycle functions
- Comparison with Vitest
#### HTTP Client with Fetch
- Why use a 3rd party lib for HTTP client access?
- Installation and configuration of node-fetch
- Simple GET request
- Performing non-GET requests
- Sending data
- Simple CRUD REST sequence
- Using json-server
#### HTTP Server with Express
- Why use a 3rd party lib for HTTP server provisioning
- Installation and configuration
- Simple Express app
- Understanding app components
- Defining routes
- Defining filters
- Defining middlewares
- Simple HTML/CSS/JS based web app using Express
- Template engines
- Implementation of a simple template engine
- Using the Express generator
- Simple REST WS server with CRUD operations
- Comparison with Fastify
- Using nodemon
#### Using a MySQL Database
- Installation och configuration of mysql2
- Connecting to a MySQL server
- How to create and drop tables
- How to perform basic CRUD operations
- An Express app using Handlebars template and engine and a MySQL database
- Brief about installing MySQL
- Installing and using MySQL using a Docker container
- Perform similar operations with a PostgreSQL DB
#### 7 - Tools
#### Transpilers
- What is a transpiler?
- JavaScript transpilers
- Installation and usage of Babel
- HTML transpilers
- Usage of Pug
- CSS transpilers
- Usage of SCSS
- Post-processors
- Minification
#### Builders
- What is a build tool?
- Using Gulp
#### Bundlers
- What is a bundler?
- Typical operations of a bundler
- Popular bundlers
- Using Parcel
- Using Vite
### Spring Batch
Nivå: advanced | Målgrupp: Java programmerare | Förkunskaper: Stor erfarenhet av att skriva Java kod
https://www.ribomation.se/programmerings-kurser/spring-batch/
Spring Batch är ett ramverk, byggt ovanpå Spring Framework, som tillhandahåller alla man behöver för
att designa robusta och skalbara batch applikationer. Denna kurs lär dig allt om item-readers, item-processor,
item-writers, tasklets och mycket mer.
Batch applikationer innebär att behandla en stor mängd data sekventiellt utan interaktion eller avbrott.
Exempel är att beräkna månatliga bank sammanställningar, aggregera månatliga fakturor för en tjänst och
maila dessa som PDF till respektive kund och mycket mera.
Spring Batch är ett ramverk, byggt ovanpå Spring Framework, som tillhandahåller alla man behöver för
att designa robusta och skalbara batch applikationer.
Denna kurs lär dig allt om item-readers, item-processor, item-writers, tasklets och mycket mer, så att
du direkt efter kursen kan komma igång med att designa egna batch applikationer.
- Förstå hur en batch applikation är uppbyggd
- Kunna läsa och skriva till CSV, FLV, XML, JSON filer
- Kunna läsa och skriva till databaser, på ett effektivt sätt
- Designa transaktionella affärsoperationer i Spring Batch
#### Background & Overview
- What is a batch application
- Why Spring Batch was created
- Why do we need Spring Batch
#### Kickstart Project
You will be following simple instructions and step-by-step build your first Spring Batch application.
The purpose of this exercise is to show-case key components of a batch application.
#### Spring Batch Concepts
- Job
- Step
- Job Repository
- Job Instance
- Job Parameters
- Task-Oriented Steps vs. Item-Oriented Steps
- Chunks and Transactions
- Execution Context
- Using Spring Initializr to create a Batch project
- Program structure
- Essential Spring beans
#### Task-Oriented Steps
- What is a task-oriented step
- Tasklets
- System command tasklet
- Invoking existing business methods
#### Launching Jobs
- Understanding @EnableBatchProcessing
- Understanding BatchConfigurer
- How is a Job (normally) launched
- How to launch a selected set of Jobs
- Bean names vs. Job names
- Bean names vs. Configuration names
- How to trigger a job to launch
- What is a TaskExecutor
- Sample demo and its configuration
- How to launch a job from a REST controller
- How to periodically launch a job, using a Spring scheduler
- How to launch a job, when a new file appear in a directory
- Sample directory watcher
#### Item-Oriented Steps
- The different parts of a step
- Setting the chunk size
- Using the step-builder
#### Item Processing
- What is item processing
- Filtering items
- Validating items
- Declarative domain object validation
- Bean Validation API
- Chaining several item-processors
#### Flat Files
- What is a flat-file format
- File-file records
- Flat-file fields
- Understanding the FlatFileItemReader
- LineMapper
- LineTokenizer
- FieldSetMapper
- BeanWrapperFieldSetMapper
- Converters & ConversionServices
- understanding the FlatFileItemWriter
- LineAggregator
- FieldExtractor
- BeanWrapperFieldExtractor
#### CSV Files
- Character Separated Values (CSV)
- Sample domain class
- Reading a CSV file with FlatFileItemReader
- Writing a field-set mapper
- Using a bean-wrapper field-set mapper
- Using a builder to create a FlatFileItemReader
- Writing to a CSV file with FlatFileItemWriter
- Writing a field-extractor
- Using a bean-wrapper field-extractor
- Using a builder to create a FlatFileItemWriter
#### FLV Files
- Fixed Length Values (FLV)
- How Batch supports FLV
- FixedLengthTokenizer
- Sample FLV item reader
- FormatterLineAggregator
- Sample FLV item writer
#### JSON Files
- JavaScript Object Notation (JSON)
- JSON support in Batch
- The Jackson JSON framework
- Sample domain class annotations
- Sample domain class converters
- Using JsonItemReaderBuilder
- Using JsonItemWriterBuilder
#### XML Files
- Extensible Markup Language (XML)
- XML support in Batch
- DOM, SAX, StAX, OXM, ...
- Spring OXM
- JAXB
- Jaxb2Marshaller
- JAXB annotations
- Sample JAXB annotatated domain class
- MVN dependencies
- Using StaxEventItemReaderBuilder
- Using StaxEventItemWiterBuilder
#### Database Items
- Database item readers & writers
- DB ItemReader classes
- DB ItemWriter classes
- Understanding JdbcCursorItemReader
- Using JdbcCursorItemReaderBuilder, with a row-mapper
- Using JdbcCursorItemReaderBuilder, with a bean-mapper
- Understanding JdbcBatchItemWriter
- Using a JdbcBatchItemWriterBuilder with a prepared-statement setter
- Using a JdbcBatchItemWriterBuilder with a bean setter
#### What is new in Spring Batch v5
- Java features supported
- Support for GraalVM
- Factories become builders
### Spring Framework och Spring Boot
Nivå: advanced | Målgrupp: Java programmerare | Förkunskaper: Stor erfarenhet av att skriva Java kod
https://www.ribomation.se/programmerings-kurser/spring-framework/
Denna kurs lär dig allt du behöver veta för att bli produktiv i ett Spring projekt direkt efter avslutad kurs.
Det finns inget Java ramverk som på ett mer genomgripande sätt förändrat hur vi designar och implementerar
affärs-applikation under de senaste 15 åren som Spring Framework. Via Spring Boot är det lekande lätt att
bygga själv-konfigurerande webb-applikationer.
Denna kurs lär dig allt du behöver veta för att bli produktiv i ett Spring projekt direkt efter avslutad kurs.
- Learn how wire together spring beans using both XML and Java annotations
- Using Spring Boot
- Writing a CLI app using Spring Shell
- Generating an executable (native image) using Graal VM and the Spring Boot build plugin
- Tweak the configuration of Spring apps
- Implementing classic web apps
- Implementing hybrid AJAX based web apps
- Implementing SPA web apps
- Implementing REST controllers
- Accessing databases using both JDBC and JPA
#### Background & History
- Rod Johnson
- The fallacy of EJB
- Why Spring was created
- Properties of Spring
- Spring configuration forms
- The evolution and success of Spring
- When Spring started to crumble on its own weight
- The inception of Spring Boot
- Properties of Spring Boot
- Overview of Spring projects
### The Robostore App
- Purpose
- H2 database
- H2 console
- Source code
- Tweaks
### Fundamentals
#### Class Loading
- Class path
- How the JVM loads a class
- JAR files
- Executable JAR file
- Application JAR file
- WAR file
- Static variables
- Thread local variables
#### Dependency Injection
- Sample payment service
- Usage
- Instantiation
- Obvious problems
- Externalization
- Configuration
- Dependency injection, instead
- Inversion of Control, explained
- Call-backs
- Bean factory
- Scopes
- Life-cycle methods
- Sample Spring app
#### Application Context
- Spring Bean Factory
- Spring Application Context
- Types of app contexts
- Configuration samples
- Using XML
- Using Groovy
- Using Java
- Customizations
- Simple bean tracer
- Using PropertySourcesPlaceholderConfigurer
#### Resources
- What is a Spring resource
- Resource types
- Writeable resources
- Resource loader
- Resource dependency
#### SpEL - Spring Expression Language
- What is SPEL?
- Syntax
- Two syntax forms to keep apart
### Configuration
#### XML Configuration
The classic way of wire an application together.
- Why learn XML configuration
- Basic XML bean syntax
- Setter injection
- Constructor injection
- Bean references
- How to load XML bean files
- Bean scopes in XML
- Configuring factory methods
- Life-cycle call-backs in XML
- Using auto-wiring in XML
- Collection property types
#### Beans from a file (_under the hood_)
- Sample domain classes
- BeanRepository
- PropertiesLoader
- BeanRepositoryImpl
- `register`
- `getBean`
- `instantiate`
#### Java Configuration
The better way of wire an application together.
- What is Java configuration of a Spring app
- Writing a @Configuration class with @Bean methods
- Application context
- Context registration
- Injecting bean dependencies
- Scopes
- Initialization method
- Destruction method
- Life-cycle call-backs
#### @nnotation Configuration
The modern way of wire an application together.
- Writing a @Component class and how it relates to @Configuration and @Bean
- Class-path scanning
- Using the scan() method
- Using @ComponentScan
- Using @Autowired
- Constructor injection
- Using a @Qualifier to select a bean by name
- Spring stereotypes
#### Beans from annotations (_under the hood_)
- Sample domain classes
- Annotations
- BeanRepository
- ClasspathLoader
- `loadClassNames`
- `getBeanClassNames`
### Database Access
#### Brief about JDBC
- History
- Drivers
- JDBC URL
- Connection
- Statements
- Prepared statements
- Queries
- Iterating over a result-set
#### Database Access via Spring JDBC
Using JDBC in Spring with JdbcTemplate and friends.
- Spring JDBC module
- Class JdbcTemplate
- Configuring a DataSource
- DriverManagerDataSource
- Embedded database
- H2 memory db
- H2 file db
- H2 server db
- MySQL / PostgreSQL data sources
- Query for a single value
- Query for a multiple values
- Query for a domain object
- Handle not-found
- Query for a Stream
- Named query parameters
- Usage of NamedParameterJdbcTemplate
- Retrieve an auto-generated primary-key
### Spring Boot
Presentation of Spring Boot and its relation to Spring Framework.
Discussions of concepts such as starter dependencies and autoconfiguration.
#### Spring Boot Overview
- Why Spring Boot was created
- What is Spring Boot more precisely
- Version history
- Spring Framework vs. Spring Boot
- Spring Initializer
- Spring Boot CLI
- Started dependencies
- Auto-configuration
#### Spring Native
- What do we mean with native?
- Graal VM
- What is required to build a native image?
- No dynamic class loading and how to deal with it
- Spring Boot build plugin
- How to build Spring app as a native image (_a.k.a. executable_)
- Example
#### Configuration Properties
Different ways to provide configuration properties.
- What is a configuration property
- Application *.properties file
- Standard Spring properties
- Inject property to field
- Inject group of properties to a bean
- Inject all app properties
- Standard type conversions
- Using YaML (*.yml)
- Override on the command-line
- Override by an environment variable
- Using application profiles
- Profile-dependent property files
- Generate build meta-data
- Generate GIT meta-data
#### Using Lombok
- What is Lombok
- Generate getters & setters
- Generate constructors
- Builders
- Generate toString() method
- Generate equals() & hashCode() methods
- Using @Data to bundle them all
- Using @Value to create an immutable data-class
#### Spring Shell
- What is Spring Shell?
- Getting started
- Simple usage
- @ShellComponent
- @ShellMethod
- @ShellOption
- Printing output using the Terminal bean
- Using the shell builder
- Built-in commands
#### Database access via JPA
How to use Spring JPA and autoconfiguration.
- What is JPA
- What is ORM
- What is JDO
- Spring Data project
- Spring Data JPA
- Starter dependencies
- Configure a data-source
- JNDI data-source
- Connection pool
- Hikari CP
- Entity class
- JPA annotations
- JPA repository interface
- Auto-generated CRUD methods
- Database initialization
- Writing query auto-methods
- Using the @Query annotation
- Repository types
- Pagination
- Populating a database
#### SQL & DB access from annotations (_under the hood_)
- Sample domain classes
- Annotations
- DAO factory
- The _magic_ behind this
- SQL generators
- Column descriptors
- Helper methods
- Handler implementations
- Row mapper
### Spring Web
#### HTTP Concepts
Brief about HTTP and web concepts in order to relate and put into
context of the Spring Web Apps chapters of this course.
- HTTP Request / response
- HTTP operations (methods)
- URI / path
- MIME types
- Response status codes
- Cookies
- Java servlet
- HTTP session
- JSP
- Model-View-Controller (MVC)
- AJAX
- The new fetch API
- REST web services
- REST operations
- Web app architectures
- The classic multi-page app (MPA)
- The hybrid multi-page app (Hybrid)
- The modern single-page app (SPA)
#### Building a classic multi-page web app
Using Spring MVC with HTML views.
- Creating a Spring Boot project
- The Spring Web MVC architecture
- Starter package
- Understanding controllers and views
- URI path composition
- GET actions
- View resolution and mapping
- Path variables
- Query parameters
- Redirection
- Assets files
- Template engines
- Brief about Thymeleaf
- Using Mustache
- Rendering a single object in Mustache
- Rendering a list of objects in Mustache
#### Sending Data
- Form data
- POST actions
- @RequestParam
- Form data bean
#### Building an AJAX hybrid web app
Using Spring MVC with AJAX powered HTML views.
- Creating a Spring Boot project
- Changes of controllers
- Changes of view pages
- Controller-less views
- Sample REST CRUD controller
- JavaScript DAO service
#### Building a single-page web app
Using Spring REST as a microservice.
- Creating a Spring Boot project
- Changes of controllers and views
- Run-time deployment of an SPA client
- External SPA client
- Configuring CORS
- Internal SPA client
- Spring configuration for an internal SPA client
- SPA controller
### Deployment
Best practices for deploying Spring apps.
- Deployment options
- Generating an executable JAR as a microservice
- Generating a WAR for deployment to a servlet container
- Working with configuration profiles
- Brief about database schema migration tools
### Twitter Bootstrap
Nivå: intermediate | Målgrupp: Web programmerare | Förkunskaper: Praktiska kunskaper i CSS och HTML
https://www.ribomation.se/programmerings-kurser/bootstrap/
Twitter Bootstrap är ett kolossalt flexibelt CSS ramverk för att bygga moderna web applikationer
som både ser snygga ut och är responsiva, dvs anpassar sig till olika skärmstorlekar.
Den här kursen lär dig att bemästra Bootstrap: Från grunderna till expertis.
Välkommen till vår 2-dagars kurs "Bemästra Bootstrap: Från grunderna till expertis". På denna kurs kommer du att
vägledas från att förstå grunderna i HTML och CSS till att utveckla responsiva och visuellt attraktiva webbapplikationer
med hjälp av Bootstrap.
Vi börjar med grunderna i HTML, CSS, Flexbox och Grid layout, samt en snabb titt på responsiv design och media queries.
Därefter dyker vi djupare in i Bootstrap, ett ramverk som förenklar och snabbar upp din webbdesign. Vi går genom
typografi, sidlayouter och praktiska komponenter; allt från enklare saker som knappar och emblem till mer komplexa såsom
dragspel, modaler och karuseller.
Vi tar också upp Bootstrap-formulär och deras tillstånd, plus validering för att ge dig de färdigheter som behövs för
att skapa anpassningsbara inmatningsalternativ som fungerar i harmoni med dina applikationer.
Slutligen kommer vi att lära dig hur du kan anpassa Bootstrap för att sätta din prägel på dina projekt. Här får du lära
dig om teman, hur man ställer in Dark Mode, CSS-variabler samt avancerade ämnen som att återbygga Bootstrap med
Sass/SCSS.
Gå med oss för att dyka in i informativa sessioner, praktiska exempel och verkliga scenarier. Den här kursen är steget
mellan att vara nybörjare och att behärska Bootstrap för att skapa snygga, effektiva och avancerade webbdesign.
- Understand the fundamental concepts and syntax of HTML and CSS.
- Dive into the principles of Flexbox and Grid layouts.
- Discover the power of media queries and responsive design.
- Grasp the attributes, architecture and installation of Bootstrap.
- Master Bootstrap's typography and learn to design pages using the 12-column grid system.
- Explore different Bootstrap components from simple buttons and badges to complex accordions and carousels.
- Gain insights into how JavaScript can augment Bootstrap components.
- Dissect the design strategies behind Flowing, Responsive, and Mobile-First Design in Bootstrap.
- Learn to construct different forms and form fields in Bootstrap.
- Study form validation, learning the differences between Bootstrap and native validation.
- Dive into the customization of Bootstrap's look and feel.
- Get into Bootstrap theming, implementing dark mode, and using CSS variables.
- Gain an understanding of SASS/SCSS for more complex Bootstrap customization.
- Learn the process and benefit of rebuilding Bootstrap.
- Understand the importance of free and paid themes and what to consider when choosing one.
### Basic Styling
Here we quickly discuss topics you must have an understanding of in order to
utilize Bootstrap.
#### HTML
- Basic syntax
- Page document
- Headings & paragraphs
- Divs & spans
- Block vs. inline vs. inline-blocks
- White space, wrapping and pre-tags
- Lists
- Links
- Images & pictures
- Tables
- Presentational vs. semantic tags
- Common attributes
- Form elements
- Document header tags
- Meta tags
- Linking to stylesheet files
- Linking to script files
#### CSS
- Basic syntax
- Selectors & combinators
- Pseudo classes & elements
- Variables
- Size units
- Text properties
- Text formats & transforms
- Justifications and columnar text
- Margins & paddings
- Borders & shadows
- Font categories
- Font-size relative units
- Ems vs. rems
- Colour properties
- Colour expressions
- RGB vs. HSL
- Opacity
- Understanding viewport units
#### Flexbox Layout
- What is flexbox?
- Why do I need to understand flex, when I'm planning to use Bootstrap?
- Terminology
- Properties
- Direction
- Justify content
- Align items
- Wrapping
#### Grid Layout
- What is grid layout?
- How does it differ from flex?
- Terminology & anatomy
- Container properties
- Item properties
- Named grid lines
- Named grid areas
#### Device/Media Queries
- What is a media query?
- Query by device type
- Query by device feature
- Operators
- Using mydevice.io
- What is _responsive design_?
### Rudimentary Bootstrap
From now on, we focus on Bootstrap and how ti simplifies website styling.
#### Overview of Twitter Bootstrap
- Mark Otto & Jacob Thornton
- Properties of Bootstrap
- Architecture
- How to install
- Which asset files to use
- Using CDN links
- Downloading asset files
- Using NPM and Vite
#### Typography
- Fonts & sizes
- Headings
- Theme colors
- Text formats
- Text transforms
- Margins & paddings
- Horizontally centered blocks
- Width & height
- Borders
- Shadows
- Responsive images
- Image transforms
- Figures
#### Page Layouts
- Containers
- The 12-column grid system
- Grid sizes
- Understanding breakpoints
- Equal columns
- Scaled columns
- Offsetting columns
- Column wraps
- Some example designs
### Components
Components are reusable snippets of tags and styling and denotes the core of Bootstrap.
#### Simple Components
- What is a Bootstrap component?
- Buttons
- Button groups
- Badges & pills
- Spinners
- Progress
- Placeholders
- Alerts
- Breadcrumbs
- Pagination indicators
#### Composite Components
- Simple cards
- Image cards
- Composite cards
- Collapse
- Dropdowns
- Accordions
- Carousels
- Tabbed panes
- Navbars
#### JavaScript Components
- Modals
- Toasts
- Tooltips
- Popovers
#### Responsive Design
- What is responsive design using Bootstrap?
- Understanding the grid model and breakpoints
- The _mobile first_ design strategy
- How to design a web page to look good both on desktop and on mobile
- How the change the number of columns based on device width
- Using column wrapping for responsive design
- How to deal with text wrapping
### Bootstrap Forms
Here we discuss how to design Bootstrap forms.
#### Simple Form Fields
- Form element structure
- Form control
- Properties
- Text fields
- Special type fields
- Range fields
- Form text
- Input groups
- Floating labels
- Form / field layout
#### Stateful Form Fields
- Checkboxes
- Radio buttons
- Switches
- Dropdown inputs
#### Form validation
- What is validation?
- Bootstrap vs. native validation
- Basic validation configuration
- Supported validation attributes
- CSS validation classes and how to use them
- How to trigger validation
### Customization of Bootstrap
In this section we discuss how customize Bootstrap.
#### Dark Mode
- What is dark mode?
- How to configure light/dark mode
- How to implement a mode switching menu
#### CSS Variables
- How to utilize Bootstrap CSS variables
- Overview of which variables are defined
- Use Bootstrap CSS variables instead of hard-coded values
#### Re-Building Bootstrap
- Why it might be a good idea to rebuild Bootstrap?
- Understanding SASS/SCSS
- How to change the basic theme colors
- Using the SASS CLI to compile Bootstrap
- Using Vite to build Bootstrap
#### Bootstrap Themes
- What are themes?
- Free themes
- Paid themes
- Important aspects to look for before purchasing a theme
### Vue.js grundkurs
Nivå: beginner | Målgrupp: Web-Apps programmerare | Förkunskaper: God erfarenhet av att programmera i JavaScript och HTML/CSS
https://www.ribomation.se/programmerings-kurser/vuejs/
Vue är ett kolossalt flexibelt ramverk för att bygga moderna webb-applikationer.
Med Vue kan du använda såväl klassisk som modern SPA (Single Page App) webb-arkitektur.
Vue är ett kolossalt flexibelt ramverk för att bygga moderna webb-applikationer.
Med Vue kan du använda såväl klassisk som modern SPA (Single Page App) webb-arkitektur.
Ett Vue system designas som en sammansättning av komponenter, vilka kan fungera som
navigerbara logiska sidor eller som återanvändbara byggblock inom logiska sidor.
Den här kursen bygger på Vue version 3 och primärt på Composition API, vilket är
vår övertygelse är klart bättre än det tidigare Options API.
- Know how to use and utilize SFC (Single File Components)
- Understand best practices of how to differentiate page, panel and widget components
- Know how to write parameterized page navigation
- Know how to communicate with a REST-WS back-end server
#### Vue.js Overview
- Why Vue.js was invented
- Evan You
- Release history
- Vue components
### Part 1 - Preparation
We first discuss som topics that are pre-requisites for the course, to ensure all course
participants has a good starting point.
#### Highlights of Modern JavaScript
- Lambda expressions
- Async functions
- Using the Object object
- The spread operator
- Array and object destructuring
- Classes
- Getters and setters
- Static members
- Subclasses
- Modules
- Export and import
#### ES Modules
- What is ESM
- ESM syntax
- Export forms
- Import forms
- Path forms
- ESM in browsers
#### Using NPM and NPX
- Using NPM
- Installing a NPM package
- Dependencies
- Global (script) packages
- Using NPX
- Alternatives to NPM
#### What is SPA (Single Page App)
- Classic web architecture
- Browser DOM
- Page navigation
- AJAX powered web app
- Partial HTTP transactions
- SPA web architecture
- Page components
- Navigation within an SPA
- SPA deployment architecture
### Part 2 - Kickstart
How to build a Vue app step by step.
#### Embedded Vue
Instructions of how to build your first Vue app using CDN links.
#### Vue Basics
- Need a bundler
- Creating a Vue project using Vite
- Understanding SFC - Single File Component
- Understanding the difference between Options and Compositions API
- Using pre-processing languages
#### The SFC Version
Instructions of how to step by step build a multi widget SFC app.
### Part 3 - The Details
#### Template Syntax
- Text interpolation
- Handlebar syntax
- JavaScript expressions only
- Prevent expression evaluation
- Injecting HTML
- Binding attributes
- v-bind
- Simplified syntax
- Dealing with events
- Modifiers
- Formatting functions
#### Reactivity
- Why do we need reactive?
- Reactive objects
- Restrictions
- Using ref()
- `reactive()` vs. `ref()`
- Understanding `