День 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, который затем добавляю таймзоной к дате автомобиля и уже ее выдаю на клиента. (Полный для того, чтобы также получать записи, где таймзона не задана).
#проект