Задать вопрос
  • Что выбрать 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 Куратор тега Информационная безопасность
    //COPY01 EXEC PGM=IEBGENER
    Как всегда :)

    Диск отформатировать (не "быстро"!), ось поставить заново, программы переставить, данные восстановить из бэкапа.
    Ответ написан
    Комментировать
  • Как устранить последствия шифровальщика 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
    Начни с обычных фильтров. Когда поймешь какой фильтр работает и дает эффект - то тогда сможешь оценить
    качество работы нейросетей. В противном случае получается что нейросеть что-то там сделала а как
    сделала - непонятно. В большинстве случаев людям достаточно убрать шум или фон или звукового сопровождения.
    Ответ написан
    Комментировать
  • Какой бесплатный мониторинг ресурсов (аналог zabbix agent) установить для vps linux ubuntu?

    paran0id
    @paran0id Куратор тега Linux
    Умный, но ленивый
    munin
    Ответ написан
    Комментировать
  • Можно ли (Как) установить модуль Golang из локального источника?

    @falconandy
    1. Можно включить вендоринг - тогда все зависимости будут размещены в подпапке vendor и при следующих сборках доступ в интернет не понадобится. go mod vendor
    2. Можно установить переменную GOPROXY так, чтобы исходники качались не через прокси proxy.golang.org, а через другой или напрямую с гитхаба. Environment variables
    3. Можно использовать уже скачанный локально репозиторий. replace directive in go.mod

    UPD: конкретно для go install можно попробовать п.2 с GOPROXY. Либо склонировать исходный репозиторий и собрать бинарник командой go build - для разрешения проблем с доступом к зависимостям воспользовавшись п. 1-3.

    UPD 2: по конкретно интересующему вас репозиторию: клонируете его, переходите в папку installer и выполняете в ней GO111MODULE=off go build, получите собранный бинарник - нет там никаких внешних зависимостей и даже go.mod
    Ответ написан
    1 комментарий
  • Почему aiohttp web сервер перестает отвечать на запросы?

    @Everything_is_bad
    По логам больше похоже на сетевые проблемы, а так, винда не лучшая ОС для aiohttp
    Ответ написан
    6 комментариев
  • Как удалить много строк (порядка 500.000) из csv файла в Python?

    @rPman
    csv не простой формат, строки в нем могут содержать разделители, ковычки и даже переводы на следующие строки. Поэтому рекомендуется работать с ним через библиотеки.

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

    По окончанию работы, если ошибок не будет, старый файл удаляешь (или переименовываешь его в xxx.bak) а новый переименовываешь под старым именем
    Ответ написан
    Комментировать