Section 1 : Fundamental Ideas Around Microservices
|
Lecture 1 | INTRODUCTION TO BRAINMEASURES PROCTOR SYSTEM | |
|
Lecture 2 | About Certification | |
|
Lecture 3 | Course Resources | |
|
Lecture 4 | What Is a Microservice | 00:03:19 Duration |
|
Lecture 5 | Data in Microservices | 00:07:34 Duration |
|
Lecture 6 | Big Problems with Data | 00:05:08 Duration |
|
Lecture 7 | Sync Communication Between Services | 00:06:53 Duration |
|
Lecture 8 | Event-Based Communication | 00:05:19 Duration |
|
Lecture 9 | A Crazy Way of Storing Data | 00:09:48 Duration |
|
Lecture 10 | Pros and Cons of Async Communication | 00:06:15 Duration |
Section 2 : A Mini-Microservices App
|
Lecture 1 | App Overview | 00:05:43 Duration |
|
Lecture 2 | Project Setup | 00:04:57 Duration |
|
Lecture 3 | Posts Service Creation | 00:08:18 Duration |
|
Lecture 4 | Testing the Posts Service | 00:04:04 Duration |
|
Lecture 5 | Implementing a Comments Service | 00:08:22 Duration |
|
Lecture 6 | Quick Comments Test | 00:03:57 Duration |
|
Lecture 7 | Note on the React App | |
|
Lecture 8 | Suggestion Regarding a Default Export Warning | |
|
Lecture 9 | React Project Setup | 00:05:00 Duration |
|
Lecture 10 | Building Post Submission | 00:09:54 Duration |
|
Lecture 11 | building-post | |
|
Lecture 12 | Handling CORS Errors | 00:04:08 Duration |
|
Lecture 13 | Fetching and Rendering Posts | 00:10:04 Duration |
|
Lecture 14 | Creating Comments | 00:08:09 Duration |
|
Lecture 15 | Displaying Comments | 00:07:23 Duration |
|
Lecture 16 | Completed React App | |
|
Lecture 17 | Request Minimization Strategies | 00:04:54 Duration |
|
Lecture 18 | An Async Solution | 00:07:16 Duration |
|
Lecture 19 | Common Questions Around Async Events | 00:04:14 Duration |
|
Lecture 20 | Event Bus Overview | 00:05:14 Duration |
|
Lecture 21 | Important Note about Node v15 and Unhandled Promise Rejections | |
|
Lecture 22 | A Basic Event Bus Implementation | 00:05:22 Duration |
|
Lecture 23 | Emitting Events | 00:05:18 Duration |
|
Lecture 24 | Emitting Comment Creation Events | 00:03:45 Duration |
|
Lecture 25 | Receiving Events | 00:04:32 Duration |
|
Lecture 26 | Creating the Data Query Service | 00:04:42 Duration |
|
Lecture 27 | Parsing Incoming Events | 00:07:02 Duration |
|
Lecture 28 | Using the Query Service | 00:07:09 Duration |
|
Lecture 29 | Adding a Simple Feature | 00:04:46 Duration |
|
Lecture 30 | Issues with Comment Filtering | 00:07:43 Duration |
|
Lecture 31 | A Second Approach | 00:05:37 Duration |
|
Lecture 32 | How to Handle Resource Updates | 00:04:45 Duration |
|
Lecture 33 | Creating the Moderation Service | 00:04:52 Duration |
|
Lecture 34 | Adding Comment Moderation | 00:04:26 Duration |
|
Lecture 35 | Reminder about Node v15 and Error Catching | |
|
Lecture 36 | Handling Moderation | 00:05:29 Duration |
|
Lecture 37 | Updating Comment Content | 00:04:58 Duration |
|
Lecture 38 | A Quick Test | 00:05:57 Duration |
|
Lecture 39 | Rendering Comments by Status | 00:03:26 Duration |
|
Lecture 40 | Dealing with Missing Events | 00:10:23 Duration |
|
Lecture 41 | Required Node v15+ Update for Query Service | |
|
Lecture 42 | Implementing Event Sync | 00:06:11 Duration |
|
Lecture 43 | Event Syncing in Action | 00:04:16 Duration |
Section 3 : Running Services with Docker
|
Lecture 1 | Deployment Issues | 00:06:55 Duration |
|
Lecture 2 | Why Docker | 00:02:55 Duration |
|
Lecture 3 | Why Kubernetes | 00:05:47 Duration |
|
Lecture 4 | Don't Know Docker Watch This | 00:01:17 Duration |
|
Lecture 5 | Note About Docker Build Output and Buildkit | |
|
Lecture 6 | Dockerizing the Posts Service | 00:04:02 Duration |
|
Lecture 7 | Review Some Basic Commands | 00:05:23 Duration |
|
Lecture 8 | Dockering Other Services | 00:03:00 Duration |
Section 4 : Orchestrating Collections of Services with Kubernetes
|
Lecture 1 | Installing Kubernetes | 00:03:19 Duration |
|
Lecture 2 | IMPORTANT Note for Minikube and MicroK8s Users | |
|
Lecture 3 | A Kubernetes Tour | 00:09:45 Duration |
|
Lecture 4 | Important Kubernetes Terminology | 00:02:51 Duration |
|
Lecture 5 | Notes on Config Files | 00:03:11 Duration |
|
Lecture 6 | Creating a Pod | 00:06:41 Duration |
|
Lecture 7 | ErrImagePull, ErrImageNeverPull and ImagePullBackoff Errors | |
|
Lecture 8 | Understanding a Pod Spec | 00:05:15 Duration |
|
Lecture 9 | Common Kubectl Commands | 00:04:44 Duration |
|
Lecture 10 | A Time-Saving Alias | 00:02:26 Duration |
|
Lecture 11 | Introducing Deployments | 00:03:27 Duration |
|
Lecture 12 | Creating a Deployment | 00:06:11 Duration |
|
Lecture 13 | Common Commands Around Deployments | 00:04:35 Duration |
|
Lecture 14 | Updating Deployments | 00:06:02 Duration |
|
Lecture 15 | Preferred Method for Updating Deployments | 00:05:42 Duration |
|
Lecture 16 | Networking With Services | 00:04:15 Duration |
|
Lecture 17 | Creating a NodePort Service | 00:07:52 Duration |
|
Lecture 18 | Accessing NodePort Services | 00:05:09 Duration |
|
Lecture 19 | Setting Up Cluster IP Services | 00:03:12 Duration |
|
Lecture 20 | Building a Deployment for the Event Bus | 00:05:35 Duration |
|
Lecture 21 | Adding ClusterIP Services | 00:07:37 Duration |
|
Lecture 22 | How to Communicate Between Services | 00:04:09 Duration |
|
Lecture 23 | Updating Service Addresses | 00:06:27 Duration |
|
Lecture 24 | Verifying Communication | 00:05:00 Duration |
|
Lecture 25 | Adding Query, Moderation and Comments | 00:09:57 Duration |
|
Lecture 26 | Testing Communication | 00:05:29 Duration |
|
Lecture 27 | Load Balancer Services | 00:05:13 Duration |
|
Lecture 28 | Load Balancers and Ingress | 00:06:38 Duration |
|
Lecture 29 | Update on Ingress Nginx Mandatory Commands | |
|
Lecture 30 | Installing Ingress-Nginx | 00:07:40 Duration |
|
Lecture 31 | Ingress v1 API Required Update | |
|
Lecture 32 | Writing Ingress Config Files | 00:04:47 Duration |
|
Lecture 33 | Important Note About Port 80 | |
|
Lecture 34 | Hosts File Tweak | 00:06:15 Duration |
|
Lecture 35 | Important Note to Add Environment Variable | |
|
Lecture 36 | Deploying the React App | 00:06:09 Duration |
|
Lecture 37 | Unique Route Paths | 00:06:55 Duration |
|
Lecture 38 | Final Route Config | 00:06:32 Duration |
|
Lecture 39 | Introducing Skaffold | 00:03:08 Duration |
|
Lecture 40 | Skaffold Setup | 00:09:17 Duration |
|
Lecture 41 | First Time Skaffold Startup | 00:01:00 Duration |
|
Lecture 42 | A Few Notes on Skaffold | 00:06:30 Duration |
Section 5 : Architecture of Multi-Service Apps
|
Lecture 1 | Big Ticket Items | 00:15:11 Duration |
|
Lecture 2 | App Overview | 00:08:53 Duration |
|
Lecture 3 | Resource Types | 00:03:23 Duration |
|
Lecture 4 | Service Types | 00:03:37 Duration |
|
Lecture 5 | Note on Typescript | |
|
Lecture 6 | Events and Architecture Design | 00:03:48 Duration |
|
Lecture 7 | Auth Service Setup | 00:04:50 Duration |
|
Lecture 8 | Auth K8s Setup | |
|
Lecture 9 | Note on Code Reloading | |
|
Lecture 10 | Ingress v1 API Required Update | |
|
Lecture 11 | Adding Skaffold | 00:05:36 Duration |
|
Lecture 12 | Ingress-Nginx Setup | 00:07:19 Duration |
|
Lecture 13 | Hosts File and Security Warning | 00:04:05 Duration |
Section 6 : Leveraging a Cloud Environment for Development
|
Lecture 1 | Note on Remote Development | 00:02:51 Duration |
|
Lecture 2 | Remote Dev with Skaffold | 00:06:35 Duration |
|
Lecture 3 | Free Google Cloud Credits | |
|
Lecture 4 | Google Cloud Initial Setup | 00:02:43 Duration |
|
Lecture 5 | Kubernetes Cluster Creation | 00:03:59 Duration |
|
Lecture 6 | Kubectl Contexts | 00:03:49 Duration |
|
Lecture 7 | Initializing the GCloud SDK | 00:05:03 Duration |
|
Lecture 8 | Installing the GCloud Context | 00:04:17 Duration |
|
Lecture 9 | Updating the Skaffold Config | 00:04:34 Duration |
|
Lecture 10 | More Skaffold Updates | 00:01:06 Duration |
|
Lecture 11 | Creating a Load Balancer | 00:05:12 Duration |
|
Lecture 12 | Final Config and Test | 00:06:25 Duration |
Section 7 : Response Normalization Strategies
|
Lecture 1 | Creating Route Handlers | 00:05:40 Duration |
|
Lecture 2 | Scaffolding Routes | 00:04:05 Duration |
|
Lecture 3 | Adding Validation | 00:08:38 Duration |
|
Lecture 4 | Handling Validation Errors | 00:06:18 Duration |
|
Lecture 5 | Postman HTTPS Issues | |
|
Lecture 6 | Surprising Complexity Around Errors | 00:06:06 Duration |
|
Lecture 7 | Other Sources of Errors | 00:04:17 Duration |
|
Lecture 8 | Solution for Error Handling | 00:04:50 Duration |
|
Lecture 9 | Building an Error Handling Middleware | 00:07:38 Duration |
|
Lecture 10 | Communicating More Info to the Error Handler | 00:05:23 Duration |
|
Lecture 11 | Encoding More Information In an Error | 00:04:35 Duration |
|
Lecture 12 | Subclassing for Custom Errors | 00:08:17 Duration |
|
Lecture 13 | Determining Error Type | 00:03:10 Duration |
|
Lecture 14 | Converting Errors to Responses | 00:10:12 Duration |
|
Lecture 15 | Moving Logic Into Errors | 00:08:36 Duration |
|
Lecture 16 | Verifying Our Custom Errors | |
|
Lecture 17 | Final Error Related Code | 00:10:19 Duration |
|
Lecture 18 | How to Define New Custom Errors | 00:05:01 Duration |
|
Lecture 19 | Uh Oh | 00:05:49 Duration |
Section 8 : Database Management and Modeling
|
Lecture 1 | Creating Databases in Kubernetes | 00:08:25 Duration |
|
Lecture 2 | Connecting to MongoDB | 00:07:53 Duration |
|
Lecture 3 | Understanding the Signup Flow | 00:04:25 Duration |
|
Lecture 4 | Getting TypeScript and Mongoose to Cooperate | 00:05:21 Duration |
|
Lecture 5 | Creating the User Model | 00:04:54 Duration |
|
Lecture 6 | Type Checking User Properties | 00:06:01 Duration |
|
Lecture 7 | Adding Static Properties to a Model | 00:06:00 Duration |
|
Lecture 8 | Defining Extra Document Properties | 00:04:53 Duration |
|
Lecture 9 | What's That Angle Bracket For | 00:03:52 Duration |
|
Lecture 10 | User Creation | 00:06:47 Duration |
|
Lecture 11 | Proper Error Handling | 00:07:25 Duration |
|
Lecture 12 | Note on Password Hashing | |
|
Lecture 13 | Reminder on Password Hashing | 00:04:58 Duration |
|
Lecture 14 | Adding Password Hashing | 00:06:57 Duration |
|
Lecture 15 | Comparing Hashed Password | 00:02:54 Duration |
|
Lecture 16 | Mongoose Pre-Save Hooks | 00:05:53 Duration |
Section 9 : Authentication Strategies and Options
|
Lecture 1 | Fundamental Authentication Strategies | 00:08:58 Duration |
|
Lecture 2 | Huge Issues with Authentication Strategies | 00:07:32 Duration |
|
Lecture 3 | So Which Option | 00:02:58 Duration |
|
Lecture 4 | Solving Issues with Option #2 | 00:08:26 Duration |
|
Lecture 5 | Reminder on Cookies vs JWT's | 00:06:21 Duration |
|
Lecture 6 | Microservices Auth Requirements | 00:11:00 Duration |
|
Lecture 7 | Issues with JWT's and Server Side Rendering | |
|
Lecture 8 | Cookies and Encryption | 00:04:51 Duration |
|
Lecture 9 | Adding Session Support | 00:03:11 Duration |
|
Lecture 10 | Generating a JWT | 00:08:29 Duration |
|
Lecture 11 | JWT Signing Keys | 00:04:56 Duration |
|
Lecture 12 | Securely Storing Secrets with Kubernetes | 00:02:13 Duration |
|
Lecture 13 | Creating and Accessing Secrets | 00:09:18 Duration |
|
Lecture 14 | Accessing Env Variables in a Pod | 00:05:18 Duration |
|
Lecture 15 | Common Response Properties | 00:04:41 Duration |
|
Lecture 16 | Formatting JSON Properties | 00:10:38 Duration |
|
Lecture 17 | The Signin Flow | 00:07:49 Duration |
|
Lecture 18 | Common Request Validation Middleware | 00:05:33 Duration |
|
Lecture 19 | Sign In Logic | 00:06:49 Duration |
|
Lecture 20 | Quick Sign In Test | 00:01:53 Duration |
|
Lecture 21 | Current User Handler | 00:03:01 Duration |
|
Lecture 22 | Returning the Current User | 00:08:55 Duration |
|
Lecture 23 | Signing Out | 00:02:48 Duration |
|
Lecture 24 | Creating a Current User Middleware | 00:06:55 Duration |
|
Lecture 25 | Augmenting Type Definitions | 00:07:46 Duration |
|
Lecture 26 | Requiring Auth for Route Access | 00:07:46 Duration |
Section 10 : Testing Isolated Microservices
|
Lecture 1 | Scope of Testing | 00:04:28 Duration |
|
Lecture 2 | Testing Goals | 00:04:32 Duration |
|
Lecture 3 | Testing Architecture | 00:07:51 Duration |
|
Lecture 4 | Index to App Refactor | 00:02:54 Duration |
|
Lecture 5 | A Few Dependencies | 00:03:33 Duration |
|
Lecture 6 | Test Environment Setup | 00:08:11 Duration |
|
Lecture 7 | Our First Test | 00:06:24 Duration |
|
Lecture 8 | An Important Note | 00:01:31 Duration |
|
Lecture 9 | Testing Invalid Input | 00:05:13 Duration |
|
Lecture 10 | Requiring Unique Emails | 00:01:45 Duration |
|
Lecture 11 | Changing Node Env During Tests | 00:05:43 Duration |
|
Lecture 12 | Tests Around Sign In Functionality | 00:06:26 Duration |
|
Lecture 13 | Testing Sign Out | 00:04:31 Duration |
|
Lecture 14 | Issues with Cookies During Testing | 00:05:18 Duration |
|
Lecture 15 | Easy Auth Solution | 00:03:03 Duration |
|
Lecture 16 | globalThis has no index signature TS Error | |
|
Lecture 17 | Auth Helper Function | 00:07:12 Duration |
|
Lecture 18 | Testing Non-Authed Requests | 00:01:44 Duration |
Section 11 : Integrating a Server-Side-Rendered React App
|
Lecture 1 | Starting the React App | 00:02:11 Duration |
|
Lecture 2 | Reminder on Server Side Rendering | 00:03:38 Duration |
|
Lecture 3 | Suggestion Regarding a Default Export Warning | |
|
Lecture 4 | Basics of Next JS | 00:05:24 Duration |
|
Lecture 5 | Building a Next Image | 00:04:28 Duration |
|
Lecture 6 | Running Next in Kubernetes | 00:10:12 Duration |
|
Lecture 7 | Note on File Change Detection | 00:04:26 Duration |
|
Lecture 8 | Adding Global CSS | 00:05:09 Duration |
|
Lecture 9 | Adding a Sign Up Form | 00:03:11 Duration |
|
Lecture 10 | Handling Email and Password Inputs | 00:03:42 Duration |
|
Lecture 11 | Successful Account Signup | 00:05:12 Duration |
|
Lecture 12 | Handling Validation Errors | 00:06:53 Duration |
|
Lecture 13 | The useRequest Hook | 00:06:59 Duration |
|
Lecture 14 | Using the useRequest Hook | 00:03:40 Duration |
|
Lecture 15 | An onSuccess Callback | 00:05:37 Duration |
|
Lecture 16 | Overview on Server Side Rendering | 00:06:47 Duration |
|
Lecture 17 | A note about ECONNREFUSED errors | |
|
Lecture 18 | Fetching Data During SSR | 00:05:07 Duration |
|
Lecture 19 | Why the Error | 00:09:00 Duration |
|
Lecture 20 | Two Possible Solutions | 00:07:04 Duration |
|
Lecture 21 | Cross Namespace Service Communication | 00:07:45 Duration |
|
Lecture 22 | When is GetInitialProps Called | 00:06:46 Duration |
|
Lecture 23 | On the Server or the Browser | 00:02:01 Duration |
|
Lecture 24 | Ingress-Nginx Namespace and Service - Important Update | |
|
Lecture 25 | Specifying the Host | 00:08:23 Duration |
|
Lecture 26 | Passing Through the Cookies | 00:04:00 Duration |
|
Lecture 27 | A Reusable API Client | 00:07:05 Duration |
|
Lecture 28 | Content on the Landing Page | 00:02:01 Duration |
|
Lecture 29 | The Sign In Form | 00:03:11 Duration |
|
Lecture 30 | A Reusable Header | 00:05:00 Duration |
|
Lecture 31 | Moving GetInitialProps | 00:02:11 Duration |
|
Lecture 32 | Issues with Custom App GetInitialProps | 00:06:41 Duration |
|
Lecture 33 | Handling Multiple GetInitialProps | 00:06:07 Duration |
|
Lecture 34 | Passing Props Through | 00:03:03 Duration |
|
Lecture 35 | Building the Header | 00:05:05 Duration |
|
Lecture 36 | Conditionally Showing Links | 00:05:58 Duration |
|
Lecture 37 | Signing Out | 00:04:36 Duration |
|
Lecture 38 | React App Catchup |
Section 12 : Code Sharing and Reuse Between Services
|
Lecture 1 | Shared Logic Between Services | 00:04:34 Duration |
|
Lecture 2 | Options for Code Sharing | 00:04:46 Duration |
|
Lecture 3 | NPM Organizations | 00:04:27 Duration |
|
Lecture 4 | Publishing NPM Modules | 00:04:06 Duration |
|
Lecture 5 | Project Setup | 00:07:34 Duration |
|
Lecture 6 | Typo in package | |
|
Lecture 7 | An Easy Publish Command | 00:07:26 Duration |
|
Lecture 8 | Relocating Shared Code | 00:07:29 Duration |
|
Lecture 9 | Updating Import Statements | 00:05:16 Duration |
|
Lecture 10 | Updating the Common Module | 00:05:34 Duration |
Section 13 : Create-Read-Update-Destroy Server Setup
|
Lecture 1 | Ticketing Service Overview | 00:03:02 Duration |
|
Lecture 2 | Project Setup | 00:05:24 Duration |
|
Lecture 3 | Running the Ticket Service | 00:06:04 Duration |
|
Lecture 4 | Mongo Connection URI | 00:08:13 Duration |
|
Lecture 5 | Quick Auth Update | 00:01:47 Duration |
|
Lecture 6 | Test-First Approach | 00:04:19 Duration |
|
Lecture 7 | Creating the Router | 00:04:56 Duration |
|
Lecture 8 | Adding Auth Protection | 00:08:04 Duration |
|
Lecture 9 | Faking Authentication During Tests | 00:07:09 Duration |
|
Lecture 10 | globalThis has no index signature TS Error | |
|
Lecture 11 | Building a Session | 00:05:39 Duration |
|
Lecture 12 | Testing Request Validation | 00:04:12 Duration |
|
Lecture 13 | Validating Title and Price | 00:04:09 Duration |
|
Lecture 14 | Reminder on Mongoose with TypeScript | 00:07:11 Duration |
|
Lecture 15 | Defining the Ticket Model | 00:03:48 Duration |
|
Lecture 16 | Creation via Route Handler | 00:08:21 Duration |
|
Lecture 17 | Testing Show Routes | 00:06:52 Duration |
|
Lecture 18 | Unexpected Failure! | 00:05:29 Duration |
|
Lecture 19 | What's that Error! | 00:08:57 Duration |
|
Lecture 20 | Better Error Logging | 00:05:11 Duration |
|
Lecture 21 | Complete Index Route Implementation | 00:06:31 Duration |
|
Lecture 22 | Ticket Updating | 00:06:14 Duration |
|
Lecture 23 | Handling Updates | 00:04:15 Duration |
|
Lecture 24 | Permission Checking | 00:06:49 Duration |
|
Lecture 25 | Final Update Changes | 00:09:04 Duration |
|
Lecture 26 | Manual Testing | 00:05:36 Duration |
Section 14 : NATS Streaming Server - An Event Bus Implementation
|
Lecture 1 | What Now | 00:02:50 Duration |
|
Lecture 2 | Three Important Items | 00:04:34 Duration |
|
Lecture 3 | Creating a NATS Streaming Deployment | 00:06:25 Duration |
|
Lecture 4 | Big Notes on NATS Streaming | |
|
Lecture 5 | Building a NATS Test Project | 00:07:31 Duration |
|
Lecture 6 | Port-Forwarding with Kubectl | 00:04:40 Duration |
|
Lecture 7 | Publishing Events | |
|
Lecture 8 | mall Required Command Change | |
|
Lecture 9 | Listening For Data | 00:06:55 Duration |
|
Lecture 10 | Accessing Event Data | 00:06:56 Duration |
|
Lecture 11 | Client ID Generation | 00:04:48 Duration |
|
Lecture 12 | Queue Groups | 00:07:28 Duration |
|
Lecture 13 | Manual Ack Mode | 00:09:51 Duration |
|
Lecture 14 | Client Health Checks | 00:09:45 Duration |
|
Lecture 15 | Graceful Client Shutdown | |
|
Lecture 16 | Core Concurrency Issues | 00:12:55 Duration |
|
Lecture 17 | Common Questions | 00:08:08 Duration |
|
Lecture 18 | [Optional] More Possible Concurrency Solutions | 00:16:42 Duration |
|
Lecture 19 | Solving Concurrency Issues | 00:20:05 Duration |
|
Lecture 20 | Concurrency Control with the Tickets App | 00:09:40 Duration |
|
Lecture 21 | Event Redelivery | 00:04:34 Duration |
|
Lecture 22 | Durable Subscriptions | 00:08:59 Duration |
Section 15 : Connecting to NATS in a Node JS World
|
Lecture 1 | Reusable NATS Listeners | 00:04:32 Duration |
|
Lecture 2 | The Listener Abstract Class | 00:09:27 Duration |
|
Lecture 3 | Extending the Listener | 00:05:53 Duration |
|
Lecture 4 | Quick Refactor | 00:03:17 Duration |
|
Lecture 5 | Leveraging TypeScript for Listener Validation | 00:05:28 Duration |
|
Lecture 6 | Subjects Enum | 00:03:28 Duration |
|
Lecture 7 | Custom Event Interface | 00:02:26 Duration |
|
Lecture 8 | Enforcing Listener Subjects | 00:07:22 Duration |
|
Lecture 9 | Quick Note 'readonly' in Typescript | |
|
Lecture 10 | Enforcing Data Types | 00:03:53 Duration |
|
Lecture 11 | Where Does this Get Used | 00:02:49 Duration |
|
Lecture 12 | Custom Publisher | 00:08:11 Duration |
|
Lecture 13 | Using the Custom Publisher | 00:03:49 Duration |
|
Lecture 14 | Awaiting Event Publication | 00:04:27 Duration |
|
Lecture 15 | Common Event Definitions Summary | 00:06:26 Duration |
|
Lecture 16 | Updating the Common Module | 00:07:35 Duration |
|
Lecture 17 | Restarting NATS | 00:02:09 Duration |
Section 16 : Managing a NATS Client
|
Lecture 1 | Publishing Ticket Creation | 00:03:48 Duration |
|
Lecture 2 | More on Publishing | 00:03:19 Duration |
|
Lecture 3 | NATS Client Singleton | 00:05:24 Duration |
|
Lecture 4 | Remember Mongoose | 00:04:57 Duration |
|
Lecture 5 | TS Error - Did you forget to include 'void' in your type argument | |
|
Lecture 6 | Singleton Implementation | 00:09:04 Duration |
|
Lecture 7 | Accessing the NATS Client | 00:04:28 Duration |
|
Lecture 8 | Graceful Shutdown | 00:06:55 Duration |
|
Lecture 9 | Successful Listen! | 00:03:23 Duration |
|
Lecture 10 | Ticket Update Publishing | 00:04:28 Duration |
|
Lecture 11 | Failed Event Publishing | 00:07:03 Duration |
|
Lecture 12 | Handling Publish Failures | 00:06:02 Duration |
|
Lecture 13 | Fixing a Few Tests | 00:03:52 Duration |
|
Lecture 14 | Redirecting Imports | 00:05:35 Duration |
|
Lecture 15 | Providing a Mock Implementation | 00:09:09 Duration |
|
Lecture 16 | Test-Suite Wide Mocks | 00:02:12 Duration |
|
Lecture 17 | Ensuring Mock Invocations | 00:09:13 Duration |
|
Lecture 18 | NATS Env Variables | 00:08:00 Duration |
Section 17 : Cross-Service Data Replication In Action
|
Lecture 1 | The Orders Service | 00:05:02 Duration |
|
Lecture 2 | Scaffolding the Orders Service | 00:04:39 Duration |
|
Lecture 3 | A Touch More Setup | 00:07:32 Duration |
|
Lecture 4 | Ingress Routing Rules | 00:01:53 Duration |
|
Lecture 5 | Scaffolding a Few Route Handlers | 00:09:55 Duration |
|
Lecture 6 | Subtle Service Coupling | 00:06:43 Duration |
|
Lecture 7 | Associating Orders and Tickets | 00:06:49 Duration |
|
Lecture 8 | Order Model Setup | 00:08:52 Duration |
|
Lecture 9 | The Need for an Enum | 00:05:55 Duration |
|
Lecture 10 | Creating an Order Status Enum | 00:08:31 Duration |
|
Lecture 11 | More on Mongoose Refs | 00:02:58 Duration |
|
Lecture 12 | Defining the Ticket Model | 00:07:09 Duration |
|
Lecture 13 | Order Creation Logic | 00:05:45 Duration |
|
Lecture 14 | Finding Reserved Tickets | 00:06:10 Duration |
|
Lecture 15 | Convenience Document Methods | 00:07:37 Duration |
|
Lecture 16 | Order Expiration Times | 00:06:05 Duration |
|
Lecture 17 | globalThis has no index signature TS Error | |
|
Lecture 18 | Test Suite Setup | 00:02:36 Duration |
|
Lecture 19 | Type 'Documentany, any' is not assignable Error | |
|
Lecture 20 | Asserting Tickets Exist | 00:06:08 Duration |
|
Lecture 21 | Asserting Reserved Tickets | 00:05:05 Duration |
|
Lecture 22 | Testing the Success Case | 00:04:09 Duration |
|
Lecture 23 | Fetching a User's Orders | 00:05:23 Duration |
|
Lecture 24 | A Slightly Complicated Test | 00:12:23 Duration |
|
Lecture 25 | Fetching Individual Orders | 00:04:36 Duration |
|
Lecture 26 | Does Fetching Work | 00:07:17 Duration |
|
Lecture 27 | Cancelling an Order | 00:04:32 Duration |
|
Lecture 28 | Can We Cancel | 00:09:12 Duration |
Section 18 : Understanding Event Flow
|
Lecture 1 | Orders Service Events | 00:04:42 Duration |
|
Lecture 2 | Creating the Events | 00:09:23 Duration |
|
Lecture 3 | Implementing the Publishers | 00:03:13 Duration |
|
Lecture 4 | Publishing the Order Creation | 00:05:03 Duration |
|
Lecture 5 | Publishing Order Cancellation | 00:02:33 Duration |
|
Lecture 6 | Testing Event Publishing | 00:05:32 Duration |
Section 19 : Listening for Events and Handling Concurrency Issues
|
Lecture 1 | Time for Listeners! | 00:02:12 Duration |
|
Lecture 2 | Reminder on Listeners | 00:01:53 Duration |
|
Lecture 3 | Blueprint for Listeners | 00:03:39 Duration |
|
Lecture 4 | A Few More Reminders | 00:05:26 Duration |
|
Lecture 5 | Simple onMessage Implementation | 00:02:17 Duration |
|
Lecture 6 | ID Adjustment | 00:05:44 Duration |
|
Lecture 7 | Ticket Updated Listener Implementation | 00:04:32 Duration |
|
Lecture 8 | Initializing the Listeners | 00:02:44 Duration |
|
Lecture 9 | A Quick Manual Test | 00:03:16 Duration |
|
Lecture 10 | Clear Concurrency Issues | 00:12:59 Duration |
|
Lecture 11 | Reminder on Versioning Records | 00:06:41 Duration |
|
Lecture 12 | Optimistic Concurrency Control | 00:05:37 Duration |
|
Lecture 13 | Mongoose Update-If-Current | 00:03:46 Duration |
|
Lecture 14 | Implementing OCC with Mongoose | 00:04:02 Duration |
|
Lecture 15 | Test functions cannot both take a 'done' callback and return something Error | |
|
Lecture 16 | Testing OCC | 00:09:07 Duration |
|
Lecture 17 | One More Test | 00:03:45 Duration |
|
Lecture 18 | Who Updates Versions | 00:06:29 Duration |
|
Lecture 19 | Including Versions in Events | 00:02:59 Duration |
|
Lecture 20 | Updating Tickets Event Definitions | 00:03:55 Duration |
|
Lecture 21 | Property 'version' is missing TS Errors After Running Skaffold | |
|
Lecture 22 | Applying a Version Query | 00:07:14 Duration |
|
Lecture 23 | Did it Work | 00:04:31 Duration |
|
Lecture 24 | Abstracted Query Method | 00:05:42 Duration |
|
Lecture 25 | [Optional] Versioning Without Update-If-Current | 00:18:34 Duration |
|
Lecture 26 | Testing Listeners | 00:04:55 Duration |
|
Lecture 27 | A Complete Listener Test | 00:09:25 Duration |
|
Lecture 28 | Testing the Ack Call | 00:02:09 Duration |
|
Lecture 29 | Testing the Ticket Updated Listener | 00:08:20 Duration |
|
Lecture 30 | Success Case Testing | 00:04:49 Duration |
|
Lecture 31 | Out-Of-Order Events | 00:04:51 Duration |
|
Lecture 32 | The Next Few Videos | 00:03:39 Duration |
|
Lecture 33 | Fixing a Few Tests | 00:06:36 Duration |
|
Lecture 34 | Listeners in the Tickets Service | 00:01:47 Duration |
|
Lecture 35 | Building the Listener | 00:04:59 Duration |
|
Lecture 36 | Strategies for Locking a Ticket | 00:05:28 Duration |
|
Lecture 37 | Reserving a Ticket | 00:03:41 Duration |
|
Lecture 38 | Setup for Testing Reservation | 00:06:59 Duration |
|
Lecture 39 | Test Implementation | 00:04:29 Duration |
|
Lecture 40 | Missing Update Event | 00:06:14 Duration |
|
Lecture 41 | Private vs Protected Properties | 00:06:54 Duration |
|
Lecture 42 | Publishing While Listening | 00:06:42 Duration |
|
Lecture 43 | Mock Function Arguments | 00:09:49 Duration |
|
Lecture 44 | Order Cancelled Listener | 00:06:51 Duration |
|
Lecture 45 | A Lightning-Quick Test | 00:07:28 Duration |
|
Lecture 46 | Don't Forget to Listen! | 00:02:21 Duration |
|
Lecture 47 | Rejecting Edits of Reserved Tickets | 00:06:15 Duration |
Section 20 : Worker Services
|
Lecture 1 | The Expiration Service | 00:02:38 Duration |
|
Lecture 2 | Expiration Options | 00:07:55 Duration |
|
Lecture 3 | Initial Setup | 00:06:14 Duration |
|
Lecture 4 | Skaffold errors - Expiration Image Can't be Pulled | |
|
Lecture 5 | A Touch of Kubernetes Setup | 00:07:43 Duration |
|
Lecture 6 | File Sync Setup | 00:02:32 Duration |
|
Lecture 7 | Listener Creation | 00:03:42 Duration |
|
Lecture 8 | What's Bull All About | 00:03:56 Duration |
|
Lecture 9 | Creating a Queue | 00:09:07 Duration |
|
Lecture 10 | Queueing a Job on Event Arrival | 00:05:09 Duration |
|
Lecture 11 | Testing Job Processing | 00:03:17 Duration |
|
Lecture 12 | Delaying Job Processing | 00:05:23 Duration |
|
Lecture 13 | Defining the Expiration Complete Event | 00:03:50 Duration |
|
Lecture 14 | Publishing an Event on Job Processing | 00:06:27 Duration |
|
Lecture 15 | Handling an Expiration Event | 00:06:00 Duration |
|
Lecture 16 | Emitting the Order Cancelled Event | 00:05:37 Duration |
|
Lecture 17 | Testing the Expiration Complete Listener | 00:05:51 Duration |
|
Lecture 18 | A Touch More Testing | 00:07:20 Duration |
|
Lecture 19 | Listening for Expiration | 00:02:20 Duration |
Section 21 : Handling Payments
|
Lecture 1 | The Payments Service | 00:02:11 Duration |
|
Lecture 2 | globalThis has no index signature TS Error | |
|
Lecture 3 | Initial Setup | 00:08:45 Duration |
|
Lecture 4 | Replicated Fields | 00:05:57 Duration |
|
Lecture 5 | Another Order Model! | 00:07:29 Duration |
|
Lecture 6 | Update-If-Current | 00:01:17 Duration |
|
Lecture 7 | Replicating Orders | 00:04:07 Duration |
|
Lecture 8 | Testing Order Creation | 00:06:12 Duration |
|
Lecture 9 | Marking an Order as Cancelled | 00:05:39 Duration |
|
Lecture 10 | Cancelled Testing | 00:06:42 Duration |
|
Lecture 11 | Starting the Listeners | 00:03:54 Duration |
|
Lecture 12 | Payments Flow with Stripe | 00:05:10 Duration |
|
Lecture 13 | Implementing the Create Charge Handler | 00:08:32 Duration |
|
Lecture 14 | Validating Order Payment | 00:04:03 Duration |
|
Lecture 15 | Testing Order Validation Before Payment | 00:06:59 Duration |
|
Lecture 16 | Testing Same-User Validation | 00:05:10 Duration |
|
Lecture 17 | Stripe Setup | 00:03:58 Duration |
|
Lecture 18 | Creating a Stripe Secret | 00:03:19 Duration |
|
Lecture 19 | Creating a Charge with Stripe | 00:06:08 Duration |
|
Lecture 20 | Manual Testing of Payments | 00:06:35 Duration |
|
Lecture 21 | Automated Payment Testing | 00:06:26 Duration |
|
Lecture 22 | Mocked Stripe Client | 00:04:23 Duration |
|
Lecture 23 | A More Realistic Test Setup | 00:09:16 Duration |
|
Lecture 24 | Realistic Test Implementation | 00:06:15 Duration |
|
Lecture 25 | Tying an Order and Charge Together | 00:07:18 Duration |
|
Lecture 26 | Testing Payment Creation | 00:06:13 Duration |
|
Lecture 27 | Publishing a Payment Created Event | 00:06:31 Duration |
|
Lecture 28 | More on Publishing | 00:03:18 Duration |
|
Lecture 29 | Marking an Order as Complete | 00:06:17 Duration |
|
Lecture 30 | Important Info About the Next Lecture - Don't Skip | |
|
Lecture 31 | Don't Cancel Completed Orders! | 00:01:01 Duration |
Section 22 : Back to the Client
|
Lecture 1 | A Few More Pages | 00:06:15 Duration |
|
Lecture 2 | Reminder on Data Fetching with Next | 00:06:09 Duration |
|
Lecture 3 | Two Quick Fixes | 00:05:43 Duration |
|
Lecture 4 | Scaffolding a Form | 00:03:43 Duration |
|
Lecture 5 | Sanitizing Price Input | 00:06:29 Duration |
|
Lecture 6 | Ticket Creation | 00:06:44 Duration |
|
Lecture 7 | Listing All Tickets | 00:07:41 Duration |
|
Lecture 8 | Linking to Wildcard Routes | 00:07:07 Duration |
|
Lecture 9 | Creating an Order | 00:07:25 Duration |
|
Lecture 10 | Programmatic Navigation to Wildcard Routes | 00:04:16 Duration |
|
Lecture 11 | The Expiration Timer | 00:10:54 Duration |
|
Lecture 12 | Displaying the Expiration | 00:01:01 Duration |
|
Lecture 13 | Showing a Stripe Payment Form | 00:03:06 Duration |
|
Lecture 14 | Configuring Stripe | 00:04:23 Duration |
|
Lecture 15 | Test Credit Card Numbers | 00:01:58 Duration |
|
Lecture 16 | Paying for an Order | 00:09:24 Duration |
|
Lecture 17 | Filtering Reserved Tickets | 00:02:27 Duration |
|
Lecture 18 | Header Links | 00:01:47 Duration |
|
Lecture 19 | Rendering a List of Orders | 00:06:20 Duration |
Section 23 : CICD
|
Lecture 1 | Development Workflow | 00:03:39 Duration |
|
Lecture 2 | Git Repository Approaches | 00:06:04 Duration |
|
Lecture 3 | Creating a GitHub Action | 00:07:11 Duration |
|
Lecture 4 | Adding a CI Test Script | 00:02:42 Duration |
|
Lecture 5 | Running Tests on PR Creation | 00:04:48 Duration |
|
Lecture 6 | Output of Failing Tests | 00:05:48 Duration |
|
Lecture 7 | Running Tests in Parallel | 00:07:27 Duration |
|
Lecture 8 | Verifying a Test Run | 00:03:01 Duration |
|
Lecture 9 | Selective Test Execution | 00:05:44 Duration |
|
Lecture 10 | Deployment Options | 00:07:40 Duration |
|
Lecture 11 | Creating a Hosted Cluster | 00:02:38 Duration |
|
Lecture 12 | Reminder on Kubernetes Context | 00:03:32 Duration |
|
Lecture 13 | Reminder on Swapping Contexts | 00:03:56 Duration |
|
Lecture 14 | The Deployment Plan | 00:04:04 Duration |
|
Lecture 15 | Building an Image in an Action | 00:08:40 Duration |
|
Lecture 16 | Testing the Image Build | 00:02:30 Duration |
|
Lecture 17 | Restarting the Deployment | 00:07:17 Duration |
|
Lecture 18 | Applying Kubernetes Manifests | |
|
Lecture 19 | Prod vs Dev Manifest Files | 00:04:23 Duration |
|
Lecture 20 | Manual Secret Creation | 00:03:39 Duration |
|
Lecture 21 | Don't Forget Ingress-Nginx! | 00:05:31 Duration |
|
Lecture 22 | Testing Automated Deployment | 00:02:51 Duration |
|
Lecture 23 | Additional Deploy Files | 00:07:12 Duration |
|
Lecture 24 | A Successful Deploy! | 00:06:06 Duration |
|
Lecture 25 | Buying a Domain Name | 00:03:10 Duration |
|
Lecture 26 | Three Important Changes Needed to Deploy - Do Not Skip! | |
|
Lecture 27 | Configuring the Domain Name | 00:05:27 Duration |
|
Lecture 28 | I Really Hope This Works | 00:01:58 Duration |
|
Lecture 29 | Next Steps | 00:04:36 Duration |
Section 24 : [Appendix A] - Basics of Docker
|
Lecture 1 | Why Use Docker | 00:03:43 Duration |
|
Lecture 2 | What is Docker | 00:02:53 Duration |
|
Lecture 3 | Docker for Mac Windows | 00:01:57 Duration |
|
Lecture 4 | Installing Docker on macOS | 00:04:45 Duration |
|
Lecture 5 | Installing Docker for Windows Home users | |
|
Lecture 6 | Installing Docker for Windows Professional | 00:02:03 Duration |
|
Lecture 7 | More Windows Professional Setup | 00:00:40 Duration |
|
Lecture 8 | One Last Piece of Windows Professional Setup | 00:01:09 Duration |
|
Lecture 9 | Installing Docker on Linux | |
|
Lecture 10 | Using the Docker Client | 00:05:03 Duration |
|
Lecture 11 | But Really | 00:08:30 Duration |
|
Lecture 12 | How's Docker Running on Your Computer | 00:02:44 Duration |
|
Lecture 13 | Docker Run in Detail | 00:01:53 Duration |
|
Lecture 14 | Overriding Default Commands | 00:05:12 Duration |
|
Lecture 15 | Listing Running Containers | 00:04:09 Duration |
|
Lecture 16 | Container Lifecycle | 00:05:16 Duration |
|
Lecture 17 | Restarting Stopped Containers | 00:03:43 Duration |
|
Lecture 18 | Removing Stopped Containers | 00:01:39 Duration |
|
Lecture 19 | Retrieving Output Logs | 00:02:33 Duration |
|
Lecture 20 | Stopping Containers | 00:05:21 Duration |
|
Lecture 21 | Multi-Command Containers | 00:04:15 Duration |
|
Lecture 22 | Executing Commands in Running Containers | 00:02:53 Duration |
|
Lecture 23 | The Purpose of the 'it' Flag | 00:04:35 Duration |
|
Lecture 24 | Getting a Command Prompt in a Container | 00:04:06 Duration |
|
Lecture 25 | Starting with a Shell | 00:02:13 Duration |
|
Lecture 26 | Container Isolation | 00:03:09 Duration |
|
Lecture 27 | Creating Docker Images | 00:02:36 Duration |
|
Lecture 28 | Buildkit for Docker Desktop v2 | |
|
Lecture 29 | Building a Dockerfile | 00:04:51 Duration |
|
Lecture 30 | Dockerfile Teardown | 00:02:40 Duration |
|
Lecture 31 | What's a Base Image | 00:05:40 Duration |
|
Lecture 32 | The Build Process in Detail | 00:11:09 Duration |
|
Lecture 33 | A Brief Recap | |
|
Lecture 34 | Rebuilds with Cache | 00:07:02 Duration |
|
Lecture 35 | Tagging an Image | 00:04:26 Duration |
|
Lecture 36 | Quick Note for Windows Users | |
|
Lecture 37 | Manual Image Generation with Docker Commit | 00:05:00 Duration |
|
Lecture 38 | Project Outline | 00:02:35 Duration |
|
Lecture 39 | Node Server Setup | 00:05:03 Duration |
|
Lecture 40 | A Few Planned Errors | 00:05:12 Duration |
|
Lecture 41 | Required WORKDIR update - Could not detect node name, idealTree errors | |
|
Lecture 42 | Base Image Issues | 00:07:50 Duration |
|
Lecture 43 | A Few Missing Files | 00:03:18 Duration |
|
Lecture 44 | Copying Build Files | 00:04:50 Duration |
|
Lecture 45 | Container Port Forwarding | 00:07:26 Duration |
|
Lecture 46 | Specifying a Working Directory | 00:07:52 Duration |
|
Lecture 47 | Unnecessary Rebuilds | 00:04:16 Duration |
|
Lecture 48 | Minimizing Cache Busting and Rebuilds | 00:04:58 Duration |
Section 25 : [Appendix B] - Basics of Typescript
|
Lecture 1 | About Proctor Testing | |
|
Lecture 2 | TypeScript Overview | 00:06:19 Duration |
|
Lecture 3 | Environment Setup | 00:07:59 Duration |
|
Lecture 4 | A First App | 00:04:42 Duration |
|
Lecture 5 | Executing Typescript Code | 00:05:03 Duration |
|
Lecture 6 | One Quick Change | 00:03:34 Duration |
|
Lecture 7 | Catching Errors with TypeScript | 00:07:22 Duration |
|
Lecture 8 | Catching More Errors! | 00:05:15 Duration |
|
Lecture 9 | Do Not Skip - Course Overview | 00:03:35 Duration |
|
Lecture 10 | Types | 00:05:11 Duration |
|
Lecture 11 | More on Types | 00:05:52 Duration |
|
Lecture 12 | Examples of Types | 00:04:48 Duration |
|
Lecture 13 | Where Do We Use Types | 00:00:49 Duration |
|
Lecture 14 | Type Annotations and Inference | 00:02:02 Duration |
|
Lecture 15 | Annotations With Variables | 00:04:53 Duration |
|
Lecture 16 | Object Literal Annotations | 00:06:53 Duration |
|
Lecture 17 | Understanding Inference | 00:03:50 Duration |
|
Lecture 18 | The Any Type | 00:07:47 Duration |
|
Lecture 19 | Fixing the Any Type | 00:01:48 Duration |
|
Lecture 20 | Delayed Initialization | 00:03:04 Duration |
|
Lecture 21 | When Inference Doesn't Work | 00:04:36 Duration |
|
Lecture 22 | More on Annotations Around Functions | 00:04:55 Duration |
|
Lecture 23 | Inference Around Functions | 00:06:07 Duration |
|
Lecture 24 | Annotations for Anonymous Functions | 00:01:42 Duration |
|
Lecture 25 | Void and Never | 00:02:48 Duration |
|
Lecture 26 | Destructuring with Annotations | 00:03:35 Duration |
|
Lecture 27 | Annotations Around Objects | 00:07:05 Duration |
|
Lecture 28 | Arrays in TypeScript | 00:05:04 Duration |
|
Lecture 29 | Why Typed Arrays | 00:04:30 Duration |
|
Lecture 30 | Multiple Typees in Arrays | 00:02:56 Duration |
|
Lecture 31 | When to Use Typed Arrays | 00:00:53 Duration |
|
Lecture 32 | Tuples in TypeScript | 00:04:04 Duration |
|
Lecture 33 | Tuples in Action | 00:05:27 Duration |
|
Lecture 34 | Why Tuples | 00:03:19 Duration |
|
Lecture 35 | Interfaces | 00:01:26 Duration |
|
Lecture 36 | Long Type Annotations | 00:04:41 Duration |
|
Lecture 37 | Fixing Annotations With Interfaces | 00:04:36 Duration |
|
Lecture 38 | Syntax Around Interfaces | 00:03:30 Duration |
|
Lecture 39 | Functions in Interfaces | 00:04:45 Duration |
|
Lecture 40 | Code Reuse with Interfaces | 00:04:15 Duration |
|
Lecture 41 | General Plan with Interfaces | 00:03:11 Duration |
|
Lecture 42 | Classes | 00:03:46 Duration |
|
Lecture 43 | Basic Inheritance | 00:03:02 Duration |
|
Lecture 44 | Class Method Modifiers | 00:06:40 Duration |
|
Lecture 45 | Fields in Classes | 00:06:18 Duration |
|
Lecture 46 | Fields with Inheritance | 00:04:18 Duration |
|
Lecture 47 | Where to Use Classes | 00:01:09 Duration |
|
Lecture 48 | App Overview | 00:02:44 Duration |
|
Lecture 49 | Bundling with Parcel | 00:04:54 Duration |
|
Lecture 50 | Project Structure | 00:03:19 Duration |
|
Lecture 51 | Generating Random Data | 00:05:28 Duration |
|
Lecture 52 | Type Definition Files | 00:05:16 Duration |
|
Lecture 53 | Using Type Definition Files | 00:06:20 Duration |
|
Lecture 54 | Export Statements in TypeScript | 00:05:05 Duration |
|
Lecture 55 | Defining a Company | 00:04:42 Duration |
|
Lecture 56 | Important Note About Google Maps Key | |
|
Lecture 57 | Adding Google Maps Support | 00:07:38 Duration |
|
Lecture 58 | Required Update for New @types Library | |
|
Lecture 59 | Google Maps Integration with TypeScript | 00:04:05 Duration |
|
Lecture 60 | Exploring Type Definition Files | 00:12:46 Duration |
|
Lecture 61 | Hiding Functionality | 00:06:28 Duration |
|
Lecture 62 | Why Use Private Modifiers Here's Why | 00:08:25 Duration |
|
Lecture 63 | Adding Markers | 00:09:18 Duration |
|
Lecture 64 | Duplicate Code | 00:02:44 Duration |
|
Lecture 65 | One Possible Solution | 00:06:37 Duration |
|
Lecture 66 | Restricting Access with Interfaces | 00:05:35 Duration |
|
Lecture 67 | Implicit Type Checks | 00:03:25 Duration |
|
Lecture 68 | Showing Popup Windows | 00:06:47 Duration |
|
Lecture 69 | Updating Interface Definitions | 00:07:11 Duration |
|
Lecture 70 | Optional Implements Clauses | 00:06:06 Duration |
|
Lecture 71 | App Wrapup | 00:08:07 Duration |