День 4
Задание:
Сделать выбор бренда выпадающим списком названий.
Ход работы:
1. Выпадающий список - это фактически метод получения необходимых опций из БД и представление его в HTML.
2. За получение всех моделек у нас отвечает уже существующий метод контроллера "models.Provider.FetchAllModels", поэтому нужно лишь подобрать подходящий элемент управления, которым стал select, опции которого создаем итерируясь по результатам провайдера.
3. Еще сделал список цветов выпадющим списком, но так как для них нет таблички, то он пока хардкодом.
4. Также немного отрефакторил существующую структуру и поправил компоновку.
#проект
Задание:
Сделать выбор бренда выпадающим списком названий.
Ход работы:
1. Выпадающий список - это фактически метод получения необходимых опций из БД и представление его в HTML.
2. За получение всех моделек у нас отвечает уже существующий метод контроллера "models.Provider.FetchAllModels", поэтому нужно лишь подобрать подходящий элемент управления, которым стал select, опции которого создаем итерируясь по результатам провайдера.
3. Еще сделал список цветов выпадющим списком, но так как для них нет таблички, то он пока хардкодом.
4. Также немного отрефакторил существующую структуру и поправил компоновку.
#проект
День 5
Задание:
Добавить REST API, по которому (по отдельному url) будет выдаваться список всех машинок в формате json (пока без авторизации и прочего).
Ход работы:
1. Так как основной ендпоинт по выдаче машинок у меня был уже готов (я с него начинал и уже им обогощал HTML-файлик для создания view), то осталось только его оформить в соответствии с REST.
2. Добавил json-тэги для внутренних моделек, чтобы json отображался красивее + настроил округление дат до секунды.
Подумать:
Как еще можно улучшить проект согласно лучшим практикам использования JSON API.
#проект
Задание:
Добавить REST API, по которому (по отдельному url) будет выдаваться список всех машинок в формате json (пока без авторизации и прочего).
Ход работы:
1. Так как основной ендпоинт по выдаче машинок у меня был уже готов (я с него начинал и уже им обогощал HTML-файлик для создания view), то осталось только его оформить в соответствии с REST.
2. Добавил json-тэги для внутренних моделек, чтобы json отображался красивее + настроил округление дат до секунды.
Подумать:
Как еще можно улучшить проект согласно лучшим практикам использования JSON API.
#проект
Май 2023:
✅ Пройти курс по верстке HTML / CSS (до 14 мая)
✅ Пройти не менее половины второго курса по парадигмам программирования
✅ Начал разрабатывать "дипломный проект" писал о нем выше. Текущий прогресс: 6/25
✅ Работодатель поддерживает саморазвитие сотрудников, поэтому в этом месяце заказал несколько технических книг за счет компании, чтобы лучше разбираться в бэкенде.
▶️ Пройти курс по JS (до 14 мая) // активно взялся за учебник JS (прошел 1/3 основ языка)
▶️ Освоить веб-фреймворк Gin для Go на базовой уровне (до 14 мая) // читаю документацию, изучаю примеры (в объеме, необходимом для проекта)
▶️ Реализовать первую версию заказного проекта (odata) и передать Заказчику в тестирование // выпустил предрелизную версию, остались небольшие доработки
❌ Наметить планы по дальнейшему развитию, как инженера-программиста, на промежутке 3/6/12/36 месяцев
—
Планы на июнь:
🔖 Закончить курс по JS
🔖 Закончить освоение веб-фреймворка Gin
🔖 Завершить проект odata и передать Заказчику в тестирование
🔖 Завершить второй курс по парадигмам программирования
🔖 Наметить планы по дальнейшему развитию, как инженера-программиста, на промежутке 3/6/12/36 месяцев
🔖 Выполнить, по меньшей мере, 16 из 25 заданий дипломного проекта
#результаты
✅ Пройти курс по верстке HTML / CSS (до 14 мая)
✅ Пройти не менее половины второго курса по парадигмам программирования
✅ Начал разрабатывать "дипломный проект" писал о нем выше. Текущий прогресс: 6/25
✅ Работодатель поддерживает саморазвитие сотрудников, поэтому в этом месяце заказал несколько технических книг за счет компании, чтобы лучше разбираться в бэкенде.
▶️ Пройти курс по JS (до 14 мая) // активно взялся за учебник JS (прошел 1/3 основ языка)
▶️ Освоить веб-фреймворк Gin для Go на базовой уровне (до 14 мая) // читаю документацию, изучаю примеры (в объеме, необходимом для проекта)
▶️ Реализовать первую версию заказного проекта (odata) и передать Заказчику в тестирование // выпустил предрелизную версию, остались небольшие доработки
❌ Наметить планы по дальнейшему развитию, как инженера-программиста, на промежутке 3/6/12/36 месяцев
—
Планы на июнь:
🔖 Закончить курс по JS
🔖 Закончить освоение веб-фреймворка Gin
🔖 Завершить проект odata и передать Заказчику в тестирование
🔖 Завершить второй курс по парадигмам программирования
🔖 Наметить планы по дальнейшему развитию, как инженера-программиста, на промежутке 3/6/12/36 месяцев
🔖 Выполнить, по меньшей мере, 16 из 25 заданий дипломного проекта
#результаты
Telegram
time2code
Начал делать "дипломный" проект в ВШПСБ. Он идет бонусом к основному курсу, который прохожу по декларативной модели, и состоит из 25 заданий (основные боли в бэкенд разработке). Тема: автопарк, регистрация и учет автомобилей.
Проект нужно успеть выполнить…
Проект нужно успеть выполнить…
День 6
Задание:
1. Добавить ещё две базовые модели: Enterprise (предприятие) и Driver (водитель). Основные поля этим моделям придумать самостоятельно. Например, название + город, имя + зарплата.
2. Организовать между ними такие связи:
- Предприятию могут принадлежать несколько автомобилей (один ко многим).
- Предприятию могут принадлежать несколько водителей (один ко многим).
- Автомобиль и водитель могут принадлежать только одному предприятию.
- Каждому автомобилю может быть назначено несколько водителей (один к многим).
- Водители для разных автомобилей могут пересекаться (один водитель может быть назначен разным автомобилям).
- Один из назначенных водителей дополнительно считается "активным" (флажок или через связь) -- это тот, кто работает на машине в данный момент.
- Активный водитель может работать только на одной машине (не может быть назначен активным на второй автомобиль).
- Создаваемый водитель исходно ни к какой машине не привязан.
3. Списки водителей и предприятий отдельно выдавать через REST.
4. Сделать 2-3 предприятия, в каждом по нескольку автомобилей с водителями и без.
Ход работы:
1. Завел в проект 2 новые модельки (файлик со структурой + миграции в БД).
2. Реализовал провайдеры для них, чтобы получать выдачу по REST.
3. Сложнее всего было продумать все необходимые поля для таблиц, чтобы обеспечить соответствующие заданию связи. Пришлось даже набросать схемку в draw.io, чтобы не запутаться. Обязательно нужно помнить про необходимые связи и ключи между таблицами.
4. Также создал табличку drivers_vehicles для реализации связи "многие ко многим". При таком типе связи неизбежно приходится создавать таблицу посредника.
Подумать:
1. Как проектируются БД (изучить лучшие практики).
2. Как грамотно составлять схемы с таблицами и правильно указывать все необходимые отношения между ними.
#проект
Задание:
1. Добавить ещё две базовые модели: Enterprise (предприятие) и Driver (водитель). Основные поля этим моделям придумать самостоятельно. Например, название + город, имя + зарплата.
2. Организовать между ними такие связи:
- Предприятию могут принадлежать несколько автомобилей (один ко многим).
- Предприятию могут принадлежать несколько водителей (один ко многим).
- Автомобиль и водитель могут принадлежать только одному предприятию.
- Каждому автомобилю может быть назначено несколько водителей (один к многим).
- Водители для разных автомобилей могут пересекаться (один водитель может быть назначен разным автомобилям).
- Один из назначенных водителей дополнительно считается "активным" (флажок или через связь) -- это тот, кто работает на машине в данный момент.
- Активный водитель может работать только на одной машине (не может быть назначен активным на второй автомобиль).
- Создаваемый водитель исходно ни к какой машине не привязан.
3. Списки водителей и предприятий отдельно выдавать через REST.
4. Сделать 2-3 предприятия, в каждом по нескольку автомобилей с водителями и без.
Ход работы:
1. Завел в проект 2 новые модельки (файлик со структурой + миграции в БД).
2. Реализовал провайдеры для них, чтобы получать выдачу по REST.
3. Сложнее всего было продумать все необходимые поля для таблиц, чтобы обеспечить соответствующие заданию связи. Пришлось даже набросать схемку в draw.io, чтобы не запутаться. Обязательно нужно помнить про необходимые связи и ключи между таблицами.
4. Также создал табличку drivers_vehicles для реализации связи "многие ко многим". При таком типе связи неизбежно приходится создавать таблицу посредника.
Подумать:
1. Как проектируются БД (изучить лучшие практики).
2. Как грамотно составлять схемы с таблицами и правильно указывать все необходимые отношения между ними.
#проект
День 6
Результат работы:
1. Получение всех автомобилей (REST-ручка).
2. Получение всех водителей (REST-ручка).
3. Получение всех предприятий (REST-ручка).
4. Получение значений таблички со связями между водителями и автомобилями (REST-ручка).
5. Схематическое изображение всех табличек в БД (черновик).
#проект
Результат работы:
1. Получение всех автомобилей (REST-ручка).
2. Получение всех водителей (REST-ручка).
3. Получение всех предприятий (REST-ручка).
4. Получение значений таблички со связями между водителями и автомобилями (REST-ручка).
5. Схематическое изображение всех табличек в БД (черновик).
#проект
День 7
Задание:
1. Добавить модель Manager (менеджер) - наследник от стандартного пользователя, для которого нужна авторизация.
2. Предприятию могут принадлежать несколько менеджеров.
3. Менеджеру могут "принадлежать" (быть видимыми) несколько предприятий.
4. Менеджер получает в REST-запросах только объекты видимых ему предприятий.
5. Сделать случай, когда три предприятия 1,2,3 и два менеджера, одному принадлежат предприятия 1,2, другому 2,3.
Ход работы:
1. Завел модельку Manager (в основном понадобился только файл миграции, но не сама гошная структура).
2. Создал табличку manager_enterprise, чтобы хранить связку менеджер-предприятие, по которой я впоследствии достаю все предприятия, принадлежащие менеджеру.
3. Добавил стандартную мидлвару BasicAuth(), которая идет с джином из коробки и с ее помощью по адресу:
Подумать:
1. Почитать больше про middleware.
2. Изучить JWT-аутентификацию.
#проект
Задание:
1. Добавить модель Manager (менеджер) - наследник от стандартного пользователя, для которого нужна авторизация.
2. Предприятию могут принадлежать несколько менеджеров.
3. Менеджеру могут "принадлежать" (быть видимыми) несколько предприятий.
4. Менеджер получает в REST-запросах только объекты видимых ему предприятий.
5. Сделать случай, когда три предприятия 1,2,3 и два менеджера, одному принадлежат предприятия 1,2, другому 2,3.
Ход работы:
1. Завел модельку Manager (в основном понадобился только файл миграции, но не сама гошная структура).
2. Создал табличку manager_enterprise, чтобы хранить связку менеджер-предприятие, по которой я впоследствии достаю все предприятия, принадлежащие менеджеру.
3. Добавил стандартную мидлвару BasicAuth(), которая идет с джином из коробки и с ее помощью по адресу:
/admin авторизую менеджера по связке логин/пароль и затем выдаю ему список его предприятий. Подумать:
1. Почитать больше про middleware.
2. Изучить JWT-аутентификацию.
#проект
День 8
Задание:
Изучить, что такое curl, и организовать с его помощью запрос машинок с авторизацией менеджера, как было в браузере в предыдущем задании.
Ход работы:
1. Прочитал по диагонали документацию.
2. Для организации запроса добавил path
Запрос с авторизацией выглядит так:
#проект
Задание:
Изучить, что такое curl, и организовать с его помощью запрос машинок с авторизацией менеджера, как было в браузере в предыдущем задании.
Ход работы:
1. Прочитал по диагонали документацию.
2. Для организации запроса добавил path
/admin/vehicles (доступный только через авторизацию), через который выдаю все машинки, принадлежащие менеджеру, через привязанные к нему предприятия. То есть теперь менеджер сможет посмотреть и список всех предприятий (/admin/enterprises), и машин. Запрос с авторизацией выглядит так:
curl -v --user ismirnov:one http://localhost:8080/admin/vehicles.#проект
День 9
Задание:
Добавить поддержку анти-CSRF (если ещё не была включена).
Ход работы:
1. Изучил, что такое CSRF.
2. Добавил поддержку анти-CSRF в проект. При этом какой-то нативной у Gin'а не оказалось, но существуют разные библиотеки, которые работают с переменным успехом. Сейчас в проекте используется одна из таких библиотек, но лишь частично, так как из коробки она не заработала, как ожидалось (при этом документации на нее нет), поэтому я немного ее докрутил, чтобы реализовать анти-CSRF механизм.
В результате запросы, требующие авторизации, обязательно проверяют
#проект
Задание:
Добавить поддержку анти-CSRF (если ещё не была включена).
Ход работы:
1. Изучил, что такое CSRF.
2. Добавил поддержку анти-CSRF в проект. При этом какой-то нативной у Gin'а не оказалось, но существуют разные библиотеки, которые работают с переменным успехом. Сейчас в проекте используется одна из таких библиотек, но лишь частично, так как из коробки она не заработала, как ожидалось (при этом документации на нее нет), поэтому я немного ее докрутил, чтобы реализовать анти-CSRF механизм.
В результате запросы, требующие авторизации, обязательно проверяют
X-Csrf-Token заголовок. Если он пришел и валидный, то запрос выполняется, если же нет - то отклоняется. В идеальном случае хочу от вышеупомянутой библиотеки отказаться со всем и сделать реализацию со своей логикой: при авторизации генерим секретный ключ, который сохраняем в сессии, а дальше на основании ключа и соли делаем токен, который прикладываем к запросу.#проект
owasp.org
Cross Site Request Forgery (CSRF) | OWASP Foundation
Cross Site Request Forgery (CSRF) on the main website for The OWASP Foundation. OWASP is a nonprofit foundation that works to improve the security of software.
День 10
Задание:
1. Сделать REST-добавление новой/изменение полей существующей заданной машинки, и её удаление -- через PUT/POST/DELETE, после того как менеджер авторизовался.
2. Проверить из curl.
Ход работы:
1. Добавил механизм авторизации для добавления/изменения/удаления машинок (по аналогии с прошлым заданием).
2. По curl проверил - без авторизации (включая анти-CSRF) не могу выполнять соответствующие запросы - получаю ошибку 401 (Unauthorized).
#проект
Задание:
1. Сделать REST-добавление новой/изменение полей существующей заданной машинки, и её удаление -- через PUT/POST/DELETE, после того как менеджер авторизовался.
2. Проверить из curl.
Ход работы:
1. Добавил механизм авторизации для добавления/изменения/удаления машинок (по аналогии с прошлым заданием).
2. По curl проверил - без авторизации (включая анти-CSRF) не могу выполнять соответствующие запросы - получаю ошибку 401 (Unauthorized).
#проект
День 11
Задание:
Написать утилиту генерации для предприятия (списка предприятий) заданного количества машинок, содержимое их формировать случайно, и водителей (чтобы примерно каждая 10-я машинка была с активным водителем).
Ход работы:
1. Написал утилиту для генерации: фактически отдельный скрипт в cmd-директории.
2. Для запуска утилиты нужны 3 аргумента: список айди предприятий разделенных ';', кол-во генерируемых машин и водителей.
- Каждая 10 машина получает активного водителя (водитель выбирается произвольно из всего списка, относящегося к предприятию).
- Из интересного: для генерации VIN хожу GET-запросом на randomvin за очередным значением.
#проект
Задание:
Написать утилиту генерации для предприятия (списка предприятий) заданного количества машинок, содержимое их формировать случайно, и водителей (чтобы примерно каждая 10-я машинка была с активным водителем).
Ход работы:
1. Написал утилиту для генерации: фактически отдельный скрипт в cmd-директории.
2. Для запуска утилиты нужны 3 аргумента: список айди предприятий разделенных ';', кол-во генерируемых машин и водителей.
- Каждая 10 машина получает активного водителя (водитель выбирается произвольно из всего списка, относящегося к предприятию).
- Из интересного: для генерации VIN хожу GET-запросом на randomvin за очередным значением.
#проект
День 12
Задание:
Сгенерировать для 3 предприятий по 3-5 тысяч машин и водителей (активный водитель для каждой 10-й машины например), и разобраться, как через REST API получать их в режиме пагинации -- не все разом, а листать страничками по 20-50 машинок.
Ход работы:
1. Сгенерировал для предприятий 3-5 тысяч машин и водителей. При этом довольно быстро обнаружил недостаток первой версии генератора, так как отрабатывал он очень долго:
- Переписал его с использованием го-рутин с необходимой синхронизацией между потоками, что сильно его ускорило.
- Раньше для получения VIN'а у меня был GET-запрос в сторонний сервис и это, конечно, сильно просадило перф, так как запросы батчевые туда недоступны, а делать тысячи запросов очень дорого, поэтому пришлось также от этого решения отказаться в пользу примитивной генерации строки (использовал юникс-время).
2. Пагинацию построил на параметрах строки запроса через:
#проект
Задание:
Сгенерировать для 3 предприятий по 3-5 тысяч машин и водителей (активный водитель для каждой 10-й машины например), и разобраться, как через REST API получать их в режиме пагинации -- не все разом, а листать страничками по 20-50 машинок.
Ход работы:
1. Сгенерировал для предприятий 3-5 тысяч машин и водителей. При этом довольно быстро обнаружил недостаток первой версии генератора, так как отрабатывал он очень долго:
- Переписал его с использованием го-рутин с необходимой синхронизацией между потоками, что сильно его ускорило.
- Раньше для получения VIN'а у меня был GET-запрос в сторонний сервис и это, конечно, сильно просадило перф, так как запросы батчевые туда недоступны, а делать тысячи запросов очень дорого, поэтому пришлось также от этого решения отказаться в пользу примитивной генерации строки (использовал юникс-время).
2. Пагинацию построил на параметрах строки запроса через:
limit=50&offset=2500 - получение 50 позиций с отступом 2500. #проект
Карьера на одном листе
Удобно переносить свои мысли на бумагу / диаграммы или куда-либо еще. Так со стороны можно оценить прошедший путь и запланировать ресурсы на предстоящий.
По ощущениям, я сейчас подхожу к середине своей карьеры, как программист. Вероятно, по этому такое говорящее название "middle".
Крупными мазками наметил планы на ближайшие 3-4 года. Карьерную лестницу спроецировал на грейды Авито (очень нравится их система и по ней действительно просто оценивать свой уровень).
Можно заметить, что 2025-26 года отмечены развилкой. Когда ты достаточно опытный (скажем senior), то у тебя появляется выбор: продолжать развиваться как технический специалист или же пойти по менеджерскому треку.
Также обозначил кругами на какие навыки нужно сделать упор на конкретном этапе. Сейчас для меня это - hard skills, то есть экспертиза в техническом направлении для того, чтобы эффективно и автономно закрывать любые бэкендерские задачи.
#карьера
Удобно переносить свои мысли на бумагу / диаграммы или куда-либо еще. Так со стороны можно оценить прошедший путь и запланировать ресурсы на предстоящий.
По ощущениям, я сейчас подхожу к середине своей карьеры, как программист. Вероятно, по этому такое говорящее название "middle".
Крупными мазками наметил планы на ближайшие 3-4 года. Карьерную лестницу спроецировал на грейды Авито (очень нравится их система и по ней действительно просто оценивать свой уровень).
Можно заметить, что 2025-26 года отмечены развилкой. Когда ты достаточно опытный (скажем senior), то у тебя появляется выбор: продолжать развиваться как технический специалист или же пойти по менеджерскому треку.
Также обозначил кругами на какие навыки нужно сделать упор на конкретном этапе. Сейчас для меня это - hard skills, то есть экспертиза в техническом направлении для того, чтобы эффективно и автономно закрывать любые бэкендерские задачи.
#карьера
👍1
День 13
Задание:
1. Разобраться с бутстрапом (https://getbootstrap.com/) - как он интегрируется с gin.
2. Сделать простую форму ввода логина-пароля, менеджер заходит через неё и видит список всех своих видимых предприятий.
Ход работы:
Добавил бутстрап-формочку для ввода логина/пароля. После авторизации менеджеру доступны его автомобили.
#проект
Задание:
1. Разобраться с бутстрапом (https://getbootstrap.com/) - как он интегрируется с gin.
2. Сделать простую форму ввода логина-пароля, менеджер заходит через неё и видит список всех своих видимых предприятий.
Ход работы:
Добавил бутстрап-формочку для ввода логина/пароля. После авторизации менеджеру доступны его автомобили.
#проект
Не выработал еще систему регулярного постинга, чтобы не пропускать дни :(
Стараюсь исправляться. После обеда будет еще один "День" разрабатываемого проекта.
Стараюсь исправляться. После обеда будет еще один "День" разрабатываемого проекта.
День 14
Задание:
Добавить несложный интерфейс для менеджера -- добавление/редактирование/удаление машинок в выбранном предприятии.
Ход проекта:
1. После того, как менеджер авторизировался, он получает список всех машинок, а также возможность провалиться в панель администратора по синей кнопке.
2. На панели администратора доступны все машины менеджера и он также может, выбирая предприятие, создавать/обновлять/удалять машины.
#проект
Задание:
Добавить несложный интерфейс для менеджера -- добавление/редактирование/удаление машинок в выбранном предприятии.
Ход проекта:
1. После того, как менеджер авторизировался, он получает список всех машинок, а также возможность провалиться в панель администратора по синей кнопке.
2. На панели администратора доступны все машины менеджера и он также может, выбирая предприятие, создавать/обновлять/удалять машины.
#проект
День 15
Задание:
1. Добавить предприятию локальную таймзону (если не задана, тогда считается UTC).
2. Сделать для машинок какое-нибудь поле, связанное с датой-временем (например, дата и время покупки), которое в машине (на сервере) всегда хранится как UTC.
3. Выводить его в запросах API и в UI с учётом таймзоны предприятия, и с учётом, что у клиента в браузере скорее всего своя локальная таймзона (показать надо соответственно в его таймзоне).
Ход проекта:
1. Добавил новое int поле для предприятий - смещение от UTC. Также добавил поле для машин - время и дата покупки (хранится в UTC).
2. В UI клиент увидит время в соответствии с его локацией. API возвращает json, где хранится дата с тайм-зоной (у последнего предприятия тайм-зона не задана).
3. Пришлось в текущий запрос добавить полный JOIN, чтобы из предприятия забирать сдвиг от UTC, который затем добавляю таймзоной к дате автомобиля и уже ее выдаю на клиента. (Полный для того, чтобы также получать записи, где таймзона не задана).
#проект
Задание:
1. Добавить предприятию локальную таймзону (если не задана, тогда считается UTC).
2. Сделать для машинок какое-нибудь поле, связанное с датой-временем (например, дата и время покупки), которое в машине (на сервере) всегда хранится как UTC.
3. Выводить его в запросах API и в UI с учётом таймзоны предприятия, и с учётом, что у клиента в браузере скорее всего своя локальная таймзона (показать надо соответственно в его таймзоне).
Ход проекта:
1. Добавил новое int поле для предприятий - смещение от UTC. Также добавил поле для машин - время и дата покупки (хранится в UTC).
2. В UI клиент увидит время в соответствии с его локацией. API возвращает json, где хранится дата с тайм-зоной (у последнего предприятия тайм-зона не задана).
3. Пришлось в текущий запрос добавить полный JOIN, чтобы из предприятия забирать сдвиг от UTC, который затем добавляю таймзоной к дате автомобиля и уже ее выдаю на клиента. (Полный для того, чтобы также получать записи, где таймзона не задана).
#проект