Результати пошуку за запитом: mvc 5*
Співбесіда з Android. 250+ питань для Junior, Middle, Senior
Автор: Влад Сверчков
Junior
1.1 Базовые вопросы
1.2 Алгоритмы, структуры данных, хранение данных
1.3 Работа с сетью
1.4 Многопоточность, Java Core, RxJava
1.5 Android SDK, Kotlin
1.6 Другое
1.7 Практические задачи
Middle
2.1 Базовые вопросы
2.2 Алгоритмы, структуры данных, хранение данных
2.3 Работа с сетью
2.4 Многопоточность, Java Core
2.5 Android SDK
2.6 Kotlin
2.7 RxJava
2.8 Тестирование
2.9 Другое
Senior
3.1 Базовые вопросы, архитектура
3.2 Многопоточность
3.3. Java Core, Android SDK, Kotlin
Дорогие друзья! Предлагаем вашему вниманию перевод статьи, опубликованной на DOU.ua 3 ноября 2021 года. Оригинальная версия на украинском языке доступна по ссылке.
Если вы готовитесь к собеседованию по Android — или проходить, или проводить — возможно, этот перечень вопросов пригодится вам. Редакция DOU поинтересовалась у разработчиков, проводящих технические интервью в компании в Украине, о чем они спрашивают кандидатов.
Это уже десятая статья из рубрики «100+ технических вопросов»; ознакомиться с вопросами для других языков программирования на DOU.ua на украинском языке вы сможете, перейдя по ссылке.
Junior
Базовые вопросы
1. Назовите основные принципы ООП.
2. Что такое класс? Что такое интерфейс? Какая между ними разница?
3. Назовите базовые типы данных.
4. В чем отличие примитивных типов от объектов?
5. Какая разница между абстрактным классом и интерфейсом?
6. Что такое паттерны проектирования? Какие паттерны вы знаете?
7. Чем отличается Java от Kotlin?
Ответы на некоторые из этих вопросов вы можете найти в видео курсе Kotlin, а также статье Kotlin vs Java: что лучше для Android-разработки? и вебинаре Структуры данных в Java и Kotlin.
Алгоритмы
8. Что такое алгоритм и как выбрать правильный?
9. Что такое сложность алгоритма? Как и с помощью чего её можно вычислить?
10. Что такое нотация big-O?
11. Что такое рекурсия?
12. Какие алгоритмы сортировки вы знаете?
Структуры данных
13. Расскажите о таких структурах данных, как List, Set, Map?
14. Какая разница между ArrayList и LinkedList?
Ответы на эти вопросы вы найдёте в вебинаре Структуры данных в Java и Kotlin.
Хранение данных
15. Как можно хранить данные в Android?
16. Когда следует использовать SharedPreferences?
17. Из каких компонентов состоит библиотека Room?
18. Что такое @PrimaryKey, @Ignore, @Embedded, @TypeConverters в Room?
19. Для чего нужна миграция в базах данных?
Ответы на некоторые из этих вопросов вы найдете в видео курсе SQLite. Базы данных в Android приложениях (урок 2, урок 3).
Работа с сетью
20. Что такое JSON, XML?
21. Какие варианты реализации работы с сервером?
22. Что такое REST?
Ответы на некоторые из этих вопросов вы найдете в видео курсах Разработка приложений под Android. Базовый курс (урок 2), Android Углубленный (урок 9).
Многопоточность
23. Что такое процесс?
24. Что такое поток?
25. Для чего используют ключевое слово synchronized?
26. Зачем синхронизировать потоки?
27. Какая разница между синхронным и асинхронным исполнением?
28. Как мы можем создать поток в Java?
29. Что такое deadlock?
30. Какие варианты реализации многопоточности есть в Android?
31. Что такое main thread? Какие операции нужно выполнять на main thread, а какие нельзя делать?
Ответы на некоторые из этих вопросов вы найдете в видео курсе Android Углубленный (урок 5).
Java Core
32. Что такое Exceptions? Зачем они нужны?
33. Зачем используют ключевые слова final, finally и finalize?
34. Что такое абстрактный класс? Что такое интерфейс?
35. Что такое анонимный класс? Использовали ли на практике? Для чего?
36. Что такое статический класс (static class)?
37. Что такое enum? Зачем его используют?
38. Можем ли мы сделать конструктор приватным?
39. Какая разница между ключевыми словами throw и throws?
40. Какая разница между Error и Exception?
41. Какая разница между checked и unchecked exception?
42. Что такое Object class и какие методы он имеет?
43. Какие существуют модификаторы доступа для классов? Какая разница между ними?
44. Что такое итератор?
45. Как безопасно удалить элемент из коллекции?
46. Зачем нам переопределять equals() и когда не нужно это делать?
47. Какой должен выполняться контракт при переопределении equals()?
Ответы на некоторые из этих вопросов вы найдете в вебинаре Что такое Java EE и Java Core и видео курсе Java Базовый (урок 2, урок 4, урок 6, урок 7, урок 8, урок 9).
RxJava
48. В чем разница между map() и flatMap() в RxJava?
49. Когда используете observeOn(), а когда subscribeOn()?
50. Как можно обработать ошибки в RxJava?
51. Какие schedulers знаете в RxJava? Назовите их отличия.
52. Что такое Disposable? Зачем его используют?
53. В чем разница между Hot и Cold Observables? Назовите примеры в RxJava.
Ответы на некоторые из этих вопросов вы найдете в видео курсе Создание пользовательских элементов управления в Android (урок 1).
Android SDK
54. Какие базовые Android-компоненты можете назвать?
55. Что такое ContentProvider?
56. Какие типы Service знаете?
57. Что такое BroadcastReceiver и какие типы существуют?
58. Для чего используют механизм фрагментов?
59. Опишите жизненный цикл Activity.
60. Опишите жизненный цикл Fragment.
61. Есть ли у Fragment контекст? Если да, то как его получить?
62. Чем отличается Fragment от Activity? Зачем выдумали Fragment?
63. Что такое изменение конфигурации? Что происходит с приложением на Android при этом?
64. Что такое Intent? Что такое explicit/implicit Intent?
65. Что такое SharedPreferences?
66. Что такое ANR? Как избегать таких ситуаций?
67. Что такое DataBinding?
68. Что такое LiveData? Какие виды знаете?
69. Как создать ViewModel? Почему создавать ViewModel нужно именно так?
70. Что такое Context и зачем он?
71. Что такое AndroidManifest.xml? Зачем его используют? Что мы можем там декларировать?
72. Перечислите layout, с которыми работали? Когда и какой нужно использовать?
73. Расскажите, что нужно реализовать, чтобы отобразить список строк в RecyclerView.
74. Объясните паттерн ViewHolder. Для чего он применяется?
75. Что такое DiffUtil?
76. Расскажите о ConstraintLayout.
77. Для чего используют Group, Guideline, Barriers, Chains в ConstraintLayout?
78. У вас есть Activity с двумя Fragment'ами, у одного есть кнопка, у другого TextView. При нажатии кнопки изменяется TextView. Как вы реализуете это?
79. Что такое WorkManager? Когда используем?
Ответы на некоторые из этих вопросов вы найдете в видео курсах Разработка приложений под Android. Базовый курс (урок 2, урок 4, урок 5, урок 7), Android Углубленный (урок 3, урок 6, урок 9), Android User Interface (урок 3), Создание пользовательских элементов управления в Android (урок 9).
Kotlin
80. Как вы понимаете термин Null safety?
81. Что такое nullable и non-nullable типы? Какая разница между val и var?
82. Как задекларировать getter/setter для property?
83. Почему классы Kotlin по умолчанию final?
84. Что такое sealed class?
85. Что такое data classes?
86. Какая разница между sealed class и enum?
87. Почему у Kotlin нет checked exceptions?
88. Что такое Extensions? Использовали ли вы их на практике?
89. Что такое перегрузка операторов (operator overloading)? Зачем нужен этот механизм?
90. Как работают примитивы в Kotlin?
91. Расскажите об объекте Unit в Kotlin.
92. Расскажите об объекте Any в Kotlin.
93. Как создать Singleton объект в Kotlin?
94. Что такое companion object?
95. Чем отличается const val от val?
96. Какие знаете модификаторы доступа?
97. Что означает модификатор lateinit?
98. Coroutines – что это за механизм? Использовали ли его на практике?
99. Зачем нужны Coroutines? Чем они лучше обычных тредов?
100. Что такое suspend-функция?
101. Что такое Job?
102. Что такое Dispatcher? Какие есть виды?
102. Что такое Scope?
103. Как писать Java compatible API в Kotlin?
Ответы на некоторые из этих вопросов вы найдете в видео курсе Kotlin.
Другое
104. Расскажите, что такое memory leak. Как избежать?
105. Как бы вы искали memory leak?
106. Расскажите о Dependency injection. Какие варианты реализации в Android?
107. Для чего нужна система контроля версий?
108. Что такое Git?
109. Для чего используем .gitignore-файл?
110. Расскажите о командах push, pull, fetch в Git?
111. Что такое merge и rebase? Какая разница?
112. Что такое CI? Зачем используем?
Ответы на некоторые из этих вопросов вы найдете в видео курсах Dependency Injection в Android-разработке, Основы работы с Git.
Практические задачи
113. Разверните Linked List. Отпишите о зацикленности в LinkedList или ее отсутствии.
114. Напишите функцию, которая вернет n первых неотъемлемых чисел:
un nMin(items: List<String>, n: Int): List<Int> {
//return n minimal non negative items
}
Пример вызова функции: nMin(listOf("1","-11","-12","22","100","-30",”2”, “5”), 3)
Ожидаемый результат: [1, 22, 100]
115. Что будет выведено в консоль? Объясните результат.
var globalId = 0
data class User(val name: String) {
val id = globalId++
}
fun main(args: Array<String>) {
val user1 = User("User")
val user2 = User("User")
println(user1)
println(user2)
println(user1 == user2)
}
116. Исправьте все ошибки в коде:
class Animal
class Dog: Animal {}
117. Для коллекции items:
val items = listOf(1, -2 ,-3 , 4, 5, 0, 2, -2)
Подсчитайте количество отрицательных элементов.
Вычислите среднее арифметическое значение отрицательных и неотрицательных чисел.
Middle
Базовые вопросы
1. Нужно ли придерживаться SOLID-принципов? Почему да/нет?
2. Какие паттерны использовали на практике? Приведите примеры.
3. Опишите паттерны MVP и MVVM. Какие из них использовали? Какой предпочитаете? Знаете ли/использовали другие паттерны?
4. Почему слой Model должен быть отделен от View или Presenter?
5. Что такое инверсия зависимости (dependency inversion)?
6. Объясните пример паттерна Singleton. Где его использовать в Android?
7. Объясните пример паттерна Observer. Где его использовать в Android?
8. Объясните пример паттерна Builder. Где его использовать в Android?
9. Как вы понимаете термин «архитектура приложения»? Зачем это вообще нужно? Почему инженеры пытаются усложнить процесс разработки и тратят время на проектирование архитектуры? Может, лучше сэкономить ресурсы и пойти по простому пути — держать весь код в одном файле?
10. Что такое иммутабельный объект? Для чего его используют? Как сделать иммутабельный объект в Java?
11. MVP vs MVVM – в чем основное отличие?
Ответы на некоторые из этих вопросов вы найдете в видео курсах Архитектура Android приложений (урок 1-5), Создание пользовательских элементов управления в Android (урок 4), SOLID принципы в Java.
Алгоритмы
12. Есть много алгоритмов сортировки. Возможно ли выбрать один самый быстрый и использовать его повсюду? Почему да/нет?
13. В чем сложность поиска произвольного элемента в ArrayList? В LinkedList?
14. Какие алгоритмы используют в Android/Java коллекциях под капотом?
Структуры данных
15. HashMap. Используете ли вы на практике? Если да, то зачем? Как она работает изнутри?
16. Какая разница между HashMap и LinkedHashMap?
17. Что такое бинарное дерево?
Сохранение данных
18. Как бы вы реализовали сохранение зашифрованных данных в SharedPreferences? Базу данных?
19. Как реализовать миграцию таблицы, где нужно из non-nullable поля сделать nullable поле?
Работа с сетью
20. Расскажите, какие методы можно применить в REST API? Зачем какой нужен?
21. Что можно использовать, кроме REST API, для работы с сервером?
Многопоточность
22. Что такое Thread Pool? Каковы его особенности?
23. Что такое Executor/ExecutorService? Какую задачу выполняют и как использовать?
24. Какие есть виды Executor?
25. Какая разница между методами start() и run() в классе Thread?
26. На что указывает ключевое слово synchronized? Какова его основная функция?
27. Модификатор volatile. Приходилось ли использовать? Зачем нужен?
28. Знаете ли вы о таком понятии, как «эффект гонки» (race condition)? Как это предотвратить? Какие механизмы в Java для предотвращения этого?
29. Что такое атомарная операция?
30. Как остановить поток в Java? Можно ли продолжить выполнение потока после его остановки?
31. Знаете ли вы о потокобезопасных коллекциях в Java/Android? Приходилось ли их использовать?
32. Какие стратегии можно применить, чтобы добиться потокобезопасности?
33. Какие варианты реализации потокобезопасности кода есть у Kotlin?
34. Как сделать переменную потокобезопасной?
35. Что такое Mutex и Monitor? Кто может выступать в роли монитора?
36. Что такое атомарные операции?
37. Почему инкрементация и операции с long не являются атомарными?
38. Какие классы атомарных переменных?
39. Что такое устаревшие данные (stale data)? Как избежать этого эффекта?
Ответы на некоторые из этих вопросов вы найдете в видео курсе Android Углубленный (урок 5).
Java Core
40. Механизм Generics. Какую проблему решает?
41. Что такое soft reference, weak reference?
42. Что такое сериализация объекта? Какую проблему она решает? Какие стандартные механизмы у Java?
43. Какой контракт существует между equals() и hashCode()?
44. По вашему мнению, почему строки в Java сделаны иммутабельными?
45. Можем ли мы задекларировать пустой интерфейс? Если да, то зачем?
46. Что такое String pool? Зачем он нужен?
47. Что такое StringBuilder, какую проблему он решает?
48. Что такое Stack в JVM и какие данные там хранятся?
49. Что такое Heap в JVM и какие данные там хранятся?
50. Что такое garbage collector, как он вообще работает? Каковы реализации GC?
Ответы на некоторые из этих вопросов вы найдете в вебинаре Что такое Java EE и Java Core и видео курсе Java Углубленный (урок 5).
Android SDK
51. Назовите основные изменения в версиях Android.
52. Как реализовать IPC в системе Android?
53. Как реализовать отложенную задачу?
54. Что такое Doze Mode?
55. Что такое App Standby mode?
56. Что такое AIDL и зачем он нужен? Какие типы данных поддерживаются?
57. Что такое Multidex?
58. Что такое KeyStore API?
59. Что такое PendingIntent?
60. Как безопасно хранить user-sensitive данные?
61. Какие методы защиты приложения?
62. Что такое SSL/TLS Pinning? Как его реализовать в Android?
63. Что такое ViewBinding?
64. Для чего нужны методы onSaveInstanceState/onRestoreInstanceState? Что такое permissions? Как запросить permissions?
65. Что такое Intent? Что такое Explicit/Implicit Intent? Что такое Sticky Intent, Pending Intent?
66. Какие типы данных мы можем положить в Bundle?
67. В чем разница между Serializable и Parcelable?
68. Если фрагмент для работы нуждается во входных данных, каким образом будет правильно передать их фрагменту?
69. Что такое ViewModel? Какие ее свойства?
70. Объясните работу ViewModel с Jetpack. Что такое ViewModelProviders, ViewModelProvider.Factory?
71. Что такое LiveData? Зачем её используете?
72. Какая связь между LiveData и LifecycleOwner?
73. Приведите пример LifecycleOwner?
74. Что такое Looper?
75. Использовали ли HaMeR фреймворк (Handler/Message/Runnable)? Для чего он?
76. Какую информацию содержит контекст? Какие типы контекста знаете?
77. Для чего используют Content Provider?
78. Что такое Data Binding? Что такое View?
79. Преимущества Fragments против View?
80. Как работает Content Provider?
81. Какая разница между Single Activity и Multiple Activity?
82. Какие виды Context знаете? Где какой использовать?
83. Объясните работу BroadcastReciever и его реализацию.
84. Зачем LocalBroadcastManager?
85. Для чего нужен MotionLayout?
86. Опишите, как реализовать анимацию в MotionLayout.
87. Как можно обнаружить проблемы в скорости UI и устранить их?
88. Расскажите о вариантах реализации custom view.
89. Что делают методы onMeasure, onLayout, onDraw во View?
90. Как воплотить анимацию при переходе между Activity-фрагментами?
91. Когда необходимо использовать foreground service вместо service?
92. Когда использовать workmanager, а когда service?
93. Есть ли у workmanager лимиты для выполнения работы?
94. Расскажите о Jetpack Compose. Зачем придумали основной принцип работы, как устроено?
95. Что такое WakeLock?
96. Что такое AlarmManager? Какие особенности работы?
Ответы на некоторые из этих вопросов вы найдете в видео курсах Разработка приложений под Android. Базовый курс (урок 4, урок 7), Android Углубленный (урок 6, урок 8), Создание пользовательских элементов управления в Android (урок 9).
Kotlin
97. Чем отличается работа с Exceptions в Kotlin и Java?
98. Что такое платформенные типы?
99. Что такое нелокальный return?
100. Для чего нужны reified generics?
101. Какая разница между Unit, Any, Nothing?
102. Расскажите о функциях высшего порядка, лямбда, функциях, которые могут использоваться в качестве аргумента.
103. Что такое inline-модификатор? Noinline?
104. Какая разница между crossinline и noinline?
105. Какие типы конструкторов вы знаете?
106. Что такое Flow? Что такое SharedFlow?
107. В чем разница методов run, let, apply, also, with, use?
108. Что произойдет, если в классе переопределить метод hashCode следующим образом: override fun hashCode(): Int = Random.nextInt()? А если так: override fun hashCode(): Int = 1?
109. Расскажите о Flow. В чем разница между Hot и Cold Flow?
110. Что такое деструктурирующее объявление? Что нужно сделать, чтобы иметь возможность использовать его для своего класса? Какие проблемы могут возникнуть с таким объявлением?
111. Для чего использовать data class? Почему нельзя работать с обычным классом?
112. Приведите пример делегатов в Kotlin?
113. Как реализовать кастомный делегат?
114. Объясните, как работает suspen-функция? Что такое continuation?
115. Как обрабатывать ошибки в Coroutines?
116. Что такое SupervisorJob и когда применяется?
117. Как остановить/отменить Coroutines?
Ответы на некоторые из этих вопросов вы найдете в видео курсе Kotlin.
RxJava
118. В чем разница между flatMap(), concatMap(), switchMap()?
119. Какие Subjects вы знаете в RxJava, чем отличаются от Observable?
120. Чем отличается Observable от Flowable?
121. Что такое backpreassure? Какие стратегии есть для решения?
122. Что такое Single, Maybe, Completable?
123. Какие варианты обработки ошибок есть, кроме onError?
Ответы на некоторые из этих вопросов вы найдете в видео курсе Создание пользовательских элементов управления в Android (урок 1).
Тестирование
124. На какие группы можно поделить тесты (Unit (JUnit) и Instrumental или UI Tests (espresso))?
125. Чем отличаются Unit и UI тесты (контекст)?
126. Расскажите, какие библиотеки использовали для mock?
127. Как тестировать DB?
128. Как “замокать” network layer в инструментальных тестах?
Ответы на некоторые из этих вопросов вы найдете в видео курсе Unit тестирование для Android разработчиков.
Другое
129. Расскажите, с какими DI-фреймворками работали.
130. Расскажите о Dagger Hilt.
Senior
Базовые вопросы
1. Расскажите о функциях высшего порядка. Когда они нужны?
2. Опишите, как происходит процесс деплоя Android-приложения.
3. Расскажите о многомодульной архитектуре. Зачем используют и когда ее нет смысла использовать?
4. Вам нужно написать простое приложение для работы с рецептами (несложное, имеет экран списка, поиска и детали). Оно должно работать с определенным API для получения/модификации вашего списка рецептов и хранить его локально в БД для отображения, если интернета нет. Опишите, как бы вы создавали приложение такого типа? Из каких уровней оно бы состояло, каково предназначение каждого уровня? Представьте, что в этом приложении необходимо добавить возможность изменять основную картинку рецепта (т. е. получать новые данные из галереи/камеры и загружать их на сервер через API) и это реализовано на экране с подробным описанием рецепта. Вам пришел запрос сделать такой же функционал и на экране список рецептов. Как вы это сделаете?
Архитектура
5. Как организовать CI/CD для Android-проектов?
6. Различия архитектурных подходов в Android. Какие и когда лучше использовать?
7. Как вы понимаете Clean Architecture?
8. Опишите основные отличия между MVC/MVP и MVVM. Как MVVM стал одним из рекомендованных паттернов?
Ответы на некоторые из этих вопросов вы найдете в видео курсе Архитектура Android приложений.
Многопоточность
9. Какие еще знаете механизмы синхронизации данных, кроме synchronized?
10. Что такое переключение контекста (context-switching), когда речь идет о многопоточности?
11. Что мы понимаем, когда говорим о «честной» блокировке (fair lock)?
Java Core
12. Если бы пришлось имплементировать иммутабельный класс на Java, как бы вы это сделали?
13. Что такое Java Memory Model?
14. Сравните принципы композиции и наследования (Composition vs Inheritance).
Android SDK
15. ViewModel сохраняет свое состояние при повороте экрана? Как это возможно? Можете ли предложить, как сделать такой механизм?
16. Android Architecture Components. Что из этого приходилось применять на практике? Какие задачи решали?
17. Приходилось ли исследовать «утечки» памяти? Какие инструменты использовали для этого?
18. Представьте, что у вас есть экран со списком товаров. Во время скроллинга вы замечаете, что рендеринг не плавный, в логах много фреймов скипается и вообще-то экран тормозит. Что будете делать, чтобы улучшить ситуацию?
19. Если бы была задача написать приложение для интернет-магазина с нуля, какие технологии/подходы выбрали бы?
20. Приведите пример применения GoF-паттернов в Android SDK.
Kotlin
21. Опишите взаимодействие кода Kotlin и Java.
22. Что изменилось в обработке ошибок в Kotlin, если сравнить с Java?
23. Что такое делегированные характеристики (Delegated properties)?
Благодарим за эту статью Виктора Чистякова, Михаила Дьяченко, Влада Тищенко, Александра Романишина, Андрея Люшенка, Дмитрия Пашко, Вячеслава Сергеева, Антона Козленка, Артема Грищука, Евгения Трощия, Романа Белоконя, Константина Красильникова, Сергея Харченка, Андрея Друка, Виктора Косенко.
Як стати Android розробником
Автор: Влад Сверчков
Операционная система Android
Языки программирования Java и Kotlin. Принципы ООП
Среда Android Studio и набор инструментов Android SDK
Формат обмена данными JSON
Архитектура REST API
Реактивное программирование
Библиотека Retrofit 2
Фреймворк Dagger 2
Данные и СУБД SQLite
UI/UX дизайн
Шаблоны проектирования
Алгоритмы и структуры данных
Unit тестирование
Архитектурные шаблоны
Git & GitHub
Google Play
Английский язык
Как стать Android разработчиком?
Итоги
Всем привет!
С каждым годом смартфоны, планшеты и другие гаджеты приобретают все большую популярность. Нам уже трудно представить хотя бы один день без них. Каким образом мы так сильно приявязались к ним? Все дело в программном обеспечении, которое находит ключ к каждому из нас: общение (телефонная связь, видеозвонки, социальные сети), просмотр мультимедийного контента, прослушивание музыки, фото- и видеосъемка, игры на любой вкус и цвет, обучающие приложения и т. д. За всем этим стоят девелоперы, разрабатывающие программы, от которых тяжело оторваться.
Каждое мобильное устройство работает с использованием одной из мобильных операционных систем. Cамыми популярными из них являются Android и iOS. В контексте данной статьи нас интересует именно первая ОС. Мы расскажем вам, какие инструменты используют разработчики в создании таких увлекательных приложений на Android и как стать специалистом в этой сфере.
Но прежде хотим познакомить вас поближе с данной операционной системой. Уверены, что практически каждый ее использовал (а может, и сейчас ею пользуется), однако сейчас вы узнаете некоторые интересные факты об Android:
Изначально Android разрабатывалась как ОС для фотоаппаратов.
ОС Android основана на ядре Linux.
Компания Samsung имела возможность приобрести стартап-компанию Android Inc. в 2004-м году, однако корейцы поставили под сомнение выгодность этого предложения. Через год корпорация Google купила Android Inc. не менее чем за $50 миллионов и смогла направить полученный потенциал в нужное русло.
Число активированных устройств, использующих Android, более 2 миллиардов.
Первая версия Android, как и первый пакет разработчика (SDK 1.0), вышла осенью 2008 года. Тогда эту ОС многие критиковали и не верили в успешность проекта.
Google Карты вычисляют дорожные пробки на основе концентрации и скорости перемещения Android устройств.
Android используется не только в смартфонах и планшетах, но также и в электронных книгах, наручных часах, фитнес-браслетах, игровых приставках, ноутбуках, нетбуках, смартбуках, очках Google Glass, телевизорах, бытовых роботах, научных аппаратах, компонентах исследовательских систем на базе гаджетов, компонентах IoT (Internet of Things — “интернет вещей”) и других устройствах.
Теперь перейдем ближе к сути.
Андроид разработчик — это IT-специалист, который создает, поддерживает и совершенствует программное обеспечение для мобильных устройств, использующих популярную ОС Android. Вместе с этим он задействован в процессах поддержки, улучшения и обновления разрабатываемых продуктов. Если посмотреть на количество устройств, которые используют данную ОС, можно прийти к выводу, что разработчик под платформу Андроид — очень востребован в IT, а также имеет высокие доходы. Какие технологии использует в своей работе этот специалист?
Какие языки программирования и технологии используют Android разработчики
Android
Каждый Android девелопер обязан знать операционную систему, под которую разрабатывает софт, а также понимать назначение и жизненный цикл Android-компонентов. Чтобы создавать эффективные мобильные приложения, вы должны понимать все аспекты устройства и работы данной ОС.
Java + ООП
Java — это объектно-ориентированный язык программирования со строгой типизацией. Безусловно, в создании приложений под Андроид можно использовать другие языки (C#, C/C++, Python и прочие), однако, именно Java считается флагманским в Android разработке. Поэтому в данной статье мы будем делать уклон в Java-стек.
Что являет собою этот язык? Не будем углубляться в его устройство, а скажем лишь, что все Java-приложения транслируются в специальный байт-код, выполняемый виртуальной машиной JVM (Java Virtual Machine), которая может быть установлена практически на любое устройство. Это делает программы, разработанные на Java, кроссплатформенными.
Какими знаниями необходимо обладать? Прежде всего необходимо знать Java и владеть методологией объектно-ориентированного программирования (ООП). Если конкретизировать:
Машинная математика, переменные и типы данных, условные конструкции, логические операции, циклические конструкции, методы, рекурсия, массивы, списки, обработка исключений, суперкласс Object, обобщения (Generics, дженерики), работа с памятью.
Понимание и применение пакетов (Packages) в Java;
ООП, понятия объектов и классов;
Механизмы наследования, умение работать с интерфейсами;
Коллекции и работа с ними;
Параллелизм.
Помимо теоретических знаний, новичок должен сформировать необходимые навыки написания кода. Для этого мы советуем вам как можно чаще практиковаться и решать прикладные задачки из интернета либо составленные самолично.
Также, советуем использовать онлайн-тренажеры, например, интерактивный тренажер от ITVDN. С его помощью вы сможете потренироваться в кодинге на Java и проверить свои знания.
Kotlin
Молодой и перспективный язык программирования, который поддерживает как объектно-ориентированное, так и процедурное программирование. Отличается своей простотой, гибкостью, лаконичностью, и являет собой следующий этап развития Java. Kotlin-приложения компилируются в уже упомянутый JVM байт-код, что делает этот язык полностью совместимым с Java.
На конференции для разработчиков I/O 2017 компания Google расставила акценты в Android разработке, заявив, что язык программирования Kotlin отныне позиционируется как приоритетный язык для разработчиков приложений под ОС Android. Подкреплено это было тем, что теперь новые API и библиотеки будут выпускаться сперва под Котлин.
Несмотря на возрастающую популярность данного языка и поддержку со стороны Google, Java не собирается уходить из мобильной разработки, удерживая там уверенные позиции и по сей день. Так что знание обоих языков будет предпочтительным для всех, кто собирается заниматься Андроид разработкой. В любом случае, зная Java, вы безпроблемно освоите и Kotlin. Все-таки классику надо знать и уважать.
Среда Android Studio и набор инструментов Android SDK
Android Studio — это интегрированная среда разработки (IDE) приложений под Android. В ней вы будете создавать проекты и работать над ними. В свою очередь, студия вам предоставит всевозможные удобности для облегчения разработки софта.
Android Software Development Kit — кроссплатформенный комплект средств Android разработки, включающий в себя: отладчик, набор библиотек, телефонный эмулятор, набор документации по работе в данной среде и примеры приложений. Особенно интересен в этом перечне эмулятор — программа, которая создает виртуальный мобильный девайс, где можно тестировать написанные приложения и смотреть, как они будут выглядеть на том или ином Андроид-устройстве.
JSON
JSON (JavaScript Object Notation) — это общий формат обмена данными. Позволяет совершать обмен информацией между программными продуктами, написанными на разных языках. Таким образом, клиент, использующий Java, может легко передавать данные на сервер, который реализован с помощью Ruby/Java/PHP.
REST API
REST — популярный архитектурный стиль, содержащий определенные принципы организации взаимодействия приложения либо сайта с сервером через протокол HTTP. API — это прикладной программный интерфейс. С его помощью происходит определение, каким образом следует обращаться к программе и какие ответы она обязана предоставлять пользователям.
К примеру, оплачиваете футболку в интернет-магазине или покупаете билет в кино — как только вы нажимаете соответствующую кнопку, подтверждающую ваши намерения на оплату, сайт соединяет вас с платежной системой с использованием API этой системы. Но даже если система не имеет никакой интеграции с другими, API все равно используется — для общения внутри системы.
RxJava
Библиотека, которая позволяет реализовать принципы реактивного программирования для JVM. Используется для оперирования событиями и потоками данных, комбинируя лучшие идеи шаблонов проектирования Observer (Наблюдатель), Iterator (Итератор) и функционального программирования.
В реальной жизни влияние реактивного подхода мы ощущаем, когда на нашем смартфоне высвечивается сообщение о новом посте человека, которого мы фолловим в социальных сетях или когда нам приходит уведомление о новом сообщении из мессенджера. То есть, вместо того, чтобы каждые 10 секунд лично перезагружать страничку объекта фолловинга или свой мессенджер, мы просто ожидаем уведомления о новом посте, занимаясь своими делами. Это очень полезная опция, позволяющая не только экономить наше время, но и упрощающая нагрузку на сервер. Куда без RxJava в мобильную разработку на Java?
Retrofit 2
Популярная библиотека для сетевого взаимодействия — типобезопасный HTTP-клиент для Android и Java. Позволяет легко получить и загрузить JSON (либо иные структурированные данные) через веб-сервис на основе REST. Для работы с HTTP-запросами в Retrofit используется библиотека OkHTTP.
Dagger 2
Фреймворк для работы с зависимостями в Java и Android. Позволяет уменьшить количество шаблонного кода, структурировать зависимости, упрощает работу при большом количестве зависимостей, а также позволяет делать код более читабельным.
SQLite
Structured Query Language (SQL) — декларативный язык структурированных запросов, разработанный для взаимодействия с базами данных. Особенностью SQL является то, что он лишь описывает необходимые компоненты и желаемые результаты, не указывая, как именно эти результаты должны быть получены.
Любое ПО подразумевает работу с данными, будь то обыкновенная процедура приема данных от сервера (например, скачивание файлов) либо внесение в БД информации о новом пользователе, который только зарегистрировался — умение работать с данными одинаково важно во всех сферах разработки. Исключением является только FrontEnd.
Также, изучите одну из систем управления базами данных (СУБД). В Андроид разработке по умолчанию используется SQLite. Благодаря своей компактности, легкости и надежности, эта СУБД идеально подходит для разработки в электронных устройствах и программах, где стратегическое значение имеет оперативная память.
XML
Extensible Markup Language - расширяемый язык разметки, с помощью которого можно структурировать и хранить данные для удобства их дальнейшей обработки. XML хорошо масштабируем, сочетает в себе простой и удобный синтаксис, а также базируется на кодировках Юникод для представления содержания документов. Также, в Андроид разработке XML используется для создания интерфейса посредством объявления элементов пользовательского интерфейса и задания их расположения.
UI/UX дизайн
UI/UX (User Interface — “интерфейс пользователя”, User eXperience — “опыт пользователя”) дизайн — это проектирование различных пользовательских интерфейсов, в которых удобство использования (UX) настолько же важно, как и внешний вид (UI). Android девелопер в ходе создания приложений также занимается и разработкой внешнего вида приложения, а потому, должен знать, как реализовывать интерфейс, который принесет юзеру максимальный комфорт во всех аспектах использования.
Обычно в UI/UX разработке под Андроид используют Material Design — стиль графического дизайна интерфейсов программного обеспечения и приложений, разработанный компанией Google, делающий уклон на естественность графической составляющей. Для работы необходимо использовать инструменты Material Components for Android.
Шаблоны проектирования
Паттерны (они же шаблоны) являют собой архитектурные конструкции, описывающие общепринятые способы решения задач, которые часто возникают в ходе проектирования программного обеспечения. Всего существует более двух десятков шаблонов, однако разработчику нет необходимости владеть ими всеми. Достаточно изучить самые популярные.
Алгоритмы и структуры данных
Понимание алгоритмов и структур данных — обязательное требование, которому должен соответствовать каждый программист. Это необходимый фундамент, который учит разработчика писать хороший исходный код через подбор оптимальных формы представления информации и последовательности действий.
Изучив структуры данных, вы будете уметь управлять уровнем сложности своих программ, делая их более доступными для понимания, а также разрабатывать приложения с высокой производительностью, которые будут рациональнее взаимодействовать с памятью.
Знание алгоритмов позволит вам создавать сложные конструкции для эффективного решения широкого спектра задач на Java и Kotlin.
Unit тестирование
Вид тестирования, который берет на себя программист, а не тестировщик. Его основная идея заключена в написании тестов под каждую нетривиальную функцию либо метод. Цель Unit (модульного) тестирования — изоляция отдельных частей программы, чтобы продемонстрировать, что по отдельности они являются работоспособными. Таким образом происходит проверка кода на регрессию, а вместе с этим — соответствующее обнаружение ошибок.
Архитектурные шаблоны
В зависимости от предпочтений работодателя, от вас могут потребовать знание одного или нескольких архитектурных паттернов. Это шаблоны наивысшего уровня, которые определяют архитектуру всей программной системы. Самыми популярными являются MVC (Model-View-Controller), MVVM (Model-View-ViewModel), MVP (Model-View-Presenter), Clean Architecture.
Git & GitHub
Git — это популярная система контроля версий, позволяющая вести историю разработки проекта с возможностью доступа к каждой сохраненной версии. Одним из самых известных антагонистов Git является SVN — централизованная система, в отличие от децентрализованной Git.
Также, в работе вам пригодится и сервис онлайн-хостинга проектов, использующий систему контроля версий. В данном случае это GitHub. В паре с Git он позволяет разработчикам сохранять свой код онлайн, а затем взаимодействовать с другими разработчиками в разных проектах.
Данные системы позволяют команде программистов работать над одним проектом одновременно, сохраняя внесенные изменения, а также отслеживать выполнение задач каждым членом группы.
Google Play
Магазин приложений, в котором можно размещать и скачивать приложения под Андроид. Умение его использовать — обязательно. Google Play имеет очень строгий набор политик, которым должно соответствовать ваше приложение. К слову, за аккаунт Android разработчика необходимо один раз раскошелиться на $25. Зато это дешевле, чем за аккаунт iOS девелопера — там с вас будут брать дань каждый год денежную сумму в размере $99.
Английский язык
Наверное, единственный язык, которым обязаны владеть все разработчики без исключения. Его вы будете использовать во время поиска ответов как во время учебы, так и во время работы, ведь большинство новых сведений о технологиях, курсы, учебные и справочные материалы появляются в первую очередь на английском.
Для работы в команде разработчиков обычно знаний языка на уровне чтения технической документации и комментирования кода вполне достаточно, однако если вы планируете вести переговоры и переписку с иностранным заказчиком, ваш уровень должен быть выше.
Как стать Android разработчиком
Как вы заметили, Android девелоперы должны знать множество различных технологий. Сейчас очень много разработчиков данного направления, но действительно хороших очень мало. Поэтому и требования к кандидатам высоки. Если вы пройдетесь по ресурсам поиска работы, то наверняка отметите, что вакансий Android Developer уровня Junior не так много, как хотелось бы, а потому за место под солнцем придется побороться. Давайте перейдем к советам касательно того, как сделать старт в Андроид разработке и начать “набирать массу”.
В университетах никто не обучит вас искусству разработки на Android, поэтому вы можете:
Учиться самостоятельно — по книгам или видео курсам.
Записаться на соответствующие курсы для максимально эффективного обучения специальности.
Второй вариант является лучшим, поскольку предусматривает более высокий уровень дисциплинированности на всем пути обучения, а также структурированную подачу необходимой информации, которой удобно пользоваться и которая отвечает современным требованиям рынка.
Если вы выбираете обучение по видео курсам, то прежде всего определите подходящую для вас образовательную онлайн-платформу.
Мы рекомендуем сделать выбор в пользу ITVDN. Почему именно эта платформа? Давайте мы познакомим вас с преимуществами обучения на ITVDN.
ITVDN — образовательная онлайн-платформа, содержащая полноценные программы обучения по 12 самым популярным специальностям. В каталоге ITVDN свыше 180 видео курсов по различным языкам программирования и информационным технологиям.
Учебная программа каждой специальности содержит:
тщательно подобранный пакет видео курсов;
план обучения с нуля до уровня специалиста, который вы можете адаптировать под свой уровень;
Интерактивный Тренажер навыков для формирования навыков написания кода;
учебные материалы, исходники программного кода, опорный конспект, презентации к урокам;
доступ к Форуму, где каждый учащийся может общаться с другими студентами, тренерами и единомышленниками;
возможность персональной консультации с тренером согласно выбранному пакету подписки;
возможность проходить тестирование для подтверждения знаний, полученных в результате прохождения видео курса;
электронный сертификат об окончании курса после успешного завершения тестирования.
Все видео курсы записываются опытными разработчиками, которые проходят соответствующую сертификацию, чем подтверждают свое мастерство владения той или иной технологией. Наши преподаватели работают в IT и в курсе всех современных тенденций в своей сфере разработки.
Знакомство со специальностью мы рекомендуем начать с просмотра бесплатных вебинаров по специальности Android Developer, в частности, с одноименного вебинара Евгения Мыцы Как стать Android разработчиком, в котором отражены все самые актуальные тренды и требования.
Если вы заинтересованы в изучении специальности Android Developer на ITVDN, у нас есть отличное предложение для вас. Наш образовательный портал содержит полноценную программу обучения Android разработке. Переходите по ссылке и делайте шаг навстречу желаемой профессии!
Какой бы способ обучения вы не выбрали — вначале нужно изучить язык программирования Java и довести владение им до высокого уровня.
После каждой пройденной темы нужно решать практические задачи, чтобы закрепить полученные знания. В этом вам может помочь интерактивный тренажер от ITVDN, с помощью которого вы сможете проверить ваше владение навыками написания кода на Java.
Продолжайте обучение и изучайте те технологии, которые мы перечислили в данной статье. Очень желательно, чтобы у вас был наставник, который мог бы следить за вашим прогрессом, отвечать на возникающие вопросы, давать полезные советы. Это может быть как преподаватель на ITVDN, так и один из ваших знакомых, который занимается Андроид разработкой и готов взять под свое крыло юного протеже.
Знание английского на уровне не ниже Intermediate обязательно. Оно вам понадобится для комфортного поиска информации по Java, Kotlin и другим технологиям в интернете. Если ваши знания английского недостаточны как минимум для чтения технической литературы — обязательно подтяните их при помощи различных курсов либо интернет-материалов свободного пользования.
Изучите Git, начните делать свой небольшой проект и опубликуйте его на GitHub — это даст вам ценный опыт работы с распределенной системой управления версиями и позволит проверить свои навыки в решении реальной задачи. Несколько хороших проектов, и полноценное портфолио готово. Не забывайте о Google Play, ведь именно сюда Android разработчики выкладывают готовый к использованию продукт.
Актуальную информацию касательно языков и технологий, которыми необходимо владеть Android разработчику, вы можете узнать из нашего вебинара “Как стать Android разработчиком”, перейдя по ссылке.
Резюмируя
Android разработчик — специалист, который занимается созданием ПО под различные устройства — смартфоны, планшеты, ноутбуки, нетбуки и прочие девайсы, в основе которых лежит ОС Android. Востребованность этого разработчика очень высока, а на настоящих профессионалов то и дело ведут охоту HR-ы и рекрутеры. Изучайте все необходимые языки и технологии, практикуйтесь, а также всегда подпитывайте интерес к вашей будущей профессиональной деятельности.
Не забывайте следить за новостями в мире Android. Просматривайте в YouTube видео, посвященные данной сфере разработки и впитывайте новую информацию. Для дополнительных очков мотивации подпишитесь на известных Андроид девелоперов. Пробуйте посещать различные мероприятия, посвященные разработке под Андроид, находите единомышленников и поддерживайте активность в их среде. Главное — быть целеустремленным и иметь желание развиваться в IT-сфере. Не останавливайтесь ни перед чем и тогда вас обязательно настигнет успех!
Желаем вам побед в обучении! Обогащайтесь новыми знаниями и скиллами на ITVDN!
Як я побудував проект на Django, Django REST Framework, Angular 1.1.x та Webpack
Автор: Редакция ITVDN
Моя идея состояла в том, чтобы построить простой репликабельный проект на Angular с бэкэндом на Django. Я искал и не смог найти нужных решений, пришлось во всем разбираться самому. В итоге я разобрался и решил сам написать гайд для всех, кого может заинтересовать данная проблема.
Данная статья поможет вам построить простое приложение Angular с бэкэндом на Django, организованного с помощью Webpack.
Проблема
Я хочу настроить проект на Angular 1.1.x и скормить ему данные с сервера Django. Мне бы хотелось использовать Django REST Framework (DRF), чтобы пострить RESTful API. Я также хочу сбандлить JS ассеты. Сейчас я собираюсь запустить сайт на одном сервере.
Предварительные требования
Python 2.x
Django 1.9.x
npm 2.15.8+
Webpack 1.13.x (sudo npm i -g webpack)
ESLint 2.13.1+ (sudo npm i -g eslint)
NodeJS 4.4.7+
Содержание
Скаффолдинг проекта. Создайте свои начальные директории.
Скаффолдинг проекта на Django.
Настрока переменных среды, нужных для запуска сервера Django.
Установка Django REST Framework и настройка Django с использованием переменных среды.
Создание API.
Запуск Django сервера с использованием dev settings.
Инициализация npm-пакета и установка front-end JS зависимостей.
Создание Angular entry-point и загрузка начальных зависимостей.
Настройка Webpack'а.
Дайте команду Django загрузить приложение.
Создайте шаблон базы приложения Angular.
Напишите компонент home.
Напишите Angular роуты, ведущие к вашему компоненту home и странице 404.
Добавьте директивы ангуляр-маршрутизатора к шаблону входной точки приложения.
Проверьте ваше REST API в приложении Angular. Шпаргалка.
Итак, начнем!
0. Настройте среду для Python.
mkvirtualenv mysite
1. Скаффолдинг проекта на Django. Создайте начальные директории.
Мы хотим сфокусироваться на модулярности в ходе разработки. Следовательно, существует множество директорий в конечном итоге использования. Мы хотим, чтобы наше дерево изначально выглядело так:
mysite
├── backend
│ ├── docs
│ ├── requirements
└── frontend
├── app
│ ├── components
│ └── shared
├── assets
│ ├── css
│ ├── img
│ ├── js
│ └── libs
├── config
├── dist
└── js
Сделайте следующее:
mkdir mysite && cd mysite
mkdir -p backend/docs/ backend/requirements/ \
frontend/app/shared/ \
frontend/app/components/ \
frontend/config \
frontend/assets/img/ frontend/assets/css/ \
frontend/assets/js/ frontend/assets/libs/ \
frontend/dist/js/
*Примечание: Структура этого проекта была навеяна опытом с несколькими другими проектами. Я считаю эту организацию идеальной, но вам не обязательно ей следовать. Но, пока вы читаете этот гайд, вы должны придерживаться этой структуры.
2. Скаффолдинг проекта на Django.
В директории backend/ создайте Django проект:
python django-admin.py startproject mysite
Также создайте requirements.txt:
pip freeze > requirements/requirements.txt
В директории (вашего проекта) backend/mysite/ произведите скаффолдинг директории, той, где будет жить ваше API:
mkdir -p applications/api/v1/
touch applications/__init__.py applications/api/__init__.py \
applications/api/v1/__init__.py applications/api/v1/routes.py \
applications/api/v1/serializers.py applications/api/v1/viewsets.py
Теперь создайте структуру директории настроек:
mkdir -p configlord/settings/
touch configlord/settings/__init__.py \
configlord/settings/base.py configlord/settings/dev.py configlord/settings/prod.py \
configlord/dev.env configlord/prod.en
3. Настройте переменные окружения, которые нужны для запуска сервера Django.
На этом этапе я предпочитаю пользоваться django-environ для работы с переменными окружения. Существует множество способов сделать это, но пакет django-environ чрезвычайно упрощает этот процесс, поэтому я использую его во всех своих проектах.
Установите django-environ:
pip install django-environ
В mysite/dev.env добавьте следующее:
DATABASE_URL=sqlite:///mysite.db
DEBUG=True
FRONTEND_ROOT=path/to/mysite/frontend/
SECRET_KEY=_some_secret_key
Мы собираемся использовать эти переменные среды в наших настройках. Выгода от использования наших переменных окружения в отдельных файлах состоит в основном в том, что такая настройка позволяет облегчить переключение между средами. В нашем случае файл the dev.env является списком переменных, которые мы бы использовали в локальной среде разработки.
*Примечание: SECRET_KEY можно взять из settings.py, который был сгенерирован django-admin.py startproject.
4. Установите Django REST Framework и настройте Django, используя переменные среды.
Установка DRF:
pip install djangorestframework
Наполните settings/base.py следующим:
Укажите, где искать переменные окружения.
import environ
project_root = environ.Path(__file__) - 3
env = environ.Env(DEBUG=(bool, False),)
CURRENT_ENV = 'dev' # 'dev' is the default environment
# read the .env file associated with the settings that're loaded
env.read_env('./mysite/{}.env'.format(CURRENT_ENV))
Установите базу данных. В данном случае мы собираемся использовать встроенные в django-environ настройки SQLite.
DATABASES = {
'default': env.db()
}
Установите SECRET_KEY ,а также debug.
SECRET_KEY = env('SECRET_KEY')
DEBUG = env('DEBUG')
Добавьте DRF в пул приложений, которые Django должен использовать.
# Application definition
INSTALLED_APPS = [
...
# Django Packages
'rest_framework',
]
Ссылки будут «жить» в специальном URL модуле, созданном с помощью базы проекта.
ROOT_URLCONF = 'mysite.urls'
Укажите Django, где искать все шаблоны и другие статические ассеты.
STATIC_URL = '/static/'
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]
STATICFILES_DIRS = [
env('FRONTEND_ROOT')
]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [env('FRONTEND_ROOT')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
В соответствии с настройкой TEMPLATES Django должен будет искать шаблоны внутри frontend/ directory. Это то, где Angular приложение будет жить. Мы используем только Django, чтобы обслужить шаблон, внутри которого Angular приложение будет загружаться, которое будет выполнено через entry-point директиву. Если вы не знаете, о чем я, продолжайте чтение...
Наполните settings/dev.py:
from mysite.settings.base import *
CURRENT_ENV = 'dev'
Здесь мы указываем, что этот файл настроек унаследывает настройки из base.py и переопределяет строку CURRENT_ENV, найденную в base.py. Мы говорим: «Используй это значение вместо значения, найденного в наследуемом модуле».
5. Создайте API.
Нам нужно нечто, с помощью чего мы сможем протестировать службы Angular, поэтому давайте создадим небольшое API. Этот шаг можно пропустить, но я не советовал бы делать этого. Нам важно знание того, что настройки приложения Angular работают исключительно с точки зрения его потенциала, чтобы облегчить HTTP запросы.
Сгенерируйте приложение.
manage.py startapp games
Создайте модель в games/models.py.
class Game(models.model):
title = models.CharField(max_length=255)
description = models.CharField(max_length=750)
Создайте DRF сериализатор для модели игры в applications/api/v1/serializers.py.
from rest_framework.serializers import ModelSerializer
from applications.games.models import Game
class GameSerializer(ModelSerializer):
class Meta:
model = Game
Создайте DRF viewset для модели в приложениях applications/api/v1/viewsets.py.
from rest_framework import viewsets
from applications.games.models import Game
from applications.api.v1.serializers import GameSerializer
class GameViewSet(viewsets.ModelViewSet):
queryset = Game.objects.all()
serializer_class = GameSerializer
В applications/api/v1/routes.py зарегистрируйте роуты, используя DRF's router registration features.
from rest_framework import routers
from applications.api.v1.viewsets import GameViewSet
api_router = routers.SimpleRouter()
api_router.register('games', GameViewSet)
Обозначьте ссылки для зарегистрированного DRF роута внутри mysite/urls.py:
from django.contrib import admin
from django.conf.urls import include, url
from applications.api.v1.routes import api_router
urlpatterns = [
url(r'^admin/', admin.site.urls),
# API:V1
url(r'^api/v1/', include(api_router.urls)),
]
6. Запустите сервер Django, используя dev settings.
manage.py runserver --DJANGO_SETTINGS_MODULE=mysite.settings.dev
Впуская DJANGO_SETTINGS_MODULE в runserver, мы «говорим» - работать используя специфические параметры.
Если все работает, у вас появится возможность открыть localhost:8000/api/v1/games и увидеть ответ от DRF. Если все работает – самое время заняться построением приложения Angular. Если нет – направьте автору проблему. Если вы застряли на этом этапе – оставьте комментарий автору под оригиналом публикации.
7. Инициализируйте npm-пакет и установите front-end JS зависимости.
Приложение Angular не будет работать так, как мы хотим, если правильные зависимости не будут установленны. Самое время установить базовые пакеты, которые понадобятся.
Инициализируйте npm-пакет. Прямо из frontend/ запустите
npm init --yes
By passing the --yes flag into init, you're telling NPM to generate a package.json using NPM defaults. Otherwise, if you don't pass that in, you'll have to answer questions... Boring.
Установите dev dependencies.
npm install --save-dev eslint eslint-loader
Установите общие зависимости.
npm install --save eslint eslint-loader angular angular-resource angular-route json-loader mustache-loader lodash
Файл package.json file во frontend/ должен выглядеть приблизительно следующим образом:
{
"name": "my-app",
"version": "0.0.1",
"description": "This is my first angular app.",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"eslint": "^3.1.1",
"eslint-loader": "^1.4.1"
},
"dependencies": {
"angular": "^1.5.8",
"angular-resource": "^1.5.8",
"angular-route": "^1.5.8",
"eslint": "^3.1.1",
"eslint-loader": "^1.4.1",
"json-loader": "^0.5.4",
"lodash": "^4.13.1",
"mustache-loader": "^0.3.1"
}
}
Здесь то, что мы только что установили:
eslint – отличный линтер, благодаря которому код JavaScript будет в порядке (последователен).
eslint-loader – для запуска eslint через Webpack. Чуть позже я объясню концепцию «загрузчиков».
angular - MVC фреймворк. Если вы не знали об этом, стоит подумать о том, чтобы закрыть эту страничку прямо сейчас.
angular-resource - (Angular) HTTP библиотека выбора. Это абстракция $http.
json-loader - загрузчик (снова, используемый Webpack) для распаковки JSON из .json файлов с помощью require() во время работы нашего приложения.
mustache-loader – загрузчик, который мы будем использовать, чтобы парсить наши mustache шаблоны. Mustache шаблоны – это веселье.
Я могу спокойно предположить, что вы не знаете, как все эти пакеты заиграют вместе.
Не переживайте, братишки.
8. Создайте entry-point в Angular, объявите начальные зависимости, объявите первоначальные глобальные переменные.
В frontend/app/app.js добавьте следующее:
/* Libs */
require("angular/angular");
require("angular-route/angular-route");
require("angular-resource/angular-resource");
/* Globals */
_ = require("lodash");
_urlPrefixes = {
API: "api/v1/",
TEMPLATES: "static/app/"
};
/* Components */
/* App Dependencies */
angular.module("myApp", [
"ngResource",
"ngRoute",
]);
/* Config Vars */
// @TODO in Step 13.
/* App Config */
angular.module("myApp").config(routesConfig);
app.js это то, где Webpack будет искать модули, чтобы бандлить их вместе. Лично я ценю такую организацию и методику вызовов, но такой порядок не обязателен. Существует 6 секций:
Libs – главные библиотеки, используемые на протяжении работы Angular приложения;
Globals – зарезервированные глобальные переменные, которые мы можем использовать во время работы приложения;
Components (Компоненты) – особенные модули проекта;
App Dependencies (Зависимости приложения) – объявление входной точки приложения и его зависимостей;
Config Vars – переменные, где хранятся настройки, такие как route config;
App Config - вводит configs (настройки) в приложение, используя сохраненные из предыдущей секции.
Для того, чтобы globals работали, вам следует указать ESLint на то, какие из переменных - глобальные.
В config/eslint.json добавляем следующее:
{
"env": {
"node": true
},
"extends": "eslint:recommended",
"rules": {
"indent": [
"error",
2
],
"linebreak-style": [
"error",
"unix"
],
"quotes": [
"error",
"double"
],
"semi": [
"error",
"always"
],
"no-console": 0
},
"globals": {
"_": true,
"_urlPrefixes": true,
"angular": true,
"inject": true,
"window": true
},
"colors": true
}
Ниже несколько переменных, о которых мы предупредили ESLint:
_ представить lodash.
_urlPrefixes – объект, который мы будем использовать в приложении для гиперссылок. Я расскажу об этом позже.
angular, чтобы представить AngularJS object driving our entire application.
inject, который будет использоваться для ввода зависимостей Angular.
window, которая просто представляет объекты окон в JavaScript, является представителем DOM.
9. Настройка Webpack.
Теперь, когда мы выложили большинство наших зависимостей приложения, мы можем построить config file для Webpack. Webpack будет консолидировать все зависимости, а также модули для приложений, которые мы создаем в один файл. В bundle.
В frontend/webpack.config.js добавляем следующее.
module.exports = {
entry: "./app/app.js",
output: {
path: "./dist/js/",
filename: "bundle.js",
sourceMapFilename: "bundle.js.map",
},
watch: true,
// eslint config
eslint: {
configFile: './config/eslint.json'
},
module: {
preLoaders: [{
test: /\.js$/,
exclude: /node_modules/,
loader: "eslint-loader"
}],
loaders: [
{ test: /\.css$/, loader: "style!css" },
{ test: /\.html$/, loader: "mustache-loader" },
{ test: /\.json$/, loader: "json-loader" }]
},
resolve: {
extensions: ['', '.js']
}
};
Для того, чтобы Webpack бандлил все наши статические зависимости, нам нужно указать ему, где их брать, какие зависимости обрабатывать и как управлять ими до банлинга.
Давайте посмотрим на то, что указывает Webpack с помощью webpack.config.js:
Entry - это путь к тому, что Webpack'у нужно для старта бандлинга. Это можеть быть полный путь или путь, относительный тому, где webpack.config.js располагается. В данном случае мы говорим о последнем варианте.
output - это объект, содержащий в себе path, который является директорией, в которую связанные зависимости будут помещаться; filename - это название бандла; и, в данном случае, мы решили использовать sourceMapFilename, чтобы обозначить, что наша() source map будет вызван(а).
watch указывает Webpack следить за изменениями в файле, пока он выполняется. Если это не настроено как true, Webpack прогонит процесс бандлинга единожды и остановится.
eslint содержит в себе специфические ESLint настройки, используемые eslint-loader.
module указывает Webpack'у, что делать с модулями, с которыми он работает.
module.preLoaders «говорит», что делать перед бандлингом. В данном случае мы хотим запустить модули (исключив модули установленные npm) через eslint.
module.loaders - это то, где указана последовательность загрузчика. В нашем случае мы просто настраиваем test и loader, где test указывает Webpack’у, какие модули запускать в загрузчике (по соответствию с паттерном regex), и loader говорит Webpack’y, какой загрузчик использовать в модулях, которые соответствуют regex паттерну в test. Каждый загрузчик указан в строке и разделен восклицательным знаком. Ex: loader!another_loader!yet_another_loader
module.preLoaders указывает, какие preLoaders'у запускать модули. Используемые настройки такие же точно, какие мы использовали в module.loaders.
Но, Грег, какая разница между preLoaders и loaders? Я рад, что ты спросил, мой дорогой друг!!
A loader указывает Webpack'у, как бандлить требуемые файлы. Loader смотрит на модуль и говорт: «Эй, так как вы упаковываете это в один файл как строку – это то, как оно должно быть преобразованно для bundle'а».
A preLoader обрабатывает код перед loaders, например, чтобы слинтить JavaScript модули.
A postLoader является плагином Webpack'а, который обрабатывает код после бандинга. Мы не специфицировали ни один postLoader ради простоты.
10. Укажите Django загрузить приложение.
Прямо сейчас все, что нужно сделать – указать Webpack’у что создавать, как создавать и что должно быть создано. (На данном этапе я бы очень удивился, если вы попробуете запустить его и он заработает без ошибок. Если так и есть, я чертов мужик.)
Так как Django использует свой собственный URL процессор в нашем приложении, мы можем быть рады тому, как любезно Django управляет всем тем, что введено в строку браузера пользователя. Как бы то ни было, мы бандлим одностраничное приложение, используя абсолютно другой фреймворк, и хотим, чтобы у приложения был полный контроль над тем, что пользователь вводит. Все, что нам нужно – обслуживать одну страничку, в которой работает SPA. Следовательно...
В backend/mysite/mysite/urls.py добавляем в список urlpatterns следующее:
# Web App Entry
url(r'^$', TemplateView.as_view(template_name="app/index.html"), name='index'),
Это значит, что когда пользователь открывает mysite.com/, env('FRONTEND_ROOT') + app/index.html будет находить STATICFILES_FINDERS в порядке рендера HTML шаблона.
11. Создайте шаблон базы приложения Angular.
frontend/app/components/app/index.html шаблон должен выглядеть как обычный шаблон Django.
В frontend/app/index.html добавляем следующее:
{% load staticfiles %}
<html ng-app="myApp">
<head>
<title>My Sitetitle>
<script src="{% static 'dist/js/bundle.js' %}">script>
head>
<body>
body>
html>
В таком случае вам удастся запустить Webpack. Если вы запустите Django сервер и откроете localhost:8000,вы увидите пустую страничку. Если нет – дайте знать автору.
12. Напишите home component.
Давайте напишем наш первый компонент. Он отобразит текст на страничке, пока пользователь открывает localhost:8000.
Создайте директорию для компонента и базовые файлы. В frontend/app/components/:
mkdir home && touch home/home-controller.js home/home.js home/home.html
В frontend/app/components/home/home.html добавляем следующее:
<div ng-controller="HomeController as ctrl">
<div>
<h1>Home!h1>
div>
div>
Теперь добавим следующее в frontend/app/components/home/home-controller.js:
function HomeController() {
var that = this;
that.foo = "Foo!";
console.log(that); // should print out the controller object
}
angular.module("Home")
.controller("HomeController", [
HomeController
])
Определение модуля Angular должно быть объявлено в home.js:
angular.module("Home", []);
require("./home-controller");
Теперь мы можем сослаться на "Home" в области зависимости определения модуля. Давайте сделаем это!
В app/app.js добавьте следующее:
/* Components */
require("./components/home/home");
/* App Dependencies */
angular.module("myApp", [
"Home", // this is our component
"ngResource",
"ngRoute"
]);
13. Пропишите пути Angular'а, ведущие к home component и страничке 404.
Нам нужно настроить первый путь. Когда пользователь попадает на localhost:8000, Angular должен взять контроль над загрузкой отрендеренного шаблона. Чтобы сделать это, нам потребуется использовать angular-router.
В frontend/app/routes.js пишем следующее:
function routesConfig($routeProvider) {
$routeProvider
.when("/", {
templateUrl: _urlPrefixes.TEMPLATES + "components/home/home.html",
label: "Home"
})
.otherwise({
templateUrl: _urlPrefixes.TEMPLATES + "404.html"
});
}
routesConfig.$inject = ["$routeProvider"];
module.exports = routesConfig;
Если мы не добавим _urlPrefixes.TEMPLATES, angular-router предположит, что components/home/home.html является действительной ссылкой, которую узнает сервер. Так как STATIC_URL в настройках предполагает неправильную работу localhost:8000/components/home/home.html.
Также, если вы еще не заметили, вы увидите otherwise({...}) в коде роутов. Это то, как будут реализованы страницы 404.
В frontend/app/404.html добавляем следующее:
<h1>NOT FOUNDh1>
И в завершении добавляем frontend/app/app.js:
/* Config Vars */
var routesConfig = require("./routes");
14. Добавьте директивы angular-router к шаблону точки входа приложения.
А теперь нам нужно указать Angular, где будет происходить переключение отображаемого, когда пользователь пользуется навигацией. Чтобы сделать это, мы используем всю силу angular-router.
В тэг
в frontend/app/index.html добавляем:
<base href="/">
Теперь в тэг
добавляем:
<div ng-view>div>
Ваш index.html теперь должен выглядеть так:
{% load staticfiles %}
<html ng-app="myApp">
<head>
<title>My Sitetitle>
<script src="{% static 'dist/js/bundle.js' %}" >script>
<base href="/">
head>
<body>
<div>
<div ng-view>div>
div>
body>
html>
Запустите Webpack. Откройте localhost:8000. Вы должны увидеть, что произошло в home/home.html. (Если ничего, отправьте эти данные автору J ).
15. Проверьте REST API в приложении Angular.
Если все сделано, у вас появится возможность написать angular службы для Django API. Давайте создадим небольшой компонент, чтобы увидеть, можем ли мы это сделать. Этот компонент должен перечислять игры. Я предполагаю, что вы уже заполнили базы данных, следовательно запрос HTTP к localhost:8000/api/v1/games вернет список игр.
Создайте скаффолд компонент в frontend/app/components/:
mkdir -p game/list/ && touch game/list/game-list-controller.js game/list/game-list-controller_test.js game/game-service.js game/game.js game/game.html
Этот компонент будет перечислять игры.
Этот компонент должен перечислять игры. Я предполагаю, что вы уже заполнили базы данных, следовательно запрос HTTP к localhost:8000/api/v1/games вернет список игр.
В game/game-service.js:
function GameService($resource) {
/**
* @name GameService
*
* @description
* A service providing game data.
*/
var that = this;
/**
* A resource for retrieving game data.
*/
that.GameResource = $resource(_urlPrefixes.API + "games/:game_id/");
/**
* A convenience method for retrieving Game objects.
* Retrieval is done via a GET request to the ../games/ endpoint.
* @param {object} params - the query string object used for a GET request to ../games/ endpoint
* @returns {object} $promise - a promise containing game-related data
*/
that.getGames = function(params) {
return that.GameResource.query(params).$promise;
};
}
angular.module("Game")
.service("GameService", ["$resource", GameService]);
Обратите внимание на ссылку $resource, которую мы используем для того, чтобы настроить механизмы HTTP в нашей службе.
В game/list/game-list-controller.js:
function GameListController(GameService) {
var that = this;
/* Stored game objects. */
that.games = [];
/**
* Initialize the game list controller.
*/
that.init = function() {
return GameService.getGames().then(function(games) {
that.games = games;
});
};
}
angular.module("Game")
.controller("GameListController", [
"GameService",
GameListController
]);
В game/game.html:
<div ng-controller="GameListController as ctrl" ng-init="ctrl.init()">
<div>
<h1>Gamesh1>
<ul>
<li ng-repeat="game in ctrl.games">{{ game.title }}li>
ul>
div>
div>
В game/game.js:
angular.module("Game", []);
require("./list/game-list-controller");
require("./game-service");
Затем обратимся к компоненту в app.js:
/* Components */
require("./components/game/game");
/* App Dependencies */
angular.module("myApp", [
"Home",
"Game",
"ngResource",
"ngRoute"
]);
В конце концов, мы собираемся настроить роуты для списка игр, поэтому в frontend/app/routes.js добавьте следующее в объект $routeProvider:
.when("/game", {
templateUrl: _urlPrefixes.TEMPLATES + "components/game/list/game-list.html",
label: "Games"
})
Запустите Webpack снова. Все должно верно скомпилироваться. Если нет – дайте знать автору.
Откройте localhost:8000/#/games. Вы увидите список игр.
Сделано!
Это все.
Сомнения/Мысли
Но есть некоторые сомнения:
Глобальные переменные могут конкретно подставить вас, если вы не знаете, как с ними работать. Их локальное поведение не гарантирует того же на продакшене. Насколько я помню, их можно заставить работать, если правильно описан метод. Ваше приложение на Angular тесно связанно с Django. Поэтому ваше приложение не будет просто слиянием back- и фронтенда. Если ваш Django-RIP давно устарел, значит поменялись и маршруты, следовательно сконфигурируете ваш бэкенд согласно тому, как должны вести себя статические файлы. Так же вам будет необходимо заменить index.html с точкой входа Angular. Маленькие проекты не дадут вам особо попотеть, а вот большие явно заставят понервничать. Совет: единственное место, где должны сопрягаться приложение на Angular и Django сервер - это одна точка входа.
Деплоймент должен быть выполнен так же, как любой обычный деплоймент приложения.
Это все. Если у вас есть какие-либо вопросы и вы испытываете трудности, пожалуйста, оставьте их в комментариях в исходной статье!
Чит!
Автор пообещал выложить на гитхабе репозиторий со всем кодом.
Оригинальная статья на английском языке.
Введення в розробку програм під iOS. Частина 6
Автор: Volodymyr Bozhek
Здравствуйте, дорогие читатели.
В этом уроке мы:
Установим менеджер установки пакетов “Brew”;
Научимся пользоваться базой данных “Mongo DB” и изучим библиотеку “Mongoose”;
Установим и сконфигурируем базу данных “Mongo DB”;
Научимся запускать демон (службу) “Mongod” и подключаться к ней;
Научимся просматривать документы базы данных “Mongo DB” с помощью приложения “Robomongo”;
Создадим REST сервисы для товаров и пользователей с использованием “NodeJS”;
Научимся тестировать REST сервисы с помощью расширения “Chrome” браузера “Postman”;
Итак, вы скорее всего задались вопросом, почему же я выбрал именно такие технологии для написания REST сервисов. Почему не выбрал то, что уже давно у всех на слуху, такие технологии как Web API + Entity Framework. Ответ прост, я выбрал ровно те технологии, которые явно подходят платформе, на которой мы ведем разработку macOS.
Да, можно было установить Xamarin Community Edition, в нем создать ASP.NET проект и сделать сервисы на Mono.NET.
Еще был вариант сделать сервисы на виндовс платформе, развернутой на виртуальной машине в веб сервере IIS с сетевым адаптером мост. Это для того, чтобы веб сайт и сервисы были доступны на хостовой машине macOS в браузере.
Возможно, в одном из моих будущих видео курсов по разработке iOS приложений я буду использовать именно платформу Windows и Visual Studio для разработки REST сервисов.
Но в этом уроке мы будем делать сервисы на NodeJS, и вы сами убедитесь в том, насколько это просто и как мало кода надо для этого написать :)
В качестве среды разработки я буду использовать WebStorm, он довольно хорошо себя оправдал как один из продуктов JetBrains.
В этом уроке мы не будем работать с приложением “Warehouse” под iOS, поскольку мы должны приступить к изучению библиотеки “Alamofire”. А для нее необходимы REST сервисы, которых у нас сейчас нет. Показывать работу на всяких httpbin, parse и других сервисах тестирования я не буду, этого полно в сети интернет, вы и сами будете видеть это в поиске нужной вам информации.
“Alamofire” - это асинхронная сетевая библиотека для работы с REST сервисами. В большинстве туториалов не рассказывается, как сделать REST сервисы и клиент к ним на разных платформах.
Мне хотелось бы нарушить этот стереотип и предоставить вам учебные примеры по созданию полнофункционального REST сервиса и полнофункционального iOS клиента в составе приложения “Warehouse” к нему. Проще говоря, дать готовое решение для быстрого понимания, что и как делается.
Это то, чего обычно не хватает новичкам и то, чего обычно нигде не выкладывают. Приходится самостоятельно разбираться и искать нужную информацию.
Откройте “WebStorm”. Выберите в меню “File -> New Project”. Выделите тип проекта “Node.js Express App”.
В поле “Location” укажите название проекта “Warehouse” и путь, по которому вы будете сохранять данный проект.
В поле “Template” выберите “EJS”. Нажмите кнопку “Create”.
Вы увидите диалоговое окно с предложением, откуда взять библиотеку “NodeJS”.
Оставьте пункт по умолчанию “Download from the Internet” и нажмите кнопку “Configure”.
Будет загружен из сети интернет “NodeJS”, “Express” и другие библиотеки.
Панель навигации будет выглядеть у вас так:
Рассмотрим, что создал нам данный шаблон.
В папке “bin” хранится файл “www”, в нем находится настройка сервера “NodeJS”, с этого файла происходит запуск нашего сервера.
В папке “node_modules” находятся библиотеки, которые были автоматически загружены шаблоном проекта NodeJS.
В папке “public” находятся ресурсы, используемые нашим сервером (картинки, CSS стили, скрипты).
В папке “routes” находятся скрипты, которые должны содержать маршрутизацию относительно текущего URL, введенного пользователем.
Например, файл с именем “users.js” вызывется, когда пользователь введет в браузере URL: “http://localhost:{port}/users”.
Файл “index.js” вызывется, когда пользователь введет URL: “http://localhost:{port}”.
Если сравнивать с паттерном MVC (Model View Controller), то в папке “routes” находятся “контроллеры”.
В папке “views” находятся представления. Расширение “*.ejs” говорит о том, что содержимое данного файла будет транслироваться через библиотеку “Express JS”.
Данная библиотека создана в помощь, чтобы можно было проще создавать маршрутизацию в NodeJS и проще создавать пользовательский интерфейс.
Внутри этих файлов “*.ejs” содержится обычная “HTML” разметка. Файл маршрутизации и файл представления должны называться одинаково, если они будут связаны.
В текущем проекте связаны только “index.js” и “index.ejs”. Маршрут “users.js” не имеет явного представления, для него преставление генерируется средствами “NodeJS”.
Наша задача создать только REST сервисы, поэтому работу с “EJS” мы не будем рассматривать в данном уроке.
Рассмотрим содержимое файла “www” в папке “bin”.
На 7 строке через библиотеку “Require JS” мы подключаем содержимое модуля “app.js” в текущий исполняемый модуль “www” и запускаем это содержимое на исполнение.
В файле “app.js” содержатся настройки для работы нашего сервера.
На 8 строке мы задаем режим отладки для нашего сервера.
На 9 строке мы подключаем модуль “http” для работы с HTTP запросами.
На 15 строке задается порт “3000”, на этом порту сервер будет принимать входящие запросы к нему.
На 16 строке устанавливает этот порт для свойства “port” сервера.
На 22 строке создается сервер на основе настроек экземпляра “app”.
На 28 строке сервер запускается и начинает прослушивание на порту “3000”.
На 29 строке привязывается функция “onError”, вызываемый при возникновении ошибок.
На 30 строке привязывается функция “onListening”, вызываемая при начале прослушивания запросов сервером.
Остальной код в данном модуле не представляет для нас интереса.
Чтобы запустить приложение, выполните в меню “Run -> Run bin/www”, сервер запустится.
Затем откройте браузер и введите URL: “http://localhost:3000”, вы увидите приветствие.
Чтобы остановить сервер, выполните в меню “Run -> Stop”.
Теперь необходимо установить базу данных “Mongo DB”. Подробнее об установке вы можете прочитать тут. Проще всего устанавливать базу данных через менеджер пакетов “Brew”.
Давайте установим его. Перейдите в браузере по адресу, на сайте будет предложено скопировать строку “/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” в терминал.
Откройте терминал и скопируйте в него строку установки “Brew”. После установки вы увидите следующее:
Теперь необходимо установить базу данных “Mongo DB”. Установка базы данных через “Brew” проще тем, что “Brew” сам заполняет нужные переменные среды окружения и вам не надо этого делать вручную в случае с установкой базы данных вручную.
Перейдите в “WebStorm”, откройте внутри него терминал. И введите команду “brew install mongodb && mongod”, данная команда скачает и установит “Mongo DB”, а также выполнит настройки по умолчанию для демона “mongod”.
Выполните в терминале команду “sudo mkdir -p /data/db”. Введите свой пароль и нажмите кнопку “Enter”. Данная команда создаст папку “data” и в ней папку “db”, эта папка используется по умолчанию для добавления базы данных “Mongo DB”.
Команда “sudo” используется, чтобы выполнить остальную часть команды от имени администратора.
Теперь необходимо установить в наш проект библиотеку “Mongoose” для осуществления возможности работы с базой данных их кода приложения сервера .
Выполните в терминале команду “npm install mongoose”. Документацию по этой библиотеке можно почитать тут:
Данную команду мы выполняли через встроенный в NodeJS менеджер пакетов, так как устанавливаем данную библиотеку исключительно для нашего проекта, а не глобально.
Откройте терминал, введите команду “mongod”.
Данная команда запускает сервер базы данных “Mongo DB”, который принимает входящие подключения на порту “27017”. На картинке выше вы можете в этом убедиться “waiting for connections on port 27017”.
Демон запустили, теперь перейдите в “WebStorm”, в терминале внутри введите команду “mongod –version”, вы увидите версию базы данных “Mongo DB”, которая была установлена на ваш компьютер.
Теперь необходим клиент с GUI для работы с базой данных. Откройте браузер, перейдите по адресу, нажмите кнопку “Download”, скачайте и установите приложение.
После установки приложения откройте его. Нажмите на иконку:
Откроется приложение “Robomongo”.
Нажмите кнопку “Connect to local or remote Mongo DB instance”. Откроется диалоговое окно подключения к базе данных.
Нажмите кнопку “Create”. Откройте диалоговое окно настройки подключения к базе данных.
Заполните настройки, как показано на картинке выше и только на вкладке “Connection”, нажмите кнопку “Save”. После этого в окне “Mongo DB connections” у вас появится добавленное подключение. Выделите его и нажмите кнопку “Connect”.
Нажмите правой кнопкой в панели навигации по “Warehouse” и в контекстном меню выберите пункт “Create Database”.
В поле “Database Name” введите “warehouse”, нажмите кнопку “Create”.
На картинке выше видно, что база данных “warehouse” была успешно добавлена.
Супер :)
Теперь надо добавить в проект модель и схему базы данных, они создаются с помощью библиотеки “Mongoose”.
Перейдите в “WebStorm”. В панели навигации, нажмите правой кнопкой по “Warehouse”, в контекстном меню выберите “New -> Directory”. Создайте папку с именем “models”.
Создайте в папке “models” модули “Product.js” и “User.js”. А в папке “routes” создайте модули “auth.js”, “products.js”.
Откройте модуль “Product.js”, заполните его, как показано на картинке ниже:
На 1 строке мы подключаем библиотеку “mongoose” и создаем ее экземпляр с именем “mongoose”.
На 2 строке мы правым операндом создаем схему таблицы товаров и присваиваем ее левому операнду с именем “ProductSchema”. Таблица товаров содержит поля:
скрытое поле “_id”, типа “String”, в этом поле содержится уникальный идентификатор строки.
скрытое поле “__v”, типа “Number”, в этом поле содержится версия API по умолчанию 0. Версия API нужна для того, чтобы можно было менять реализацию сервисов и иметь несколько версий для обратной совместимости.
поле “productImage”, типа “String”, тут будет храниться название картинок из нашего проекта под iOS, названия от “tool001” до “tool012”.
поле “productName”, типа “String”, тут будет храниться название товара.
поле “productDescription”, типа “String”, тут будет храниться описание товара.
На 7 строке мы правым операндом создаем экземпляр модели с именем “Product” и указываем создать экземпляр на основе схемы, описанной в экземпляре “ProductSchema”. Библиотека “mongoose” создает данный экземпляр и присваивает его левому операнду.
Свойство “exports” содержит экземпляры объектов, которые будут доступны из модуля при подключении его через библиотеку “Require JS”.
Откройте модуль “User.js”, заполните его, как показано на картинке ниже:
На 1 строке мы подключаем библиотеку “mongoose” и создаем ее экземпляр с именем “mongoose”.
На 2 строке мы правым операндом создаем схему таблицы товаров и присваиваем ее левому операнду с именем “UserSchema”. Таблица пользователей содержит поля:
скрытое поле “_id”, типа “String”, в этом поле содержится уникальный идентификатор строки.
скрытое поле “__v”, типа “Number”, в этом поле содержится версия API по умолчанию 0. Версия API нужна для того, чтобы можно было менять реализацию сервисов и иметь несколько версий для обратной совместимости.
поле “userName”, типа “String”, тут будет храниться логин пользователя.
поле “userPwd”, типа “String”, тут будет храниться пароль пользователя.
поле “userDesc”, типа “String”, тут будет храниться описание пользователя.
На 7 строке мы правым операндом создаем экземпляр модели с именем “User” и указываем создать экземпляр на основе схемы, описанной в экземпляре “UserSchema”. Затем присваем созданный экземпляр свойству “exports” данного модуля.
Откройте модуль “auth.js”, заполните его в соответствии с содержимым ниже:
На 1 строке подключаем модуль “express” и создаем его экземпляр с именем “express”.
На 2 строке создаем экземпляр маршрутизатора запросов с именем “router”.
На 3 строке подключаем модуль “User.js” и создаем его экземпляр с именем “User”.
На 4 строке строим маршрут типа “http://localhost:3000/auth/”.
На экземпляре “router” вызываем функцию “post”. Вызов данной функции говорит, что созданный с помощью него маршрут будет доступен только через HTTP глагол POST. Первым аргументом задаем маршрут, вторым аргументом задаем функцию обработчик, который будет вызван при переходе по данному маршруту с учетом заданного HTTP глагола. Т.е. когда пользователь отправит POST запрос по адресу.
Функция обработчик принимает три аргумента.
Первый аргумент “request” содержит экземпляр запроса по данному маршруту. Второй аргумент “response” содержит экземпляр ответа по запросу по данному маршруту. В этот экземпляр можно добавлять любой ответ, который вы хотите, чтобы пользователь получил.
Третий аргумент “next” содержит текущий итератор в стеке запросов по маршрутизации. Данный экземпляр необходим, чтобы была возможность перейти на следующую итерацию в стеке маршрутизации.
Сам по себе сервер NodeJS работает асинхронно и никогда никого и ничего не ждет, это нужно учитывать при работе с ним.
На 5 строке мы выводим сообщение на консоль.
На 6 строке мы на экземпляре “User” вызываем функцию “find”, в которую единственным аргументом передаем специальную функцию обработчик, в которой будет содержаться результат данной операции. Функция “find” получает все записи из таблицы “User” и присваивает их в JSON формате второму аргументу функции обработчика с именем “data”.
Для примера, в “data” может содержаться такой JSON:
“[{_id:'789787sdfsd78sdfsd7', __v:0, userName: “Test1”,...},{_id:'4444447sdfsd78sdfsd7', __v:0, userName: “Test2”,...}]”.
Где квадратные скобки - это массив, а в фигурных скобках - это экземпляр JSON.
В аргументе “err” содержится экземпляр ошибки, если произошла ошибка при выполнении данной функции “find”.
На 7 строке мы создаем экземпляр объекта с именем “res”, данный объект содержит свойство “Error”, которое инициализировано значением по умолчанию “Authorization Error”. Как вы уже поняли, это текст ошибки, который вернется на клиент в случае ошибки авторизации клиента.
На 8 строке мы проверяем, если при получении данных через функцию “find” произошла ошибка и аргумент “err” не содержит значение “undefined”, мы обращаемся к экземпляру “next” и говорим серверу выполнить следующую итерацию маршрутизации и вернуть ошибку на клиент. На клиент средствами NodeJS будет возвращена “Stack Trace” ошибки.
На 9 строке, если ошибки не было, мы выполняем цикл foreach по массиву JSON объектов “data”. В функцию “forEach” передается специальная функция, которая содержит три аргумента.
Первый аргумент “item” содержит текущий итерируемый экземпляр JSON.
Второй аргумент “i” содержит позицию итератора и имеет тип Number.
Третий аргумент “data” содержит исходный массив объектов JSON, по которым проводится итерация.
На 10 строке мы задаем условие поиска пользователя по его имени и паролю в списке всех пользователей полученной функцией “find”. В условии сравниваются имя и пароль, которые пришли в POST запросе на сервер, с именем и паролем, полученным от функции “find”.
На 12 строке, если пользователь был найден, мы присваиваем экземляру “res” JSON объект найденного пользователя.
На 15 строке мы обращаемся к экземпляру ответа “response”, вызываем на нем функцию “json”, которая принимает данные и возвращает ответ на клиент в JSON формате. В аргумент данного метода мы передаем или экземпляр найденного пользователя, или экземпляр ошибки, что пользователь не найден и авторизация не удалась.
На 18 строке мы экспортируем из модуля экземпляр маршрутизации “router”.
Откройте модуль “index.js”. Заполните его в соответствии с содержимым ниже:
На 1 строке подключаем модуль “express” и создаем его экземпляр с именем “express”.
На 2 строке создаем экземпляр маршрутизатора запросов с именем “router”.
На 3 строке строим маршрут типа “http://localhost:3000/index/”, доступный через HTTP глагол GET.
На 4 строке, на экземпляр ответа вызываем функцию “render”. Данная функция возьмет представление, указанное в первом аргументе функции и вернет его на сторону клиента. Вторым аргументом задается словарь, в который можно добавить свойства со значениями, к которым можно будет обращаться со стороны представления.
На 6 строке мы экспортируем из модуля экземпляр маршрутизации “router”.
Откройте модуль “index.ejs”. Заполните его в соответствии с содержимым ниже:
Библиотека Express JS позволяет нам обращаться к свойствам, которые мы указали во втором аргументе метода “render” путем добавления следующей конструкции “<%= Название_Свойства %>”. На этапе отрисовки страницы данные конструкции будут заменены на значение указанного свойства.
Откройте модуль “products.js”, заполните его в соответствии с содержимым ниже:
На 1 строке подключаем модуль “express” и создаем его экземпляр с именем “express”.
На 2 строке создаем экземпляр маршрутизатора запросов с именем “router”.
На 3 строке подключаем модуль “Product.js” и создаем его экземпляр с именем “Product”.
На 4 строке строим маршрут типа “http://localhost:3000/products/”. Данный маршрут будет доступен по HTTP глаголу GET.
На 5 строке мы вызываем на экземпляре “Product” функцию “find”. Внутри функции мы проверяем, были ли ошибки, и возвращаем в ответе JSON массив со списком всех товаров.
На 10 строке строим маршрут типа “http://localhost:3000/products/”. Данный маршрут будет доступен по HTTP глаголу POST.
На 11 строке мы вызываем на экземпляре “Product” функцию “create”. Внутри функции мы проверяем, были ли ошибки, и возвращаем в ответе JSON объект успешно созданного товара.
На 16 строке строим маршрут типа “http://localhost:3000/products/{_id}” (например, “http://localhost:3000/products/789w66s2322kks4676s” ). Данный маршрут будет доступен по HTTP глаголу GET.
На 17 строке мы вызываем на экземпляре “Product” функцию “findById”. Из названия функции ясно, что функция выполняет поиск по идентификатору товара. Для поиска используется скрытое поле “_id” в модели “Product”, объявленной в модуле “Product.js”. Внутри функции мы проверяем, были ли ошибки, и возвращаем в ответе JSON объект успешно найденного товара.
На 23 строке строим маршрут типа “http://localhost:3000/products/{_id}” (например, “http://localhost:3000/products/789w66s2322kks4676s” ). Данный маршрут будет доступен по HTTP глаголу PUT.
На 24 строке мы вызываем на экземпляре “Product” функцию “findByIdAndUpdate”. Из названия функции ясно, что выполняется поиск товара по его идентификатору “_id”, затем, в случае если найден, обновляются все его поля, кроме скрытых полей. В ответе возвращается JSON объект успешно обновленного товара.
На 30 строке строим маршрут типа “http://localhost:3000/products/{_id}” (например, “http://localhost:3000/products/789w66s2322kks4676s” ). Данный маршрут будет доступен по HTTP глаголу DELETE.
На 31 строке мы вызываем на экземпляре “Product” функцию “findByIdAndRemove”. Из названия функции ясно, что выполняется поиск товара по его идентификатору “_id”, затем, в случае если найден, товар удаляется. В ответе возвращается удаленный JSON объект.
Откройте модуль “users.js”, заполните его в соответствии с содержимым ниже:
В модуле “users.js” я не вижу смысла расписывать подробно, что происходит, поскольку тут все то же самое, что и происходило в модуле “products.js”, рассмотренном выше. Разница только в том, что мы используем другую модель данных “User”. Опишу только доступные маршруты.
На 4 строке строим маршрут типа “http://localhost:3000/users/”. Данный маршрут будет доступен по HTTP глаголу GET.
На 10 строке строим маршрут типа “http://localhost:3000/users/”. Данный маршрут будет доступен по HTTP глаголу POST.
На 16 строке строим маршрут типа “http://localhost:3000/users/{_id}” (например, “http://localhost:3000/users/789w66s2322kks4676s” ). Данный маршрут будет доступен по HTTP глаголу GET.
На 23 строке строим маршрут типа “http://localhost:3000/users/{_id}” (например, “http://localhost:3000/users/789w66s2322kks4676s” ). Данный маршрут будет доступен по HTTP глаголу PUT.
На 30 строке строим маршрут типа “http://localhost:3000/users/{_id}” (например, “http://localhost:3000/users/789w66s2322kks4676s” ). Данный маршрут будет доступен по HTTP глаголу DELETE.
Откройте модуль “app.js”, обновите его в соответствии с содержимым ниже:
Конкретно в модуль “app.js” были внесены следующие изменения.
С 8 по 11 строку были подключены модули “index.js”, “users.js”, “products.js”, “auth.js”.
На 13 строке был подключен модуль “mongoose”.
На 14 строке мы задаем свойство “Promise” в значение “global.Promise”, чтобы начать обмениваться сообщениями с базой данной “Mongo DB”.
На 15 строке мы подключаемся к базе данных “Mongo DB” c названием “warehouse”, мы ее ранее создавали в приложении “Robomongo”. Источник данных “mongodb://localhost/warehouse” можно разбить так: “mongodb://” протокол взаимодействия (аналоги “http://”, “tcp://”, “file://”). “localhost” - это адрес машины, на которой хостится база данных. “warehouse” - имя базы данных.
На 16 строке метод “then” вызывается в случае успешного подключения к базе данных.
На 17 строке метод “catch” вызывается в случае сбоя подключения к базе данных.
С 33 по 36 строку мы задаем доступные глобальные маршруты, которые будет обрабатывать сервер. Надеюсь, все помнят разницу между сервером и сервисами, это не одно и то же.
Сервер - это просто приложение, которое внутри себя способно содержать различные ресурсы. Сервер может запускать внутри себя различные потоки для обработки данных.
Сервис - это функционал, который как раз запускается в отдельном потоке внутри сервера.
Сам по себе сервис без наличия приложения ,в котором его можно разместить, работать не будет. В случае с WebAPI сервером является Microsoft IIS или отдельно стоящее исполняемое приложение с функцией self хостинга.
Мы закончили написание сервера. Запустите демон “mongod” в терминале.
Запустите сервер. Вы увидите обновленное приветствие.
Я бы рекомендовал вам прослушать курс “Angular JS”, автор Дмитрий Охрименко. Это один из лучших курсов, которые я когда-либо слушал. После данного курса вы без особых проблем сможете сделать клиентскую часть для сервера на “Angular JS”.
Теперь давайте научимся тестировать наши REST сервисы. Тестировать сервисы можно и через Fiddler, но на macOS у него есть проблемы с отрисовкой и работой. Поэтому откройте браузер и перейдите по адресу.
“Postman” - это аналог “Fiddler”, доступный в качестве расширения для браузера “Google Chrome”.
После установки расширения “Postman” откройте его.
Выполним первый запрос к сервису “users” по HTTP глаголу GET.
Заполните поле адрес, выберите глагол “GET”, нажмите кнопку “Send”. Результат придет - пусто. Обратите внимание, что в терминале “WebStorm” тоже пишется логирование вызовов при обращения к сервисам.
Откройте приложение “Robomongo”, подключитесь к базе данных. Разверните папку “Collections” базы данных “warehouse”, выполните щелчок правой кнопкой мыши по таблице “users”, в контекстном меню выберите “View Documents”. В “Mongo DB” нет колонок, там есть всего одна колонка, в которой хранится JSON объект. Строки называются документами. Причем, в каждую строку одной таблицы можно класть абсолютно разный по структуре JSON объект. База данных позволяет такую операцию.
Видим, что данных нет, это не удивительно, ведь мы еще ничего не добавляли.
Давайте добавим. Перейдите в “Postman”, выберите глагол “POST”.
Выберите “Content-Type” - “x-www-form-urlencoded”. Внимание, через другие типы “form-data” “raw” работать не будет. Заданные свойства “userName”, “userPwd”, “userDesc” будут отправлены в запросе как JSON объект “{ userName: 'admin', userPwd: 'abc123!', userDesc: 'Administrator' }”. Нажмите кнопку “Send”. Придет ответ:
В ответе мы видим JSON объект модели “User”, созданной на сервере.
Перейдите в приложение “Robomongo”, выполните пункт контекстного меню “View Documents” на таблице “users”.
Отлично, у нас появился первый пользователь :)
Перейдите в “Postman”, выберите HTTP глагол “GET”. Нажмите кнопку “Send”. Вы увидите такой результат.
Обратите внимание на квадратные скобки, в ответе пришел массив JSON объектов, а не один объект.
Теперь давайте изменим пароль пользователю “admin”, на “12345678”. Нам понадобится идентификатор пользователя, выделите и скопируйте значение свойства “_id”.
Выберите HTTP глагол “PUT”. Обновите данные так, как показано ниже.
Обратите внимание на добавление идентификатора пользователя после основного маршрута “../users/”. Нажмите кнопку “Send”. В ответе получим старый JSON объект до внесения изменений.
Теперь для того, чтобы посмотреть измененный объект, воспользуемся сервисом , который возвращает пользователя по его идентификатору “_id”. Выберите HTTP глагол “GET”, обновите адрес, добавьте в конец адреса идентификатор пользователя. Нажмите кнопку “Send”. Получим такой результат.
Видим, что пароль пользователя был успешно обновлен и мы получили в ответе один JSON объект, а не массив пользователей.
Теперь попробуем удалить пользователя. Адрес оставьте тот же. Выберите HTTP глагол “DELETE” и нажмите кнопку “Send”.
Видим, что в ответе содержится JSON объект удаленного пользователя.
Теперь проверим, доступен ли пользователь после удаления. Адрес оставьте тот же. Выберите HTTP глагол “GET”, нажмите кнопку “Send”.
Видим, что пользователь действительно был удален. Также можете проверить это в приложении “Robomongo”.
Теперь приступим к тестированию сервиса “products”.
Получим список товаров.
Товаров нет. Добавим первый товар.
Обновим описание товара.
Получим обновленный товар по его идентификатору.
Удалим товар.
На этом мы завершаем урок.
К данной статье прикреплен архив с готовым сервером на NodeJS , в помощь учащимся :)
На следующем уроке мы:
выполним рефакторинг проекта “Warehouse” под “iOS”;
научимся пользоваться CollectionViewController;
научимся пользоваться библиотекой “Alamofire”, в конце урока будут доступны исходники полноценного рабочего приложения;
научимся сохранять объекты в настройки телефона и извлекать их;
реализуем функциональность для работы со всеми сервисами, созданными в данном уроке;
добавим представление регистрации;
добавим представление редактирования пользователей.
Материалы к статье тут.
Ruby on Rails – новий курс
Автор: Редакция ITVDN
Дорогі друзі, на ITVDN опубліковано новий відео курс, присвячений вивченню Ruby on Rails – популярного веб-фреймворку для BackEnd-розроблення мовою Ruby!
Ruby on Rails (він же "RoR") – це MVC-фреймворк, який успішно застосовується для розроблення різних веб-додатків: від високонавантажених, стійких до відмов сайтів до веб-сервісів з продуманою бізнес-логікою і динамічним веб-інтерфейсом.
Курс “Ruby on Rails” складається з 15-ти логічно взаємопов'язаних уроків, під час проходження яких учні застосують на практиці теоретичні знання з імплементації якісного веб-сервісу за допомогою RoR.
На курсі будуть розглянуті основні модулі фреймворку Ruby on Rails, тонкощі, пов'язані з побудовою архітектури додатків, заснованих на даному фреймворку, а також з робочою практикою масштабування, налагодження, тестування та доставлення написаного коду на віддалені сервери.
Автор курсу – Євген Кушвід, Software Engineer and Data Scientist. У записаних відео уроках він ділиться техніками ефективного використання Ruby on Rails, спираючись на власний досвід та найкращі практики.
Структура курсу:
Знайомство з Ruby on Rails.
C з MVC. Знайомство з Controllers. Routing.
V з MVC. Знайомство з Views. Templates. Assets pipeline. Webpack.
M з MVC. Знайомство з ActiveRecord, міграціями та асоціаціями.
Інтерфейс запитів ActiveRecord. Валідації та колбеки ActiveRecord.
Rails command line. Налагодження Rails додатку (binding.pry).
Тестування додатку.
Rails Forms.
Знайомство з ServiceObject.
Знайомство з concerns.
Знайомство з FormObject.
Пишемо background jobs.
Кешування, інтернаціоналізація, serializers.
Deploy your Rails app (Heroku / Capistrano).
Зміни у Ruby on Rails 6
Чого ви навчитеся на даному курсі:
Розуміти структуру веб-додатків.
Створювати веб-додатки на Ruby on Rails.
Правильно масштабувати створені веб-додатки.
Ефективно тестувати та налагоджувати код.
Доставляти код на віддалений сервер і запускати його, підтримуючи сервер у постійному Uptime-і.
Попередні вимоги
Для розуміння матеріалу даного курсу потрібні знання мови Ruby, командної оболонки Bash, системи управління версіями Git, мови запитів SQL.
Дивіться перший урок у вільному доступі. Якщо у вас є активна передплата, курс доступний для вас у повному обсязі.
Spring – знайомство та швидке занурення.
Автор: Віталій Карнаух
<p>Этот вебинар посвящен введению в один из самых мощных Java фреймворков – Spring.</p>
<p>Spring покрывает очень много различных областей разработки, от консольных приложений до сложного batch-процессинга. Но все его модули и функциональные возможности основываются на понимании Spring Core, который мы и будем тщательно разбирать и изучать на нашем вебинаре.</p>
<p>Отдельное внимание мы уделим таким популярным модулям как Spring MVC, Spring Data, Spring REST.</p>
<p><strong>План вебинара:</strong></p>
<ol>
<li>Spring философия и overview.</li>
<li>DI and IoC концепция.</li>
<li>Что такое Spring Bean.</li>
<li>ApplicationContext.</li>
<li>Объявление бинов.</li>
<li>Bean scopes и как их использовать.</li>
<li>Внедрение бинов - виды и их назначение.</li>
<li>MVC паттерн.</li>
<li>Что такое Spring MVC.</li>
<li>Обработка запроса в стиле Spring MVC.</li>
<li>Работа с REST.</li>
<li>Доступ к базе данных.</li>
<li>Spring Data.</li>
</ol>
<p><strong>Целевая аудитория:</strong></p>
<p>Этот вебинар будет полезен всем, кто начинает изучать Java технологии и хочет ознакомиться со Spring - фреймворком, без которого сложно представить современного Java разработчика. На этом вебинаре мы разберем что такое Spring Framework, его основные концепты и понятия, научимся использовать базовый арсенал Spring-a для того, чтобы кратно усилить и ускорить качество нашей разработки.</p>
ECMAScript 6. Нові інструменти для розробника JavaScript.
Автор: Дмитро Охріменко
Ведущий: Дмитрий Охрименко сертифицированный разработчик и тренер Microsoft,
CEO CyberBionic Systematics, автор видео курсов ITVDN по JavaScript, AngularJS, ASP.NET MVC,
спикер IT конференций, связанных с веб разработкой. В сентябре 2015 года на конкурсе Ukrainian IT Awards
Дмитрий Охрименко был назван лучшим профессионалом в номинации в IT Education.
Все JavaScript разработчики уже прочитали много статей и посмотрели видео о новых возможностях ECMAScript6. В этом вебинаре мы упорядочим все новые возможности языка и в понятной форме постараемся объяснить, как и когда их использовать.
Ознайомлення з курсом AngularJS
Автор: Дмитро Охріменко
Фреймворк AngularJS розроблявся для створення односторінкових сайтів. На даний момент сфера його застосування стала набагато ширшою, а популярність зросла у багато разів. Практично кожен другий роботодавець у вимогах до претендента вказує вміння роботи з AngularJS. Даний курс розповість Вам про можливості AngularJS, так само навчить користуватися шаблоном MVC для створення браузерних розширень. Знання цієї технології стане незаперечним плюсом у вашому резюме.
ASP.NET Core Базовий
Автор: Євген Лукашук
Курс "ASP.NET Core Essential" складається з 11 взаємозалежних уроків, які розкриють основи побудови сучасного веб-додатку з використанням технологій .NET від компанії Microsoft. В рамках цього курсу ви ознайомитеся з різними шаблонами ASP.NET Core, вивчите особливості MVC-архітектури (Model-View-Controller), навчитеся взаємодіяти з базами даних за допомогою Entity Framework Core.
Практический курс по Laravel
Автор: Алексей Круглик
Практический курс по Laravel состоит из 8 логически взаимосвязанных уроков, на которых учащиеся применяют на практике теоретические знания в разработке веб приложений с использованием PHP фреймворка Laravel. В рамках данного курса, на примере создания небольшого интернет магазина, учащиеся смогут понять и попробовать на практике основные механизмы и принципы разработки на Laravel. Курс затрагивает такие темы как: понимание работы паттерна проектирования MVC, понимание роутинга, обработки запросов от клиента серверу, работу с БД, работу с контроллерами и шаблонами веб приложения.