Задать вопрос
  • Как реализовать веб-сервер и VLESS на одном VPS?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    а) Вариант 1 - использовать xray на веб портах и fallback на сайт.
    Вариант 2 - использовать веб сервер на веб портах и проксирование к xray например через websockets.
    Вариант 3 - использовать haproxy\nginx upstream proxy для проксирования сайта и xray по SNI.
    б) Веб сервер должен работать по 80 и 443 портам. Вне зависимости от количества виртуальных хостов.
    xray может работать на любом порту.
    Ответ написан
    1 комментарий
  • Что такое уровни абстракции в книге 'Чистый код' Мартина?

    @res2001
    Developer, ex-admin
    А мне это вообще не очевидно, ведь тут подразумевается, что в методе несколько уровней абстракции

    Тут не несколько уровней абстракции. Тут не хватает абстракций, а потому и возникает проблема.
    совершенно очевидно выполняет более одной операции

    Для данного примера очевидно, что "более одной операции" - это расчет выплат для разных типов сотрудников.
    А раз разные типы, то значит в этом методе, по мнению автора, не хватает абстракций для типов сотрудников.
    Об этом же говорит и способ решения проблемы, предлагаемый автором в следующем листинге - он предлагает применить полиморфизм, т.е. создать иерархию классов по типам сотрудников, которые будут наследоваться от абстрактного класса Employee и сделать "абстрактную фабрику", которая будет создавать объект нужного класса сотрудника в зависимости от переданного типа сотрудника. Тогда каждый дочерний класс сотрудника будет переопределять свой метод calculatePay только для своего типа. Вышестоящий код благодаря полиморфизму получит правильный расчет выплат для данного сотрудника без switch.
    Точнее в решении switch остается, но на уровне абстрактной фабрики, когда делается выбор какой объект сотрудника надо создавать. И это единственное место, где будет такой switch. Если же не использовать полиморфизм, то потенциально может существовать множество мест, где понадобится использовать switch по типам сотрудников.
    Ответ написан
    Комментировать
  • Откуда брать наборы данных для наполнения базы?

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

    + есть много разных провайдеров данных, чтобы не скраппить.
    Для игр: IGDB, Rawg
    Для фильмов, сериалов, телешоу: imdb
    Для аниме и манги: шикимори, myanimelist, mangadex
    Музыка: deezer, soundcloud, lastfm, openwhyd, spotify

    + некоторые сервисы могут не иметь прям api чтобы получить весь каталог, но зато может быть api, чтобы пользователь мог поделиться своими списками того, что ему понравилось (так точно умеет шикимори, myanimelist, spotify)
    Ответ написан
    Комментировать
  • Откуда брать наборы данных для наполнения базы?

    @Giperoglif
    сделать автокомплит из бд с автоматическим добавлением в неё отсутствующего значения. по типу как теги на пикабу, напмример. для начала пойдет.
    Ответ написан
    Комментировать
  • Как хранить настройки сайта?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Два базовых правила:
    1. Всё, что передаётся пользователю, он может увидеть.
    Если не хотите, чтобы пользователь что-то видел, просто не передавайте это на фронт. Отправляйте только то, что пользователю можно видеть.
    2. Всё, что приходит от пользователя требует проверки.
    Если вы не хотите, чтобы пользователь мог прислать на бэк недостоверные данные, просто не принимайте их без проверки.
    В обоих случаях, чтобы знать, что конкретному пользователю можно видеть и что он может прислать требуется аутентификация/авторизация как минимум для пользователей с повышенными правами.
    Ответ написан
  • Какой ИБП подойдет для raspberry pi (5)?

    Вариант раз:
    Обычный бесперебойник как для любой другой техники с инвертором до 220в и обычный блок питания в розетку.

    Вариант два:
    Также бесперебойник, но подключаться не через инвертор, а сразу к 12вольт через dc-dc преобразователь.

    В случае домашнего сервера это будет самый надёжный вариант.

    Очевидный вариант с повербанком откидываем, тк они не рассчитаны на такие сценарии:
    1. Может тупо не хватить тока
    2. Перегрев из-за длительной высокой нагрузки (ибо рассчитаны максимум на пару часов на полной мощности, чтобы зарядить телефон)
    3. Быстрый износ аккумулятора из-за того что мало какие повербанки предполагают постоянное нахождение на розетке с постоянным питанием устройства.
    4. Некоторые повербанки тупо не умеют одновременно заряжаться и питать другое устройство
    5. Они могут периодически отключать питание внешнего устройства

    Подробнее о разных кейсах можно на форуме почитать (есть ссылки на другие треды и разные решения)
    https://forums.raspberrypi.com/viewtopic.php?t=361748
    Ответ написан
    Комментировать
  • Как сохранить ноутбук зимой?

    @Refguser
    Решения для бизнеса: корп.сайты, ИМ, боты и пр.
    Имеет ли смысл отогревать ноутбук перед использованием

    Имеет.
    (в конденсат я не верю)

    конденсат - это не религия, а физика.

    ресурс аккумулятора кончился полностью

    Хотя результат тот же, но не "ресурс кончился", а ты убил банки раньше срока.

    Я ношу ноутбук в простом рюкзаке, после пары долгих прогулок

    Использовать ноут в качестве груза при прогулках? Хммм странный выбор.
    spoiler
    Иначе непонятно зачем гулять с компом. Его нужно максимально быстро переместить из одного места в другое


    Ах, да..
    Как сохранить ноутбук зимой?

    Не таскать по морозу. Не давать охлаждаться ниже 15С на продолжительное время.
    При необходимости переноски - сократить время и использовать термосумку/пакет.
    spoiler
    Можно положить рядом пластиковую бутылку с гор.водой.
    Ответ написан
  • Как вернуться из модуля обратно в main?

    Vindicar
    @Vindicar
    RTFM!
    Фигню творишь. Отношения между модулями должны быть строго односторонними - один модуль предоставляет сервис, другой его использует. В этом случае просто не будет необходимости в циклическом импорте.

    Если же у тебя более сложная ситуация, придётся выкручиваться. Например: main описывает бота, который используется модулем, который уже предоставляет сервис через этого бота. Тут ситуация усложняется телеботом, который не особенно пригоден для многомодульных ботов. Хотя есть приём, который можно сравнить с внедрением зависимостей.

    module1.py
    # бота передаём как параметр внутрь функции install_module
    # если у тебя будут другие глобальные ресурсы, скажем, соединение с СУБД, можно передавать их также
    def install_module(bot) -> None:  
        # да, мы описываем функцию прямо внутри другой функции. Так можно
        @bot.message_handler(commands=['some_command', ])
        def my_command(message):
            ...  # тут логика команды
    
        # и ещё одну...
        @bot.message_handler(commands=['other_command', ])
        def my_other_command(message):
            ...  # тут логика команды

    Тогда в main.py будет что-то вроде
    import telebot
    bot=telebot.TeleBot('TOKEN')
    # импортируем и активируем модуль
    import module1
    module1.install_module(bot)  # install_module() модуля должна вызываться строго однажды
    # модулей может быть несколько
    import module2
    module2.install_module(bot)
    # когда всё установлено, запускаем бота
    bot.infinity_polling()

    Идею можно развить таким образом: пусть твои модули лежат не рядом с main.py, а в подпапке modules. Тогда можно сделать что-то такое, чтобы автоматически подгрузить все модули из этой папки при старте бота.
    from pathlib import Path
    import sys
    import importlib
    
    import telebot
    
    bot=telebot.TeleBot('TOKEN')
    
    MAIN_DIR = Path(sys.argv[0]).parent.resolve()  # папка где лежит скрипт бота
    MODULES_DIR = MAIN_DIR / 'modules'  # лежащая рядом папка modules
    for item in MODULES_DIR.glob('*'):   # перебираем файлы и папки в папке modules
        # игнорируем папки и файлы, начинающиеся с _ или с .
        if item.name.startswith('_') or item.name.startswith('.'):
            continue
        # item - это имя пригодного для импорта модуля?
        if (item.isfile() and item.name.endswith('.py')) or (item.isdir() and (item / '__init__.py').isfile()):
            # да импортируем и активируем модуль
            module = importlib.import_module('modules.'+item.name)
            module.install_module(bot)
    
    # когда всё установлено, запускаем бота
    bot.infinity_polling()
    Ответ написан
    2 комментария
  • Postgres минимальная установка где взять?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега PostgreSQL
    Седой и строгий
    Но установка Postgres очень большая...

    PostgreSQL занимает около 185 Mb на диске, не требует установки и в стандартной конфигурации ему требуется для работы всего 128 Mb оперативной памяти, а в минимальной вовсе 8 Mb. Это одна из самых малотребовательных к ресурсам СУБД. Если надо ещё меньше и ваш скрипт будет работать в единственном экземпляре, можно посмотреть в сторону файловых СУБД, например SQLite.
    Ответ написан
    4 комментария
  • Как проверить наличие поля в JSON файле с помощью python?

    @Everything_is_bad
    Ну так сначала проверяй наличие поля, а потом только доставай, а не наоборот, хотя метод get позволяет это совместить. И зачем ты еще к str приводишь?
    Ответ написан
    Комментировать
  • Как поставить второй системой linux, на другой диск?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Самый оптимальный вариант - отключить все диски и оставить только тот, на который надо её поставить, а на самом диске удалить все разделы. И далее ставить новую ОС. После установки уже можно подключить все остальные диски и в биосе выставить загрузку с нужного диска. Если хочется иметь удобное загрузочное меню без биоса: лучшим вариантом будет отдельный загрузчик, раньше я юзал Acronis OS Selector и каждую ОС ставил со своим загрузчиком - т.е., диски с ОС самодостаточны и не зависят от других. Не знаю как он сейчас, но вроде его засунули в Acronis Disk Director. И еще один удобный вариант: после установки ОС надо в её загрузчик вручную добавить записи о других ОС и в загрузчиках других ОС тоже самое сделать. Таким образом будет возможность выбора с какого диска грузиться и в БИОСе/бут меню, и в загрузчике, а так же будет страховка на случай поломки ОС/загрузчика. А так же можно будет безболезненно удалить целиком любую ОСь и оставить нужную и она даже будет продолжать работать. В любом случае, надо ставить ОС так, чтобы её загрузка не зависла от других ОС и дисков.

    И добавлю, почему надо делать именно так, а не иначе и полагаться на разработчиков дистрибутива: у каждой ОС свой загрузчик и есть куча вариантов загрузки ОС и каждая ОС делает по своему. Например, установщик ОС может:
    • снести все разделы на всех дисках или любой рандомный раздел и навести свой порядок
    • просто перезаписать текущий загрузчик своим, игнорируя существующие ОС
    • перезаписать текущий загрузчик своим и, что бывает значительно реже, перенести конфигурацию текущего загрузчика в свой или часть конфигурации (ну версия там не та или еще что)
    • перезаписать текущий загрузчик своим и попытаться найти существующие ОС и добавить их в свою конфигурацию (бывает так, что находит остатки старых записей удаленных ОС, скрытые бэкапы и прочее)
    • добавить свою запись в существующий загрузчик
    • записать свой загрузчик на любой диск, а существующий отключить
    • не трогать существующий загрузчик и просто установить ОС без своего загрузчика


    А еще есть MBR, GPT, активные/пассивные разделы, составные диски и разделы, софтовые и железные RAID, BIOS, UEFI, NVME, SATA, SAS, USB, CD, сетевая загрузка (а тут еще Ethernet, WiFi, DHCP, PXE в линукс и винде), дисковые контроллеры, сетевые хранилища, плюс дикая фантазия разработчиков материнских плат и контроллеров и их прошивок. И вот это все может быть перемешано в разных вариациях с разными дикими фантазиями и еще более безумными результатами. Что точно гарантирует безразмерную кучу незабываемых ощущений в процессе. Так что очень, очень-очень рекомендую всегда ставить на один ПК все операционные системы независимо друг от друга со своими родными загрузчиками - лучше путь будет цепочка загрузчиков и запас, чем их не будет, когда одна из осей или дисков отправятся в электронный рай.
    Ответ написан
    Комментировать
  • Как определить что страница открыта в браузере Telegram?

    Noizefan
    @Noizefan
    WebView внутри приложения все равно сильно урезан от полной версии браузера
    задача проста:
    1) выявить расхождения
    2) определять их на стороне клиента
    https://abrahamjuliot.github.io/creepjs/
    вот тебе пачка расхождений
    Ответ написан
    Комментировать
  • Почтовое приложение android со встроенной синхронизацией?

    @Refguser
    Решения для бизнеса: корп.сайты, ИМ, боты и пр.
    Thunderbird ака K-9 Mail и ещё несколько аналогичных

    Так же можно найти что-нибудь на русторе
    Ответ написан
  • Не могу играть в некоторые игры по роутеру(МТС провайдер) на всех устройствах, а через мобильный интернет могу. Почему так?

    @ElxkoT
    Все в таких вопросах всё время сразу кричат про "ркн, сво, косяк провайдера" и забывают о том, что в любых проблем есть вполне конкретная причина. Если адрес серый, то белый адрес, через который вы фактически выходите в интернет, запросто может использоваться на весь дом, квартал или даже район. При таких вводных есть очень хорошая вероятность, что кто-то из ваших соседей в этих проблемных играх вёл себя не по-джентльменски и получил за это бан по IP, утащив за собой и всех своих соседей. Такое бывает довольно часто. Для теста попробуйте позвонить в техподдержку провайдера, объяснить ситуацию и попросить выдать вам новый адрес с другим NAT. Если такой возможности нет, можете для теста подключить себе белый IP, либо вырросить его временно, аргументируя тем, что иначе вынуждены будете поменять провайдера.
    Ответ написан
    Комментировать
  • Какая модель LLama лучше для использования в telegram?

    @rPman
    Какая? llama3-70b наилучшая из открытых (те что можно запустить у себя), или command r+. Так же хорошие открытые модели основанные на mixtral (mixtral-8x22b). llama3-8b тоже не плохая для своего размера (запустится на 8-16Gb десктопных видеокартах).
    https://chat.lmsys.org/?leaderboard

    Llama это модель, она ничего не может, это файл на диске. Для того чтобы модель работала тебе нужна программа, например с гитхаба официальный пример на python (он очень простой, там буквально 5-10 строчек)

    Не рекомендую прямо в боте telegram вставлять работу с gpt, т.е. это можно и даже будет работать но помятуя что у gpt высокие требования к железу (оперативная память) это будет не эффективно.

    Готовый сервер идет в поставке с llama.cpp (запросы api по http), он же умеет обрабатывать одновременно несколько запросов (по умолчанию 10 одновременных потоков кажется) так же есть возможность самому собирать запросы в пакет и отправлять одним запросом в сервер, он все обработает и вернет, и по скорости это будет быстрее чем каждый по отдельности (особенно когда работа на gpu).

    Программирование ботов gpt - это придумывание запросов на естественном языке, которые дополняются данными от пользователей или еще какими (например обычный запрос в классическую базу, вываливая в промп тупо текстом, к примеру csv форматом). У тебя ограниченное количество ресурсов, маленькое окно контекста (у llama это 8к токенов) и в попытке все туда уместить и приходится что то поверх городить. тупой пример - если ты будешь весь чат пихать в контекст, уже через 20-30 сообщений он переполнится, и нужно будет принимать решение что и как выкидывать.

    А еще llama любит отвечать лишнее, т.е. ты ее просишь ответь числом, а оно отвечает - ваш ответ 3... вот эти 'ваш ответ' нужно как то выявлять. А еще модели лучше работают, если просить их по рассуждать, она тебе даст рассуждения, тебе они нафиг не нужны, как из них результат вычленить? Иногда можно отделить мусор от ответа, попросив его дать в каком то формате, например дай ответ в формате json, а так как запрос к gpt это часть беседы в форме чата, можно дать часть ответа прямо в промпте, например "...assitent: {" тогда у модели не останется варианта как сразу фигачить json.

    Но чем больше ограничений ты даешь модели тем хуже ее качество ответов.

    У llama.cpp есть механизмы задания gramma формата ответа, какие токены предпочтительнее и в каком формате, говорят не идеально реализовано (например не получится задать варианты ответов списком слов типа отвечай только название цвета 'красный', 'зеленый', 'желтый', 'другое',..)
    Ответ написан
    Комментировать
  • Как отправить разные изображения для сообщений с одинаковым содержанием в Telebot?

    Vindicar
    @Vindicar
    RTFM!
    Тебе нужен автомат состояний (finite state machine, FSM). Не знаю, есть ли его реализация в комплекте с telebot, но идея простая: нужно помнить, что пользователь делал раньше, т.е. иметь хранилище ключ-значение вида "id пользователя -> состояние+доп. инфа". В простейшем варианте хватит и словаря (если тебе не критично, чтобы сведения переживали перезагрузку бота).
    Ответ написан
    Комментировать
  • Как запустить несколько фреймворков одновременно?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Никак, не надо смешивать мягкое с тёплым. Если хотите сделать два интерфейса, то делаете ядро приложения с API, web-приложение и gui-приложение, использующие API ядра. И все три запускаться должны отдельно.
    Ответ написан
    Комментировать
  • На вход программе поступает строка, как удалить из нее все символы "w" и "t"?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    v = ''.join([x for x in a if x not in 'wt'])
    Ответ написан
    Комментировать
  • Почему телеграмм бот не реагирует на часть кода?

    nki
    @nki
    bezkart.ru готовая система лояльности
    Потому что первым отрабатывает функция get_text_messages. Зачем вы сделали a_task, которая тоже должна реагировать на текст не понятно. Оставляйте одну функцию и в ней делайте ветвление в зависимости от введенного текста.
    Ответ написан
    Комментировать
  • Непонятные символы и как они получаются?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    https://www.w3schools.com/tags/ref_urlencode.ASP
    Update: для тех, кто в танке (https://www.ascii.ca/cp1251.htm):
    %C3 → Г
    %E5 → е 
    %EE → о
    %F0 → р
    %E3 → г
    %E8 → и
    %E9 → й
    Ответ написан
    2 комментария