{"id":396192,"date":"2024-06-29T12:41:33","date_gmt":"2024-06-29T12:41:33","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=396192"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=396192","title":{"rendered":"<span>Ontol \u043f\u0440\u043e Kotlin: \u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0430 28 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432 \u0438 \u0432\u0438\u0434\u0435\u043e \u043d\u0430 Youtube<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/6bc\/ec6\/769\/6bcec67690cec29642c631a0ceb95992.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/6bc\/ec6\/769\/6bcec67690cec29642c631a0ceb95992.png\"\/><\/p>\n<h3>\u041d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c<\/h3>\n<p>  <b>freeCodeCamp<\/b> \u2014 \u043b\u0443\u0447\u0448\u0438\u0439 \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u0434\u043b\u044f \u0441\u0430\u043c\u043e\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e. \u041c\u043d\u043e\u0433\u0438\u0435 \u043f\u043b\u0430\u0442\u043d\u044b\u0435 \u0448\u043a\u043e\u043b\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u00ab\u0440\u0435\u0440\u0430\u0439\u0442\u00bb \u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0438 \u043f\u0440\u043e\u0434\u0430\u044e\u0442 \u0437\u0430 100\u041a \u0440\u0443\u0431.<\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee31370783b8bf930e5\" data-style=\"\" id=\"61809ee31370783b8bf930e5\" width=\"\"><\/div>\n<\/div>\n<p>  850 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  2,5 \u0447\u0430\u0441\u0430<br \/>  \u043a\u0443\u0440\u0441 \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 2019 \u0433\u043e\u0434\u0430 <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\">(0:00:50) Create Your First Kotlin Project<br \/>   (0:04:23) Hello World<br \/>   (0:06:33) Working With Variables<br \/>   (0:11:04) Type System<br \/>   (0:15:00) Basic Control Flow<br \/>   (0:21:31) Basic Kotlin Functions<br \/>   (0:27:12) Function Parameters<br \/>   (0:32:52) Arrays<br \/>   (0:35:28) Iterating with forEach<br \/>   (0:41:17) Lists<br \/>   (0:42:47) Maps<br \/>   (0:45:05) Mutable vs Immutable Collections<br \/>   (0:49:24) Vararg Parameters<br \/>   (0:54:21) Named Arguments<br \/>   (0:56:26) Default Parameter Values<br \/>   (1:00:27) Create A Simple Class<br \/>   (1:03:35) Adding Class Properties<br \/>   (1:05:15) Class Init Block<br \/>   (1:06:40) Accessing Class Properties<br \/>   (1:07:32) Primary Constructor Properties<br \/>   (1:08:17) Secondary Constructors<br \/>   (1:09:50) Working With Multiple Init Blocks<br \/>   (1:11:30) Default Property Values<br \/>   (1:11:59) Properties With Custom Getters\/Setters<br \/>   (1:16:52) Class Methods<br \/>   (1:20:12) Visibility Modifiers \u2014 Public\/Private\/Protected\/Public<br \/>   (1:22:30) Interfaces<br \/>   (1:24:21) Abstract Classes<br \/>   (1:26:13) Implementing An Interface<br \/>   (1:26:35) Overriding Methods<br \/>   (1:28:30) Default Interface Methods<br \/>   (1:29:30) Interface Properties<br \/>   (1:31:40) Implementing Multiple Interfaces<br \/>   (1:32:57) Type Checking And Smart Casts<br \/>   (1:36:18) Inheritance<br \/>   (1:43:07) Object Expressions<br \/>   (1:45:06) Companion Objects<br \/>   (1:49:51) Object Declarations<br \/>   (1:52:41) Enum Classes<br \/>   (1:58:16) Sealed Classes<br \/>   (2:00:07) Data Classes<br \/>   (2:12:25) Extension Functions\/Properties<br \/>   (2:16:40) Higher-Order Functions<br \/>   (2:29:07) Using The Kotlin Standard Library<br \/>   (2:00:07) Data Classes  <\/div>\n<\/p><\/div>\n<p>  <a name=\"habracut\"><\/a>  <\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee4122cc8f63869683b\" data-style=\"\" id=\"61809ee4122cc8f63869683b\" width=\"\"><\/div>\n<\/div>\n<p>  210 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432 <br \/>  3,5 \u0447\u0430\u0441\u0430<br \/>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0434 Adroid, 2019 \u0433\u043e\u0434<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\">1<br \/>  (0:00) Introduction<\/p>\n<p>  2<br \/>  (5:14) Model View ViewModel (MVVM) Architecture fundamentals and variations<br \/>  (5:38) Is MVVM the perfect architecture?<br \/>  (7:41) Overview of MVVM with whiteboard example<br \/>  (12:11) Pros and Cons of MVVM<br \/>  (18:58) Package structure<\/p>\n<p>  3<br \/>  (23:22) How to create Vector Drawables<br \/>  (24:22) Difference between Raster (PNG, JPG, BMP) and Vector (SVG) Images?<br \/>  (27:55) Uh Oh!<br \/>  (28:41) How to use Inkscape to create an SVG from a BMP\/PNG<br \/>  (30:07) How to convert an SVG into an Android Studio Vector Asset<br \/>  (32:29) How to create simple animations using animation lists and fade animations<\/p>\n<p>  4<br \/>  (38:19) Material Design User Interface using ConstraintLayout and Styles<br \/>  (41:00) Building an XML Layout using ConstraintLayout<br \/>  (51:09) Using ConstraintLayout Chains<br \/>  (55:43) Some tips on using Styles to create a material design look<\/p>\n<p>  5<br \/>  (56:51) How to use (and when not to use) the Android Navigation Component from Android Jetpack<br \/>  (1:00:00) Adding Safe Args to gradle<br \/>  (1:01:15) Building a Navigation Graph using the Navigation Editor (XML)<br \/>  (1:11:00) Creating a NavHostFragment to host the Navigation Component and adding it to an Activity<br \/>  (1:15:29) How to actually change destinations in our Fragments using the Navigation Component (with safe args)<\/p>\n<p>  6<br \/>  (1:20:00) Setting up Fragments as Views in MVVM using Kotlin Synthetic Properties<br \/>  (1:25:32) Starting point<br \/>  (1:27:54) Importing an XML layout to an Activity\/Fragment using Kotlin Synthetic Properties<br \/>  (1:32:09) How to reference Views in the Fragment using synthetic properties<br \/>  (1:33:41) Adding onClickListener to our views<br \/>  (1:38:03) Intercepting OnBackPressed (NOTE: The API for this has changed since making this video. I have updated the Repository appropriately)<br \/>  (1:39:40) How to observe the ViewModel using LiveData callbacks<\/p>\n<p>  7<br \/>  (1:43:22) ViewModels in MVVM with Kotlin Coroutines for Concurrency<br \/>  (1:45:26) A look at my BaseViewModel class which contains part of the Coroutines Implementation (Coroutine Scope)<br \/>  (1:49:25) Starting point<br \/>  (2:01:40) Handling events from the View in the ViewModel<br \/>  (2:05:34) Using the launch Coroutine Builder to access data<br \/>  (2:08:44) How to update the MutableLiveData fields to publish data to the View<\/p>\n<p>  8<br \/>  (2:19:35) Modern RecyclerView implementation using LiveData to handle ItemTouchListener() callbacks<br \/>  (2:22:49) Overview of the RecyclerView within the XML View with LinearLayoutManager<br \/>  (2:26:53) What does the DiffUtil do?<br \/>  (2:28:48) A look at the source code of ListAdapter to better understand how it works<br \/>  (2:35:34) Writing the RecyclerView.ViewHolder class<br \/>  (2:37:23) Why is it actually called a RecyclerView? What gets Recycled?<br \/>  (2:37:58) Writing our RecyclerView.ListAdapter<br \/>  (2:46:37) How to use a MutableLiveData object to publish events from the onClickListener in the ViewHolders<br \/>  (2:48:09) Overview of the Fragment which manages the RecyclerView, and how to avoid memory leaks!<\/p>\n<p>  9<br \/>  (2:53:17) FirebaseAuth for User Authentication using Google Sign In<br \/>  (2:54:00) How to set up a new Firebase Project using Android Studio<br \/>  (2:54:36) Enabling Authentication (FirebaseAuth) in the Firebase Console<br \/>  (2:55:00) Setting up a debug signing certificate for your App in Firebase<br \/>  (2:56:48) Gradle Configurations for FirebaseAuth<br \/>  (2:58:00) Setting up GoogleSignInProvider<br \/>  (2:59:24) Handling the result in onActivityResult<br \/>  (3:01:06) Back FirebaseAuth Implementation using Coroutines<\/p>\n<p>  10<br \/>  (3:05:31) Local Database with Room Persistence Library and Coroutines<br \/>  (3:06:17) Entities and Primary Keys in Room<br \/>  (3:08:50) Setting up a Dao (Data Access Object) in Room<br \/>  (3:12:28) Overview of RoomDatabase implementation<br \/>  (3:14:21) How to build your Database and get a reference to you Dao<br \/>  (3:14:47) How to get data in and out of the Dao using suspend functions<\/p>\n<p>  11<br \/>  (3:16:34) Setting up a Local and Remote Database using Firebase&#8217;s Firestore NoSQL library<br \/>  (3:17:33) Communicating with Firestore using a Repository, with Coroutines<\/p>\n<p>  12<br \/>  (3:21:59) Dependency Injection using an AndroidViewModel, and ViewModelProvider.Factory<br \/>  (3:22:29) What is dependency injection in simple terms?<br \/>  (3:23:36) Implementing Dependency Injection using AndroidViewModel<br \/>  (3:24:13) Quick look at using a ViewModelProvider.Factory to create our ViewModel with the Injected Repository<br \/>  (3:24:27) How to use our Dependency Injector from within a Fragment or Activity  <\/div>\n<\/p><\/div>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee4f61f533babdf2f09\" data-style=\"\" id=\"61809ee4f61f533babdf2f09\" width=\"\"><\/div>\n<\/div>\n<p>  162 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  4,5 \u0447\u0430\u0441\u0430<br \/>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u0438\u0433\u0440\u0443, 2020 \u0433\u043e\u0434<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\"> (0:00:00) Intro + app overview<br \/>   (0:05:40) Create the main layout<br \/>   (0:19:43) Setup the RecyclerView to show memory cards<br \/>   (0:37:15) Add the BoardSize enum + create icons<br \/>   (0:51:45) Create the memory card and game classes<br \/>   (1:01:39) Implement the game logic<br \/>   (1:20:20) Display game info<br \/>   (1:27:45) Add menu options for game control<br \/>   (1:41:59) Use an intent to navigate to the CreateActivity<br \/>   (1:58:04) Build the image grid in the creation flow<br \/>   (2:11:55) Choose image intent<br \/>   (2:30:03) Image upload preparation<br \/>   (2:39:07) Upload to Firebase Storage<br \/>   (2:59:43) Save the memory game to Firebase<br \/>   (3:16:00) Play memory with custom images<br \/>   (3:34:30) Add menu option to download a game<br \/>   (3:45:53) Style updates<br \/>   (3:56:33) Creating a release build<br \/>   (4:04:09) Publishing your app to Google Play<br \/>   (4:19:53) Concept Review <\/p><\/div>\n<\/p><\/div>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee46a73daf6662a1be2\" data-style=\"\" id=\"61809ee46a73daf6662a1be2\" width=\"\"><\/div>\n<\/div>\n<p>  80 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  4 \u0447\u0430\u0441\u0430<br \/>  \u0422\u0443\u0442\u043e\u0440\u0438\u0430\u043b, 2019 \u0433\u043e\u0434<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\"><b>Section 1<\/b><br \/>   (0:00:00) Course Overview: About Me, You, and this Course<br \/>   (0:09:23) How to Run the Examples<br \/>   (0:10:59) Kotlin Syntax Practice for Beginners<\/p>\n<p>  <b>Section 2<\/b><br \/>   (0:39:26) Data Landscape: Memory Spaces and Named Addresses (References)<br \/>   (0:44:21) How to use \u00abval\u00bb and \u00abconst val\u00bb References to promote Immutability\/Efficiency:<br \/>   (0:51:55) Using \u00abvar\u00bb Reference Types, and the problems with Shared Mutable State!<br \/>   (0:58:58) Giving Structure to Data with Classes<\/p>\n<p>  <b>Section 3<\/b> <br \/>   (1:19:45) A Fundamental Divide: Computation and Control Logic<br \/>   (1:22:52) Computing Data means Solving Problems<br \/>   (1:32:11) Controlling the Flow of Data<br \/>   (1:37:24) Event Driven Programs<br \/>   (1:57:33) Functional versus Imperative Program Style (mild introduction)<\/p>\n<p>  <b>Section 4<\/b><br \/>   (2:18:38) What is Software Architecture?<br \/>   (2:21:14) Separation of Concerns<br \/>   (2:34:13) Dependency Inversion: Using Interfaces Effectively for Front End and Back End<br \/>   (3:06:22) Extension versus Abstraction: Open\/Closed Principle<br \/>   (3:17:00) Dependency Injection: How, What, and Why?<br \/>   (3:30:23) Inversion of Control via the Service Locator Pattern<\/p>\n<p>  <b>Section 5<\/b><br \/>   (3:44:25) Proving Programs with Tests (a light introduction to Testing)<br \/>   (4:01:42) Solving Problem (Domains) by Analysis  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee44615593b75e246d3\" data-style=\"\" id=\"61809ee44615593b75e246d3\" width=\"\"><\/div>\n<\/div>\n<p>  78 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  3,5 \u0447\u0430\u0441\u0430<br \/>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Kotlin \u0438 Jetpack Compose UI, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0421\u0443\u0434\u043e\u043a\u0443, 2021 \u0433\u043e\u0434<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">C\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\"> (0:00:16) Introduction &amp; Overview: Topics, Source<br \/>  (0:02:39) App Design Approach: 3rd Party Library Minimalism &amp; MV-Whatever Architecture<br \/>   (0:04:50) Domain package: Repository Pattern, Enum, Data Class, Sealed Class, Hash Code, Interfaces<br \/>   (0:34:39) Common package: Extension Functions &amp; Variables, Open-Closed Principle (OCP), Abstract Class, Singleton<br \/>   (0:50:20) Persistence (Storage) package: Clean Architecture Back End w\/ Java File System Storage, Jetpack Proto Datastore<br \/>   (1:28:07) UI package: Jetpack Compose UI Basics, Styles, Typography, Light &amp; Dark Themes<br \/>   (1:39:56) UI Components package: Modifiers, Reusable Toolbar &amp; Loading Screens<br \/>   (1:52:08) UI Active Game Feature package: Presentation Logic &amp; ViewModel w\/ Coroutines, Kotlin Function Types<br \/>   (2:30:55) UI Active Game Feature package: Sudoku Game with Jetpack Compose UI &amp; Activity Container<br \/>  Note: In a larger App, I&#8217;d suggest using Fragments as Containers; didn&#8217;t make sense to with this app though<br \/>   (3:15:58) Computation Logic package: Overview, design, and testing of Graph DS &amp; Algos for n-sized *square* Sudokus  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee5edd610f626b80d0b\" data-style=\"\" id=\"61809ee5edd610f626b80d0b\" width=\"\"><\/div>\n<\/div>\n<p>  57 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  1,5 \u0447\u0430\u0441\u0430<br \/>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u044d\u043c\u043e\u0434\u0437\u0438, 2021 \u0433\u043e\u0434<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\">(00:00) Intro<br \/>   (01:07) App architecture<br \/>   (09:05) Firebase Authentication logic<br \/>   (29:25) User sign up Cloud Function<br \/>   (42:31) Display user emoji list<br \/>   (57:13) Update emoji status<br \/>   (1:07:15) Restrict input to emoji  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee56ea11f3bbbaf1ffc\" data-style=\"\" id=\"61809ee56ea11f3bbbaf1ffc\" width=\"\"><\/div>\n<\/div>\n<p>  43 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  1 \u0447\u0430\u0441<br \/>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 \u0447\u0430\u0435\u0432\u044b\u0445, 2021 \u0433\u043e\u0434<\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6180e02cabb378f6450d1a5e\" data-style=\"\" id=\"6180e02cabb378f6450d1a5e\" width=\"\"><\/div>\n<\/div>\n<p>  42 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  1,5 \u0447\u0430\u0441\u0430<br \/>  \u0414\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435-\u043a\u043b\u043e\u043d RobiHood, 2021 \u0433\u043e\u0434<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\">(00:00) Intro<br \/>   (03:41) Retrieving data from the API<br \/>   (21:43) Building the layout<br \/>   (31:25) Render the spark line chart<br \/>   (40:13) Add chart interaction<br \/>  (54:26) Add colors and state spinner<br \/>  (1:11:01) Ticker view + radio button styling<br \/>   (1:23:47) Color update + conclusion  <\/div>\n<\/p><\/div>\n<p>  <b>Google<\/b><\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee51370783b8bf930e6\" data-style=\"\" id=\"61809ee51370783b8bf930e6\" width=\"\"><\/div>\n<\/div>\n<p>  534 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  40 \u043c\u0438\u043d\u0443\u0442<br \/>  \u041b\u0435\u043a\u0446\u0438\u044f 2017 \u0433\u043e\u0434\u0430<\/p>\n<p>  <a href=\"https:\/\/www.youtube.com\/channel\/UCwRXb5dUK4cvsHbx-rGzSgw\">Derek Banas<\/a><\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee6abb378f6450d1a5c\" data-style=\"\" id=\"61809ee6abb378f6450d1a5c\" width=\"\"><\/div>\n<\/div>\n<p>  520 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  1,5 \u0447\u0430\u0441\u0430<br \/>  \u0422\u0443\u0442\u043e\u0440\u0438\u0430\u043b 2017 \u0433\u043e\u0434\u0430<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\">00:30 MacOS Install<br \/>  02:49 Windows Install<br \/>  04:30 Data Types<br \/>  12:07 Casting<br \/>  13:45 Strings<br \/>  20:43 Arrays<br \/>  25:52 Ranges<br \/>  29:54 Conditionals<br \/>  30:24 If<br \/>  32:21 When<br \/>  34:02 For<br \/>  35:18 While<br \/>  40:23 Functions<br \/>  50:44 Higher Order Functions<br \/>  56:40 Collection Operators<br \/>  1:01:00 Exception Handling<br \/>  1:03:05 Lists<br \/>  1:08:00 Maps<br \/>  1:10:50 Classes<br \/>  1:16:00 Inheritance<br \/>  1:18:12 Interfaces<br \/>  1:22:22 Null Safety  <\/div>\n<\/p><\/div>\n<p>  <b>Google<\/b><\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee6f61f533babdf2f0a\" data-style=\"\" id=\"61809ee6f61f533babdf2f0a\" width=\"\"><\/div>\n<\/div>\n<p>  258 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  40 \u043c\u0438\u043d\u0443\u0442<br \/>  \u041b\u0435\u043a\u0446\u0438\u044f 2018 \u0433\u043e\u0434\u0430<\/p>\n<p>  <a href=\"https:\/\/www.youtube.com\/channel\/UC29ju8bIPH5as8OGnQzwJyA\">Traversy Media<\/a><\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee7122cc8f63869683c\" data-style=\"\" id=\"61809ee7122cc8f63869683c\" width=\"\"><\/div>\n<\/div>\n<p>  286 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  1 \u0447\u0430\u0441<br \/>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c todo-\u043b\u0438\u0441\u0442, 2020 \u0433\u043e\u0434<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\">00:00 \u2014 Intro<br \/>  00:33 \u2014 What we will build<br \/>  01:42 \u2014 Why choose Kotlin for Android Development?<br \/>  03:29 \u2014 Android Studio Setup<br \/>  07:17 \u2014 Creating the project<br \/>  08:57 \u2014 Android Studio Roundtrip<br \/>  16:17 \u2014 Building the app&#8217;s layout<br \/>  35:07 \u2014 Writing the Kotlin code for our app<br \/>  01:03:04 \u2014 Recap of what we&#8217;ve done<br \/>  01:06:25 \u2014 Setting up the Android emulator<br \/>  01:08:15 \u2014 Running our app  <\/div>\n<\/p><\/div>\n<p>  <a href=\"https:\/\/www.youtube.com\/channel\/UCGjv_3tbzJ8yKuvacoqmO-Q\">tutorialsEU<\/a><\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee74615593b75e246d4\" data-style=\"\" id=\"61809ee74615593b75e246d4\" width=\"\"><\/div>\n<\/div>\n<p>  280 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  8 \u0447\u0430\u0441\u043e\u0432<br \/>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 \u00ab\u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430 \u0432 \u043c\u0438\u043d\u0443\u0442\u044b\u00bb, 2020 \u0433\u043e\u0434<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\">0:00:00 \u2014 Introduction<br \/>  0:01:10 \u2014 Installing Android Studio<br \/>  0:05:47 \u2014 Our First Project \u2014 The UI and how to change it<br \/>  0:15:08 \u2014 Setting up the AVD (Android Virtual Device)<br \/>  0:24:22 \u2014 Starting our first app<br \/>  0:33:04 \u2014 Our First App \u2014 People Counter App<br \/>  0:49:05 \u2014 Testing on our phone<br \/>  0:54:49 \u2014 Outro for this chapter<br \/>  0:55:42 \u2014 Intro \u2014 Fundamentals Chapter<br \/>  0:57:08 \u2014 Basic Concepts of OOP Languages<br \/>  1:03:13 \u2014 Val vs Var<br \/>  1:11:07 \u2014 Datatypes of Numbers<br \/>  1:19:57 \u2014 Datatypes bool, char and string<br \/>  1:26:41 \u2014 Arythmetic operators<br \/>  1:35:24 \u2014 Comparison operators and string interpolation<br \/>  1:43:51 \u2014 assignment operators<br \/>  1:50:24 \u2014 If Statements<br \/>  2:02:45 \u2014 If Statements part 2<br \/>  2:06:28 \u2014 When Expressions<br \/>  2:18:58 \u2014 While Loops<br \/>  2:26:33 \u2014 Do While Loops<br \/>  2:29:51 \u2014 Another way to use while loops<br \/>  2:33:32 \u2014 For Loops<br \/>  2:38:44 \u2014 Functions \u2014 Parameters and arguments<br \/>  2:52:00 \u2014 Nullables in Kotlin<br \/>  3:02:01 \u2014 Nullables \u2014 elvis operator<br \/>  3:07:26 \u2014 Outro Basics 1<br \/>  3:08:57 \u2014 Intro Basics of OOP<br \/>  3:10:21 \u2014 Classes and Objects<br \/>  3:15:11 \u2014 Classes and Initializers<br \/>  3:22:16 \u2014 Scope and Shadowing<br \/>  3:27:32 \u2014 Member Variables, Functions and Constructors<br \/>  3:42:00 \u2014 Lateinit \u2014 Setters and Getters<br \/>  3:50:57 \u2014 Data Classes<br \/>  4:00:37 \u2014 Inheritance<br \/>  4:15:53 \u2014 Interfaces<br \/>  4:27:07 \u2014 Abstract Classes<br \/>  4:33:07 \u2014 Typecasting<br \/>  4:40:55 \u2014 Outro OOP<br \/>  4:42:19 \u2014 Intro more on Kotlin Basics<br \/>  4:43:51 \u2014 Arraylists<br \/>  4:49:37 \u2014 Lambda expressions<br \/>  4:54:11 \u2014 Visibility modifiers<br \/>  5:05:06 \u2014 Nested and Inner Classes<br \/>  5:09:54 \u2014 Safe Casting<br \/>  5:14:59 \u2014 Exception Handling with try and catch<br \/>  5:30:35 \u2014 Outro More Basics<br \/>  5:32:08 \u2014 Intro Age in Minutes App<br \/>  5:33:39 \u2014 Setting up the UI for the App<br \/>  5:48:22 \u2014 Difference of SP, DP Px<br \/>  6:03:45 \u2014 Finalizing the UI<br \/>  6:08:51 \u2014 Adding a DatePickerDialog and OnDateSetListener<br \/>  6:22:13 \u2014 Using the selected Date to Display it<br \/>  6:33:30 \u2014 Outro Age in Minutes<br \/>  6:34:46 \u2014 Intro Calculator App<br \/>  6:40:46 \u2014 Building the UI<br \/>  6:55:34 \u2014 Using onClick and implementing the CLR<br \/>  7:01:33 \u2014 Adding the onDecimalPoint<br \/>  7:06:41 \u2014 Adding the onOperatorFunctionality<br \/>  7:14:47 \u2014 Adding Subtraction \u2014 using substring and other string methods<br \/>  7:27:47 \u2014 adding the missing operations <br \/>  7:38:04 \u2014 Outro  <\/div>\n<\/p><\/div>\n<p>  \u041a\u0430\u043d\u0430\u043b \u0441 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u044f\u043c\u0438: <a href=\"https:\/\/www.youtube.com\/channel\/UCGjv_3tbzJ8yKuvacoqmO-Q\">tutorialsEU<\/a><\/p>\n<p>  <a href=\"https:\/\/www.youtube.com\/channel\/UC59K-uG2A5ogwIrHw4bmlEg\">Telusko<\/a><\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee76a73daf6662a1be3\" data-style=\"\" id=\"61809ee76a73daf6662a1be3\" width=\"\"><\/div>\n<\/div>\n<p>  200 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  5 \u0447\u0430\u0441\u043e\u0432<br \/>  \u0422\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 2019 \u0433\u043e\u0434\u0430<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\">1. Introduction \u2013 04:13<br \/>  2. Hello World Program \u2013 08:31<br \/>  3. How to create Android Project Using Kotlin \u2013 18:38<br \/>  4. Class &amp; Object \u2013 24:18<br \/>  5. Var Val \u2013 29:56<br \/>  6. Kotlin &amp; Java together \u2013 32:51<br \/>  7. Convert Java &amp; Kotlin \u2013 38:07<br \/>  8. Decompile Bytecode \u2013 40:06<br \/>  9. Operators \u2013 46:07<br \/>  10. String Template \u2013 50:41<br \/>  11. If Else Expression \u2013 54:11<br \/>  12. String Comparison \u2013 57:47<br \/>  13. Null Handling \u2013 01:02:11<br \/>  14. When Expression \u2013 01:07:04<br \/>  15. Loop &amp; Range \u2013 01:14:34<br \/>  16. List &amp; Map \u2013 01:27:20<br \/>  17. Function Expression \u2013 01:35:23<br \/>  18. Function calling from Java \u2013 01:44:34<br \/>  19. Default and Named Parameters \u2013 01:51:20<br \/>  20. String to Integer \u2013 02:03:21<br \/>  21. Try Expression \u2013 02:07:32<br \/>  22. Extension Function \u2013 02:12:17<br \/>  23. Infix and Operator Overloading \u2013 02:20:20<br \/>  24. Recursion \u2013 02:27:05<br \/>  25. Recursion | Factorial \u2013 02:34:46<br \/>  26. Tail Recursion \u2013 02:41:12<br \/>  27. Constructor \u2013 02:46:46<br \/>  28. Secondary Constructor \u2013 02:53:29<br \/>  29. Inheritance \u2013 02:58:46<br \/>  30. Constructor in Inheritance \u2013 03:09:35<br \/>  31. Abstract class \u2013 03:14:21<br \/>  32. Interface \u2013 03:20:17<br \/>  33. Data Class \u2013 03:29:32<br \/>  34. Object Keyword \u2013 03:40:09<br \/>  35. Anonymous inner class \u2013 03:46:54<br \/>  36. Companion Object \u2013 03:53:31<br \/>  37. Companion Object | Factory Pattern \u2013 03:59:08<br \/>  38. Backtick As Escape Character \u2013 04:03:18<br \/>  39. User Input in Kotlin \u2013 04:06:42<br \/>  40. Array \u2013 04:11:48<br \/>  41. List \u2013 04:21:53<br \/>  42. List of Objects \u2013 04:30:01<br \/>  43. Higher Order Function \u2013 04:35:15<br \/>  44. Filter and Map \u2013 04:49:06  <\/div>\n<\/p><\/div>\n<p>  <a href=\"https:\/\/www.youtube.com\/channel\/UClLXKYEEM8OBBx85DOa6-cg\">Devslopes<\/a><\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee76ea11f3bbbaf1ffd\" data-style=\"\" id=\"61809ee76ea11f3bbbaf1ffd\" width=\"\"><\/div>\n<\/div>\n<p>  157 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  5 \u0447\u0430\u0441\u043e\u0432<br \/>  \u0422\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f 3 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, 2020<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\">00:00:37 \u2014 Intro to Kotlin<br \/>  00:04:28 \u2014 Installing Android Studio on macOS<br \/>  00:17:12 \u2014 Installing Android Studio on Windows<br \/>  00:27:21 \u2014 Installing Intellij for Kotlin on macOS<br \/>  00:36:00 \u2014 Installing Intellij for Kotlin on Windows<br \/>  00:44:35 \u2014 Kotlin Variables<br \/>  01:01:09 \u2014 Kotlin Strings<br \/>  01:23:03 \u2014 Kotlin Numbers &amp; Operators<br \/>  01:27:31 \u2014 Kotlin Functions<br \/>  01:44:33 \u2014 Kotlin Conditional Logic<br \/>  02:03:41 \u2014 Kotlin Collections<br \/>  02:23:04 \u2014 Kotlin Loops<br \/>  02:31:44 \u2014 Kotlin Nullability<br \/>  02:50:05 \u2014 Kotlin Classes &amp; Inheritance<br \/>  03:18:17 \u2014 Kotlin Lambda<br \/>  03:41:12 \u2014 Setting Up Android Emulator<br \/>  03:53:02 \u2014 Dinner Decider App Part 1<br \/>  04:14:24 \u2014 Dinner Decider App Part 2<br \/>  04:38:07 \u2014 Dinner Decider App Part 3<br \/>  04:49:01 \u2014 Installing to a Real Device from macOS<br \/>  04:55:42 \u2014 Installing to a Real Device from Windows  <\/div>\n<\/p><\/div>\n<p>  <a href=\"https:\/\/www.youtube.com\/channel\/UCX-K1HK8ejnnQF_GWcMHveg\">Donn Felker \u2014 Freelancing for Software Developers<\/a><\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee8edd610f626b80d0c\" data-style=\"\" id=\"61809ee8edd610f626b80d0c\" width=\"\"><\/div>\n<\/div>\n<p>  36 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  9,5 \u0447\u0430\u0441\u043e\u0432<br \/>  \u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u0443\u0440\u0441 2021 \u0433\u043e\u0434\u0430<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\">0:00:00 Welcome<br \/>  0:02:07 Installing IntelliJ<br \/>  0:03:20 Creating your First Kotlin File<br \/>  0:04:38 Updating the Kotlin Plugin<br \/>  0:05:43 Hello World<br \/>  0:06:49 Creating a Variable<br \/>  0:10:06 Creating a Read only Variable<br \/>  0:12:19 Providing a Type on a Variable<br \/>  0:14:00 Basic Types: Numbers<br \/>  0:21:14 Basic Types: String and Char<br \/>  0:24:11 String Interpolation and Triple Quotes<br \/>  0:29:26 Basic Types: Boolean<br \/>  0:31:18 If\/Else Conditionals<br \/>  0:36:25 One Line If\/Else Conditional<br \/>  0:40:17 Understanding Truth Tables<br \/>  0:46:08 Structural Equality<br \/>  0:48:19 Referential Equality<br \/>  0:50:46 Nullable Types<br \/>  0:52:12 Nullable Safe Calls<br \/>  0:55:48 The Elvis Operator<br \/>  0:57:49 Your First Kotlin Function<br \/>  1:03:29 Functions with Return Types<br \/>  1:08:49 Functions inside of Functions<br \/>  1:11:51 Single Line Expressions<br \/>  1:15:59 Function Arguments<br \/>  1:21:49 Named Parameters<br \/>  1:26:14 Default Function Arguments<br \/>  1:30:44 IDE Refactoring to New LInes and Named Arguments<br \/>  1:32:13 Multiple Args with varargs<br \/>  1:34:57 Function Overloading<br \/>  1:38:30 Creating your First Kotlin Class<br \/>  1:45:31 Class Primary Constructors<br \/>  1:49:18 Multiple Class Constructors<br \/>  1:57:18 Constructor Init Blocks<br \/>  2:00:57 Class Properties<br \/>  2:04:00 Read Class Properties<br \/>  2:04:54 Overriding a Property Getter<br \/>  2:06:35 Overriding a Property Setter<br \/>  2:09:42 Multiple Properties in a Class<br \/>  2:11:11 Class Functions<br \/>  2:15:51 Companion Objects<br \/>  2:21:32 How to Create a Singleton<br \/>  2:29:09 Declaring Constants<br \/>  2:36:09 The lateinit modifier<br \/>  2:40:23 How to Nest Classes<br \/>  2:43:57 Inner Classes<br \/>  2:46:56 Creating an Enum<br \/>  2:51:36 Enum Constructor Parameters<br \/>  2:55:27 Abstract Functions in Kotlin<br \/>  2:58:51 Iterating over Enum Values<br \/>  3:00:04 Adding Static Methods to Enums<br \/>  3:01:37 The When Statement (Kotlin Switch Statement)<br \/>  3:08:19 Exhaustive vs Non-Exhaustive When<br \/>  3:15:09 Data Classes<br \/>  3:19:27 Data Class with Parameterless Constructor<br \/>  3:20:40 Data Class: Component1-N functions<br \/>  3:24:15 Destructuring Data Classes<br \/>  3:27:47 Copying Data Class Instances<br \/>  3:31:17 The Pair and Triple Data Classes<br \/>  3:33:50 Protected Modifier for Variables<br \/>  3:40:53 Protected Modifier for Functions<br \/>  3:47:02 Internal Modifier for Classes<br \/>  3:55:07 Abstract Classes<br \/>  3:59:45 Implementing an Abstract Class<br \/>  4:13:30 Understanding Abstractions with Abstract Classes<br \/>  4:17:52 What interfaces are used for<br \/>  4:26:28 Creating an Interface<br \/>  4:27:32 Implementing an Interface<br \/>  4:28:51 Real World Interface Example<br \/>  4:35:39 Anonymous Interfaces<br \/>  4:40:34 Creating Arrays<br \/>  4:47:06 Creating Immutable Lists<br \/>  4:52:46 Creating Mutable Lists<br \/>  5:00:47 Filtering a List<br \/>  5:06:28 Finding Items in a List<br \/>  5:12:44 Using \u00abfilterNot\u00bb on a List<br \/>  5:14:10 filterTo and filterNotTo on Lists<br \/>  5:16:40 Flattening Lists and Arrays<br \/>  5:19:39 Combining Immutable Lists<br \/>  5:21:21 List vs Map<br \/>  5:29:40 Map vs FlatMap<br \/>  5:34:15 Set Data Structure (a List with no Duplicates)<br \/>  5:39:05 For Loops<br \/>  5:44:13 While Loops<br \/>  5:47:59 For Each Loops<br \/>  5:51:03 Combining Lists with the Union Operator<br \/>  5:53:53 Iterating over a List with an Index<br \/>  5:55:28 Ranges<br \/>  5:56:59 Immutable Maps<br \/>  6:00:49 Mutable Maps<br \/>  6:08:29 Filtering and Transforming Maps<br \/>  6:16:30 Using mapNotNull on a Map<br \/>  6:20:22 Generating Large Sequences<br \/>  6:23:11 Measuring Performance<br \/>  6:31:33 Kotlin Sequences<br \/>  6:44:19 List vs Set vs Map vs Sequence<br \/>  6:49:25 Kotlin Ternary Operator: Single Line If<br \/>  6:50:51 Double Bang!!! Operator<br \/>  6:54:58 Using requireNotNull()<br \/>  6:59:04 Using checkNotNull()<br \/>  7:01:05 Filtering a List with filterNotNull()<br \/>  7:02:20 Type Checking with &#8216;is&#8217;<br \/>  7:08:52 Casting<br \/>  7:11:36 Safe Casting with &#8216;as&#8217;<br \/>  7:14:58 Generic Lists and Maps<br \/>  7:19:50 Your First Generic Class<br \/>  7:27:06 Throwing Exceptions<br \/>  7:29:54 Creating a Custom Exception<br \/>  7:32:44 Catching Exceptions with Try\/Catch<br \/>  7:36:09 Catching Multiple Exception Types<br \/>  7:40:43 Try\/Catch\/Finally blocks<br \/>  7:44:52 Try\/Catch vs Try\/Finally<br \/>  7:47:27 Creating a typealias<br \/>  7:50:38 Extension Functions<br \/>  7:59:14 Lazy Evaluation<br \/>  8:02:26 Lazy Initializer Block<br \/>  8:05:42 Packages and Imports<br \/>  8:14:04 Type Inference<br \/>  8:21:09 Simple Lambda Expressions<br \/>  8:34:29 Lambdas as Function Parameters<br \/>  8:40:23 Passing Values to Lambda Function Parameters<br \/>  8:51:37 Underscore Parameters in Lamba Functions<br \/>  8:54:24 The &#8216;it&#8217; Paramter in Lambda Functions<br \/>  8:56:38 Calling Kotlin from Java<br \/>  8:59:39 Calling Java from Kotlin<br \/>  9:04:51 Calling an Extension Function from Java<br \/>  9:07:50 @JvmName Annotation<br \/>  9:10:21 Top Level Main Functions<br \/>  9:11:15 Kotlin REPL<br \/>  9:13:52 Project: Setup<br \/>  9:15:54 Project: Reading Input<br \/>  9:20:16 Project: Calculator Logic<br \/>  9:28:04 Project: Adding Validation<br \/>  9:35:54 Project: Compiling to a Jar File and Execution<br \/>  9:38:21 Kotlin Koans<br \/>  9:40:09 Congratulations  <\/div>\n<\/p><\/div>\n<p>  <b>CodingWithMitch<\/b><\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee8cd09f7f6552eb3e5\" data-style=\"\" id=\"61809ee8cd09f7f6552eb3e5\" width=\"\"><\/div>\n<\/div>\n<p>  \u043a\u0430\u043d\u0430\u043b: <a href=\"https:\/\/www.youtube.com\/playlist?list=PLgCYzUzKIBE-JpO1NWMdjCLUPVNNnVWXW\">CodingWithMitch<\/a><\/p>\n<p>  14 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  2019 \u0433\u043e\u0434<\/p>\n<p>  <b>Stevdza-San<\/b><\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee81370783b8bf930e7\" data-style=\"\" id=\"61809ee81370783b8bf930e7\" width=\"\"><\/div>\n<\/div>\n<p>  \u041a\u0430\u043d\u0430\u043b: <a href=\"https:\/\/www.youtube.com\/channel\/UCYLAirIEMMXtWOECuZAtjqQ\">Stevdza-San<\/a><br \/>  2020 \u0433\u043e\u0434<\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee9abb378f6450d1a5d\" data-style=\"\" id=\"61809ee9abb378f6450d1a5d\" width=\"\"><\/div>\n<\/div>\n<p>  \u043a\u0430\u043d\u0430\u043b: <a href=\"https:\/\/www.youtube.com\/channel\/UCKNTZMRHPLXfqlbdOI7mCkg\">Philipp Lackner<\/a><\/p>\n<p>  <b>Rahul Pandey<\/b><\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6180acf31370783b8bf930e9\" data-style=\"\" id=\"6180acf31370783b8bf930e9\" width=\"\"><\/div>\n<\/div>\n<p>  64 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  12 \u043c\u0438\u043d\u0443\u0442<br \/>  2021 \u0433\u043e\u0434<\/p>\n<p>  <a href=\"https:\/\/www.youtube.com\/channel\/UClLXKYEEM8OBBx85DOa6-cg\">Devslopes<\/a><\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee5cd09f7f6552eb3e4\" data-style=\"\" id=\"61809ee5cd09f7f6552eb3e4\" width=\"\"><\/div>\n<\/div>\n<p>  4 500 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  16 \u043c\u0438\u043d\u0443\u0442<br \/>  \u0423\u0447\u0438\u043c\u0441\u044f \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438, 2021 \u0433\u043e\u0434<br \/>  \u041a\u0430\u043d\u0430\u043b \u0441 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u044f\u043c\u0438: <a href=\"https:\/\/www.youtube.com\/channel\/UClLXKYEEM8OBBx85DOa6-cg\">Devslopes<\/a><\/p>\n<h3>\u041d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c<\/h3>\n<p>  <a href=\"https:\/\/www.youtube.com\/channel\/UCORRUYUmW1pffMgLPzU0XCA\">Devcolibri<\/a><\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6180e02c1370783b8bf930ea\" data-style=\"\" id=\"6180e02c1370783b8bf930ea\" width=\"\"><\/div>\n<\/div>\n<p>  180 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  18 \u0443\u0440\u043e\u043a\u043e\u0432 \u043f\u043e 5-10 \u043c\u0438\u043d\u0443\u0442<br \/>  2016 \u0433\u043e\u0434<\/p>\n<p>  <a href=\"https:\/\/www.youtube.com\/channel\/UCzE7HcbvyEiS5ea1rVRbPLQ\">Start Android<\/a>  <\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6180e02ccd09f7f6552eb3e7\" data-style=\"\" id=\"6180e02ccd09f7f6552eb3e7\" width=\"\"><\/div>\n<\/div>\n<p>  143 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  19 \u0443\u0440\u043e\u043a\u043e\u0432 \u043f\u043e 10 \u043c\u0438\u043d\u0443\u0442<br \/>  2017 \u0433\u043e\u0434<\/p>\n<p>  <b>\u0413\u043e\u0448\u0430 \u0414\u0443\u0434\u0430\u0440\u044c<\/b><\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee94615593b75e246d5\" data-style=\"\" id=\"61809ee94615593b75e246d5\" width=\"\"><\/div>\n<\/div>\n<p>  113 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  2019 \u0433\u043e\u0434<br \/>  \u041a\u0430\u043d\u0430\u043b: <a href=\"https:\/\/www.youtube.com\/watch?v=DjDL5cjLYwE&amp;list=PL0lO_mIqDDFUP-pEWtX7mrnmoP4Hxxp6y\">\u0413\u043e\u0448\u0430 \u0414\u0443\u0434\u0430\u0440\u044c<\/a><\/p>\n<p>  <a href=\"https:\/\/www.youtube.com\/channel\/UCPz3xmUpIbo8jooCtV_vMNw\">Neco Ru<\/a><\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6180e02dad041b3b9bfdc7c9\" data-style=\"\" id=\"6180e02dad041b3b9bfdc7c9\" width=\"\"><\/div>\n<\/div>\n<p>  41 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  34 \u0443\u0440\u043e\u043a\u0430 \u043f\u043e 20 \u043c\u0438\u043d\u0443\u0442<br \/>  \u041a\u0443\u0440\u0441 \u043f\u043e KOTLIN \u0438 ANDROID STUDIO \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 2021 \u0433\u043e\u0434\u0430<\/p>\n<p>  <a href=\"https:\/\/www.youtube.com\/channel\/UCK5d3n3kfkzlArMccS0TTXA\">alishev<\/a><\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6180acf3ad041b3b9bfdc7c8\" data-style=\"\" id=\"6180acf3ad041b3b9bfdc7c8\" width=\"\"><\/div>\n<\/div>\n<p>  40 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  Kotlin \u0437\u0430 \u0447\u0430\u0441. \u0422\u0435\u043e\u0440\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 <br \/>  2021 \u0433\u043e\u0434<\/p>\n<p>  <b>\u0412\u043e\u0439\u0442\u0438 \u0432 IT \u0447\u0435\u0440\u0435\u0437 Minecraft \u0438 \u042f\u043d\u0434\u0435\u043a\u0441 \/ \u0412\u0441\u0451 \u043e Kotlin \u0438 Android \/ \u0418\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u0441 Kotlin Developer<\/b><\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809eeacd09f7f6552eb3e6\" data-style=\"\" id=\"61809eeacd09f7f6552eb3e6\" width=\"\"><\/div>\n<\/div>\n<p>  182 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0440\u043e\u0432<br \/>  \u0418\u043d\u0442\u0435\u0440\u0432\u044c\u044e 1,5 \u0447\u0430\u0441\u0430<br \/>  2019 \u0433\u043e\u0434<\/p>\n<p>  <b>JUG .ru<\/b><\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/www.youtube.com\/embed\/rB5Q3y73FTo?rel=0&amp;showinfo=1&amp;hl=en-US\" data-style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" id=\"\" width=\"\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>  34 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  \u041b\u0435\u043a\u0446\u0438\u044f 1 \u0447\u0430\u0441<br \/>  \u0420\u043e\u043c\u0430\u043d \u0415\u043b\u0438\u0437\u0430\u0440\u043e\u0432 \u00ab\u041a\u043e\u0440\u0443\u0442\u0438\u043d\u044b \u0432 Kotlin\u00bb, 2018 \u0433\u043e\u0434<\/p>\n<h3>\u0415\u0449\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043e\u043d\u0442\u043e\u043b\u044b<\/h3>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/company\/skillfactory\/blog\/509212\/\">\u041e\u043d\u0442\u043e\u043b \u043e\u0442 DeepMind: \u0441\u0430\u043c\u044b\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043f\u043e \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443 \u043e\u0442 \u043c\u0438\u0440\u043e\u0432\u043e\u0433\u043e \u043b\u0438\u0434\u0435\u0440\u0430<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/company\/timeweb\/blog\/583942\/\">Ontol: \u0421\u0430\u043c\u044b\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0434\u043b\u044f \u0440\u0435\u043b\u043e\u043a\u0435\u0439\u0442\u0430 \u0432 \u043b\u044e\u0431\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0443 \u043c\u0438\u0440\u0430<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/company\/timeweb\/blog\/568802\/\">Ontol: \u0441\u0430\u043c\u044b\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u043f\u0440\u043e \u0432\u0438\u0437\u044b \u041e-1 \u0438 \u0433\u0440\u0438\u043d-\u043a\u0430\u0440\u0442\u044b<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/company\/engelbart\/blog\/492942\/\">\u041e\u043d\u0442\u043e\u043b(=\u0441\u0430\u043c\u043e\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435) \u043f\u0440\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 [\u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0430 100+ \u0441\u0442\u0430\u0442\u0435\u0439]<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/company\/engelbart\/blog\/493166\/\">\u041e\u043d\u0442\u043e\u043b: \u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0430 \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u0440\u043e \u00ab\u0432\u044b\u0433\u043e\u0440\u0430\u043d\u0438\u0435\u00bb [100+]<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/506124\/\">\u0412\u0441\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0422\u0438\u043c\u0430 \u0423\u0440\u0431\u0430\u043d\u0430 (Wait But Why) \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c [46 \u0438\u0437 99]<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/484114\/\">\u041f\u043e\u0434\u0431\u043e\u0440\u043a\u0430 143 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u0432 \u044d\u0441\u0441\u0435 \u041f\u043e\u043b\u0430 \u0413\u0440\u044d\u043c\u0430 (\u0438\u0437 184)<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/company\/macloud\/blog\/551896\/\">Ontol: \u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0430 \u0432\u0438\u0434\u0435\u043e-\u043b\u0435\u043a\u0446\u0438\u0439 \u0438 \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/company\/skillfactory\/blog\/503196\/\">450 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0432 \u043e\u0442 \u041b\u0438\u0433\u0438 \u041f\u043b\u044e\u0449\u0430<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/496276\/\">Masterclass: 70 \u043e\u0444\u0438\u0433\u0435\u043d\u043d\u044b\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0443\u0440\u0441\u043e\u0432 \u043e\u0442 \u043c\u0438\u0440\u043e\u0432\u044b\u0445 \u0437\u0432\u0451\u0437\u0434<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<blockquote><p><a href=\"https:\/\/t.me\/timewebru\"><b>\u041d\u043e\u0432\u043e\u0441\u0442\u0438, \u043e\u0431\u0437\u043e\u0440\u044b \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u044b \u043e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b Timeweb.Cloud \u2014 \u0432 \u043d\u0430\u0448\u0435\u043c Telegram-\u043a\u0430\u043d\u0430\u043b\u0435<\/b><\/a> \u21a9<\/p><\/blockquote>\n<p>  <a href=\"https:\/\/timeweb.cloud\/?i=106909\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/b5\/pj\/of\/b5pjofdoxth14ro-rjsrn7sbmiy.png\" data-src=\"https:\/\/habrastorage.org\/webt\/b5\/pj\/of\/b5pjofdoxth14ro-rjsrn7sbmiy.png\"\/><\/a><\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/586804\/\"> https:\/\/habr.com\/ru\/articles\/586804\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/6bc\/ec6\/769\/6bcec67690cec29642c631a0ceb95992.png\" alt=\"image\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/6bc\/ec6\/769\/6bcec67690cec29642c631a0ceb95992.png\"\/><\/p>\n<h3>\u041d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c<\/h3>\n<p>  <b>freeCodeCamp<\/b> \u2014 \u043b\u0443\u0447\u0448\u0438\u0439 \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b \u0434\u043b\u044f \u0441\u0430\u043c\u043e\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e. \u041c\u043d\u043e\u0433\u0438\u0435 \u043f\u043b\u0430\u0442\u043d\u044b\u0435 \u0448\u043a\u043e\u043b\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0435\u043b\u0430\u044e\u0442 \u00ab\u0440\u0435\u0440\u0430\u0439\u0442\u00bb \u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0438 \u043f\u0440\u043e\u0434\u0430\u044e\u0442 \u0437\u0430 100\u041a \u0440\u0443\u0431.<\/p>\n<div class=\"oembed\">\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/61809ee31370783b8bf930e5\" data-style=\"\" id=\"61809ee31370783b8bf930e5\" width=\"\"><\/div>\n<\/div>\n<p>  850 000 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432<br \/>  2,5 \u0447\u0430\u0441\u0430<br \/>  \u043a\u0443\u0440\u0441 \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 2019 \u0433\u043e\u0434\u0430 <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/b>                         <\/p>\n<div class=\"spoiler_text\">(0:00:50) Create Your First Kotlin Project<br \/>   (0:04:23) Hello World<br \/>   (0:06:33) Working With Variables<br \/>   (0:11:04) Type System<br \/>   (0:15:00) Basic Control Flow<br \/>   (0:21:31) Basic Kotlin Functions<br \/>   (0:27:12) Function Parameters<br \/>   (0:32:52) Arrays<br \/>   (0:35:28) Iterating with forEach<br \/>   (0:41:17) Lists<br \/>   (0:42:47) Maps<br \/>   (0:45:05) Mutable vs Immutable Collections<br \/>   (0:49:24) Vararg Parameters<br \/>   (0:54:21) Named Arguments<br \/>   (0:56:26) Default Parameter Values<br \/>   (1:00:27) Create A Simple Class<br \/>   (1:03:35) Adding Class Properties<br \/>   (1:05:15) Class Init Block<br \/>   (1:06:40) Accessing Class Properties<br \/>   (1:07:32) Primary Constructor Properties<br \/>   (1:08:17) Secondary Constructors<br \/>   (1:09:50) Working With Multiple Init Blocks<br \/>   (1:11:30) Default Property Values<br \/>   (1:11:59) Properties With Custom Getters\/Setters<br \/>   (1:16:52) Class Methods<br \/>   (1:20:12) Visibility Modifiers \u2014 Public\/Private\/Protected\/Public<br \/>   (1:22:30) Interfaces<br \/>   (1:24:21) Abstract Classes<br \/>   (1:26:13) Implementing An Interface<br \/>   (1:26:35) Overriding Methods<br \/>   (1:28:30) Default Interface Methods<br \/>   (1:29:30) Interface Properties<br \/>   (1:31:40) Implementing Multiple Interfaces<br \/>   (1:32:57) Type Checking And Smart Casts<br \/>   (1:36:18) Inheritance<br \/>   (1:43:07) Object Expressions<br \/>   (1:45:06) Companion Objects<br \/>   (1:49:51) Object Declarations<br \/>   (1:52:41) Enum Classes<br \/>   (1:58:16) Sealed Classes<br \/>   (2:00:07) Data Classes<br \/>   (2:12:25) Extension Functions\/Properties<br \/>   (2:16:40) Higher-Order Functions<br \/>   (2:29:07) Using The Kotlin Standard Library<br \/>   (2:00:07) Data Classes  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-396192","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/396192","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=396192"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/396192\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=396192"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=396192"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=396192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}