Задать вопрос
  • Как запушить проект webpаck на GitHub, но при этом не толкать все зависимости?

    yesbro
    @yesbro
    Думаю, помогаю думать
    Надо добавить папку node_modules в .gitignore

    Если файлы уже добавлены под контроль гит, то просто добавление этой папки в gitignore не поможет. Надо сперва удалить эти файлы, потом добавить папку в gitignore, а потом уже снова подтянуть зависимости.
    Ответ написан
    9 комментариев
  • Где и как хранить сообщения чата?

    yesbro
    @yesbro
    Думаю, помогаю думать
    Если бот будет не только считать статистику, но и модерировать, то хранить сообщения нужно. Его постоянно придется дообучать, вводить новые правила модерации. Истории сообщений очень поможет это новое тестировать.

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

    Если прочувствуешь, что упираешь в какой-либо потолок, то только тогда стоит задуматься о миграции на что-то более узкоспециализированное.
    Ответ написан
    5 комментариев
  • Какой ЯП подходит для производственного ERP?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Какой хочешь.
    Равнозначно

    UPD:
    Лично я, как предприниматель, бы делал выбор между C# / Java
    Причины:
    1. Сформированное, "взрослое" (mature) сообщество, которое может помочь
    2. Существуют проверенные/документированные фремворки
    3. Для общих случаев (настройка БД, создание диаграмм, документирование кода, какие-нибудь паттерны) уже есть удобные инструменты/фреймворки
    4. Рынок разработчиков большой
    5. Эти ЯП позволяют абстрагироваться от инфраструктуры или упростить работу с ней (управление памятью, вопросы ABI, версионирование, сборка и т.д.)
    Ответ написан
    1 комментарий
  • Как оптимизировать сервер на python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    как можно улучшить код, чтобы данные с сервера к клиенту предавались быстрее

    Я бы использовал следующее:
    - Асинхронность с Asyncio.
    - Сжимать аудио перед отправкой на клиент.

    Если я правильно понимаю, Вы используете новое соединение для каждого запроса? Может лучше постоянное?
    Ответ написан
    2 комментария
  • Что выбрать WP или Python+Django для сайта?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Короткий ответ (с учетом указанного ТЗ) - WP.

    Длинный ответ:
    публиковать страницы, создавать иерархию страниц, чпу url, какой то слайдер с картинками

    Учитывая типовое ТЗ, ответ - WP (все это уже реализовано, преимущественно бесплатно и в большом количестве).
    небольшое количество услуги в регионе

    Вы на старте выхода в интернет, предположу, что количество оказываемых услуг оффлайн - будет примерно равнозначно количеству оказываемых услуг онлайн, а значит производительность инструмента не первостепенна, ответ - WP.
    Нашли компанию, предлагает разработку сайта на WP или на Python+Django (дороже и дольше)

    Начнем с того, что это не равнозначные инструмент, ибо WP - это готовый движок/CMS для сайта + сам сайт (готовые шаблоны), развернул на хостинге и готово. А вот Django - это фреймворк, т.е. некий набор инструментов, да он позволяет сделать из него что угодно (ах*енно сделать (на правах отвечающего)), но потом. Соответственно, если вопроса в функционале и производительности не стоит (и предположу - сделать быстро) - выбираем WP, будет дешевле и быстрее.

    Что обычно я использую (от начального проекта к финальному):
    1. WP в стоке + сборка фронта (webpack) с оптимизацией + кэширование.
    2. Докупка железа и горизонтальное масштабирование п1 балансировщиком.
    3. Профилирование и переписывание определенных запросов под конкретные задачи в самом WP, обычно добавляет производительности в 2-3 раза (от wp там мало что остается, но ценник и сроки еще не такие, как в п4).
    4. Python + Django + кэширование (если нужно быстрее любого WP и более специфический функционал).
    5. П4 + FastAPI (если прям совсем прижало по производительности).
    Ответ написан
    6 комментариев
  • Ошибка при использовании grep на сервере?

    fzfx
    @fzfx
    18,5 дм
    У меня стойкое ощущение, что ваш греп залип на работе с каким-то устройством или FIFO-буфером. Можете попробовать добавить параметр --devices=skip, чтобы пропускать (игнорировать) всё, кроме файлов и симлинков.
    Ответ написан
    1 комментарий
  • Ошибка при использовании grep на сервере?

    Adamos
    @Adamos
    grep -R "Вечность" /dev/urandom
    grep, начиная с корня системы

    Не начинайте с корня, начинайте с тех мест, где реально надо искать. В корне куча виртуальных папок, примонтированные шары, блочные устройства... не надо в нем запускать команды с -R. Вообще не надо.
    Ответ написан
    5 комментариев
  • Как скормить звук python чтобы после его распознания выполнялось действие?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Без примеров такие абстрактные вопросы для ответа требуют целой лекции. Огромного количества догадок и большой индивидуально подготовленной для вас лекции по теме. Судя по постановке вопросв и комментариям у вас нет необходимых навыков программирования, чтобы начинать свою картеру программиста с такой задачи. Нужно освоить массу более простых вещей, терминологию, сделать несколько более простых и понятных проектов.

    На ваш вопрос было бы проще ответить, если бы вы привели в качестве примера звуки, на которые нужно сделать специфическую реакцию, продемонстрировали какие шумы (в худшем случае) могут накладываться на звук, а также звуки, которые похожи на требуемый, но недостаточно, чтобы программа реагировала на него, как на нужный.
    Тогда можно уже, вооружившись опытом и знаниями, поискать решение вашей проблемы.
    Может быть вам подойдёт сравнение фурье-спектров референсного звука и распознаваемого. Может быть достаточно реагировать на специфический ритм щелчков, а может быть придётся прибегнуть к смеси этих методов отфильтровав звуки в виде фурье-образов, а потом результат фильтрации выравнивать по фазе и сравнивать семпл-по-семплу с некоторой точностью.
    Может быть вас устроило бы дискретизировать звук после фильтрации и сравнивать их.

    В любом случае звук - это массив чисел длинной Частота_дискретизации*Длительность.
    Этот массив можно обрезать по тишине слева и справа, выровнять по уровню, оценить поместится ли в оставшийся фрагмент искомый звук. Потом нужно понимать, что оставшийся массив - это многомерный вектор. Он указывает в некий объём многомерного пространства. Какие-то сати этого пространства "похожи на некий образцовый звук", а какие-то нет. Нужно написать функцию, принимающую вектор и возвращающую число - степень похожести звука на образец. Это делается нормированием.

    Надо понимать, что к полезному примешивается обычно шум. Шумы имеют разные источники и их нужно уметь различать. Есть простой гауссовский шум, есть какие-то помехи и щелчки, которые будут соперничать с уровнями и частотами полезного сигнала.

    Изучать нужно по теме "Цифровая обработка сигналов", "сравнение звуков"
    Ответ написан
    3 комментария
  • Где найти сервис дающий ссылку на файл с расширением файла в конце (пример: https://**********.dat)?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Почему бы не использовать использовать какое-нибудь S3 хранилище?
    Ответ написан
    Комментировать
  • Какие программы есть для индексации и контекстного поиска в офисных файлах и файлах PDF?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    https://docfetcher.sourceforge.io/ru/index.html из фри,

    платные постоянно меняются, что-то когда-то мог Copernic
    сейчас он Copernic Desktop Search или чертишо, когда-то был поисковиком по всем поисковикам, в общем, что-то могут, но платный, хоть есть продажа на рутракере помоему
    Ответ написан
    1 комментарий
  • Как защитить postgresql в контейнере докера?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    база данных светится наружу в интернет

    Для чего? Почему просто не выставлять наружу порт?
    Ответ написан
    4 комментария
  • Почему не открывается страница на 3000 порту?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    - server.listen(port, hostname, () => {
    + server.listen(port, hostname, (error) => {
    +   if (error) {
    +     console.error(error);
    +   } else {
          console.log(`Server running at http://${hostname}:${port}/`);
    +   }

    Ну и проверьте, что порт не блокируется файрволом
    Ответ написан
    4 комментария
  • При каких обстоятельствах запущен данный процесс python-программы?

    leahch
    @leahch Куратор тега Linux
    3D специалист. Dолго, Dорого, Dерьмово.
    Посмотреть, что происходит с программой можно через lsof -p PID-процесса, если это линукс.

    Также можно через gdb подключиться к процессу - https://wiki.python.org/moin/DebuggingWithGdb
    и есть еще pyrasite https://gist.github.com/reywood/e221c4061bbf2eccea...

    PS. Если ничего не помогает, то можно воспользоваться strace -p PID
    Но в системе его желательно включить командой # echo 0 > /proc/sys/kernel/yama/ptrace_scope
    Ответ написан
    5 комментариев
  • При каких обстоятельствах запущен данный процесс python-программы?

    Vindicar
    @Vindicar
    RTFM!
    Я бы попробовал использовать аудит-хук.
    Многие функции питона генерят события аудита, на которые можно подписаться.
    Есть полная таблица событий для CPython, но тебя будут интересовать события типа subprocess.Popen, os.system, os.spawn, os.startfile, os.exec, os.fork и так далее.
    Внутри хука можешь попробовать вызвать traceback.format_stack() чтобы узнать текущий стек вызовов, и записать его в какой-нибудь журнал работы.
    import sys
    import traceback
    # хук который ловит событие импорта модуля
    def hook(event, args):
        if event != 'import':
            return
        name, filename = args[0], args[1]
        callstack = traceback.extract_stack(limit=None)
        print(event, name, filename)
        for item in traceback.format_list(callstack):
            print('    ', item.strip())
    
    sys.addaudithook(hook)
    
    import json
    
    print('Done')


    Это сработает только если процессы спавнятся средствами питона, а не каким-нибудь скомпилированным расширением.

    Также можешь поискать использование модуля multiprocessing, это тоже вероятный кандидат.
    Ответ написан
    1 комментарий
  • Кто нибудь применял или видел generics в серьезных Go проектах?

    Одно из самых полезных применений дженериков, которое у меня было — это написание врапперов, которые добавляют строгую типизацию в обработку чего-либо и уменьшают бойлерплейт. Например, обработка http-запросов. Обычно используется роутер и в него регистрируются хендлеры для разных путей, например:
    router := httprouter.New()
    
    router.POST("/api/products", productsHandler.Handle)
    router.POST("/api/get_free_slots", getFreeTimeSlotsHandler.Handle)
    router.POST("/api/create_visit", createVisitHandler.Handle)


    При этом, функция Handle у каждого хендлера это обычно что-то типа func(w http.ResponseWriter, r *http.Request)
    Хендлер уже внутри себя сам читает тело, парсит его из json, потом формирует ответ, итд.

    Хотелось добавить сюда типизацию и какую-то структуру, поэтому я написал
    простой враппер

    type Validatable interface {
    	Validate() error
    }
    
    func Wrap[Req Validatable, Res any](fn func(ctx context.Context, req Req) (Res, error)) httprouter.Handle {
    	handler := func(writer http.ResponseWriter, request *http.Request, _ httprouter.Params) {
    		writeError := func(statusCode int, err error) {
    			writer.WriteHeader(statusCode)
    			_, _ = writer.Write([]byte(err.Error()))
    		}
    
    		var req Req
    
    		bytes, err := io.ReadAll(request.Body)
    		if err != nil {
    			writeError(http.StatusBadRequest, err)
    			return
    		}
    
    		if err := json.Unmarshal(bytes, &req); err != nil {
    			writeError(http.StatusBadRequest, err)
    			return
    		}
    
    		if err := req.Validate(); err != nil {
    			writeError(http.StatusBadRequest, err)
    			return
    		}
    
    		resp, err := fn(request.Context(), req)
    		if err != nil {
    			writeError(http.StatusInternalServerError, err)
    			return
    		}
    
    		respBytes, err := json.Marshal(resp)
    		if err != nil {
    			writeError(http.StatusInternalServerError, err)
    			return
    		}
    		writer.WriteHeader(http.StatusOK)
    		_, _ = writer.Write(respBytes)
    	}
    
    	return handler
    }



    Он берет на себя весь бойлерплейт по парсингу и валидации запроса, формированию ответа, работы с кодами, итд. Причем, через стандартный errors.Is иногда добавлял сюда еще возможность из хэндлера указать врапперу, какой http-код ответа отдавать. Обычно все функции враппера делал под конкретную задачу в конкретном проекте (можно, например, не только json тела парсить, но и урл и хедеры, итд).

    Использование враппера выглядит так.
    Мы пишем хэндлер, используя конкретные типы

    type Handler struct {
    	userService *usersvc.Service
    }
    
    type Request struct {
    	UserID int64 `json:"user_id"`
    }
    
    func (c Request) Validate() error {
    	if c.UserID == 0 {
    		return errors.New("empty user id")
    	}
    	return nil
    }
    
    type Response struct {
    	Name string `json:"name"`
    	Age  int    `json:"age"`
    }
    
    func New(userService *usersvc.Service) *Handler {
    	return &Handler{userService: userService}
    }
    
    func (h Handler) Handle(ctx context.Context, req *Request) (*Response, error) {
    	user, err := h.userService.UserByID(ctx, req.UserID)
    	if err != nil {
    		return nil, err
    	}
    
    	return &Response{
    		Name: user.Name,
    		Age:  user.Age,
    	}, nil
    }



    Через dependency injection даем хэндлеру все источники данных, изолируем хэндлер в отдельном пакете, четко прописываем ему типы Request и Response, пишем валидацию для запроса. Открыв хэндлер, разработчик сразу видит его контракты, весь бойлерплейт во враппере, остается написать только логику.

    В итоге использование такого хэндлера+враппер выглядит так:
    getUserHandler := getuser.New(userSvc)
    
    router := httprouter.New()
    
    router.POST("/api/get_user", wrapper.Wrap(productsHandler.getUserHandler))


    Причем, тут даже не видно, что Wrap() имеет дженерик-параметры, потому что гошка самостоятельно выводит эти параметры из типов Request и Response из хэндлера и проверяет, что у Request есть метод Validate.

    Подобные дженерик-врапперы применял в нескольких разных задачах. Кроме обработки запросов еще была система для запуска фоновых джоб по обработке данных, нужно было положить джобы в один слайс, но при этом, чтобы контракты джоб были типизированы. Поэтому враппером приводил конкретные типы структур из джоб к более универсальному виду с типами в interface{}. Получилось, что и типы все на компиляции проверяются и могу положить все джобы в одну коллекцию.
    Ответ написан
    Комментировать
  • Как эффективно хранить и раздавать миллиарды мелких файлов?

    @hx510b
    "Я знаю, что ничего не знаю"
    В подобной задаче: у нас были сотни миллионов файлов мы их хранили на виртуальных дисках. Одна из причин такого подхода - это ограничение по inode и по iops.
    На низлежащей базовой файловой системе эти файлы не хранили, а только на виртуальных дисках.
    Таким подходом решались следующие проблемы:
    1. Cнимались проблемы с количеством inode
    2. Двигать виртуальные диски быстрее, т.к. копирование образа идет с наиболее эффективной скоростью, чем пофайлово. т.е. любые перемещения, перекладки, преобразование хранилища давались меньшей кровью.
    3. Делать резервное копирование проще с образами, чем с миллионами файлов.
    4. Если вдруг рухнет какая-то файловая система, то она может рухнуть, не утащив за собой все. да, мы попутно разделяли на разные блочные устройства. Чтобы доступ к одному блочному устройству не вешал всю систему.
    при это rootfs вообще лучше сделать маленьким и разместить в RAM. Надо сказать, что с разрушением фс на сторадже мы не сталкивались, несмотря на бутерброд: drbd -> ext4 -> loop image -> ext4
    5. За счет loop имиджей достигалась экономия пространства за счет оверселлинга: суммарные объем внутри виртуальных дисков мог быть равным или превышать объем низлежащего блочного устройства. Конечно за этим надо следить. Этому помогал zabbix и статичность хранимых файлов.
    6. Для прикладных приложений все оставалось обычными файлами. Не пришлось менять код.
    В момент создания этого проекта технологий было меньше чем сейчас, еще меньше было проверенных технологий. Все облачные масштабируемые хранилища слишком медленные и не дают прямого доступа к файлам.
    Поэтому использовали обычный набор:
    1. DRBD для сетевого зеркаливания между нодами.
    2. EXT3/EXT4 инициализированные с большим количеством inode.
    3. loop images - штатная возможность создания блочных устройств в файлах.
    4. sparse files - технология пропуска пустых блоков внутри файла.
    5. обычные symlinks.
    Несмотря на некоторую сложность в начале, подход себя оправдал.

    По монтированию все выглядит примерно так:
    root /
    +- block device ext4
    +- block device ext4
    +- block device ext4
    ...

    Внутри каждого блочного устройства block device ext4:
    vdisk0.img
    vdisk1.img
    vdisk2.img
    ...

    Монтируются они все в каталоги в дерево виртуального хранилища:
    /virtstore
    +- virtfolder0 
    +- virtfolder1 
    +- virtfolder2
    ...

    За счет древовидной структуры каталогов, симлинков получали более менее пригодную схему для работы
    Что еще можно сделать:
    1. для миллионов мелких файлов можно в образе диска использовать btrfs со сжатием. для доступа только на чтение получается серьезная экономия по месту. но только в режиме чтения. при перезаписи плотность "упаковки" падает.
    2. для интенсивной записи нужно разнести запись на разные блочные устройства. Чем больше физических блочных устройств, тем легче расшить узкие места по нагрузке и получить приемлемую производительность всей системы.

    Для примера, команды для работы:

    Создаем sparse имидж на 850 гб
    dd if=/dev/zero bs=1M seek=850000 count=1 of=/path/to/image.img

    либо
    truncate -s 850G /path/to/image.img

    Инициализация ФС:
    mkfs.ext4 -m 0 -O dir_index -O resize_inode -t ext4  /path/to/image.img

    Монтируем имидж:
    mount -o loop /path/to/image.img /path/to/mount/point/

    Для ускорения работы, монтировать лучше с оптимизированным параметрами монтирования, например:
    rw,nosuid,nodev,noatime,nodiratime,strictatime
    Соответственно такие образы можно монтировать, размонтировать, копировать и двигать. Можно уменьшать и увеличивать размер такого образа.
    Ответ написан
    Комментировать
  • Как устранить последствия шифровальщика blackbit?

    CityCat4
    @CityCat4 Куратор тега Информационная безопасность
    Жил да был черный кот за углом...
    Как всегда :)

    Диск отформатировать (не "быстро"!), ось поставить заново, программы переставить, данные восстановить из бэкапа.
    Ответ написан
    Комментировать
  • Как устранить последствия шифровальщика blackbit?

    @kalapanga
    Если сомневаетесь, что вирус полностью устранили, то систему переустановить.
    Зашифрованные файлы из резервной копии восстановить.
    Ответ написан
    Комментировать
  • Как эффективно хранить и раздавать миллиарды мелких файлов?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    условно, xml логи

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


    Раздача статики (условно, пользовательские файлы... к примеру, картинки — коих уже 2+Тб)

    Использовать специализированное файловое хранилище с БД и многуровневым кэшированием и соответствующей ФС. RAM - NVME - HDD. Конкретные решения не подскажу, к сожалению. Хм, а вот тут интересный тред про недостатки и особенности MinIO и судя по которому, в вашем случае оно может не подойти. Из треда:

    HDDimon:
    Так в итоге какое объектное хранилище вы выбрали? Ванильный hdfs?

    onyxmaster:
    MongoDB GridFS

    HDDimon:
    Если не секрет какой кластер и какой объем файлов храните? Какая fs?

    onyxmaster:
    Объём не очень большой, "чистый" около 150ТБ, чуть больше миллиарда объектов. Работает поверх XFS.


    В целом же, рекомендую сделать декомпозицию решения на более простые задачи и разделить нагрузку по разным типам данных на специализированные решения.
    Ответ написан
    Комментировать
  • Есть ли свободные нейросети улучшающие качество звука?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Начни с обычных фильтров. Когда поймешь какой фильтр работает и дает эффект - то тогда сможешь оценить
    качество работы нейросетей. В противном случае получается что нейросеть что-то там сделала а как
    сделала - непонятно. В большинстве случаев людям достаточно убрать шум или фон или звукового сопровождения.
    Ответ написан
    Комментировать