День 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, который затем добавляю таймзоной к дате автомобиля и уже ее выдаю на клиента. (Полный для того, чтобы также получать записи, где таймзона не задана).
#проект
День 16
Задание:
Экспериментальное задание - подумать самостоятельно как лучше реализовать:
1. Надо хранить трек -- набор точек GPS, условную поездку автомобиля с привязкой к нему.
2. То есть, как оптимальнее хранить трек, в котором может быть много (потенциально неограниченное) количество gps-точек.
Ход проекта:
1. Так как непонятно, насколько сложные вычисления с использованием gps-точек нас ждут, то от использования какого-нибудь PostGis для PostgreSQL отказался.
2. Посмотрел Geopoint для Go и мне показался он слишком несерьезным (даже тестов на функции не увидел), чтобы использовать в проекте. Есть как будто более интересная библиотека
3. Самым интересным решением мне показалось использовать Redis. При этом я собираюсь хранить активные треки по ключам, а точки для них добавлять через команду Редиса доступную из коробки `GeoAdd`. Завершенные маршруты собираюсь бэкапить в какое-нибудь хранилище.
4. Таким образом, сигнатура основного метода, который добавляет gps-точку к треку следующая:
type VehicleTrack struct {
ID, VehicleID int64
}
type GPSPoint struct {
longitude, latitude float64
}
То есть для добавления новой точки к конкретному треку нужно передать сам трек (к которому привязана машина) и соответствующую точку с долготой и широтой.
#проект
Задание:
Экспериментальное задание - подумать самостоятельно как лучше реализовать:
1. Надо хранить трек -- набор точек GPS, условную поездку автомобиля с привязкой к нему.
2. То есть, как оптимальнее хранить трек, в котором может быть много (потенциально неограниченное) количество gps-точек.
Ход проекта:
1. Так как непонятно, насколько сложные вычисления с использованием gps-точек нас ждут, то от использования какого-нибудь PostGis для PostgreSQL отказался.
2. Посмотрел Geopoint для Go и мне показался он слишком несерьезным (даже тестов на функции не увидел), чтобы использовать в проекте. Есть как будто более интересная библиотека
golang-geo, но так как у нас пока нет расчетов, то использовать тоже не стал. 3. Самым интересным решением мне показалось использовать Redis. При этом я собираюсь хранить активные треки по ключам, а точки для них добавлять через команду Редиса доступную из коробки `GeoAdd`. Завершенные маршруты собираюсь бэкапить в какое-нибудь хранилище.
4. Таким образом, сигнатура основного метода, который добавляет gps-точку к треку следующая:
AddPointToTrack(ctx context.Context, point GPSPoint, track VehicleTrack) error
Где GPSPoint и VehicleTrack имеют следующие структуры:type VehicleTrack struct {
ID, VehicleID int64
}
type GPSPoint struct {
longitude, latitude float64
}
То есть для добавления новой точки к конкретному треку нужно передать сам трек (к которому привязана машина) и соответствующую точку с долготой и широтой.
#проект
Docs
GEOADD
Adds one or more members to a geospatial index. The key is created if it doesn't exist.
День 17
Задание:
1. Добавить в REST API выдачу точек трека по заданному автомобилю и диапазону дат/времени с учётом локальной таймзоны предприятия (сами точки на сервере хранят дату время в UTC).
2. Выдавать их по отдельной настройке либо в json, либо в geoJSON (на выбор пользователя).
Ход проекта:
1. Добавил ендпоинт, который при передаче параметров (vehicleID и дат) будет выдавать точки соответствующие параметрам запроса с поправкой на сдвиг от UTC, который есть у предприятия (если даты не передать, то точки будут выданы все:
-
-
Задание:
1. Добавить в REST API выдачу точек трека по заданному автомобилю и диапазону дат/времени с учётом локальной таймзоны предприятия (сами точки на сервере хранят дату время в UTC).
2. Выдавать их по отдельной настройке либо в json, либо в geoJSON (на выбор пользователя).
Ход проекта:
1. Добавил ендпоинт, который при передаче параметров (vehicleID и дат) будет выдавать точки соответствующие параметрам запроса с поправкой на сдвиг от UTC, который есть у предприятия (если даты не передать, то точки будут выданы все:
-
/gps/track?vehicle=1&start=2015-01-01&end=2022-01-01
2. Также добавил возможность получить ответ в geoJSON, если передать соответствующий параметр в строку "geoJSON":-
/gps/track?vehicle=1&start=2015-01-01&end=2022-01-01&geoJSON
#проектДень 18
Задание:
1. Добавить модель Поездка, в которой хранится автомобиль, и дата-время в UTC начало и окончание поездки без ограничений (может быть два часа, может быть два года).
2. В API сделать запрос, который по заданным дате-времени начала и конца вытащит все поездки (считаем, что они в таймзоне предприятия) - запрос именно по поездкам, но выдаются только точки трека по id заданного автомобиля.
3. Точки могут быть из нескольких реальных треков (которые в проекте сами по себе никак не представлены); условно, можно запросить за месяц все поездки, и получить один огромный трек.
4. Если начало первой поездки раньше начального времени запроса, или окончание последней поездки позже времени конца запроса, то их не включаем в выдачу.
Ход проекта:
1. Добавил модель "поездка (trip)" в БД и проект.
2. Сделал ручку, по которой можно получить все поездки на определенном промежутке со всеми граничными условиями.
#проект
Задание:
1. Добавить модель Поездка, в которой хранится автомобиль, и дата-время в UTC начало и окончание поездки без ограничений (может быть два часа, может быть два года).
2. В API сделать запрос, который по заданным дате-времени начала и конца вытащит все поездки (считаем, что они в таймзоне предприятия) - запрос именно по поездкам, но выдаются только точки трека по id заданного автомобиля.
3. Точки могут быть из нескольких реальных треков (которые в проекте сами по себе никак не представлены); условно, можно запросить за месяц все поездки, и получить один огромный трек.
4. Если начало первой поездки раньше начального времени запроса, или окончание последней поездки позже времени конца запроса, то их не включаем в выдачу.
Ход проекта:
1. Добавил модель "поездка (trip)" в БД и проект.
2. Сделал ручку, по которой можно получить все поездки на определенном промежутке со всеми граничными условиями.
#проект
Июнь 2023:
✅ Продолжаю разрабатывать "дипломный проект" писал о нем выше. Текущий прогресс: 18/25
✅ Для получения опыта разработки "с нуля" в свободное время занимаюсь разработкой MVP-проектов в стартапе. Одну из наработок передал в тестирование Заказчику.
✅ Наметил планы по дальнейшему развитию, как инженера-программиста, на ближайшие 3 года.
✅ Очень давно хотел найти ментора и в июне это удалось. В текущей компании есть программа внутреннего обмена опытом между сотрудниками и мне удалось найти инженера E6 (пред-пред-максимальный грейд в Авито), который согласился менторить меня по проектированию систем. Успели провести пробное интервью, на котором вскрылись слабые места... Хочу постепенно полностью освоить дорожную карту
✅ И, пожалуй, очень важная технология, к которой, наконец, прикоснулся - ChatGPT. Это действительно прорыв. Если этот инструмент использовать с умом, то можно сэкономить многие часы, потраченные на изучение документации. Уже сейчас я его использую как цифрового ментора / советника, а также генератор запросов для наполнения БД большим количеством случайных записей.
▶️ Завершить второй курс по парадигмам программирования // материал очень объемный и требует серьезного осмысления, чтобы продвигаться дальше
—
Планы на июль:
🔖 Закончить курс по JS (повторно)
🔖 Закончить освоение веб-фреймворка Gin (повторно)
🔖 Завершить второй курс по парадигмам программирования
🔖 Завершить дипломный проект (осталось 7 заданий) и выложить все на гитхаб
🔖 Выстроить регулярное взаимодействие с ментором и выполнить первое задание про балансировщик нагрузки
🔖 Приступить к изучению одной из N купленных в июне книг
#результаты
✅ Продолжаю разрабатывать "дипломный проект" писал о нем выше. Текущий прогресс: 18/25
✅ Для получения опыта разработки "с нуля" в свободное время занимаюсь разработкой MVP-проектов в стартапе. Одну из наработок передал в тестирование Заказчику.
✅ Наметил планы по дальнейшему развитию, как инженера-программиста, на ближайшие 3 года.
✅ Очень давно хотел найти ментора и в июне это удалось. В текущей компании есть программа внутреннего обмена опытом между сотрудниками и мне удалось найти инженера E6 (пред-пред-максимальный грейд в Авито), который согласился менторить меня по проектированию систем. Успели провести пробное интервью, на котором вскрылись слабые места... Хочу постепенно полностью освоить дорожную карту
✅ И, пожалуй, очень важная технология, к которой, наконец, прикоснулся - ChatGPT. Это действительно прорыв. Если этот инструмент использовать с умом, то можно сэкономить многие часы, потраченные на изучение документации. Уже сейчас я его использую как цифрового ментора / советника, а также генератор запросов для наполнения БД большим количеством случайных записей.
▶️ Завершить второй курс по парадигмам программирования // материал очень объемный и требует серьезного осмысления, чтобы продвигаться дальше
—
Планы на июль:
🔖 Закончить курс по JS (повторно)
🔖 Закончить освоение веб-фреймворка Gin (повторно)
🔖 Завершить второй курс по парадигмам программирования
🔖 Завершить дипломный проект (осталось 7 заданий) и выложить все на гитхаб
🔖 Выстроить регулярное взаимодействие с ментором и выполнить первое задание про балансировщик нагрузки
🔖 Приступить к изучению одной из N купленных в июне книг
#результаты
Telegram
time2code
Начал делать "дипломный" проект в ВШПСБ. Он идет бонусом к основному курсу, который прохожу по декларативной модели, и состоит из 25 заданий (основные боли в бэкенд разработке). Тема: автопарк, регистрация и учет автомобилей.
Проект нужно успеть выполнить…
Проект нужно успеть выполнить…
День 19
Задание:
1. Добавить REST-запрос, который по заданному диапазону дат-времени (считаем, что они в таймзоне предприятия) выдаст список всех поездок машинки (без треков), где будет вся общая информация по поездке, начальная и конечная точки.
2. Также добавить текстовое "представление" этих точек, физический адрес. (Получить его можно через разные maps API)
Ход проекта:
1. Добавил начальную, конечную точки поездки + их физический адрес.
2. Использовал API MapQuest: https://developer.mapquest.com/
- искал доступ к API с простой регистрацией + очень хотел информацию о точках получать батчевым запросом, так как их много, а на каждую делать свой запрос - дорого. MapQuest позволяет за 1 запрос обрабатывать до 100 точек, что хорошо подошло, как мне кажется.
Долго возился со случайными данными, которые наполняют БД, чтобы широту/долготу нормально распарсить, пришлось кучу ограничений ставить, чтобы хороший результат получить.
#проект
Задание:
1. Добавить REST-запрос, который по заданному диапазону дат-времени (считаем, что они в таймзоне предприятия) выдаст список всех поездок машинки (без треков), где будет вся общая информация по поездке, начальная и конечная точки.
2. Также добавить текстовое "представление" этих точек, физический адрес. (Получить его можно через разные maps API)
Ход проекта:
1. Добавил начальную, конечную точки поездки + их физический адрес.
2. Использовал API MapQuest: https://developer.mapquest.com/
- искал доступ к API с простой регистрацией + очень хотел информацию о точках получать батчевым запросом, так как их много, а на каждую делать свой запрос - дорого. MapQuest позволяет за 1 запрос обрабатывать до 100 точек, что хорошо подошло, как мне кажется.
Долго возился со случайными данными, которые наполняют БД, чтобы широту/долготу нормально распарсить, пришлось кучу ограничений ставить, чтобы хороший результат получить.
#проект
Возвращаюсь в регулярный ритм журналирования своего прогресса по проекту.
Очень плотный выдался июль в плане разнообразных дел: работа, проект и личное.
Очень плотный выдался июль в плане разнообразных дел: работа, проект и личное.
День 20
Задание:
В веб-интерфейсе сделать минимальную логику drill-down (удобство не нужно):
- Менеджер логинится, видит список своих предприятий,
- выбирает предприятие - видит список машинок в нём,
- выбирает машинку - видит по ней всю детальную инфу и список поездок (лучше, из заданного диапазона дат).
- Выбрав любую поездку (или все из диапазона), он увидит её трек (все треки) на карте -- подберите подходящий Map API для отображения трека.
Ход проекта:
Добавил следующую механику:
1) менеджер логинится
2) видит список всех предприятий
3) выбирает предприятие - получает список всех машин
4) выбрав машину - получает список всех поездок
5) выбрав поездку, он видит трек на карте (начальное положение - конечное)
Возникли проблемы с треком: пока не заставил библиотеку отрисовывать нормальный маршрут по точкам - хочу с этим разобраться.
Использую OpenStreetMap (https://www.openstreetmap.org/), так как предоставляет бесплатное API.
#проект
Задание:
В веб-интерфейсе сделать минимальную логику drill-down (удобство не нужно):
- Менеджер логинится, видит список своих предприятий,
- выбирает предприятие - видит список машинок в нём,
- выбирает машинку - видит по ней всю детальную инфу и список поездок (лучше, из заданного диапазона дат).
- Выбрав любую поездку (или все из диапазона), он увидит её трек (все треки) на карте -- подберите подходящий Map API для отображения трека.
Ход проекта:
Добавил следующую механику:
1) менеджер логинится
2) видит список всех предприятий
3) выбирает предприятие - получает список всех машин
4) выбрав машину - получает список всех поездок
5) выбрав поездку, он видит трек на карте (начальное положение - конечное)
Возникли проблемы с треком: пока не заставил библиотеку отрисовывать нормальный маршрут по точкам - хочу с этим разобраться.
Использую OpenStreetMap (https://www.openstreetmap.org/), так как предоставляет бесплатное API.
#проект
День 21
Задание:
1. Добавить утилиту: для заданной id машинки, которая генерит её трек в реальном времени (дописывает точки в базу например раз в 10 секунд), похожий на настоящий. Можно какие-нибудь сплайны задействовать. Задаются также длина трека в километрах, максимальные скорость и ускорение и шаг точек с разбросом.
2. Треки желательно к улицам привязывать, в карточных API есть роутинг. Есть например GraphHopper Directions API - строит случайный маршрут по автодороге.
3. Попробуйте добавить генерацию с роутингом.
Ход проекта:
1. Сделал утилиту, которая на вход принимает флагами нужные параметры и каждые 10 секунд записывает точки трека в БД. Использую роутинг GraphHopper'а, который генерирует трек, получая 2 или более точек. Если есть флаг step (шаг точек), то генерируется несколько точек в зависимости от заданной длины трека, по которым затем строится роутинг с привязкой к улицам.
2. Сохраняю непосредственно поездку.
#проект
Задание:
1. Добавить утилиту: для заданной id машинки, которая генерит её трек в реальном времени (дописывает точки в базу например раз в 10 секунд), похожий на настоящий. Можно какие-нибудь сплайны задействовать. Задаются также длина трека в километрах, максимальные скорость и ускорение и шаг точек с разбросом.
2. Треки желательно к улицам привязывать, в карточных API есть роутинг. Есть например GraphHopper Directions API - строит случайный маршрут по автодороге.
3. Попробуйте добавить генерацию с роутингом.
Ход проекта:
1. Сделал утилиту, которая на вход принимает флагами нужные параметры и каждые 10 секунд записывает точки трека в БД. Использую роутинг GraphHopper'а, который генерирует трек, получая 2 или более точек. Если есть флаг step (шаг точек), то генерируется несколько точек в зависимости от заданной длины трека, по которым затем строится роутинг с привязкой к улицам.
2. Сохраняю непосредственно поездку.
#проект
День 22
Задание:
1. Добавьте модель Отчёт, которая содержит поля - название, период и пр.
2. От него наследуйте конкретный отчёт "Пробег автомобиля за период" (тип отчёта). Период и даты задаются, а в результате показываются пробеги в км. Если период - сутки, то раскладка пробега по дням, если месяц - по месяцам, и т. д.
3. Добавьте в интерфейсе для менеджера раздел "Отчёты", где доступен список отчётов и календарь с возможностью выбора дат.
4. Для получения отчёта сделайте API, где запрашивается отчёт с id автомобиля, нужным типом, датами и периодом.
Ход проекта:
1. Добавил модель "Отчет". В Go нет наследования, но есть композиция - завел структуру "Пробег автомобиля за период", в которую вложил кроме Id и Пробега непосредственно сам "Отчет".
2. Для менеджера сделал дополнительную кнопку на экране всех предприятий.
3. По кнопке он получает доступ к конфигуратору отчета с календарем. Выбирает нужный автомобиль из доступных. Когда все значения выбраны, можно сформировать отчет.
#проект
Задание:
1. Добавьте модель Отчёт, которая содержит поля - название, период и пр.
2. От него наследуйте конкретный отчёт "Пробег автомобиля за период" (тип отчёта). Период и даты задаются, а в результате показываются пробеги в км. Если период - сутки, то раскладка пробега по дням, если месяц - по месяцам, и т. д.
3. Добавьте в интерфейсе для менеджера раздел "Отчёты", где доступен список отчётов и календарь с возможностью выбора дат.
4. Для получения отчёта сделайте API, где запрашивается отчёт с id автомобиля, нужным типом, датами и периодом.
Ход проекта:
1. Добавил модель "Отчет". В Go нет наследования, но есть композиция - завел структуру "Пробег автомобиля за период", в которую вложил кроме Id и Пробега непосредственно сам "Отчет".
2. Для менеджера сделал дополнительную кнопку на экране всех предприятий.
3. По кнопке он получает доступ к конфигуратору отчета с календарем. Выбирает нужный автомобиль из доступных. Когда все значения выбраны, можно сформировать отчет.
#проект