Skip to content

feat: ✨ Add new chapters #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,12 @@ macos/
linux/
ios/
android/
.DS_Store
.vscode/
.flutter-plugins/
.dart_tool/
.packages
.pub-cache/
.pub/
build/
pubspec.lock
7 changes: 7 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"workbench.colorCustomizations": {
"activityBar.background": "#590248",
"titleBar.activeBackground": "#7D0365",
"titleBar.activeForeground": "#FFF9FE"
}
}
44 changes: 22 additions & 22 deletions chapter_01_overview/.flutter-plugins
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
# This is a generated file; do not edit or check into version control.
audioplayers=/Users/viktor/.pub-cache/hosted/pub.dev/audioplayers-5.2.1/
audioplayers_android=/Users/viktor/.pub-cache/hosted/pub.dev/audioplayers_android-4.0.3/
audioplayers_darwin=/Users/viktor/.pub-cache/hosted/pub.dev/audioplayers_darwin-5.0.2/
audioplayers_linux=/Users/viktor/.pub-cache/hosted/pub.dev/audioplayers_linux-3.1.0/
audioplayers_web=/Users/viktor/.pub-cache/hosted/pub.dev/audioplayers_web-4.1.0/
audioplayers_windows=/Users/viktor/.pub-cache/hosted/pub.dev/audioplayers_windows-3.1.0/
path_provider=/Users/viktor/.pub-cache/hosted/pub.dev/path_provider-2.1.1/
path_provider_android=/Users/viktor/.pub-cache/hosted/pub.dev/path_provider_android-2.2.2/
path_provider_foundation=/Users/viktor/.pub-cache/hosted/pub.dev/path_provider_foundation-2.3.1/
path_provider_linux=/Users/viktor/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/
path_provider_windows=/Users/viktor/.pub-cache/hosted/pub.dev/path_provider_windows-2.2.1/
url_launcher=/Users/viktor/.pub-cache/hosted/pub.dev/url_launcher-6.2.2/
url_launcher_android=/Users/viktor/.pub-cache/hosted/pub.dev/url_launcher_android-6.2.0/
url_launcher_ios=/Users/viktor/.pub-cache/hosted/pub.dev/url_launcher_ios-6.2.1/
url_launcher_linux=/Users/viktor/.pub-cache/hosted/pub.dev/url_launcher_linux-3.1.1/
url_launcher_macos=/Users/viktor/.pub-cache/hosted/pub.dev/url_launcher_macos-3.1.0/
url_launcher_web=/Users/viktor/.pub-cache/hosted/pub.dev/url_launcher_web-2.2.2/
url_launcher_windows=/Users/viktor/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.1/
video_player=/Users/viktor/.pub-cache/hosted/pub.dev/video_player-2.8.1/
video_player_android=/Users/viktor/.pub-cache/hosted/pub.dev/video_player_android-2.4.10/
video_player_avfoundation=/Users/viktor/.pub-cache/hosted/pub.dev/video_player_avfoundation-2.5.3/
video_player_web=/Users/viktor/.pub-cache/hosted/pub.dev/video_player_web-2.1.2/
audioplayers=/Users/akanshajain/.pub-cache/hosted/pub.dev/audioplayers-5.2.1/
audioplayers_android=/Users/akanshajain/.pub-cache/hosted/pub.dev/audioplayers_android-4.0.3/
audioplayers_darwin=/Users/akanshajain/.pub-cache/hosted/pub.dev/audioplayers_darwin-5.0.2/
audioplayers_linux=/Users/akanshajain/.pub-cache/hosted/pub.dev/audioplayers_linux-3.1.0/
audioplayers_web=/Users/akanshajain/.pub-cache/hosted/pub.dev/audioplayers_web-4.1.0/
audioplayers_windows=/Users/akanshajain/.pub-cache/hosted/pub.dev/audioplayers_windows-3.1.0/
path_provider=/Users/akanshajain/.pub-cache/hosted/pub.dev/path_provider-2.1.1/
path_provider_android=/Users/akanshajain/.pub-cache/hosted/pub.dev/path_provider_android-2.2.2/
path_provider_foundation=/Users/akanshajain/.pub-cache/hosted/pub.dev/path_provider_foundation-2.3.1/
path_provider_linux=/Users/akanshajain/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/
path_provider_windows=/Users/akanshajain/.pub-cache/hosted/pub.dev/path_provider_windows-2.2.1/
url_launcher=/Users/akanshajain/.pub-cache/hosted/pub.dev/url_launcher-6.2.2/
url_launcher_android=/Users/akanshajain/.pub-cache/hosted/pub.dev/url_launcher_android-6.2.1/
url_launcher_ios=/Users/akanshajain/.pub-cache/hosted/pub.dev/url_launcher_ios-6.2.2/
url_launcher_linux=/Users/akanshajain/.pub-cache/hosted/pub.dev/url_launcher_linux-3.1.1/
url_launcher_macos=/Users/akanshajain/.pub-cache/hosted/pub.dev/url_launcher_macos-3.1.0/
url_launcher_web=/Users/akanshajain/.pub-cache/hosted/pub.dev/url_launcher_web-2.2.3/
url_launcher_windows=/Users/akanshajain/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.1/
video_player=/Users/akanshajain/.pub-cache/hosted/pub.dev/video_player-2.8.2/
video_player_android=/Users/akanshajain/.pub-cache/hosted/pub.dev/video_player_android-2.4.11/
video_player_avfoundation=/Users/akanshajain/.pub-cache/hosted/pub.dev/video_player_avfoundation-2.5.4/
video_player_web=/Users/akanshajain/.pub-cache/hosted/pub.dev/video_player_web-2.1.3/
2 changes: 1 addition & 1 deletion chapter_01_overview/.flutter-plugins-dependencies
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"audioplayers_darwin","path":"/Users/viktor/.pub-cache/hosted/pub.dev/audioplayers_darwin-5.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/viktor/.pub-cache/hosted/pub.dev/path_provider_foundation-2.3.1/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"url_launcher_ios","path":"/Users/viktor/.pub-cache/hosted/pub.dev/url_launcher_ios-6.2.1/","native_build":true,"dependencies":[]},{"name":"video_player_avfoundation","path":"/Users/viktor/.pub-cache/hosted/pub.dev/video_player_avfoundation-2.5.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]}],"android":[{"name":"audioplayers_android","path":"/Users/viktor/.pub-cache/hosted/pub.dev/audioplayers_android-4.0.3/","native_build":true,"dependencies":[]},{"name":"path_provider_android","path":"/Users/viktor/.pub-cache/hosted/pub.dev/path_provider_android-2.2.2/","native_build":true,"dependencies":[]},{"name":"url_launcher_android","path":"/Users/viktor/.pub-cache/hosted/pub.dev/url_launcher_android-6.2.0/","native_build":true,"dependencies":[]},{"name":"video_player_android","path":"/Users/viktor/.pub-cache/hosted/pub.dev/video_player_android-2.4.10/","native_build":true,"dependencies":[]}],"macos":[{"name":"audioplayers_darwin","path":"/Users/viktor/.pub-cache/hosted/pub.dev/audioplayers_darwin-5.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/viktor/.pub-cache/hosted/pub.dev/path_provider_foundation-2.3.1/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"url_launcher_macos","path":"/Users/viktor/.pub-cache/hosted/pub.dev/url_launcher_macos-3.1.0/","native_build":true,"dependencies":[]},{"name":"video_player_avfoundation","path":"/Users/viktor/.pub-cache/hosted/pub.dev/video_player_avfoundation-2.5.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]}],"linux":[{"name":"audioplayers_linux","path":"/Users/viktor/.pub-cache/hosted/pub.dev/audioplayers_linux-3.1.0/","native_build":true,"dependencies":[]},{"name":"path_provider_linux","path":"/Users/viktor/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/","native_build":false,"dependencies":[]},{"name":"url_launcher_linux","path":"/Users/viktor/.pub-cache/hosted/pub.dev/url_launcher_linux-3.1.1/","native_build":true,"dependencies":[]}],"windows":[{"name":"audioplayers_windows","path":"/Users/viktor/.pub-cache/hosted/pub.dev/audioplayers_windows-3.1.0/","native_build":true,"dependencies":[]},{"name":"path_provider_windows","path":"/Users/viktor/.pub-cache/hosted/pub.dev/path_provider_windows-2.2.1/","native_build":false,"dependencies":[]},{"name":"url_launcher_windows","path":"/Users/viktor/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.1/","native_build":true,"dependencies":[]}],"web":[{"name":"audioplayers_web","path":"/Users/viktor/.pub-cache/hosted/pub.dev/audioplayers_web-4.1.0/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/viktor/.pub-cache/hosted/pub.dev/url_launcher_web-2.2.2/","dependencies":[]},{"name":"video_player_web","path":"/Users/viktor/.pub-cache/hosted/pub.dev/video_player_web-2.1.2/","dependencies":[]}]},"dependencyGraph":[{"name":"audioplayers","dependencies":["audioplayers_android","audioplayers_darwin","audioplayers_linux","audioplayers_web","audioplayers_windows","path_provider"]},{"name":"audioplayers_android","dependencies":[]},{"name":"audioplayers_darwin","dependencies":[]},{"name":"audioplayers_linux","dependencies":[]},{"name":"audioplayers_web","dependencies":[]},{"name":"audioplayers_windows","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_android","url_launcher_ios","url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_android","dependencies":[]},{"name":"url_launcher_ios","dependencies":[]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]},{"name":"video_player","dependencies":["video_player_android","video_player_avfoundation","video_player_web"]},{"name":"video_player_android","dependencies":[]},{"name":"video_player_avfoundation","dependencies":[]},{"name":"video_player_web","dependencies":[]}],"date_created":"2024-01-18 19:59:49.235554","version":"3.16.7"}
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"audioplayers_darwin","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/audioplayers_darwin-5.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/path_provider_foundation-2.3.1/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"url_launcher_ios","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/url_launcher_ios-6.2.2/","native_build":true,"dependencies":[]},{"name":"video_player_avfoundation","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/video_player_avfoundation-2.5.4/","shared_darwin_source":true,"native_build":true,"dependencies":[]}],"android":[{"name":"audioplayers_android","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/audioplayers_android-4.0.3/","native_build":true,"dependencies":[]},{"name":"path_provider_android","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/path_provider_android-2.2.2/","native_build":true,"dependencies":[]},{"name":"url_launcher_android","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/url_launcher_android-6.2.1/","native_build":true,"dependencies":[]},{"name":"video_player_android","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/video_player_android-2.4.11/","native_build":true,"dependencies":[]}],"macos":[{"name":"audioplayers_darwin","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/audioplayers_darwin-5.0.2/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/path_provider_foundation-2.3.1/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"url_launcher_macos","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/url_launcher_macos-3.1.0/","native_build":true,"dependencies":[]},{"name":"video_player_avfoundation","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/video_player_avfoundation-2.5.4/","shared_darwin_source":true,"native_build":true,"dependencies":[]}],"linux":[{"name":"audioplayers_linux","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/audioplayers_linux-3.1.0/","native_build":true,"dependencies":[]},{"name":"path_provider_linux","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/","native_build":false,"dependencies":[]},{"name":"url_launcher_linux","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/url_launcher_linux-3.1.1/","native_build":true,"dependencies":[]}],"windows":[{"name":"audioplayers_windows","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/audioplayers_windows-3.1.0/","native_build":true,"dependencies":[]},{"name":"path_provider_windows","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/path_provider_windows-2.2.1/","native_build":false,"dependencies":[]},{"name":"url_launcher_windows","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.1/","native_build":true,"dependencies":[]}],"web":[{"name":"audioplayers_web","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/audioplayers_web-4.1.0/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/url_launcher_web-2.2.3/","dependencies":[]},{"name":"video_player_web","path":"/Users/akanshajain/.pub-cache/hosted/pub.dev/video_player_web-2.1.3/","dependencies":[]}]},"dependencyGraph":[{"name":"audioplayers","dependencies":["audioplayers_android","audioplayers_darwin","audioplayers_linux","audioplayers_web","audioplayers_windows","path_provider"]},{"name":"audioplayers_android","dependencies":[]},{"name":"audioplayers_darwin","dependencies":[]},{"name":"audioplayers_linux","dependencies":[]},{"name":"audioplayers_web","dependencies":[]},{"name":"audioplayers_windows","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_android","url_launcher_ios","url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_android","dependencies":[]},{"name":"url_launcher_ios","dependencies":[]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]},{"name":"video_player","dependencies":["video_player_android","video_player_avfoundation","video_player_web"]},{"name":"video_player_android","dependencies":[]},{"name":"video_player_avfoundation","dependencies":[]},{"name":"video_player_web","dependencies":[]}],"date_created":"2024-01-23 13:10:24.258249","version":"3.16.5"}
3 changes: 3 additions & 0 deletions chapter_01_overview/assets/feature_vs_code.mov
Git LFS file not shown
2 changes: 2 additions & 0 deletions chapter_01_overview/lib/chapter_01_overview.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ export 'src/slides/slide_00_title_overview.dart';
export 'src/slides/slide_01_features_main.dart';
export 'src/slides/slide_02_features_all.dart';
export 'src/slides/slide_03_features_insights.dart';
export 'src/slides/slide_04_features_vs_code.dart';

final slidesOverview = [
slideTitleOverview,
slideFeaturesMain,
slideFeaturesAll,
slideFeaturesInsights,
slideFeaturesVSCode,
];
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import 'package:slick_slides/slick_slides.dart';

const String _presenterNotesOverviewTitleSlide =
'Serverpod is an open-source, scalable app server written in Dart for the Flutter community. It has gained substantial popularity among Flutter developers since its initial stable release in January. The framework comes with many features that make it faster to get things done, debug your code, and deploy your server. It automatically generates your protocol and client-side code by analyzing your server. Calling a remote endpoint is as easy as making a local method call.';

final slideTitleOverview = TitleSlide(
title: 'Serverpod Overview',
notes: 'This would be the presenter notes for this slide.',
notes: _presenterNotesOverviewTitleSlide,
);
12 changes: 10 additions & 2 deletions chapter_01_overview/lib/src/slides/slide_01_features_main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,17 @@ import 'package:flutter_svg/svg.dart';
import 'package:shared/shared.dart';
import 'package:slick_slides/slick_slides.dart';

const String _presenterFeaturesMainNotes =
'''Serverpod is a complete, competent backend for Flutter. Apart from being just a server, Serverpod incorporates many common tasks that are otherwise cumbersome to implement or require external services.

It provides you with world-class logging capabilities. You no longer need to search through endless server logs. Pinpoint exceptions and slow database queries in an easy-to-use user interface with a single click.

It comes with a high-performance distributed cache built right in. Any serializable objects can be cached locally on your server or using Redis if you need to use the same cache across a cluster of servers.

It comes with a complete database migration system that helps you apply and version changes to the database. With Serverpod's ORM, your queries use native Dart types and null-safety. There is a straight path from your statically checked code to the database.''';

final slideFeaturesMain = Slide(
// TODO: Add presenter notes.
notes: 'This would be the presenter notes for this slide.',
notes: _presenterFeaturesMainNotes,
transition: defaultTransition,
theme: const SlideThemeData.light(),
builder: (context) => ContentLayout(
Expand Down
9 changes: 7 additions & 2 deletions chapter_01_overview/lib/src/slides/slide_02_features_all.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,14 @@ import 'package:flutter_svg/svg.dart';
import 'package:shared/shared.dart';
import 'package:slick_slides/slick_slides.dart';

const String _presenterFeaturesAllNotes =
'''Serverpod comes with all the features you need to build a complete backend for your Flutter app.
You can seamlessly upload files directly to Google Cloud Storage, S3, or store them in your database with ease. Sign in through various social platforms like Google, Apple, Firebase, or even create your own authentication system. Utilize authenticated sockets to pass serialized objects for real-time communication, even across a cluster of servers, making it ideal for gaming or chat applications. Replace cumbersome cron jobs with Serverpod's future calls, enabling you to invoke methods at any time or after a specified delay, with the added benefit of persistence even if the server restarts. Keep a close eye on the health of your database and external services through custom health checks, ensuring prompt notification of any issues. Plus, deploying your server is made incredibly quick with Serverpod's included Terraform scripts for Google Cloud Platform and AWS.
With Serverpod, building a powerful backend for your Flutter app has never been easier.
''';

final slideFeaturesAll = Slide(
// TODO: Add presenter notes.
notes: 'This would be the presenter notes for this slide.',
notes: _presenterFeaturesAllNotes,
theme: const SlideThemeData.light(),
transition: defaultTransition,
builder: (context) => ContentLayout(
Expand Down
11 changes: 11 additions & 0 deletions chapter_01_overview/lib/src/slides/slide_03_features_insights.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,18 @@ import 'package:flutter/material.dart';
import 'package:shared/shared.dart';
import 'package:slick_slides/slick_slides.dart';

const String _presenterFeaturesInsightsNotes =
'''Serverpod Insights is a companion app bundled with Serverpod. It allows you to access your server's logs and health metrics.

- Logs are grouped by sessions. So instead of browsing through endless text logs, you can directly find the relevant logs for a method call.

- Insights can not only log your methods, but also all the database queries you make. This makes it quick to pin-point any performance issues.

- The logging configuration can be changed while the server is running. This allows you to increase the log level for specific endpoints or methods.
''';
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe skip the "rembember to always use..." and which platforms are supported (or we will need to update this in the future).

But we should flesh out the benefits of using Insights a bit more:

  • Logs are grouped by sessions. So instead of browsing through endless text logs, you can directly find the relevant logs for a method call.
  • Insights can not only log your methods, but also all the database queries you make. This makes it quick to pin-point any performance issues.
  • The logging configuration can be changed while to server is running. This allows you to increase the log level for specific endpoints or methods.


final slideFeaturesInsights = Slide(
notes: _presenterFeaturesInsightsNotes,
transition: defaultTransition,
builder: (context) {
return Stack(
Expand Down
14 changes: 14 additions & 0 deletions chapter_01_overview/lib/src/slides/slide_04_features_vs_code.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import 'package:slick_slides/slick_slides.dart';
import 'package:video_player/video_player.dart';

const String _presenterFeaturesVSCodeNotes =
'''The VSCode plugin ensures that errors surface exactly where they occur in your code, in real-time as you type (like a helpful code co-pilot).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's flesh this out a bit more. Perhaps take some inspiration from Isak's part in the 1.2 release video.

''';

final slideFeaturesVSCode = VideoSlide(
notes: _presenterFeaturesVSCodeNotes,
videoPlayerController: VideoPlayerController.asset(
'assets/feature_vs_code.mov',
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • There seem to be a bit of a funky frame around the VS Code window, where is that coming from?
  • The video is vertically stretched.
  • There are two mouse pointers in the video.

package: 'chapter_01_overview',
)..setPlaybackSpeed(2.0),
);
Git LFS file not shown
3 changes: 3 additions & 0 deletions chapter_02_get_started/assets/database_migration_slide.mov
Git LFS file not shown
Loading