Абьюзер СhatGPT 💄 REBORN
9.47K subscribers
318 photos
47 videos
56 files
164 links
ЕСЛИ БЕРЁТЕ МОИ ПРОЕКТЫ - УКАЗЫВАЙТЕ АВТОРА
Download Telegram
🖥 Зависимости в Python: как быстро навести порядок и почему это важно

Часто встречаю проекты, от заказчиков, которые стоит доработать, или просто на GitHub, где в requirements указывается просто библиотека, без конкретной версии. И часто из-за этого у конечного пользователя не получается запустить проект. Почему так?

Дело в том, что разные версии библиотек могут иметь разный синтаксис. Например, популярный aiogram, который используют для написания асинхронных телеграм-ботов, во всех версиях 2. имеет совершенно иные методы/функции, нежели в версии 3. И даже внутри одного поколения, к примеру, aiogram 3.7 и aiogram 3.18 - есть значительные отличия. К чему это ведет? Проект написанный на какой-то конкретной, актуальной версии библиотеки, может просто не "стартовать" у пользователя уже через полгода. Для неопытного/начинающего разработчика - это беда.


То есть, мы определили, что зависимости вида:

requests
aiogram
pillow


Это нормально в момент, когда вы разрабатываете проект, знакомитесь с актуальными библиотеками и используете методы/функции, которые представлены в них. Но если вы хотите передавать/распространять/выкладывать свой код в общий доступ, рекомендую выучить команду:

pip freeze > requirements.txt


🚀 Это - классика, быстро и грубо сохраняет все зависимости.

Есть и более чистый вариант через pip install pip-tools. Что нужно делать?:

1) Создайте (или активируйте) venv.
2) Установите инструмент:


pip install pip-tools


3) Напишите верхнеуровневые пакеты в requirements.in (те, которые без версий!).
4) Скомпилируйте замороженный список:

pip-compile requirements.in -o requirements.txt


👀 У этой команды также есть несколько опций:

- "--upgrade" - обновить всё до свежих допустимых версий
- "-P httpx" - обновить только httpx
- " --generate-hashes" - добавить SHA256-хеши для безопасности


5) После этого, выполните установку пакетов из сформированного requirements.txt:

pip-sync requirements.txt


pip-sync удалит лишние пакеты из venv и установит ровно те, что в файле.


Таким образом можно и разделять Prod и Dev инструменты, чтобы не тащить лишнее в продакшн. Создаете requirements.in - это прод зависимости и requirements-dev.in - инструменты для разработки. Типичное содержание такого файла:

-r requirements.in
pytest
ruff
mypy


То есть, включаем тесты и т.д., а также базовый requirements.in. Дальше компилируем и получаем два файла requirements.txt и requirements-dev.txt, с актуальными версиями, для разработчика и для продакшена:

pip-compile requirements.in -o requirements.txt
pip-compile requirements-dev.in -o requirements-dev.txt


🚀 При разработке, устанавливаем оба:

pip-sync requirements.txt requirements-dev.txt


Не рекомендую, кстати, смешивать prod и dev в один файл — тяжёлые и нестабильные билды получаются...

🤷‍♂️ Дальше разберем, pyproject.toml + lock (uv/Poetry/PDM) и почему стоит постепенно уходить от requirements.txt.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣15🤬3🤯1💔1🙊1
🖥 Короткий скрипт опишете, что изображено на фото:

from transformers import BlipProcessor, BlipForConditionalGeneration
import torch
from PIL import Image

processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-base")
model = BlipForConditionalGeneration.from_pretrained("Salesforce/blip-image-captioning-base")

image_path = "img_4.jpg"
image = Image.open(image_path)

inputs = processor(images=image, return_tensors="pt")

with torch.no_grad():
output = model.generate(**inputs)

description = processor.decode(output[0], skip_special_tokens=True)

print("Image description:", description)


requirements.txt:


transformers
torch
Pillow
Please open Telegram to view this post
VIEW IN TELEGRAM
🤬25👏9😐71
🖥 Зависимости в Python: как быстро навести порядок и почему это важно

Часто встречаю проекты, от заказчиков, которые стоит доработать, или просто на GitHub, где в requirements указывается просто библиотека, без конкретной версии. И часто из-за этого у конечного пользователя не получается запустить проект. Почему так?

Дело в том, что разные версии библиотек могут иметь разный синтаксис. Например, популярный aiogram, который используют для написания асинхронных телеграм-ботов, во всех версиях 2. имеет совершенно иные методы/функции, нежели в версии 3. И даже внутри одного поколения, к примеру, aiogram 3.7 и aiogram 3.18 - есть значительные отличия. К чему это ведет? Проект написанный на какой-то конкретной, актуальной версии библиотеки, может просто не "стартовать" у пользователя уже через полгода. Для неопытного/начинающего разработчика - это беда.


То есть, мы определили, что зависимости вида:

requests
aiogram
pillow


Это нормально в момент, когда вы разрабатываете проект, знакомитесь с актуальными библиотеками и используете методы/функции, которые представлены в них. Но если вы хотите передавать/распространять/выкладывать свой код в общий доступ, рекомендую выучить команду:

pip freeze > requirements.txt


🚀 Это - классика, быстро и грубо сохраняет все зависимости.

Есть и более чистый вариант через pip install pip-tools. Что нужно делать?:

1) Создайте (или активируйте) venv.
2) Установите инструмент:


pip install pip-tools


3) Напишите верхнеуровневые пакеты в requirements.in (те, которые без версий!).
4) Скомпилируйте замороженный список:

pip-compile requirements.in -o requirements.txt


👀 У этой команды также есть несколько опций:

- "--upgrade" - обновить всё до свежих допустимых версий
- "-P httpx" - обновить только httpx
- " --generate-hashes" - добавить SHA256-хеши для безопасности


5) После этого, выполните установку пакетов из сформированного requirements.txt:

pip-sync requirements.txt


pip-sync удалит лишние пакеты из venv и установит ровно те, что в файле.


Таким образом можно и разделять Prod и Dev инструменты, чтобы не тащить лишнее в продакшн. Создаете requirements.in - это прод зависимости и requirements-dev.in - инструменты для разработки. Типичное содержание такого файла:

-r requirements.in
pytest
ruff
mypy


То есть, включаем тесты и т.д., а также базовый requirements.in. Дальше компилируем и получаем два файла requirements.txt и requirements-dev.txt, с актуальными версиями, для разработчика и для продакшена:

pip-compile requirements.in -o requirements.txt
pip-compile requirements-dev.in -o requirements-dev.txt


🚀 При разработке, устанавливаем оба:

pip-sync requirements.txt requirements-dev.txt


Не рекомендую, кстати, смешивать prod и dev в один файл — тяжёлые и нестабильные билды получаются...

🤷‍♂️ Дальше разберем, pyproject.toml + lock (uv/Poetry/PDM) и почему стоит постепенно уходить от requirements.txt.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤬243👍1
Для работы использовал FFMPEG.

Как легкий пример для поста выше.

import os
import ffmpeg

class VideoToGifConverter:
def __init__(self, source_dir="video", target_dir="gif", frame_rate=2):
self.source_dir = source_dir
self.target_dir = target_dir
self.frame_rate = frame_rate
os.makedirs(self.source_dir, exist_ok=True)
os.makedirs(self.target_dir, exist_ok=True)

def get_video_files(self):
return [
file_name
for file_name in os.listdir(self.source_dir)
if file_name.lower().endswith(".mp4")
]

def convert_videos_to_gif(self):
video_files = self.get_video_files()
for video_file in video_files:
base_name = os.path.splitext(video_file)[0]
gif_file_name = base_name + ".gif"
input_path = os.path.join(self.source_dir, video_file)
output_path = os.path.join(self.target_dir, gif_file_name)
stream = ffmpeg.input(input_path)
stream = stream.filter("fps", fps=self.frame_rate)
stream = ffmpeg.output(stream, output_path)
ffmpeg.run(stream)

def main():
converter = VideoToGifConverter(source_dir="video", target_dir="gif", frame_rate=2)
converter.convert_videos_to_gif()

if __name__ == "__main__":
main()
🤬252🐳1🎃1💘1🙉1
🖥 В очередной раз прочитал комментарии гениев о том, что Python медленный, а С++ и Java - быстрые. Вероятно, люди не совсем еще понимают, в чем идея огромного количества языков программирования и что у каждого из них своя задача. Я же не идиот, что начал Python учить, зная могучий C++ (или мне просто нечего делать было?)

Давайте сравним на казуальной задаче: парсинг веб-страницы. Задача
- собрать все заголовки с главной страницы Wikipedia.

На Python для этого нужно использовать только: requests, BeautifulSoup. А вот на C++ придется по-мучится с libcurl и Gumbo-parser.

Что у нас получается на Python
? Буквально 7 строк. А вот, что получится для С++:

#include <iostream>
#include <string>
#include <vector>
#include <curl/curl.h>
#include <gumbo.h>

size_t write_callback(void *contents, size_t size, size_t nmemb, std::string *s) {
size_t new_length = size * nmemb;
try {
s->append((char*)contents, new_length);
} catch(std::bad_alloc &e) {
return 0;
}
return new_length;
}

void search_for_headers(GumboNode* node, std::vector<std::string>& headers) {
if (node->type != GUMBO_NODE_ELEMENT) {
return;
}

GumboTag tag = node->v.element.tag;
if (tag >= GUMBO_TAG_H1 && tag <= GUMBO_TAG_H6) {
GumboVector* children = &node->v.element.children;
for (unsigned int i = 0; i < children->length; ++i) {
GumboNode* child = static_cast<GumboNode*>(children->data[i]);
if (child->type == GUMBO_NODE_TEXT) {
headers.push_back(child->v.text.text);
}
}
}

GumboVector* children = &node->v.element.children;
for (unsigned int i = 0; i < children->length; ++i) {
search_for_headers(static_cast<GumboNode*>(children->data[i]), headers);
}
}

int main() {
CURL *curl;
CURLcode res;
std::string html_content;

curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://ru.wikipedia.org/wiki/Заглавная_страница");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &html_content);

res = curl_easy_perform(curl);
if (res != CURLE_OK) {
std::cerr << "Ошибка curl_easy_perform(): " << curl_easy_strerror(res) << std::endl;
}

curl_easy_cleanup(curl);
}

if (html_content.empty()) {
std::cerr << "Не удалось загрузить HTML." << std::endl;
return 1;
}

GumboOutput* output = gumbo_parse(html_content.c_str());

std::vector<std::string> headers;
search_for_headers(output->root, headers);

std::cout << "Найденные заголовки:" << std::endl;
for (const auto& header : headers) {
std::cout << "- " << header << std::endl;
}

gumbo_destroy_output(&kGumboDefaultOptions, output);

return 0;
}


Как видите, код на C++ требует:

- ручного управления зависимостями: нужно установить и слинковать библиотеки;
- более низкоуровневой работы: вы вручную настраиваете curl, пишете callback-функцию для сохранения данных;
- явного обхода дерева: вы рекурсивно обходите DOM-дерево, построенное Gumbo;
- ручного управления памятью: вы обязаны вызвать gumbo_destroy_output, чтобы избежать утечек памяти.

🚀 Задача одна, объем кода и время на выполнение - кардинально разные. На С++ это +- час, на Python - 5 минут. А в скорости работы при таком сценарии разницы нет. Я это к чему: у всех языков свои преимущества, назначения. Python не существует для того, чтобы на уровне ядра с ОС взаимодействовать. Он нужен, чтобы упростить разработку в типизированных сценариях, сделать ее быстрой и приятной.
Please open Telegram to view this post
VIEW IN TELEGRAM
😡25🔥9🤬62😢2😁1
🖥 Зависимости в Python: как быстро навести порядок и почему это важно

Часто встречаю проекты, от заказчиков, которые стоит доработать, или просто на GitHub, где в requirements указывается просто библиотека, без конкретной версии. И часто из-за этого у конечного пользователя не получается запустить проект. Почему так?

Дело в том, что разные версии библиотек могут иметь разный синтаксис. Например, популярный aiogram, который используют для написания асинхронных телеграм-ботов, во всех версиях 2. имеет совершенно иные методы/функции, нежели в версии 3. И даже внутри одного поколения, к примеру, aiogram 3.7 и aiogram 3.18 - есть значительные отличия. К чему это ведет? Проект написанный на какой-то конкретной, актуальной версии библиотеки, может просто не "стартовать" у пользователя уже через полгода. Для неопытного/начинающего разработчика - это беда.


То есть, мы определили, что зависимости вида:

requests
aiogram
pillow


Это нормально в момент, когда вы разрабатываете проект, знакомитесь с актуальными библиотеками и используете методы/функции, которые представлены в них. Но если вы хотите передавать/распространять/выкладывать свой код в общий доступ, рекомендую выучить команду:

pip freeze > requirements.txt


🚀 Это - классика, быстро и грубо сохраняет все зависимости.

Есть и более чистый вариант через pip install pip-tools. Что нужно делать?:

1) Создайте (или активируйте) venv.
2) Установите инструмент:


pip install pip-tools


3) Напишите верхнеуровневые пакеты в requirements.in (те, которые без версий!).
4) Скомпилируйте замороженный список:

pip-compile requirements.in -o requirements.txt


👀 У этой команды также есть несколько опций:

- "--upgrade" - обновить всё до свежих допустимых версий
- "-P httpx" - обновить только httpx
- " --generate-hashes" - добавить SHA256-хеши для безопасности


5) После этого, выполните установку пакетов из сформированного requirements.txt:

pip-sync requirements.txt


pip-sync удалит лишние пакеты из venv и установит ровно те, что в файле.


Таким образом можно и разделять Prod и Dev инструменты, чтобы не тащить лишнее в продакшн. Создаете requirements.in - это прод зависимости и requirements-dev.in - инструменты для разработки. Типичное содержание такого файла:

-r requirements.in
pytest
ruff
mypy


То есть, включаем тесты и т.д., а также базовый requirements.in. Дальше компилируем и получаем два файла requirements.txt и requirements-dev.txt, с актуальными версиями, для разработчика и для продакшена:

pip-compile requirements.in -o requirements.txt
pip-compile requirements-dev.in -o requirements-dev.txt


🚀 При разработке, устанавливаем оба:

pip-sync requirements.txt requirements-dev.txt


Не рекомендую, кстати, смешивать prod и dev в один файл — тяжёлые и нестабильные билды получаются...

🤷‍♂️ Дальше разберем, pyproject.toml + lock (uv/Poetry/PDM) и почему стоит постепенно уходить от requirements.txt.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤬17😡1
🖥 SeleniumBase для парсинга: мощнее и удобнее обычного Selenium

Парсить сайты на Selenium уже не считается практичным. Он медленней конкурентов. Единственное преимущество - это большое сообщество, которое делится опытом и поможет найти решение любой проблемы, практически. Но мой опыт показывает, что условный Playwright или DrissionPage быстрее, лучше справляются с задачами, где нужно "маскировать" автоматизацию.

👨‍💻 Но вот, доделывая один из "долгов", на той неделе познакомился с SeleniumBase. Если коротко, это надстройка над обычным Selenium, которая решает кучу проблем.

Чем SeleniumBase лучше?

- простой синтаксис;
- встроенная защита от бот-детекторов;
- автоматическое управление драйверами - не нужно вручную скачивать и прописывать пути к chromedriver;
- "умные" ожидания: Скрипт не упадет, если элемент не успел прогрузиться. SeleniumBase автоматически дождется его появления перед тем, как выполнить действие. Это делает парсеры намного стабильнее.


По сути, он упрощает код и помогает обходить защиту там, где обычный Selenium уже не справляется. Вот такой вот опыт.

P.S. жду стул и микрофон, не могу пока ТТ вести, скоро фулл-комбек. Прямо сегодня утром закрыл 3-х заказчиков, сегодня отпишу еще троим. Жизнь продолжается, по чуть продолжаем работу.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤬15🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
👀 Tesseractэто "движок" для оптического распознавания символов (Optical Character Recognition). Представьте, у вас есть картинка, скан документа или фотография с текстом. Tesseract умеет "читать" этот текст прямо с изображения и превращать его в обычный текстовый формат, который можно редактировать, копировать и искать по нему.

👁 Это проект с открытым исходным кодом, который изначально разрабатывался в Hewlett-Packard, а затем его подхватила и значительно улучшила компания Google. Сейчас это один из самых точных и мощных OCR-инструментов в мире.

👀 Ключевые возможности Tesseract:

- Поддержка более 100 языков: он отлично распознает не только английский, но и русский, украинский и многие другие языки.
- Новейшие технологии: с 4-й версии в нем используется нейронная сеть (LSTM), что значительно повышает точность распознавания, особенно для строк текста.
- Гибкость: он может работать с различными форматами изображений (PNG, JPEG, TIFF и др.) и выдавать результат в виде простого текста, PDF-документа с возможностью поиска, HTML и других форматов.
- Доступность и открытость: вы можете свободно использовать его в своих проектах.


Применений - масса. Используйте в своих проектах!

(Например, в приложении, о котором рассказывал сверху - он)


Вот официальный репозиторий.
Please open Telegram to view this post
VIEW IN TELEGRAM
12
📱 Мне было так лень постить шортсы, поэтому я сделал себе софт, который будет это делать за меня, фух.

Сам формирует видео название, описание, хештеги. Заполняет формы автоматически.

Все делается с ПК, с одного интерфеса, есть пресеты описаний и хеш-тегов, могу грузить пакетно с папки, ставить любое удобное мне время и не думать.

Кайф. Просто хвастаюсь, даю Вам идеи...
Please open Telegram to view this post
VIEW IN TELEGRAM
30😁3👌2
🖥 В очередной раз прочитал комментарии гениев о том, что Python медленный, а С++ и Java - быстрые. Вероятно, люди не совсем еще понимают, в чем идея огромного количества языков программирования и что у каждого из них своя задача. Я же не идиот, что начал Python учить, зная могучий C++ (или мне просто нечего делать было?)

Давайте сравним на казуальной задаче: парсинг веб-страницы. Задача
- собрать все заголовки с главной страницы Wikipedia.

На Python для этого нужно использовать только: requests, BeautifulSoup. А вот на C++ придется по-мучится с libcurl и Gumbo-parser.

Что у нас получается на Python
? Буквально 7 строк. А вот, что получится для С++:

#include <iostream>
#include <string>
#include <vector>
#include <curl/curl.h>
#include <gumbo.h>

size_t write_callback(void *contents, size_t size, size_t nmemb, std::string *s) {
size_t new_length = size * nmemb;
try {
s->append((char*)contents, new_length);
} catch(std::bad_alloc &e) {
return 0;
}
return new_length;
}

void search_for_headers(GumboNode* node, std::vector<std::string>& headers) {
if (node->type != GUMBO_NODE_ELEMENT) {
return;
}

GumboTag tag = node->v.element.tag;
if (tag >= GUMBO_TAG_H1 && tag <= GUMBO_TAG_H6) {
GumboVector* children = &node->v.element.children;
for (unsigned int i = 0; i < children->length; ++i) {
GumboNode* child = static_cast<GumboNode*>(children->data[i]);
if (child->type == GUMBO_NODE_TEXT) {
headers.push_back(child->v.text.text);
}
}
}

GumboVector* children = &node->v.element.children;
for (unsigned int i = 0; i < children->length; ++i) {
search_for_headers(static_cast<GumboNode*>(children->data[i]), headers);
}
}

int main() {
CURL *curl;
CURLcode res;
std::string html_content;

curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://ru.wikipedia.org/wiki/Заглавная_страница");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &html_content);

res = curl_easy_perform(curl);
if (res != CURLE_OK) {
std::cerr << "Ошибка curl_easy_perform(): " << curl_easy_strerror(res) << std::endl;
}

curl_easy_cleanup(curl);
}

if (html_content.empty()) {
std::cerr << "Не удалось загрузить HTML." << std::endl;
return 1;
}

GumboOutput* output = gumbo_parse(html_content.c_str());

std::vector<std::string> headers;
search_for_headers(output->root, headers);

std::cout << "Найденные заголовки:" << std::endl;
for (const auto& header : headers) {
std::cout << "- " << header << std::endl;
}

gumbo_destroy_output(&kGumboDefaultOptions, output);

return 0;
}


Как видите, код на C++ требует:

- ручного управления зависимостями: нужно установить и слинковать библиотеки;
- более низкоуровневой работы: вы вручную настраиваете curl, пишете callback-функцию для сохранения данных;
- явного обхода дерева: вы рекурсивно обходите DOM-дерево, построенное Gumbo;
- ручного управления памятью: вы обязаны вызвать gumbo_destroy_output, чтобы избежать утечек памяти.

🚀 Задача одна, объем кода и время на выполнение - кардинально разные. На С++ это +- час, на Python - 5 минут. А в скорости работы при таком сценарии разницы нет. Я это к чему: у всех языков свои преимущества, назначения. Python не существует для того, чтобы на уровне ядра с ОС взаимодействовать. Он нужен, чтобы упростить разработку в типизированных сценариях, сделать ее быстрой и приятной.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤬17👏82👍2🤔1
🖥 Короткий скрипт опишете, что изображено на фото:

from transformers import BlipProcessor, BlipForConditionalGeneration
import torch
from PIL import Image

processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-base")
model = BlipForConditionalGeneration.from_pretrained("Salesforce/blip-image-captioning-base")

image_path = "img_4.jpg"
image = Image.open(image_path)

inputs = processor(images=image, return_tensors="pt")

with torch.no_grad():
output = model.generate(**inputs)

description = processor.decode(output[0], skip_special_tokens=True)

print("Image description:", description)


requirements.txt:


transformers
torch
Pillow
Please open Telegram to view this post
VIEW IN TELEGRAM
🤬12🥰8🤯4🙉21🔥1😁1🤔1
🖥 Зависимости в Python: как быстро навести порядок и почему это важно

Часто встречаю проекты, от заказчиков, которые стоит доработать, или просто на GitHub, где в requirements указывается просто библиотека, без конкретной версии. И часто из-за этого у конечного пользователя не получается запустить проект. Почему так?

Дело в том, что разные версии библиотек могут иметь разный синтаксис. Например, популярный aiogram, который используют для написания асинхронных телеграм-ботов, во всех версиях 2. имеет совершенно иные методы/функции, нежели в версии 3. И даже внутри одного поколения, к примеру, aiogram 3.7 и aiogram 3.18 - есть значительные отличия. К чему это ведет? Проект написанный на какой-то конкретной, актуальной версии библиотеки, может просто не "стартовать" у пользователя уже через полгода. Для неопытного/начинающего разработчика - это беда.


То есть, мы определили, что зависимости вида:

requests
aiogram
pillow


Это нормально в момент, когда вы разрабатываете проект, знакомитесь с актуальными библиотеками и используете методы/функции, которые представлены в них. Но если вы хотите передавать/распространять/выкладывать свой код в общий доступ, рекомендую выучить команду:

pip freeze > requirements.txt


🚀 Это - классика, быстро и грубо сохраняет все зависимости.

Есть и более чистый вариант через pip install pip-tools. Что нужно делать?:

1) Создайте (или активируйте) venv.
2) Установите инструмент:


pip install pip-tools


3) Напишите верхнеуровневые пакеты в requirements.in (те, которые без версий!).
4) Скомпилируйте замороженный список:

pip-compile requirements.in -o requirements.txt


👀 У этой команды также есть несколько опций:

- "--upgrade" - обновить всё до свежих допустимых версий
- "-P httpx" - обновить только httpx
- " --generate-hashes" - добавить SHA256-хеши для безопасности


5) После этого, выполните установку пакетов из сформированного requirements.txt:

pip-sync requirements.txt


pip-sync удалит лишние пакеты из venv и установит ровно те, что в файле.


Таким образом можно и разделять Prod и Dev инструменты, чтобы не тащить лишнее в продакшн. Создаете requirements.in - это прод зависимости и requirements-dev.in - инструменты для разработки. Типичное содержание такого файла:

-r requirements.in
pytest
ruff
mypy


То есть, включаем тесты и т.д., а также базовый requirements.in. Дальше компилируем и получаем два файла requirements.txt и requirements-dev.txt, с актуальными версиями, для разработчика и для продакшена:

pip-compile requirements.in -o requirements.txt
pip-compile requirements-dev.in -o requirements-dev.txt


🚀 При разработке, устанавливаем оба:

pip-sync requirements.txt requirements-dev.txt


Не рекомендую, кстати, смешивать prod и dev в один файл — тяжёлые и нестабильные билды получаются...

🤷‍♂️ Дальше разберем, pyproject.toml + lock (uv/Poetry/PDM) и почему стоит постепенно уходить от requirements.txt.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤬16❤‍🔥32🔥1🤣1👀1
👨‍💻 У ребят, которые начали свой путь в разработки с помощью нейронок, наблюдается проблема, что они всюду используют SQlite. Особенно этим GPT болеет. Это не плохой проект, если проект у вас минорный. А вот для чего-то крупного - такая БД станет "слабым" местом в моменте, когда к ней будет поступать много запросов. Зависания, падения, долгое время ожидания - это не круто.

Кратко расскажу об альтернативах
👀, где и почему их лучше использовать. Чуть позже по каждой пройдемся подробнее:

1) SQLite

- Плюсы: Простая, быстрая, не требует отдельного сервера, встроена в Python.
- Минусы: Ограниченная поддержка многопоточности, не подходит для больших объемов данных.


🎯 Идеально для: Небольших проектов, мобильных приложений, тестирования.

2) PostgreSQL

- Плюсы: Мощная, расширяемая, поддерживает сложные запросы и большие объемы данных.
- Минусы: Требовательна к ресурсам, сложнее в настройке.


🎯 Идеально для: Крупных веб-приложений, систем аналитики, научных проектов.

3) MongoDB


- Плюсы: Гибкая схема данных, горизонтальное масштабирование, высокая скорость записи.
- Минусы: Ограниченная поддержка транзакций, не подходит для связанных данных.


🎯 Идеально для: Big Data, социальных сетей, IoT, контент-менеджмента.

4) Redis

- Плюсы: Очень быстрая (in-memory), подходит для кэширования и очередей сообщений.
- Минусы: Данные хранятся в оперативной памяти (ограниченный объем), риск потери данных при сбое.


🎯 Идеально для: Кэширования сессий пользователей, real-time аналитики, чатов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🤬3❤‍🔥1😁1🤣1
🚀 Скоро выложу вам ReelsMaker свой (собранный в .exe), с фикшенными багами, редизайном, возможность качать видосы с YouTube для обработки прямо в программе, поддежкой кодеков для обработки через видеокарты AMD/nVidia.

Также добавлена область предпросмотра, чтобы вы могли видеть, какое видео у вас получится в итоге, со всеми эффектами, обрезками, наложенным баннером и далее.

Обновил и темную, и светлую тему - теперь не колхоз.

Еще будет "частная версия", с авто-постингом по расписанию в YouTube, YT-reels, TikTok.
🔥30🤬187😎1
🚀 Появилась идея, очередная.

Что если создать закрытое сообщество, чат, из 5-6 человек. Сделать кастинг. Собес, тестовое задание. Что-то такое. Конечно, начать из 1-2...

Суть в следующем: у меня действительно много заказов в ЛС и от многих я отказываюсь за неимением времени. Я мог бы предоставлять Вам работу, следить за ее качеством, вносить правки перед финальной выдачей заказчику, если требуется. Средства делили бы как-то, 60/40, если хорошо и много работаете - 70/30 или даже 75/25.


Этим людям я мог бы также помогать с обучением, давать ресурсы для чего-либо, предоставлю свои серверы.

Выгода Вам - очевидная. У меня для рынка СНГ довольно высокие цены на работу, т.к. я привык работать на UpWork и Fiverr в свое время. Это будет для вас:

- отличный способ заработать. Возраст - не важен. Важны знания, навыки, компетенция, ответственность;
- заполните портфолио;
- получите опыт.


🔥 Мне выгода понятна также - около пассивный доход. Что думаете?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥46🤬5👍3
Media is too big
VIEW IN TELEGRAM
Код красивой "залипалки" (бесконечная анимация), которые часто размещают под нарезками из фильмов/видео в ТикТок\Shorts.

Скачать.

Если есть идеи как сделать лучше - пишите.
🤣7🦄1
two_claps_open-main.rar
7.4 KB
👀 Скрипт ловит два хлопка, на них можно настроить что угодно.

В проекте две реализации:

- открытие ДОТЫ2;
- запуск голосового ассистена Gemini (нужен API-ключ)
.

Забавно, можно найти применение.

⚙️ Как это работает:

В основе всего лежит технология обнаружения хлопков в реальном времени. Этот процесс реализован как в Python-скриптах, так и в прототипах на MATLAB:

- захват аудио: скрипты непрерывно слушают аудиопоток с микрофона с частотой дискретизации 44100 Гц. Аудио делится на короткие фрагменты (фреймы) длительностью 20 мс;
- фильтрация: хлопок имеет характерный частотный спектр. Чтобы отсеять посторонние шумы (голос, музыку, звуки улицы), каждый фрейм проходит через полосовой фильтр Баттерворта. Фильтр пропускает только частоты в диапазоне от 1400 Гц до 1800 Гц. К фреймам применяется оконная функция Ханна для сглаживания и уменьшения спектральных искажений;
- детекция пиков: в отфильтрованном сигнале скрипт ищет резкие всплески амплитуды (пики), которые превышают заданный порог (например, 0.2);
- защита от ложных срабатываний: Чтобы один громкий хлопок не был засчитан как два, установлена минимальная задержка между обнаруженными пиками — 0.2 секунды.


✍️ Отличный пример того, как можно объединить классические алгоритмы обработки сигналов для создания надёжного триггера и подключить к нему мощь современных нейросетей для выполнения осмысленных задач.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤬112🤔2👾1
Camera.rar
16.3 KB
В ТикТоке еще не показывал, сначала решил кинуть сюда. Интересный, как мне кажется, проект, который делает из Вашей веб-камеры камеру видео-наблюдения, которая отправляет уведомления в Телеграм.

Применение придумаете сами. Хочу сюда еще прицепить распознавание лиц. Тогда можно будет цеплять к электронному замку из Али и вешать в подъезде, чтобы открывать двери в квартиру. Но пока так.

В боте через инлайн-кнопки можно включать/выключать мониторинг, а также выбирать режим: фото или видео. Фото делает фото с камеры раз в 30 секунд, если обнаруежает в кадре человека/собаку (у меня есть пес, поэтому прицепил для прикола). Правда, собака распознается по принципу "не человек = пес". Точное определение можно докрутить, если нужно. Видео же пишется с момента, как человек попал в кадр, до момента как вышел. Само собой, распознается количество людей/собак в кадре.

Берите, допиливайте под свои нужды, знакомьтесь :)
🤬9❤‍🔥8🍌5😁21👍1
Вкатываюсь в новую область для себя. Скоро буду прямо полноценным full stack developer 😄. Видимо, на этой комбинации я и остановлюсь на ближайшее время.

Python + JS.

Если серьезно, это и есть сейчас моя цель - full-Stack разработка: Это классический сценарий. Python (с фреймворками типа Django, Flask, FastAPI) отлично подходит для бэкенда (логика сервера, работа с базами данных, API), а JavaScript — король фронтенда (интерфейс пользователя в браузере, интерактивность с помощью React, Vue, Angular или ванильного JS). Знание обоих позволяет создавать веб-приложения целиком, к чему я и буду стремиться.
36🤬4🔥2👏1🆒1
💥 Для разработчиков в Telegram может быть полезно - скрипт для парсинга ID всех доступных к покупке подарков 🎁 в ТГ, их ID.

import asyncio
from telegram import Bot

async def get_telegram_gifts(bot_token):
bot = Bot(token=bot_token)
gifts = await bot.get_available_gifts()
for gift in gifts.gifts:
print(f"ID подарка: {gift.id}, Эмодзи: {gift.sticker.emoji}, Размер файла стикера: {gift.sticker.file_size}, Стоимость: {gift.star_count}")



# Замените на токен бота!
bot_token = "ТОКЕН_АДМИН_КРАСАВЧИК"
asyncio.run(get_telegram_gifts(bot_token))


 pip install python-telegram-bot


🤔В дальнейшем можно использовать в своих проектах для авто-выдачи/выплаты/обмена подарков в Телеграм. Используйте, потому что интернет пока не пишет, как найти ID подарков в Телеграм)

P.S. пост со старого канала, но видел в обсуждениях, кому-то нужно было.
Please open Telegram to view this post
VIEW IN TELEGRAM
9😁1🤔1😭1