Закончилась короткая, но дивная неделька!
Познакомилась с новым:
- декоратор lru_cache.
https://pythonz.net/references/named/functools.lru_cache/
Эта штука кэширует результат выполнения функции для одинаковых атрибутов. В моем случае при использовании библиотеки formulas парсинг excel файла занимал около 9 секунд. Закэшировав функцию с парсингом, я получила постоянный и быстрый доступ к уже готовой xl_model:
```python
@lru_cache(maxsize=2)
def get_model():
xl_model = formulas.ExcelModel().loads(EXCEL_SOURCE).finish(circular=True)
return xl_mod
```
- По умолчанию в PyCharm стоит длина строки 120, а в PEP 79. Я была уверена, что PyCharm мне показывает 79, но нет. Пришлось идти в настройки и править. 79 символов - это так мало(
Есть еще такая штука https://tirinox.ru/flake8-pycharm/, но надо настраивать. Попробую как-нибудь.
- Правильный импорт файла, если он лежит в той же директории, что и скрипт:
- 1_000_000 == 1000000. Божечки-кошечки, это круто. Смысл в том, что число с пробелами не напишешь, а вот так норм.
- ssh и работа с ним (сейчас у опытных чуваков рука-лицо, но да, я никогда не делала этого).
Научилась выполнять команды на сервере через ssh-подключение без переключения на терминал внутри сервера.
Это типа таких вещей:
```shell
scp -i ~/.ssh/key user@host:file . # копирует файл с сервера к себе (если ключ по дефолту, то указывать его не нужно
ssh user@host 'rm file' # в кавычках команда для выполнения
```
Спасибо коллегам за развитие. Познавательно.
И вроде столько всего делала сама, но из таких мелочей, наверное, начинает складываться мастерство. #Python, #Работа, #Tools
Познакомилась с новым:
- декоратор lru_cache.
https://pythonz.net/references/named/functools.lru_cache/
Эта штука кэширует результат выполнения функции для одинаковых атрибутов. В моем случае при использовании библиотеки formulas парсинг excel файла занимал около 9 секунд. Закэшировав функцию с парсингом, я получила постоянный и быстрый доступ к уже готовой xl_model:
```python
@lru_cache(maxsize=2)
def get_model():
xl_model = formulas.ExcelModel().loads(EXCEL_SOURCE).finish(circular=True)
return xl_mod
el```
- По умолчанию в PyCharm стоит длина строки 120, а в PEP 79. Я была уверена, что PyCharm мне показывает 79, но нет. Пришлось идти в настройки и править. 79 символов - это так мало(
Есть еще такая штука https://tirinox.ru/flake8-pycharm/, но надо настраивать. Попробую как-нибудь.
- Правильный импорт файла, если он лежит в той же директории, что и скрипт:
DIR_PATH = os.path.dirname(os.path.realpath(__file__))
EXCEL = 'file.xlsx'
EXCEL_SOURCE = os.path.join(DIR_PATH, EXCEL)
Я видела, конечно, как в Django прописаны импорты, но никогда не делала сама.- 1_000_000 == 1000000. Божечки-кошечки, это круто. Смысл в том, что число с пробелами не напишешь, а вот так норм.
- ssh и работа с ним (сейчас у опытных чуваков рука-лицо, но да, я никогда не делала этого).
Научилась выполнять команды на сервере через ssh-подключение без переключения на терминал внутри сервера.
Это типа таких вещей:
```shell
scp -i ~/.ssh/key user@host:file . # копирует файл с сервера к себе (если ключ по дефолту, то указывать его не нужно
ssh user@host 'rm file' # в кавычках команда для выполнения
```
Банально и все знают? Я раньше не работала с ssh, для меня это все было в новинку.Спасибо коллегам за развитие. Познавательно.
И вроде столько всего делала сама, но из таких мелочей, наверное, начинает складываться мастерство. #Python, #Работа, #Tools
Дневник можно переименовать в еженедельник)
Отчет за недельку:
Докер
Продолжаю познавать докер и перестаю его бояться. Узнала про команды:
- docker stats - выводит состояние запущенных контейнеров (использование CPU, памяти, сети и тп).
Узнала знаете как? Первый раз у меня докер сожрал 18 ГБ памяти, а второй раз проц ушел в полку. Я решила, что хватит это терпеть, пора все же посмотреть, что там происходит.
- docker-compose up container -d
Эта приставка -d делает так, чтобы докер не начал срать своими логами в терминал, когда его запускаешь. Надоело переоткрывать терминал, поэтому сходила и посмотрела как это нормально делается.
Ну и плюс узнала как задать лимит по памяти для контейнера. Но почему-то то, что работало у меня на компе, не завелось на сервере.
logging
Когда я писала логирование для своего проекта, я просто узнала как логировать, написала свою простенькую функцию для логирования (вроде писала о ней выше) и мне было норм. Все мои логи aws заботливо собирает в CloudWatch, там прекрасный интерфейс и я довольная всегда имею доступ ко всем последним событиям на своем проекте, и не только к последним. AWS все сделал за меня! Почти все, функции обкладывала логами все же сама.
А тут на работе понадобилось логи складывать в текстовые файлики и очищать их со временем чем-нибудь, чтобы не засоряли пространство. При этом еще стоило их разделять на отдельные файлики. И пришлось мне таки разобраться как вообще работает logging.
Мне посоветовали https://www.youtube.com/watch?v=qqdgynJ5ATU это видео, но это уже после того как я перерыла кучу инфы в интернете и наваяла вот это:
```python
import logging
import logging.handlers
import os
def get_logger(filename: str):
"""
Функция возвращает logger по имени и сохраняет логи в файлы с
соответствующим названием, разделяя по часам
:param filename: название для logger
:return: logger
"""
if not os.path.exists(LOG_DIR):
os.makedirs(LOG_DIR)
logger = logging.getLogger(filename)
logger.propagate = False
if not logger.handlers:
log_path = os.path.join(LOG_DIR, f"{filename}.log")
file_handler = logging.handlers.TimedRotatingFileHandler(
log_path, when='h', interval=1, backupCount=90
)
log_formatter = logging.Formatter("[%(levelname)s] "
"%(asctime)s %(message)s")
file_handler.setFormatter(log_formatter)
logger.addHandler(file_handler)
logger.setLevel('INFO')
return logger
```
- обработчики (handlers) сделают всю грязную работу за меня. TimedRotatingFileHandler разделяет файлы по заданным промежуткам времени, параметр backupCount указывает на то, через какое количество созданных файлов их надо чистить.
- форматирование Formatter. Для него полезно знать о том, какие атрибуты вообще есть у лог-записи https://docs.python.org/3/library/logging.html#logrecord-attributes. Я там обнаружила, что есть та вещь, которую я в свое время прописывала ручками в своей функции, а именно funcName - название функции, в рамках которой залогирована запись.
Это круто. Я понимаю, что языки программирования не дураки пишут и библиотеки тоже. Дураки (незнающие) пользуются всем этим добром криво-косо и страдают. А там такое вот чудо.
О дивный новый мир. #Python, #Docker, #Работа
Отчет за недельку:
Докер
Продолжаю познавать докер и перестаю его бояться. Узнала про команды:
- docker stats - выводит состояние запущенных контейнеров (использование CPU, памяти, сети и тп).
Узнала знаете как? Первый раз у меня докер сожрал 18 ГБ памяти, а второй раз проц ушел в полку. Я решила, что хватит это терпеть, пора все же посмотреть, что там происходит.
- docker-compose up container -d
Эта приставка -d делает так, чтобы докер не начал срать своими логами в терминал, когда его запускаешь. Надоело переоткрывать терминал, поэтому сходила и посмотрела как это нормально делается.
Ну и плюс узнала как задать лимит по памяти для контейнера. Но почему-то то, что работало у меня на компе, не завелось на сервере.
logging
Когда я писала логирование для своего проекта, я просто узнала как логировать, написала свою простенькую функцию для логирования (вроде писала о ней выше) и мне было норм. Все мои логи aws заботливо собирает в CloudWatch, там прекрасный интерфейс и я довольная всегда имею доступ ко всем последним событиям на своем проекте, и не только к последним. AWS все сделал за меня! Почти все, функции обкладывала логами все же сама.
А тут на работе понадобилось логи складывать в текстовые файлики и очищать их со временем чем-нибудь, чтобы не засоряли пространство. При этом еще стоило их разделять на отдельные файлики. И пришлось мне таки разобраться как вообще работает logging.
Мне посоветовали https://www.youtube.com/watch?v=qqdgynJ5ATU это видео, но это уже после того как я перерыла кучу инфы в интернете и наваяла вот это:
```python
import logging
import logging.handlers
import os
def get_logger(filename: str):
"""
Функция возвращает logger по имени и сохраняет логи в файлы с
соответствующим названием, разделяя по часам
:param filename: название для logger
:return: logger
"""
if not os.path.exists(LOG_DIR):
os.makedirs(LOG_DIR)
logger = logging.getLogger(filename)
logger.propagate = False
if not logger.handlers:
log_path = os.path.join(LOG_DIR, f"{filename}.log")
file_handler = logging.handlers.TimedRotatingFileHandler(
log_path, when='h', interval=1, backupCount=90
)
log_formatter = logging.Formatter("[%(levelname)s] "
"%(asctime)s %(message)s")
file_handler.setFormatter(log_formatter)
logger.addHandler(file_handler)
logger.setLevel('INFO')
return logger
```
Главные открытия:- обработчики (handlers) сделают всю грязную работу за меня. TimedRotatingFileHandler разделяет файлы по заданным промежуткам времени, параметр backupCount указывает на то, через какое количество созданных файлов их надо чистить.
- форматирование Formatter. Для него полезно знать о том, какие атрибуты вообще есть у лог-записи https://docs.python.org/3/library/logging.html#logrecord-attributes. Я там обнаружила, что есть та вещь, которую я в свое время прописывала ручками в своей функции, а именно funcName - название функции, в рамках которой залогирована запись.
Это круто. Я понимаю, что языки программирования не дураки пишут и библиотеки тоже. Дураки (незнающие) пользуются всем этим добром криво-косо и страдают. А там такое вот чудо.
О дивный новый мир. #Python, #Docker, #Работа
Мои курсы:
0. Когда-то давно для общего развития скорее проходила курсы "Специалист" (от МГТУ им. Баумана) по php и в целом по программированию. Еще проходила https://tutorial.djangogirls.org/ru/, думала с них начать приобщение к питону, но это не сильно все помогло. Но дало хотя бы базовые знания, чтобы совсем не теряться в общении с программистами.
1. Началом изучения программирования я считаю курс https://www.udemy.com/course/bestpython/. До него я пробовала проходить курс от MIT, но шел он довольно тяжело не из-за сложности, а из-за английского и слабого понимания темы. На русском курс пошел легче и стало все как-то понятнее. Прошла его за пару недель (после этого курс автор еще расширил темой про многопоточку и я к нему возвращалась еще на пару недель). Для базы - курс отличный.
2. Курс-любовь, курс-огонь. https://cs50.harvard.edu/x/2021/ Бесплатный, старые лекции можно найти на русском. Это базовый курс, есть еще по разным направлениям (web, ml, мобилки). Первые задания придется выполнять на C, это гораздо больнее, чем на питончике. Но инфраструктура для учебы, офигенные интересные задачи, увлекательные лекции, все это к-к-комбо. Самый лучший курс, который я когда-либо проходила.
3. Начинала курс по алгоритмам https://www.youtube.com/playlist?list=PLRDzFCPr95fK7tr47883DFUbm4GeOjjc0. Прошла 6 или 7 лекций. К ним еще есть практика http://judge.mipt.ru/mipt_cs_on_python3/. Уважаю МФТИ и этого лектора в частности за то, что дают доступ к своим лекциям. Это круто. Но... как же я горела с задач, этот поток несвязных цифр на входе и на выходе, эти кривые тесты для проверки... Когда-нибудь я допройду этот курс. Но практику буду искать на кодварс или литкоде.
4. Вдумчиво разбирала первые лекции с канала https://www.youtube.com/c/lbTechOfficial/videos. Тут про паттерны проектирования. SOLID, чистый код, про рефакторинг и тд. Очень хочу вернуться позже к этому каналу, так как на момент прохождения было мало опыта, знаний и понимания.
5. Какой-то курс по вебпаку, что-то по докеру. Дальше вот этот канал был https://www.youtube.com/channel/UCWEHue8kksIaktO8KTTN_zg. На самом try django 2.2 начинала еще на самом старте, но это было так, попытка схватиться за что-нибудь. Упоролась, но прошла курс https://www.youtube.com/watch?v=f1R_bykXHGE. 12 часов растянулись на неделю или две. Но я хотела подсмотреть какие-то практики работы с джангой.
6. А, и еще я где-то там начала проходить курс по web от cs50, сдала половину проектов и просмотрела все лекции, но в итоге не закончила его, так как они меняли контент, я ждала, а в итоге переключилась на другое и не видела большого смысла для себя возвращаться к нему. https://cs50.harvard.edu/web/2020/. Они, кстати, заставляют снимать видео для демо проектов https://www.youtube.com/watch?v=MmLte1ii_5A. А тут я даже в кадре что-то пытаюсь рассказывать https://www.youtube.com/watch?v=fAZq7Qdsvp8
7. Дальше я выла с того, что мне нужен js, а я его не понимаю. Я вроде что-то делала на нем, но как-то не очень получалось. Поэтому я собралась и взяла курс https://www.udemy.com/course/javascript_full/. Прошла, стало как-то понятнее и легче ориентироваться в JS.
8. Параллельно JS, чтобы разнообразить себе жизнь и подтянуть еще одно свое слабое место проходила курс по AWS https://www.youtube.com/playlist?list=PLg5SS_4L6LYsxrZ_4xE_U95AtGsIB96k9. Посмотрела до 45 лекции. Иногда смотрю у этого же автора какие-то темы по инфре, например, у него же смотрела про github actions. Вообще, когда смотрела казалось, что вроде он ничего особенно и не рассказывает, тык-тык, что-то там делает, что я из этого пойму. Но на самом деле потом осознала, что мне стало легче ориентироваться в aws. Я внезапно начала лучше понимать их сокращения и архитектуру сервисов. #Курсы, #Учеба, #Python, #JS
0. Когда-то давно для общего развития скорее проходила курсы "Специалист" (от МГТУ им. Баумана) по php и в целом по программированию. Еще проходила https://tutorial.djangogirls.org/ru/, думала с них начать приобщение к питону, но это не сильно все помогло. Но дало хотя бы базовые знания, чтобы совсем не теряться в общении с программистами.
1. Началом изучения программирования я считаю курс https://www.udemy.com/course/bestpython/. До него я пробовала проходить курс от MIT, но шел он довольно тяжело не из-за сложности, а из-за английского и слабого понимания темы. На русском курс пошел легче и стало все как-то понятнее. Прошла его за пару недель (после этого курс автор еще расширил темой про многопоточку и я к нему возвращалась еще на пару недель). Для базы - курс отличный.
2. Курс-любовь, курс-огонь. https://cs50.harvard.edu/x/2021/ Бесплатный, старые лекции можно найти на русском. Это базовый курс, есть еще по разным направлениям (web, ml, мобилки). Первые задания придется выполнять на C, это гораздо больнее, чем на питончике. Но инфраструктура для учебы, офигенные интересные задачи, увлекательные лекции, все это к-к-комбо. Самый лучший курс, который я когда-либо проходила.
3. Начинала курс по алгоритмам https://www.youtube.com/playlist?list=PLRDzFCPr95fK7tr47883DFUbm4GeOjjc0. Прошла 6 или 7 лекций. К ним еще есть практика http://judge.mipt.ru/mipt_cs_on_python3/. Уважаю МФТИ и этого лектора в частности за то, что дают доступ к своим лекциям. Это круто. Но... как же я горела с задач, этот поток несвязных цифр на входе и на выходе, эти кривые тесты для проверки... Когда-нибудь я допройду этот курс. Но практику буду искать на кодварс или литкоде.
4. Вдумчиво разбирала первые лекции с канала https://www.youtube.com/c/lbTechOfficial/videos. Тут про паттерны проектирования. SOLID, чистый код, про рефакторинг и тд. Очень хочу вернуться позже к этому каналу, так как на момент прохождения было мало опыта, знаний и понимания.
5. Какой-то курс по вебпаку, что-то по докеру. Дальше вот этот канал был https://www.youtube.com/channel/UCWEHue8kksIaktO8KTTN_zg. На самом try django 2.2 начинала еще на самом старте, но это было так, попытка схватиться за что-нибудь. Упоролась, но прошла курс https://www.youtube.com/watch?v=f1R_bykXHGE. 12 часов растянулись на неделю или две. Но я хотела подсмотреть какие-то практики работы с джангой.
6. А, и еще я где-то там начала проходить курс по web от cs50, сдала половину проектов и просмотрела все лекции, но в итоге не закончила его, так как они меняли контент, я ждала, а в итоге переключилась на другое и не видела большого смысла для себя возвращаться к нему. https://cs50.harvard.edu/web/2020/. Они, кстати, заставляют снимать видео для демо проектов https://www.youtube.com/watch?v=MmLte1ii_5A. А тут я даже в кадре что-то пытаюсь рассказывать https://www.youtube.com/watch?v=fAZq7Qdsvp8
7. Дальше я выла с того, что мне нужен js, а я его не понимаю. Я вроде что-то делала на нем, но как-то не очень получалось. Поэтому я собралась и взяла курс https://www.udemy.com/course/javascript_full/. Прошла, стало как-то понятнее и легче ориентироваться в JS.
8. Параллельно JS, чтобы разнообразить себе жизнь и подтянуть еще одно свое слабое место проходила курс по AWS https://www.youtube.com/playlist?list=PLg5SS_4L6LYsxrZ_4xE_U95AtGsIB96k9. Посмотрела до 45 лекции. Иногда смотрю у этого же автора какие-то темы по инфре, например, у него же смотрела про github actions. Вообще, когда смотрела казалось, что вроде он ничего особенно и не рассказывает, тык-тык, что-то там делает, что я из этого пойму. Но на самом деле потом осознала, что мне стало легче ориентироваться в aws. Я внезапно начала лучше понимать их сокращения и архитектуру сервисов. #Курсы, #Учеба, #Python, #JS
👎1🔥1
Давно сюда не писала. Но хочу поделиться ботом, которого перенесла на свой бекенд сегодня, @s_channel_bot.
Это бот, который позволяет отслеживать наиболее популярные посты в каналах.
Изначально он был собран другим человеком через простенький скрипт. Я перенесла этот функционал на свой бекенд проекта Noctua.
Пришлось много поплакать над библиотекой telethon, чтобы добиться адекватного сохранения данных о просмотрах и репостах постов. Нет, на самом деле это не великая проблема, но когда поток сообщений высокий, аккаунтов больше, чем 1, начинаются пляски с бубном.
Жаль, что тележка не предоставляет возможность работать с чужими каналами через бота, и приходится так выворачиваться.
К слову, кто не в курсе, бота нельзя добавить в канал обычным смертным, только админом. Поэтому, чтобы получать сообщения из каналов, приходится заводить пользователей и добавляться в канал как пользователь через кастомный клиент тележки как раз с помощью библиотеки telethon.
Недавно осознала, что перестала бояться незнакомого для меня функционала, новых библиотек и так далее. Вообще перестала так бояться и стрессовать при выкатах и разработке. Все можно порешать, со всем можно разобраться. Если раньше конкретно нервничала, когда что-то шло не так или я не знала как это делать, то сейчас... Ахаха, могу просто залипнуть над решением и орать, если меня отвлекают. Орать. Потому что не трогайте меня, когда я сосредоточена. Нет, большую часть времени я расслабленно что-то делаю, но если я погрузиласть в поток, то не трогайте меня, я не хочу есть/чай/ничего, дайте дописать код спокойно)
На счет нового и интересного функционала, с которым столкнулась. Надо ж поделиться полезным:
1. https://docs.python.org/3/library/textwrap.html встроенная библиотека для того, чтобы разделять текст на нужные по размеру куски. Та же тележка имеет ограничение на объем сообщения. Раньше я ручками писала функции, чтобы резать тексты до нужного объема, но оказывается есть вот такая штука. Удобно.
2. https://docs.python.org/3/library/difflib.html. Мне периодически нужен нечеткий поиск. Недавно я вообще столкнулась с задачей, где в таблице есть список людей, у который в фамилиях есть спецсимволы (ну там немцы, чехи, кто-то там еще со своими умлаутами или как их там). А нужен простенький скрипт, который будет искать нужных людей по фамилии. И вот как быть с этими умлаутами? Короче, эта библиотека - мое спасение. Она сравнивает строки и оценивает их "похожесть", что дает возможность найти нужную фамилию. Работает примерно так:
запрос - caceres
1. A. Cáceres | Совпадение = 0.7058823529411765
2. A. Calver | Совпадение = 0.5
3. L. Cacace | Совпадение = 0.5
4. J. Cabrera | Совпадение = 0.47058823529411764
5. C. Armiento | Совпадение = 0.4444444444444444
Если интересно, то алгоритм описан https://en.wikipedia.org/wiki/Gestalt_Pattern_Matching
Всем удачи и спасибо, что вы со мной! ^_^ #Python, #Tools, #Работа
Это бот, который позволяет отслеживать наиболее популярные посты в каналах.
Изначально он был собран другим человеком через простенький скрипт. Я перенесла этот функционал на свой бекенд проекта Noctua.
Пришлось много поплакать над библиотекой telethon, чтобы добиться адекватного сохранения данных о просмотрах и репостах постов. Нет, на самом деле это не великая проблема, но когда поток сообщений высокий, аккаунтов больше, чем 1, начинаются пляски с бубном.
Жаль, что тележка не предоставляет возможность работать с чужими каналами через бота, и приходится так выворачиваться.
К слову, кто не в курсе, бота нельзя добавить в канал обычным смертным, только админом. Поэтому, чтобы получать сообщения из каналов, приходится заводить пользователей и добавляться в канал как пользователь через кастомный клиент тележки как раз с помощью библиотеки telethon.
Недавно осознала, что перестала бояться незнакомого для меня функционала, новых библиотек и так далее. Вообще перестала так бояться и стрессовать при выкатах и разработке. Все можно порешать, со всем можно разобраться. Если раньше конкретно нервничала, когда что-то шло не так или я не знала как это делать, то сейчас... Ахаха, могу просто залипнуть над решением и орать, если меня отвлекают. Орать. Потому что не трогайте меня, когда я сосредоточена. Нет, большую часть времени я расслабленно что-то делаю, но если я погрузиласть в поток, то не трогайте меня, я не хочу есть/чай/ничего, дайте дописать код спокойно)
На счет нового и интересного функционала, с которым столкнулась. Надо ж поделиться полезным:
1. https://docs.python.org/3/library/textwrap.html встроенная библиотека для того, чтобы разделять текст на нужные по размеру куски. Та же тележка имеет ограничение на объем сообщения. Раньше я ручками писала функции, чтобы резать тексты до нужного объема, но оказывается есть вот такая штука. Удобно.
2. https://docs.python.org/3/library/difflib.html. Мне периодически нужен нечеткий поиск. Недавно я вообще столкнулась с задачей, где в таблице есть список людей, у который в фамилиях есть спецсимволы (ну там немцы, чехи, кто-то там еще со своими умлаутами или как их там). А нужен простенький скрипт, который будет искать нужных людей по фамилии. И вот как быть с этими умлаутами? Короче, эта библиотека - мое спасение. Она сравнивает строки и оценивает их "похожесть", что дает возможность найти нужную фамилию. Работает примерно так:
запрос - caceres
1. A. Cáceres | Совпадение = 0.7058823529411765
2. A. Calver | Совпадение = 0.5
3. L. Cacace | Совпадение = 0.5
4. J. Cabrera | Совпадение = 0.47058823529411764
5. C. Armiento | Совпадение = 0.4444444444444444
matcher = SequenceMatcher(lambda x: x in " .", name.lower(), query.lower())
matcher.ratio() #Совпадение
Если интересно, то алгоритм описан https://en.wikipedia.org/wiki/Gestalt_Pattern_Matching
Всем удачи и спасибо, что вы со мной! ^_^ #Python, #Tools, #Работа
Закончила задачу с 3D аватарами. У blender есть python api и можно запускать скрипты с помощью cli. Изначально писать код и дебажить пришлось в самом блендере, потом вынесла его в скрипт. Теперь запускаю скрипт и формируются нужные опоры для эмоций и удаляется все лишнее.
Правда, возни получается все равно много пока. Надо скачать аватара, запустить на нем скрипт блендера, залить в проект, сделать превью через js-скрипт, который вызывается через get-параметр при загрузке страницы с аватаром. Дичь) Но так как это разовая операция, пока нет смысла все это оптимизировать.
Было забавно, когда начала заливать новых аватаров обнаружился косяк с глазами. Поверх глаз аватарок начали накладываться лишние ресницы. Поковырявшись, нашла лишние глаза для женской анимации стандартной фигуры стояния (по дефолту аватары в T-позе).
Я безумно рада, что я разобралась и сделала эту задачу. Изначально я даже не знала как к ней подойти. Плюс еще одна победа, хехей! #Работа, #Python, #Tools
Правда, возни получается все равно много пока. Надо скачать аватара, запустить на нем скрипт блендера, залить в проект, сделать превью через js-скрипт, который вызывается через get-параметр при загрузке страницы с аватаром. Дичь) Но так как это разовая операция, пока нет смысла все это оптимизировать.
Было забавно, когда начала заливать новых аватаров обнаружился косяк с глазами. Поверх глаз аватарок начали накладываться лишние ресницы. Поковырявшись, нашла лишние глаза для женской анимации стандартной фигуры стояния (по дефолту аватары в T-позе).
Я безумно рада, что я разобралась и сделала эту задачу. Изначально я даже не знала как к ней подойти. Плюс еще одна победа, хехей! #Работа, #Python, #Tools
👍4🔥3
Просто делюсь эмоциями...
Да простят меня коллеги, но сил нет.
Второй день переписываю кусок кода, который и ранее уже немного правила. И все еще негодую) Просто одно и тоже гоняется туда-сюда, такое ощущение, что писали индусы, которым платят за строчки, но иногда они вдруг пытаются сэкономить! внезапно! и там где стоило бы разнести как раз на несколько строк, наоборот впихивают все в одну.
Зачем я это делаю? Я хочу несколько запросов делать асинхронно, но для этого мне надо вытащить их из общего потока задублированного по сути кода. Терпения мне.
Пример бесячего однострочника:
И вот такого довольно много #Работа, #Python
Да простят меня коллеги, но сил нет.
Второй день переписываю кусок кода, который и ранее уже немного правила. И все еще негодую) Просто одно и тоже гоняется туда-сюда, такое ощущение, что писали индусы, которым платят за строчки, но иногда они вдруг пытаются сэкономить! внезапно! и там где стоило бы разнести как раз на несколько строк, наоборот впихивают все в одну.
Зачем я это делаю? Я хочу несколько запросов делать асинхронно, но для этого мне надо вытащить их из общего потока задублированного по сути кода. Терпения мне.
Пример бесячего однострочника:
ignore_fail = getattr(result, 'ignore_fail', False) and (kwargs['level'] == 2 and session.mode == LessonMode.CHOICES_TEST_TWO_STEP)
И вот такого довольно много #Работа, #Python
🤯3👍1
"Ты когда-нибудь думала, что программирование это не твое?"
Нет, блин, но я думала: "Какого черта это так сложно понять, учитывая, что программирование это точно мое!"
Я не из тех, кто переживает на счет математики и логики, потому что с этим всегда было все в порядке. Но дико не хватало базы. И все еще многое надо изучить. И каждый собес как чертов экзамен с кучей заковыристых вопросов с совершенно незнакомыми экзаменаторами и без билетов. Тестовые задания, технические интервью, попробуй подготовься! Отсутствие высшего как клеймо - недоучка! Да блин, офигеть, все жизнь учусь, но вот это недоучка все равно догоняет.
Когда кто-то говорит что наличие высшего неважно, я отрицаю. Если есть возможность его получить, то лучше это сделать. Чтобы потом не пришлось мучительно всем доказывать, что и без него ты норм. Ну, и та же база, фундамент важны. Без них гораздо сложнее продираться через все самому. Хотя лично я предпочитаю учиться сама.
Когда училась на журналистике, ничто так не забустило как опыт собственного проекта, когда пришлось резко разобраться в куче вещей самостоятельно вперед программы. Правда ведь, господин преподаватель? 🙂 Это забавно, прошло 10 лет и мы пересеклись уже на теме программирования. Как успехи c JS?
Больная тема) Пора бы уже переключиться.
Как же чертовски все медленно! Сегодня катнула на прод по-быстренькому небольшое обновление. Нельзя было так резко, надо было соблюсти все формальности. Хотя нет никаких регламентов, говорящих как можно и нельзя. Просто знаю по менеджерскому опыту (по щучьему веленью, по моему хотенью!), что надо бы тикет, согласование, апрув изменений. Но черт возьми, слишком долго для мелкой доработки. На самом деле хотелось еще больше протащить в прод. Опыт и осознание задач говорит о том, что это можно катать, но и тот же опыт говорит, что не надо брать на себя слишком много ответственности, когда ты не СТО, а линейный разработчик.
Наверное, это самое ощутимая разница между привычной позицией и текущей - отсутствие свободы в принятии решений. Не страшно в целом, терпимо, просто непривычно.
Поделюсь немного техническим, давно ничего такого не шарила. Писала кастомный middleware для aws lambda function в виде декоратора для функции lambda_handler. По сути делала просто обработку исключений при выполнении с отправкой уведомлений.
Логирование исключений. Почему-то никогда ранее не использовала logging.exception() https://docs.python.org/3/library/logging.html#logging.Logger.exception для логирования. Полезная штука, которая логирует еще и трейс.
Обработка неотловленных исключений. Познакомилась еще с такой штукой как sys.excepthook https://docs.python.org/3/library/sys.html#sys.excepthook
Пример использования можно найти тут https://stackoverflow.com/questions/5191830/how-do-i-log-a-python-error-with-debug-information
Когда у тебя довольно необычная архитектура проекта, построенная на одних лямбда функциях и слоях к ним, какие только не приходится придумывать решения 🙂
В итоге о внеплановых ошибках должно приходить уведомление на почту с описанием ошибки и ссылкой на cloud watch. Я же уже писала, что изобретаю велосипеды? 🙂
Но блин, это интересно. Люблю этот чудесный мир программирования. #AWS, #Работа, #Python
Нет, блин, но я думала: "Какого черта это так сложно понять, учитывая, что программирование это точно мое!"
Я не из тех, кто переживает на счет математики и логики, потому что с этим всегда было все в порядке. Но дико не хватало базы. И все еще многое надо изучить. И каждый собес как чертов экзамен с кучей заковыристых вопросов с совершенно незнакомыми экзаменаторами и без билетов. Тестовые задания, технические интервью, попробуй подготовься! Отсутствие высшего как клеймо - недоучка! Да блин, офигеть, все жизнь учусь, но вот это недоучка все равно догоняет.
Когда кто-то говорит что наличие высшего неважно, я отрицаю. Если есть возможность его получить, то лучше это сделать. Чтобы потом не пришлось мучительно всем доказывать, что и без него ты норм. Ну, и та же база, фундамент важны. Без них гораздо сложнее продираться через все самому. Хотя лично я предпочитаю учиться сама.
Когда училась на журналистике, ничто так не забустило как опыт собственного проекта, когда пришлось резко разобраться в куче вещей самостоятельно вперед программы. Правда ведь, господин преподаватель? 🙂 Это забавно, прошло 10 лет и мы пересеклись уже на теме программирования. Как успехи c JS?
Больная тема) Пора бы уже переключиться.
Как же чертовски все медленно! Сегодня катнула на прод по-быстренькому небольшое обновление. Нельзя было так резко, надо было соблюсти все формальности. Хотя нет никаких регламентов, говорящих как можно и нельзя. Просто знаю по менеджерскому опыту (по щучьему веленью, по моему хотенью!), что надо бы тикет, согласование, апрув изменений. Но черт возьми, слишком долго для мелкой доработки. На самом деле хотелось еще больше протащить в прод. Опыт и осознание задач говорит о том, что это можно катать, но и тот же опыт говорит, что не надо брать на себя слишком много ответственности, когда ты не СТО, а линейный разработчик.
Наверное, это самое ощутимая разница между привычной позицией и текущей - отсутствие свободы в принятии решений. Не страшно в целом, терпимо, просто непривычно.
Поделюсь немного техническим, давно ничего такого не шарила. Писала кастомный middleware для aws lambda function в виде декоратора для функции lambda_handler. По сути делала просто обработку исключений при выполнении с отправкой уведомлений.
Логирование исключений. Почему-то никогда ранее не использовала logging.exception() https://docs.python.org/3/library/logging.html#logging.Logger.exception для логирования. Полезная штука, которая логирует еще и трейс.
Обработка неотловленных исключений. Познакомилась еще с такой штукой как sys.excepthook https://docs.python.org/3/library/sys.html#sys.excepthook
Пример использования можно найти тут https://stackoverflow.com/questions/5191830/how-do-i-log-a-python-error-with-debug-information
Когда у тебя довольно необычная архитектура проекта, построенная на одних лямбда функциях и слоях к ним, какие только не приходится придумывать решения 🙂
В итоге о внеплановых ошибках должно приходить уведомление на почту с описанием ошибки и ссылкой на cloud watch. Я же уже писала, что изобретаю велосипеды? 🙂
Но блин, это интересно. Люблю этот чудесный мир программирования. #AWS, #Работа, #Python
🔥9👍2
Сегодня меня попросили сделать нагрузочное тестрование (НТ) для блокчейн нод на пару методов. Я ни разу не делала НТ сама и почти ничего не знаю про внутрянку блокчейна. Что ж…
Сначала попробовала погуглить, но на меня вывалилось большое разнообразие инструментов, что я поняла - выбирать буду долго. Тогда постучала к другу, который ранее делился со мной впечатлениями, когда сам делал НТ, и попросила его пошарить чем он пользовался.
Что же, и вот документация по locust https://docs.locust.io/en/stable/index.html. Немного повозилась с установкой, потому что давно не юзала venv и в целом на маке, если честно, бардак в плане версий python и библиотек. Нашла пример простого конфига и залипла в подготовку сценариев, так как почти вообще не шарю в контексте блокчейна. Благо уже проходила по просьбе кое-какие гайды и уже создавала базовые контракты, поэтому хоть чуток ориентируюсь.
Предоставленные хосты - отдельная песня, на один и тот же запрос, то 502, то 503, то 200. Может это норма для блокчейна?
Провозившись часа 2, я все же запустила, немного офигела от RPS до 2000 без ошибок, долго игралась с параметрами как сделать плавный запуск. Не уверена, что я все сделала как надо, так как реально не хотела сильно погружаться в эту задачу. Скорее всего, если копнуть глубже, то можно настроить более корректный сценарий проведения НТ, но мне нужны были базовые цифры.
Потом еще долго снимала показатели и собирала отчеты по разным методам (можно, кстати, автоматизировать, там вроде вообще есть запуск в фоне).
А потом решила по фану зайти в чатгпт и попросить помочь. После чего эта радость выдает мне нужный скрипт для locust с первого запроса со всеми параметрами и тп. Ну, черт, какой же все-таки это прикольный зверь. Почему я не сделала это сразу?
Еще момент, помню в бытность менеджером проведение НТ вызывало много страданий и мало кто его нормально мог сделать. И вот сижу я и не понимаю, какого черта. Ну? Ведь не надо быть супер-инженером, чтобы это сделать. Пусть на коленке, но это уже может дать пищу для ума. Я помню как мы проводили НТ, я помню эти “красивые отчеты”, которые вот, я собрала на раз-два-три. Очень сложная задача! И я понимаю, что дать нагрузку это не вся задача, надо бы посмотреть логи, проанализировать ошибки, узкие места, но это тоже не рокет саенс…
Ну да лан. Дорогу осилит идущий, вот что я хочу сказать.
К прошлой теме. Хочу поделиться, переписывая скрипт деплоя на питон, наткнулась на встроенную библиотеку в питоне специально для вызова скриптов из терминала argparse. Удобная штука, позволяет конфигурировать аргументы, которые ожидаешь при вызове скрипта и работать с ними. Вообще на питоне, конечно, намного веселее было собрать все, что нужно. Плюс еще удобнее собирать архив с помощью опять же встроенной библиотеки zipfile, тут отличный пример для сборки архива https://stackoverflow.com/questions/1855095/how-to-create-a-zip-archive-of-a-directory
Кстати, chatGPT приобрела платную версию. Но посты сюда пишу сама! 🙂 Спрашивала, конечно, рекомендации по каналу и тп, советы прикольные. Однако, я сюда пишу не ради аудитории или репутации, или еще чего-то. Это просто место для излияния души, так сказать. Поэтому не, генерить или специально задротить на посты здесь я не буду. Это мой уютный дневничок и пока есть настроение, я буду продолжать графоманить сюда всякое накопившееся, накипевшее.
Но с сеткой довольно интересно общаться, да! Мне нравится.
Фыр #ChatGPT, #Python, #Tools
Сначала попробовала погуглить, но на меня вывалилось большое разнообразие инструментов, что я поняла - выбирать буду долго. Тогда постучала к другу, который ранее делился со мной впечатлениями, когда сам делал НТ, и попросила его пошарить чем он пользовался.
Что же, и вот документация по locust https://docs.locust.io/en/stable/index.html. Немного повозилась с установкой, потому что давно не юзала venv и в целом на маке, если честно, бардак в плане версий python и библиотек. Нашла пример простого конфига и залипла в подготовку сценариев, так как почти вообще не шарю в контексте блокчейна. Благо уже проходила по просьбе кое-какие гайды и уже создавала базовые контракты, поэтому хоть чуток ориентируюсь.
Предоставленные хосты - отдельная песня, на один и тот же запрос, то 502, то 503, то 200. Может это норма для блокчейна?
Провозившись часа 2, я все же запустила, немного офигела от RPS до 2000 без ошибок, долго игралась с параметрами как сделать плавный запуск. Не уверена, что я все сделала как надо, так как реально не хотела сильно погружаться в эту задачу. Скорее всего, если копнуть глубже, то можно настроить более корректный сценарий проведения НТ, но мне нужны были базовые цифры.
Потом еще долго снимала показатели и собирала отчеты по разным методам (можно, кстати, автоматизировать, там вроде вообще есть запуск в фоне).
А потом решила по фану зайти в чатгпт и попросить помочь. После чего эта радость выдает мне нужный скрипт для locust с первого запроса со всеми параметрами и тп. Ну, черт, какой же все-таки это прикольный зверь. Почему я не сделала это сразу?
Еще момент, помню в бытность менеджером проведение НТ вызывало много страданий и мало кто его нормально мог сделать. И вот сижу я и не понимаю, какого черта. Ну? Ведь не надо быть супер-инженером, чтобы это сделать. Пусть на коленке, но это уже может дать пищу для ума. Я помню как мы проводили НТ, я помню эти “красивые отчеты”, которые вот, я собрала на раз-два-три. Очень сложная задача! И я понимаю, что дать нагрузку это не вся задача, надо бы посмотреть логи, проанализировать ошибки, узкие места, но это тоже не рокет саенс…
Ну да лан. Дорогу осилит идущий, вот что я хочу сказать.
К прошлой теме. Хочу поделиться, переписывая скрипт деплоя на питон, наткнулась на встроенную библиотеку в питоне специально для вызова скриптов из терминала argparse. Удобная штука, позволяет конфигурировать аргументы, которые ожидаешь при вызове скрипта и работать с ними. Вообще на питоне, конечно, намного веселее было собрать все, что нужно. Плюс еще удобнее собирать архив с помощью опять же встроенной библиотеки zipfile, тут отличный пример для сборки архива https://stackoverflow.com/questions/1855095/how-to-create-a-zip-archive-of-a-directory
Кстати, chatGPT приобрела платную версию. Но посты сюда пишу сама! 🙂 Спрашивала, конечно, рекомендации по каналу и тп, советы прикольные. Однако, я сюда пишу не ради аудитории или репутации, или еще чего-то. Это просто место для излияния души, так сказать. Поэтому не, генерить или специально задротить на посты здесь я не буду. Это мой уютный дневничок и пока есть настроение, я буду продолжать графоманить сюда всякое накопившееся, накипевшее.
Но с сеткой довольно интересно общаться, да! Мне нравится.
Фыр #ChatGPT, #Python, #Tools
🔥13👍1
Прекоммит.
https://pre-commit.com/
Когда коллега поставил его, я впервые столкнулась с этим злом 🙂 Шучу, не злом, конечно, но в начале он хорошо так напрягал. Пришлось подстроиться под него и в конце концов споры у нас (с прекоммитом) возникали только из-за количество пропущенных строчек и типа кавычек, из-за чего просто приходилось дважды коммитить. Но недавно коллега докинул туда новых правил и тут внезапно как назло во время очень большого коммита мне привалило СТОЛЬКО правок, что я выпала в осадок. Я потратила на исправление 50% от времени на изначальную подготовку коммита.
С другой стороны если бы не это, то я не узнала бы о некоторых нюансах, которые, как я понимаю, довольно важны в командной работе и в работе над крупными долгосрочными проектами.
1. Код наоборот. Как-то для меня было логично, что сначала мы пишем функции, потом их используем. Соответственно функция, использующая другую функцию, будет ниже. Но оказалось, что дядюшка Мартин завещал иначе и многие придерживаются этого обратного подхода. https://github.com/mobility-university/flake8-newspaper-style. Мне реально придется переучиваться под это. И я все еще внутренне протестую против этого правила и моя логика сломана. Может быть позже поменяю свою точку зрения. Стараюсь быть открытой к переменам.
2. В логировании не использовать f-строки. https://github.com/globality-corp/flake8-logging-format. Типа вместо `logger.info(f”{name}: {result}”)` пишем `logger.info(“%s: %s”, name, result)`. Потому что… а дальше я залипла в поисках причин. Говорят в этом случае sentry может группировать записи (а что без не? не работала с сентри, у меня всю дорогу cloud watch). Еще видела аргумент про безопасность, что так не возникнет исключение в случае чего. А еще чет читала про то, что когда настраиваешь уровень логирования и у тебя f- строки, то они формируются независимо от настроенного уровня логирования и типа идет дополнительный ненужный расход памяти. В целом аргументов и правда достаточно, чтобы перестроиться под такой формат. f-строки удобный синтаксический сахар, но как-то очень много но с ними 🙁
3. Докстринги. Да и фиг с ними, копайлот прекрасно справляется с описаниями. Теперь документировать код стало прям приятно. https://github.com/peterjc/flake8-rst-docstrings
Это, конечно, не все проверки, но я перечислила именно те, которые вызвали у меня попаболь.
Но что меня радует в нашей маленькой команде, так это свобода и скорость в применении улучшений. То есть да, мой коллега не сильно то согласовывал, а я не сильно отслеживала набор правил для прекоммита. Он добавил, залил. Я попробовала и уже после мы обсудили что-куда-зачем, на практике, скажем так, без долгих холиваров перед на тему надо-не надо. Хотя холивары все же были, но скорее это был мой поток эмоций, когда я долго-долго приводила код к новым требованиям.
Такой подход позволяет нам очень быстро внедрять изменения и пробовать их в деле. Конечно, код, от которого многое зависит, мы не меняем опрометчиво, но вот новый функционал строим довольно гибко и быстро.
Я просто слушаю иногда коллег и кажется, что у многих в командах так не работает. Нужно пройти 7 кругов ада, чтобы что-то поменять или внедрить новое. Искренне не хочется тухнуть в такой неповоротливой системе.
Кон!
PS. Надо бы дальше поучиться, а то все последние дни вожусь с планами переезда. Остался месяц до отправления в Малайзию. Немного нервничаю. Вроде все это весело, но и диковато в то же время. Сегодня заглянула на обзор улиц в google map в Куала Лумпуре и пока это кажется чем-то далеким и сложно представить, что уже скоро я буду там вживую 🙂
Хы. #Жизнь, #Работа, #Tools, #Python
https://pre-commit.com/
Когда коллега поставил его, я впервые столкнулась с этим злом 🙂 Шучу, не злом, конечно, но в начале он хорошо так напрягал. Пришлось подстроиться под него и в конце концов споры у нас (с прекоммитом) возникали только из-за количество пропущенных строчек и типа кавычек, из-за чего просто приходилось дважды коммитить. Но недавно коллега докинул туда новых правил и тут внезапно как назло во время очень большого коммита мне привалило СТОЛЬКО правок, что я выпала в осадок. Я потратила на исправление 50% от времени на изначальную подготовку коммита.
С другой стороны если бы не это, то я не узнала бы о некоторых нюансах, которые, как я понимаю, довольно важны в командной работе и в работе над крупными долгосрочными проектами.
1. Код наоборот. Как-то для меня было логично, что сначала мы пишем функции, потом их используем. Соответственно функция, использующая другую функцию, будет ниже. Но оказалось, что дядюшка Мартин завещал иначе и многие придерживаются этого обратного подхода. https://github.com/mobility-university/flake8-newspaper-style. Мне реально придется переучиваться под это. И я все еще внутренне протестую против этого правила и моя логика сломана. Может быть позже поменяю свою точку зрения. Стараюсь быть открытой к переменам.
2. В логировании не использовать f-строки. https://github.com/globality-corp/flake8-logging-format. Типа вместо `logger.info(f”{name}: {result}”)` пишем `logger.info(“%s: %s”, name, result)`. Потому что… а дальше я залипла в поисках причин. Говорят в этом случае sentry может группировать записи (а что без не? не работала с сентри, у меня всю дорогу cloud watch). Еще видела аргумент про безопасность, что так не возникнет исключение в случае чего. А еще чет читала про то, что когда настраиваешь уровень логирования и у тебя f- строки, то они формируются независимо от настроенного уровня логирования и типа идет дополнительный ненужный расход памяти. В целом аргументов и правда достаточно, чтобы перестроиться под такой формат. f-строки удобный синтаксический сахар, но как-то очень много но с ними 🙁
3. Докстринги. Да и фиг с ними, копайлот прекрасно справляется с описаниями. Теперь документировать код стало прям приятно. https://github.com/peterjc/flake8-rst-docstrings
Это, конечно, не все проверки, но я перечислила именно те, которые вызвали у меня попаболь.
Но что меня радует в нашей маленькой команде, так это свобода и скорость в применении улучшений. То есть да, мой коллега не сильно то согласовывал, а я не сильно отслеживала набор правил для прекоммита. Он добавил, залил. Я попробовала и уже после мы обсудили что-куда-зачем, на практике, скажем так, без долгих холиваров перед на тему надо-не надо. Хотя холивары все же были, но скорее это был мой поток эмоций, когда я долго-долго приводила код к новым требованиям.
Такой подход позволяет нам очень быстро внедрять изменения и пробовать их в деле. Конечно, код, от которого многое зависит, мы не меняем опрометчиво, но вот новый функционал строим довольно гибко и быстро.
Я просто слушаю иногда коллег и кажется, что у многих в командах так не работает. Нужно пройти 7 кругов ада, чтобы что-то поменять или внедрить новое. Искренне не хочется тухнуть в такой неповоротливой системе.
Кон!
PS. Надо бы дальше поучиться, а то все последние дни вожусь с планами переезда. Остался месяц до отправления в Малайзию. Немного нервничаю. Вроде все это весело, но и диковато в то же время. Сегодня заглянула на обзор улиц в google map в Куала Лумпуре и пока это кажется чем-то далеким и сложно представить, что уже скоро я буду там вживую 🙂
Хы. #Жизнь, #Работа, #Tools, #Python
🔥6👍1
Новая матрешка детектед!
Внутри сервиса сделан свой класс - менеджер запросов, который отнаследован от менеджера из общей библиотеки. Этот класс обернут в декоратор, который определяет схему конвертации для данных, возвращаемых методами этого класса.
И вот пишете вы тип возвращаемых данных в основном менеджере для метода get_history, например, словарик. А в сервисе на этот метод вот через такой декоратор сделана обработка, которая вместо результата - словарика вернет число! Удачи в дебаге, дорогая!
Почему я называю это матрешкой? Потому что название метода в декораторе задано строкой, это уже рвет все возможные нити для поддержания кода в связном состоянии, а тут еще и переопределяется результат этого метода. Ты вообще с наскока не найдешь, что произошло и почему. Плюс чтобы отследить весь процесс обработки придется занырнуть через весь этот накрученный клубок наследования и обработчиков. Там бизнес-логика размазана между классом, который вызывает этот метод, и функцией, которая конвертирует респонс.
В данном случае логичнее было бы сделать отдельный класс аля Контроллер со всеми необходимыми методами, прописать ожидаемые модели для структур данных с фабричными методами для обработки данных из респонса, но никак не декоратор с набором кастомной конвертации респонса для отдельных методов!
Я тоже ошибаюсь. На днях коллега поймал меня за руку на том, что я пыталась создать универсальный фабричный метод на две разных структуры исходных данных. Они очень близки по сути, отличаются буквально чуток. Но все же реально было странно их смешивать. Просто когда пишешь код иногда переклинивает на какой-то такой ерунде, поэтому далеко не все получается удачно с первого раза.
Однако, я не могу понять вот такие замороченные схемы. Это ведь не за один день было написано. Плюс вся логика сервиса вот в таком формате.
Я все еще пытаюсь вытащить из этого сервиса кусочек и чем дальше в лес, тем толще партизаны. Хех. #Работа, #Python
Внутри сервиса сделан свой класс - менеджер запросов, который отнаследован от менеджера из общей библиотеки. Этот класс обернут в декоратор, который определяет схему конвертации для данных, возвращаемых методами этого класса.
@conversion(schema)
class CustomManager(Manager):
pass
schema = {
“method_name”: conversion_function
}
def conversion_function(response):
return response[“id”]
И вот пишете вы тип возвращаемых данных в основном менеджере для метода get_history, например, словарик. А в сервисе на этот метод вот через такой декоратор сделана обработка, которая вместо результата - словарика вернет число! Удачи в дебаге, дорогая!
Почему я называю это матрешкой? Потому что название метода в декораторе задано строкой, это уже рвет все возможные нити для поддержания кода в связном состоянии, а тут еще и переопределяется результат этого метода. Ты вообще с наскока не найдешь, что произошло и почему. Плюс чтобы отследить весь процесс обработки придется занырнуть через весь этот накрученный клубок наследования и обработчиков. Там бизнес-логика размазана между классом, который вызывает этот метод, и функцией, которая конвертирует респонс.
В данном случае логичнее было бы сделать отдельный класс аля Контроллер со всеми необходимыми методами, прописать ожидаемые модели для структур данных с фабричными методами для обработки данных из респонса, но никак не декоратор с набором кастомной конвертации респонса для отдельных методов!
Я тоже ошибаюсь. На днях коллега поймал меня за руку на том, что я пыталась создать универсальный фабричный метод на две разных структуры исходных данных. Они очень близки по сути, отличаются буквально чуток. Но все же реально было странно их смешивать. Просто когда пишешь код иногда переклинивает на какой-то такой ерунде, поэтому далеко не все получается удачно с первого раза.
Однако, я не могу понять вот такие замороченные схемы. Это ведь не за один день было написано. Плюс вся логика сервиса вот в таком формате.
Я все еще пытаюсь вытащить из этого сервиса кусочек и чем дальше в лес, тем толще партизаны. Хех. #Работа, #Python
👍5😱1
Импорты в python. Много раз от знакомых видела вопросы про проблемы с импортами в python. Чаще всего они не возникают, если не менять уровень директории для запуска скрипта. То есть если у вас проект от корня, то с импортами будет все в порядке. Однако, сейчас я работаю на проекте, где все сервисы лежат в одном репозитории. Получается, что на сервере запуск идет от корня сервиса, а на локальной машине от корня репозитория (на уровень выше).
И вот был у нас один сервис, который был упакован коллегами так: репозиторий -> название сервиса -> еще одна папка, в которой лежит сам сервис с разбивкой на разные директории внутри. Его вручную собирали в архив и этот архив вручную заливали на сервер, а иногда даже тупо обновляли вручную содержание конкретных скриптов. Ко всему прочему, в зависимости от стейджа внутрь сервиса на сервере заливался свой конфиг файл. Адский ад.
Самое интересное, что в тестах к этому сервису был хук импортов, который добавлял директорию сервиса к python путям, а внутри сервиса все импорты были прописаны как абсолютные. Когда я открывала этот сервис в pycharm, у меня были кровавые слезы при взгляде на эти импорты, потому что интерпретатор грустил. Можно было бы, конечно, в настройках проекта также указать эту папку как пакет, но это костыль.
Как же я давно мечтала исправить этот сервис. Как же у меня свербило от него. И вот вчера я добралась до него!
Убрала этот конфиг, прописала в settings файл все условия в зависимости от стейджа. Основные доступы и прочие защищенные данные я уже давно перетащила в SecretManager, поэтому с этим проблем не было. Попутно поправила кое-что для других сервисов, которые использовались в этом (обновила код в репозитории, потому что расходился прод-код и код в репе, обновила название одного из сервисов под наш стандарт и тп). И вот добралась до импортов. Быстренько подменила абсолютные пути на относительные и раскатала скриптом новую версию на тестовом стейдже. И… ничего не заработало. Получила ошибку импортов, что вылезаю на слишком высокий уровень с помощью относительных импортов. Сначала я решила перебрать структуру проекта, потому что там было много такого from module import *. Плюс система вложенности отчасти нелогичная, плюс связность между модулями высокая. Но все мои попытки соптимизировать все равно выдавали одну и ту же ошибку с импортами. Что же…
Я не хотела откатываться назад. Я не хотела сдаваться. Стаковерфлоу, документация, ничего не помогало. Но я отчаянно хотела найти решение для нашей задачи, так как реально часто хочется сделать нормальную структуру сервиса, а не получается из-за разного уровня запуска на локальной машине и сервере.
Моей палочкой-выручалочкой стал ответ чатгпт. Вот по истине приятно обсудить проблему с машиной. Ее можно применять как продвинутую уточку, так сказать. Ничего сильного нового она мне не посоветовала, но в конце написала мысль:
“To fix this issue, you should refactor your code to either use absolute imports where appropriate, or restructure your package so that relative imports do not need to go beyond the top level package.”
И тут меня осенило! Я базовый входной файл (у меня это lambda_function.py с обработчиком для событий) вынесла в корень сервиса, а остальное завернула в общую директорию, таким образом убрав все скрипты с относительными импортами с верхнего для сервиса уровня. В корневом скрипте же вполне ок работают абсолютные пути.
Божечки-кошечки, все завелось!
Ня! А коллег ждет кошмарный пул-реквест… Но это лучше, чем предыдущее состояние этой функции.
А еще я сдала midterm вчера, ура! 19 страниц, 686 строк latex кода! Вжух! #Python, #Работа
И вот был у нас один сервис, который был упакован коллегами так: репозиторий -> название сервиса -> еще одна папка, в которой лежит сам сервис с разбивкой на разные директории внутри. Его вручную собирали в архив и этот архив вручную заливали на сервер, а иногда даже тупо обновляли вручную содержание конкретных скриптов. Ко всему прочему, в зависимости от стейджа внутрь сервиса на сервере заливался свой конфиг файл. Адский ад.
Самое интересное, что в тестах к этому сервису был хук импортов, который добавлял директорию сервиса к python путям, а внутри сервиса все импорты были прописаны как абсолютные. Когда я открывала этот сервис в pycharm, у меня были кровавые слезы при взгляде на эти импорты, потому что интерпретатор грустил. Можно было бы, конечно, в настройках проекта также указать эту папку как пакет, но это костыль.
Как же я давно мечтала исправить этот сервис. Как же у меня свербило от него. И вот вчера я добралась до него!
Убрала этот конфиг, прописала в settings файл все условия в зависимости от стейджа. Основные доступы и прочие защищенные данные я уже давно перетащила в SecretManager, поэтому с этим проблем не было. Попутно поправила кое-что для других сервисов, которые использовались в этом (обновила код в репозитории, потому что расходился прод-код и код в репе, обновила название одного из сервисов под наш стандарт и тп). И вот добралась до импортов. Быстренько подменила абсолютные пути на относительные и раскатала скриптом новую версию на тестовом стейдже. И… ничего не заработало. Получила ошибку импортов, что вылезаю на слишком высокий уровень с помощью относительных импортов. Сначала я решила перебрать структуру проекта, потому что там было много такого from module import *. Плюс система вложенности отчасти нелогичная, плюс связность между модулями высокая. Но все мои попытки соптимизировать все равно выдавали одну и ту же ошибку с импортами. Что же…
Я не хотела откатываться назад. Я не хотела сдаваться. Стаковерфлоу, документация, ничего не помогало. Но я отчаянно хотела найти решение для нашей задачи, так как реально часто хочется сделать нормальную структуру сервиса, а не получается из-за разного уровня запуска на локальной машине и сервере.
Моей палочкой-выручалочкой стал ответ чатгпт. Вот по истине приятно обсудить проблему с машиной. Ее можно применять как продвинутую уточку, так сказать. Ничего сильного нового она мне не посоветовала, но в конце написала мысль:
“To fix this issue, you should refactor your code to either use absolute imports where appropriate, or restructure your package so that relative imports do not need to go beyond the top level package.”
И тут меня осенило! Я базовый входной файл (у меня это lambda_function.py с обработчиком для событий) вынесла в корень сервиса, а остальное завернула в общую директорию, таким образом убрав все скрипты с относительными импортами с верхнего для сервиса уровня. В корневом скрипте же вполне ок работают абсолютные пути.
Божечки-кошечки, все завелось!
Ня! А коллег ждет кошмарный пул-реквест… Но это лучше, чем предыдущее состояние этой функции.
А еще я сдала midterm вчера, ура! 19 страниц, 686 строк latex кода! Вжух! #Python, #Работа
🔥7
Словила тут очень интересный баг в чужом коде. Рассказываю схемку.
Не буду выкладывать код конвертера, но суть его логики была в том, что он брал все методы родителя и оборачивал их в соответствии со scheme, где в ключе указывалось название метода, а в значении функция, которая обработает результат в нужном формате. А потом он эти методы присваивал в соответствии с названием дочернему классу.
Неудивительно, что если дочерний класс перегружал методы родителя, то эти методы были просто похерены и использовались родительские. Вот это блин хак!
И что самое забавное, место, где возникала ошибка никак не логировалось. Там было нечто вроде:
Классно, да?
Используйте logger.exception(“все пошло к херам”), так вы хотя бы получите трейс исключения.
Изначально ошибку нашла путем поиска по коду текста ошибки. Добавила логов, потом увидела то, что пишут логи и очень удивилась, что вместо дочерней функции, почему-то отрабатывала функция родителя. Вот это поворот! Потом нашла этот чертов декоратор и долго тупила над его кодом, потому что - “что блин прости ты делаешь, серьезно?”. На самом деле хочется выпилить этот декоратор, но пока лишь пофиксила его логику, чтобы он использовал дочерний метод (если он существует) для обертки вместо родительского. Что за дичь, а?
И нет, я тоже допускаю ошибки в коде, иногда очень глупые. Я тоже иногда пишу диковатый код. Но такие хаки у меня вызывают крайнее недоумение. Типа вместо использования ООП сделать декоратор, который сломает логику ООП, это надо исключительно постараться. #Работа, #Python
class Parent:
def func():
pass
@converter(scheme: Dict[str, callable])
class Children(Parent):
def func():
pass
Не буду выкладывать код конвертера, но суть его логики была в том, что он брал все методы родителя и оборачивал их в соответствии со scheme, где в ключе указывалось название метода, а в значении функция, которая обработает результат в нужном формате. А потом он эти методы присваивал в соответствии с названием дочернему классу.
Неудивительно, что если дочерний класс перегружал методы родителя, то эти методы были просто похерены и использовались родительские. Вот это блин хак!
И что самое забавное, место, где возникала ошибка никак не логировалось. Там было нечто вроде:
try:
children.func()
except Exception as err:
return f“Все пошло к херам {err}”
)
Классно, да?
Используйте logger.exception(“все пошло к херам”), так вы хотя бы получите трейс исключения.
Изначально ошибку нашла путем поиска по коду текста ошибки. Добавила логов, потом увидела то, что пишут логи и очень удивилась, что вместо дочерней функции, почему-то отрабатывала функция родителя. Вот это поворот! Потом нашла этот чертов декоратор и долго тупила над его кодом, потому что - “что блин прости ты делаешь, серьезно?”. На самом деле хочется выпилить этот декоратор, но пока лишь пофиксила его логику, чтобы он использовал дочерний метод (если он существует) для обертки вместо родительского. Что за дичь, а?
И нет, я тоже допускаю ошибки в коде, иногда очень глупые. Я тоже иногда пишу диковатый код. Но такие хаки у меня вызывают крайнее недоумение. Типа вместо использования ООП сделать декоратор, который сломает логику ООП, это надо исключительно постараться. #Работа, #Python
🔥6
Конспект по математике на английском и немного русском https://xmind.app/m/Krpc6j
Это модуль по вычислительной математике. Я закончила все темы, осталось экзамен, который должен был быть по плану сегодня, но оказалось, что он не сегодня а 21-22 числа. Что же… Хорошо, больше времени на подготовку, больше нервов.
Друзья, этому дневнику уже почти 3 года или всего 3 года. Это самый долгий срок, кажется, для моего личного проекта. При чем у меня нет конкретной цели здесь, только путь. Мне очень приятно, что здесь есть люди, которые подписаны почти с самого начала и кто до сих пор читает мои длиннопосты, зачастую не причесанные и шероховатые.
Нет настроения строчить сегодня огромную простыню, поэтому позвольте просто отчитаться о последних событиях, потом позже может о чем-то распишу детальнее.
1. Бытовое. В отпуске внезапно сгоняла на Бали, чтобы открыть счет на wise. Цели моих путешествий удивляют меня саму. Впервые поехать на остров просветленных и серферов ради счета. Бали мне не понравился, деревня, ужасное движение, пешком особо не погуляешь. Хотя поездка на водопады с друзьями мне понравилась, еще еда на порядок вкуснее, чем тут, да и закаты на океане прекрасны! Отдельное слово о wise - офигенно удобная штука, прям такое ощущение, что этот сервис делала команда Тинькова. Плюс одна симка, плюс один номер телефона. У меня уже набрались: московский, турецкий, грузинский, малазийский и вот теперь индонезийский номера. Все приходится поддерживать в рабочем состоянии. Тык-тык между симками.
2. Бытовое 2. Попробовала сделать swift между Турцией и wise. Переводила 100 долларов, заплатила 15 долларов комиссии сверху в самом начале. Получила 65 долларов, из которых 5 долларов ушло на комиссию обработки платежа со стороны wise. Внимание, где еще 35 долларов? Я так и не добралась до ответа. Но делать еще swift-переводы расхотелось. Посмотрим как придет зп на вайс.
3. Выкатила нотификации, вернувшись с отпуска на тестовый контур. Оно работает, но я офигела как много всего пришлось задействовать, при этом кода вроде немного получилось. Реально, чуть позже постараюсь собраться и нарисовать схемку как оно работает.
4. Пока делала задачку, пришлось в регулярках поковыряться. Узнала прикольную штуку как сделать ключевые группы в шаблоне для регулярки и потом забирать значения по ключу:
https://docs.python.org/3/library/re.html#re.Match.groupdict
5. Я тут обнаружила, что Adobe пакет для личного использования стал вполне себе подъёмным по деньгам. Давно-давно я немного увлекалась дизайном и мне хотелось научиться монтировать. В целом даже кое-какие основы монтажа я знаю, спасибо опыту на телике. Плюс я когда-то пыталась учиться рисовать, да и планшет брала с пером, так как хотелось иногда снова попробовать рисовать. В общем, не знаю куда, но хочу еще впихнуть в себя изучение графики и тп, хочется подизайнить, порисовать что-нибудь. Поизучать современные возможности графического ПО.
Пока все.
PS. Кайфанула от One Piece от Нетфликс. #Жизнь, #Конспекты, #Математика, #UOL, #Python
Это модуль по вычислительной математике. Я закончила все темы, осталось экзамен, который должен был быть по плану сегодня, но оказалось, что он не сегодня а 21-22 числа. Что же… Хорошо, больше времени на подготовку, больше нервов.
Друзья, этому дневнику уже почти 3 года или всего 3 года. Это самый долгий срок, кажется, для моего личного проекта. При чем у меня нет конкретной цели здесь, только путь. Мне очень приятно, что здесь есть люди, которые подписаны почти с самого начала и кто до сих пор читает мои длиннопосты, зачастую не причесанные и шероховатые.
Нет настроения строчить сегодня огромную простыню, поэтому позвольте просто отчитаться о последних событиях, потом позже может о чем-то распишу детальнее.
1. Бытовое. В отпуске внезапно сгоняла на Бали, чтобы открыть счет на wise. Цели моих путешествий удивляют меня саму. Впервые поехать на остров просветленных и серферов ради счета. Бали мне не понравился, деревня, ужасное движение, пешком особо не погуляешь. Хотя поездка на водопады с друзьями мне понравилась, еще еда на порядок вкуснее, чем тут, да и закаты на океане прекрасны! Отдельное слово о wise - офигенно удобная штука, прям такое ощущение, что этот сервис делала команда Тинькова. Плюс одна симка, плюс один номер телефона. У меня уже набрались: московский, турецкий, грузинский, малазийский и вот теперь индонезийский номера. Все приходится поддерживать в рабочем состоянии. Тык-тык между симками.
2. Бытовое 2. Попробовала сделать swift между Турцией и wise. Переводила 100 долларов, заплатила 15 долларов комиссии сверху в самом начале. Получила 65 долларов, из которых 5 долларов ушло на комиссию обработки платежа со стороны wise. Внимание, где еще 35 долларов? Я так и не добралась до ответа. Но делать еще swift-переводы расхотелось. Посмотрим как придет зп на вайс.
3. Выкатила нотификации, вернувшись с отпуска на тестовый контур. Оно работает, но я офигела как много всего пришлось задействовать, при этом кода вроде немного получилось. Реально, чуть позже постараюсь собраться и нарисовать схемку как оно работает.
4. Пока делала задачку, пришлось в регулярках поковыряться. Узнала прикольную штуку как сделать ключевые группы в шаблоне для регулярки и потом забирать значения по ключу:
compound_key_match = re.fullmatch(r"(?P<main>\w+)\[(?P<second>\w+)\]", value)
if compound_key_match:
main = compound_key_match["main"]
second = compound_key_match["second"]
)
https://docs.python.org/3/library/re.html#re.Match.groupdict
5. Я тут обнаружила, что Adobe пакет для личного использования стал вполне себе подъёмным по деньгам. Давно-давно я немного увлекалась дизайном и мне хотелось научиться монтировать. В целом даже кое-какие основы монтажа я знаю, спасибо опыту на телике. Плюс я когда-то пыталась учиться рисовать, да и планшет брала с пером, так как хотелось иногда снова попробовать рисовать. В общем, не знаю куда, но хочу еще впихнуть в себя изучение графики и тп, хочется подизайнить, порисовать что-нибудь. Поизучать современные возможности графического ПО.
Пока все.
PS. Кайфанула от One Piece от Нетфликс. #Жизнь, #Конспекты, #Математика, #UOL, #Python
Xmind
Math
A Mind Map about Math submitted by Margarita Andrianova on Sep 4, 2023. Created with Xmind.
🔥12👍2👏1
gzip
Я тут познала gzip.
Впервые уперлась в ошибку из-за лимитов lambda function на размер payload https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html. Суть в том, что лямбда не хочет отдавать больше 6MB за раз. Скажете, а нафига тебе так много? Можно ведь на s3 сложить и с него потом раздать, но суть в том, что тогда либо s3 должен быть публичным, либо опять же надо делать проксю, которая будет отдавать из s3. Чисто технически да, так и надо сделать, но я пока сделала временное решение через сжатие, которое потребовало буквально лишь пары строк кода на бекенде:
Мы используем aws_lambda_powertools для роутинга, ну и другие фишки этой либы для работы с лямбда функциями.
Заголовок Content-Encoding дает браузеру понять формат респонса и браузер его автоматически распаковывает, поэтому никакой обработки на стороне фронтенда не требуется, при этом размер данных сократился в несколько раз, что позволило войти в нужные лимиты.
Чуть позже буду менять логику, разобью респонс на части, но как хотфикс текущее решение сойдет.
Да и в целом по-моему прекрасная опция поджать контент. Странно, что раньше я о ней не знала.
PS. Балдура прекрасна! Пока межсессионная тишина можно поиграть.
PPS. Что за мода убивать классных персонажей пошла в анимешках/манге? >_<
“На небе и на земле, лишь я один достойный!” #Python, #AWS
Я тут познала gzip.
Впервые уперлась в ошибку из-за лимитов lambda function на размер payload https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html. Суть в том, что лямбда не хочет отдавать больше 6MB за раз. Скажете, а нафига тебе так много? Можно ведь на s3 сложить и с него потом раздать, но суть в том, что тогда либо s3 должен быть публичным, либо опять же надо делать проксю, которая будет отдавать из s3. Чисто технически да, так и надо сделать, но я пока сделала временное решение через сжатие, которое потребовало буквально лишь пары строк кода на бекенде:
import gzip
import json
from aws_lambda_powertools.event_handler import Response
@app.get(“path”)
def some_route():
data = json.dumps({“result”: “some result”}).encode("utf-8")
return Response(
status_code=200,
body=gzip.compress(data),
content_type="application/json",
headers={"Content-Encoding": "gzip"},
)
Мы используем aws_lambda_powertools для роутинга, ну и другие фишки этой либы для работы с лямбда функциями.
Заголовок Content-Encoding дает браузеру понять формат респонса и браузер его автоматически распаковывает, поэтому никакой обработки на стороне фронтенда не требуется, при этом размер данных сократился в несколько раз, что позволило войти в нужные лимиты.
Чуть позже буду менять логику, разобью респонс на части, но как хотфикс текущее решение сойдет.
Да и в целом по-моему прекрасная опция поджать контент. Странно, что раньше я о ней не знала.
PS. Балдура прекрасна! Пока межсессионная тишина можно поиграть.
PPS. Что за мода убивать классных персонажей пошла в анимешках/манге? >_<
“На небе и на земле, лишь я один достойный!” #Python, #AWS
🔥11
Работа
Скучаю по Django ORM. Приходится писать вручную запросы для добавления данных в базу, лапками оборачивать все это в транзакции и откатывать по необходимости. Процесс добавления состоит из нескольких этапов, то есть проверить наличие, если нет, то добавить новое и так для нескольких связанных элементов. Все это в ORACLE. Думаю, что в ORACLE можно наваять какой-нить супер-запрос, который будет сразу все обрабатывать, но я делала всю логику через питон, так как, наверное, это будет проще поддерживать.
Для меня главным открытием стало, что Оракл просто так не возвращает то, что он добавил. Я узнала, что чтобы получить сгенерированный id, надо специально передать переменную в запросе. Пример кода:
Про ярлыки
На работе у меня тайтл просто software engineer, а у коллеги senior. Мне в целом все равно, но стало интересно по какому принципу компания определяет уровень, спросила у менеджера. Но так как она с нами недавно, она не смогла ответить почему так вышло, но заверила, что я самый что ни на есть сеньорский сеньор и по работе и по зп 🙂 Обещают поменять лычку, правда, с повышением зп пока все сложно, поэтому остаюсь при своей маленькой, но гордой сеньорской зп 🙂
Балдура
Черт, дошла до финала и мне не понравились варианты решения в финале. Я вчера психанула и закрыла игру. Я не скажу, что финал плохой, но я не хочу принимать такой финал, у меня были другие ожидания. Впервые в игре, я не могу, не хочу такой сюжет. Хотя, с некоторыми аниме/мангами тоже так происходит последнее время, - мне психологически, морально сложно принять сюжет. Я не досмотрела Атаку Титанов и Игру Престолов из-за этого.
Сегодня в местном книжном проходит фан-встреча Звездных войн. Народ ходит в костюмах, музыка играет соответствующая. Заметила за собой, что я будучи в футболке с Бличом, стесняюсь быть гиком и мне хотелось поскорее оттуда свалить, потому что не-не, я не такая, да, я взрослая женщина ваще-то, ага 🙂 Получается, вроде и позволила себе свободно увлекаться всем этим, но так и не могу до конца признать свои увлечения публично, а Ичиго на футболке, ну просто футболка, чего не так? Ну и пусть что из мужского отдела, потому что в женском (сексизм блин!) не было анимешных футболок, хнык( #Жизнь, #Истории, #Работа, #Игры, #Python
Скучаю по Django ORM. Приходится писать вручную запросы для добавления данных в базу, лапками оборачивать все это в транзакции и откатывать по необходимости. Процесс добавления состоит из нескольких этапов, то есть проверить наличие, если нет, то добавить новое и так для нескольких связанных элементов. Все это в ORACLE. Думаю, что в ORACLE можно наваять какой-нить супер-запрос, который будет сразу все обрабатывать, но я делала всю логику через питон, так как, наверное, это будет проще поддерживать.
Для меня главным открытием стало, что Оракл просто так не возвращает то, что он добавил. Я узнала, что чтобы получить сгенерированный id, надо специально передать переменную в запросе. Пример кода:
import cx_Oracle
# Connect to Oracle
connection = cx_Oracle.connect("username/password@dsn")
# PL/SQL block
plsql_block = """
DECLARE
new_id NUMBER;
BEGIN
INSERT INTO your_table (column1, column2)
VALUES ('some_value', 'another_value')
RETURNING id_column INTO new_id;
:py_new_id := new_id;
END;
"""
try:
connection.begin()
cursor = connection.cursor()
# Variable to store new_id
py_new_id = cursor.var(cx_Oracle.NUMBER)
# Execute PL/SQL block
cursor.execute(plsql_block, py_new_id=py_new_id)
# Fetch and print new_id
print("Newly Inserted ID:", py_new_id.getvalue())
# Commit
connection.commit()
except cx_Oracle.Error as error:
print("Something went wrong:", error)
connection.rollback()
finally:
# Close the cursor and connection
cursor.close()
connection.close()
Про ярлыки
На работе у меня тайтл просто software engineer, а у коллеги senior. Мне в целом все равно, но стало интересно по какому принципу компания определяет уровень, спросила у менеджера. Но так как она с нами недавно, она не смогла ответить почему так вышло, но заверила, что я самый что ни на есть сеньорский сеньор и по работе и по зп 🙂 Обещают поменять лычку, правда, с повышением зп пока все сложно, поэтому остаюсь при своей маленькой, но гордой сеньорской зп 🙂
Балдура
Черт, дошла до финала и мне не понравились варианты решения в финале. Я вчера психанула и закрыла игру. Я не скажу, что финал плохой, но я не хочу принимать такой финал, у меня были другие ожидания. Впервые в игре, я не могу, не хочу такой сюжет. Хотя, с некоторыми аниме/мангами тоже так происходит последнее время, - мне психологически, морально сложно принять сюжет. Я не досмотрела Атаку Титанов и Игру Престолов из-за этого.
Сегодня в местном книжном проходит фан-встреча Звездных войн. Народ ходит в костюмах, музыка играет соответствующая. Заметила за собой, что я будучи в футболке с Бличом, стесняюсь быть гиком и мне хотелось поскорее оттуда свалить, потому что не-не, я не такая, да, я взрослая женщина ваще-то, ага 🙂 Получается, вроде и позволила себе свободно увлекаться всем этим, но так и не могу до конца признать свои увлечения публично, а Ичиго на футболке, ну просто футболка, чего не так? Ну и пусть что из мужского отдела, потому что в женском (сексизм блин!) не было анимешных футболок, хнык( #Жизнь, #Истории, #Работа, #Игры, #Python
🔥5😁2❤1🌚1
Протегировала почти все посты в канале. Дальше постараюсь все посты также тегировать, чтобы можно было ориентироваться, если это необходимо. А этот пост закреплю как навигацию.
#AWS
#UOL
#Курсы
#Python
#ML
#JS
#React
#Django
#Работа
#Жизнь
#Конспекты
#Математика
#Учеба
#Аниме
#Игры
#Tools
#ChatGPT
#Истории
#Техника
#Docker
#Хакатон
#AWS
#UOL
#Курсы
#Python
#ML
#JS
#React
#Django
#Работа
#Жизнь
#Конспекты
#Математика
#Учеба
#Аниме
#Игры
#Tools
#ChatGPT
#Истории
#Техника
#Docker
#Хакатон
🔥7👍5😱1
#Python
Открыла для себя тулу для работы со сложными структурами из json, когда нет нужды детально их описывать, но надо получить какие-то конкретные данные.
https://jmespath.org/
Эта штука встроена в powertools aws lambda https://docs.powertools.aws.dev/lambda/python/latest/utilities/jmespath_functions/, что в моем случае хорошо, так как не нужны никакие дополнительные либы.
Примеры моих текущих запросов, которые я делала для своей задачки:
чтобы работать с ключами, которые содержат пробелы или спецсимволы, их надо заключить в экранированные кавычки
| - это значок пайплайна, после него идет обработка результата предыдущей операции.
@ - текущий элемент
[?] - условие для фильтрации элементов
[0] - забирает первое найденное значение, иначе бы вернуло список всех значений
[?name=='Compound API'] - Позволяет выбрать объекты с конкретными параметрами из списка
Короче, это такой аля упрощенный пандас для работы с json.
Открыла для себя тулу для работы со сложными структурами из json, когда нет нужды детально их описывать, но надо получить какие-то конкретные данные.
https://jmespath.org/
Эта штука встроена в powertools aws lambda https://docs.powertools.aws.dev/lambda/python/latest/utilities/jmespath_functions/, что в моем случае хорошо, так как не нужны никакие дополнительные либы.
Примеры моих текущих запросов, которые я делала для своей задачки:
f"data[*].attributes.tags.\"worksheet.{COLUMN_NAME}\" | [?starts_with(@, 'G')]"
чтобы работать с ключами, которые содержат пробелы или спецсимволы, их надо заключить в экранированные кавычки
| - это значок пайплайна, после него идет обработка результата предыдущей операции.
@ - текущий элемент
[?] - условие для фильтрации элементов
"included[?starts_with(id, 'ado-')].attributes.fields.\"Primary API\".value | [0]"
[0] - забирает первое найденное значение, иначе бы вернуло список всех значений
"data.attributes.fields[?name=='Compound API'].content.value | [0]"
[?name=='Compound API'] - Позволяет выбрать объекты с конкретными параметрами из списка
Короче, это такой аля упрощенный пандас для работы с json.
🔥6👍2❤1😱1🤓1
#Python #Django
Мне стоит открыть еще один тег #Стартап или сборка на коленке.
Я зачем-то взялась помочь собрать маленький MVP для очередного стартапа. На самом деле поток идей приходит со всех сторон нескончаемый, но в меня реально не влезает по времени делать что-то еще, помимо того, что я уже делаю. И если честно, я жалею, что согласилась, так как я бы лучше в учебу сейчас вложилась по времени и личным ресурсам. Минутка нытья закончена.
Блин, я со своими знаниями такого франкенштейна собрала, чтобы по-быстренькому. В одну репу закинула все - джангу, nginx, react. Прописала композ, для нджинкса сделала два конфига - локальный и для стейджа. Локальный берет фронт с npm run dev, а на стейдже уже статику использует. Аналогично с джангой. Вместо деплоя запилила мейк, который делает архив сборки и закидывает ее на инстанс через ssh, потом на инстансе распаковывает и запускает то, что надо запустить. Нет времени пилить норм деплой!
В самой джанге забила на DRF, все вью написала сама на базе пайдентик моделей. Нафиг мне свагер и прочие ништяки реста? Впервые потыкала в Django Channels, тоже взяв буквально лишь консьюмер и расписав свои обработчики для разных видов событий, хотя ведь можно было роунтинг использовать.
Если честно, то я творю откровенную дичь, и я это прекрасно понимаю. Совсем забила на какие-то лучшие практики и тп. Чисто код структурирую так, чтобы удобно было что-то дорабатывать. Но какая ж чертовская разница между тем, как и что я делала в начале пути и сейчас. На сколько ж проще и понятнее все это собирать.
Подумаю еще, но может в итоге сделаю этот репозиторий публичным, чтобы показать какую шизу можно накрутить вместо “правильного” стандартного пути.
Осталось UI добить и MVP будет готов. Фаундерши на выходных хвастались мне, что уже есть 2000 человек, которые хотят использовать этот продукт. Хехе, я запустила все пока на одном бесплатном инстансе на 1 гиг оперативки на все и лишь базу вытащила на другой бесплатный рдс инстанс. Вообще буквально заставила их завсти отдельный аккаунт на AWS, чтобы фритир юзать и не тратить деньги на это. Интересно, какое количество пользователей потянет и как быстро закончатся деньги на опен аи, когда они ко мне придут и скажут, а давай еще оплату прикрутим.
Так-то, с этим проектом и инвесторы не сильно нужны. Чисто раб-технарь, который будет реализовывать все их влажные фантазии. Типа меня, ага. Блин, не хочу быть рабом-технарем. ХД но вот она я >_<
Мне стоит открыть еще один тег #Стартап или сборка на коленке.
Я зачем-то взялась помочь собрать маленький MVP для очередного стартапа. На самом деле поток идей приходит со всех сторон нескончаемый, но в меня реально не влезает по времени делать что-то еще, помимо того, что я уже делаю. И если честно, я жалею, что согласилась, так как я бы лучше в учебу сейчас вложилась по времени и личным ресурсам. Минутка нытья закончена.
Блин, я со своими знаниями такого франкенштейна собрала, чтобы по-быстренькому. В одну репу закинула все - джангу, nginx, react. Прописала композ, для нджинкса сделала два конфига - локальный и для стейджа. Локальный берет фронт с npm run dev, а на стейдже уже статику использует. Аналогично с джангой. Вместо деплоя запилила мейк, который делает архив сборки и закидывает ее на инстанс через ssh, потом на инстансе распаковывает и запускает то, что надо запустить. Нет времени пилить норм деплой!
В самой джанге забила на DRF, все вью написала сама на базе пайдентик моделей. Нафиг мне свагер и прочие ништяки реста? Впервые потыкала в Django Channels, тоже взяв буквально лишь консьюмер и расписав свои обработчики для разных видов событий, хотя ведь можно было роунтинг использовать.
Если честно, то я творю откровенную дичь, и я это прекрасно понимаю. Совсем забила на какие-то лучшие практики и тп. Чисто код структурирую так, чтобы удобно было что-то дорабатывать. Но какая ж чертовская разница между тем, как и что я делала в начале пути и сейчас. На сколько ж проще и понятнее все это собирать.
Подумаю еще, но может в итоге сделаю этот репозиторий публичным, чтобы показать какую шизу можно накрутить вместо “правильного” стандартного пути.
Осталось UI добить и MVP будет готов. Фаундерши на выходных хвастались мне, что уже есть 2000 человек, которые хотят использовать этот продукт. Хехе, я запустила все пока на одном бесплатном инстансе на 1 гиг оперативки на все и лишь базу вытащила на другой бесплатный рдс инстанс. Вообще буквально заставила их завсти отдельный аккаунт на AWS, чтобы фритир юзать и не тратить деньги на это. Интересно, какое количество пользователей потянет и как быстро закончатся деньги на опен аи, когда они ко мне придут и скажут, а давай еще оплату прикрутим.
Так-то, с этим проектом и инвесторы не сильно нужны. Чисто раб-технарь, который будет реализовывать все их влажные фантазии. Типа меня, ага. Блин, не хочу быть рабом-технарем. ХД но вот она я >_<
👍6🔥4