• Какой есть сервис-хостинг с API для загрузки аудиофайлов?

    Maksclub
    @Maksclub
    maksfedorov.ru
    AWS S3 от Amazon
    Space от Digital Oсean (совместим с AWS S3, кроме некоторых пунктов нет, по сути код можно от s3 sdk использовать)
    Yandex Cloud Object Storage (полностью совместим с AWS S3 и код не будет отличаться совсем, только разве ключи другие и работать будет только на ip российских)

    Google Cloud Platform Storage
    Ответ написан
    Комментировать
  • Можно ли как-нибудь защитить класс, свойства, методы и функции от "Reflection"?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Чтобы спрятать значение от возможности переопределить есть одно место...
    static переменная внутри функции
    Ответ написан
  • Почему fetch отдаёт 401 при JWT авторизации на сервер asp.net core web api?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Коротко при работе с лкоального хоста с доменом, который ограничивает CORS — настраиваете прокси (если ангуляр, есть из коробки возможность настроить), если реакт — погуглите как.

    Работает так:
    - запрос с фронта идет на прокс-сервер
    - прокси-сервер не делает запрос через браузер, а server2server
    - получает овтет и отдает фронту

    Например запрос на домен api.foo.com/users настраивается так, что запрос идет на localhost:3001/api/users, который под капотом проксирует весь запрос на api.foo.com/users
    Ответ написан
    2 комментария
  • Как запустить скрипт с середины в PyCharm?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Как запустить скрипт в PyCharm с любого места, а не только с начало ?


    Что поимаете с любого места? примерно так?
    ста, а не только с начало ?


    ну интерпретатор примерно поймет эти инструкции как я — никак и ошибется :)
    Ответ написан
    Комментировать
  • Как настроить nginx на отдачу статичных файлов из разных папок?

    Maksclub
    @Maksclub
    maksfedorov.ru
    listen 80;
    server_name site.local;
    root /src;
    
    location / {
            try_files $uri /index.html$is_args$args;
        }


    Отдает src/index.html, если по запросу не найден файл в /src папке

    например:
    /images/foo.jpg -> картинку (если лежит в src/images/foo.jpg )
    /maks/foo.jpg -> картинку (если лежит в src/maks/foo.jpg )
    /blablabla/foo.jpg -> /index.html (если НЕ лежит в src/blablabla/foo.jpg или даже нет папки src/blablabla)
    /index.html -> /index.html
    Ответ написан
  • Можно ли авторизоваться в гугл аккаунт не используя веб интерфейс?

    Maksclub
    @Maksclub
    maksfedorov.ru
    https://developers.google.com/identity/protocols/o...

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

    Maksclub
    @Maksclub
    maksfedorov.ru
    Лучше повесить докер и в нем сервисы держать — поможет поднимать/убивать без аффекта на весь сервер
    Юзера лучше одного, внутри докер-контейнеров все само будет резовлиться

    По части деплоя: пушите в гит
    Далее смотря какая система, если гитлаб, то на сервере нужно поставить гитлаб-агент, через который будете деплоить, если гитхаб — можно через GithubActions и плагины
    Удобно поставить деплоер какой-нибудь, с помощью которого будете таски на сервере запускать удаленно с хоста (в нашем случае из среды CI/CD), например capistrano, или deployer на php (простой, но им даже Баду пользуется)

    Отдельно рассмотрел бы вам что-то облачное, чтобы не админить руками сервер, например Хероку или Digital Ocean, они поддерживают простой деплой изнутри хостинга, просто направляя на репозиторий и при обновлении они сами подтянут изменения и перезапустят корректно контейнеры
    Ответ написан
    Комментировать
  • Как настроить nginx под статический сервер с автоматическим подбором страниц по существованию таких файлов?

    Maksclub
    @Maksclub
    maksfedorov.ru
    index index.html;
    root /app;
    
    location / {
            try_files $uri $uri/ /index.html =404;
    }


    Если файл есть в /app — отдаст, если нет — index.html
    Ответ написан
    2 комментария
  • API для создания изображений-карточек к публикациям?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Такое легко делается
    В свое время еще когда не программировал — легко сделал для блога своего на php

    На гитхабе посмотрите реализации по поиску test to image, text2image
    Почти все делают возможность задавать обложку, и центровка текста и лого/др картинки помещать.
    Ответ написан
    Комментировать
  • Как восстановить данные с контейнера при docker-compose?

    Maksclub
    @Maksclub
    maksfedorov.ru
    db:
            image: postgres:13
            ports:
                - "54321:5432"
            environment:
                - POSTGRES_DB=app
                - POSTGRES_USER=app
                - POSTGRES_PASSWORD=secret
            volumes:
                - ./.var/pg:/var/lib/postgresql/data
            healthcheck:
                test: PGPASSWORD='secret' psql -U app --command='SELECT 1'
                interval: 1s
                timeout: 2s
                retries: 5


    Тут секция volumes синкает все состояние БД в локальную папку ./.var/pg
    Ответ написан
    Комментировать
  • Как генерировать соурсы jOOQ, когда БД тоже в Docker?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Будет ли доступна БД при старте приложения, чтобы можно было сгенерировать соурсы для jOOQ?

    Если docker-compose, то можно healthcheck сделать и переподнимать, пока не будет доступно
    таже можно настроить переподнятие, если контейнер с приложением зафейлится... а если он при поднятии првоеряет переменные окружения, то будет фейл

    Пробовал следующие варианты - объявляю args внутри build. Пробовал через environment. А внутри pom.xml уже получаю значение переменной таким образом `${env.XXX}`

    у вас docker-compose есть?
    там можно в секции environments указать
    Ответ написан
    7 комментариев
  • Как организовать правильное взаимодействие контейнеров nginx, и node fronted (nginx virtual host), node backend (nginx reverse proxy)?

    Maksclub
    @Maksclub Куратор тега Веб-разработка
    maksfedorov.ru
    Стоит ли билдить фронтенд в контейнере, что очень хотелось бы, чтобы нода с зависимостями была изолирована от сервера?


    стоит

    фронт и бэк побить на разные репозитории, настроить каждому отдельный воркфлоу?


    лучше разнести, да, чтобы потом изменения фронта не тащили деплой фронта и наоборот, ну тут все и так понятно

    Может, вообще было бы разумнее всё в одном репозитории хранить, но сделать несколько dockerfile, docker-compose?

    это можно (иногда очень удобно, как в моем проекте, где всего бек сервиса и 1 фронт), но деплой и воркфлоу будут разные все равно

    Стоит ли вообще nginx в контейнер пихать, что тоже очень хотелось бы (при том, что я буду собирать его через make)?

    Да вполне, максимально близко к проду

    Как при этом перезапускать (и нужно ли) nginx в контейнере?

    Нжинкс сам не перезапускают, просто контейнер перезапустить
    Ответ написан
    Комментировать
  • Как правильно делать запросы в цикле?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    it depends

    • если запросы зависимые, то в цикле
    • если запросы можно выполнить "параллельно", то можно асинхронно сделать сразу все 4 запроса и подождать самый медленный


    например через multi curl, тогда все 4 запроса будут выполняться за время самого медленного из них, а не за сумму времени, удобно через Guzzle Async

    $promise1 = $client->getAsync('http://www.example.com/foo1');
    $promise2 = $client->getAsync('http://www.example.com/foo2');
    $promise3 = $client->getAsync('http://www.example.com/foo3');
    $promises = [$promise1, $promise2, $promise3];
    
    $results = GuzzleHttp\Promise\settle($promises)->wait(); // тут все результаты


    в обоих случаях не понятно, зачем таймаут, тк синхронно второй запрос начнется только ПОСЛЕ выполнения предыдущего, а в асинхронном варианте они просто выполнятся "одновременно" и вы получите результат сразу от всех запросов... таймаут ни к селу ни к городу
    Ответ написан
    1 комментарий
  • Как в Chi router обрезать префикс url?

    Maksclub
    @Maksclub
    maksfedorov.ru
    r.Get("/category", category.List)
    
    r.Route("/internal", func(r chi.Router) {
          r.Get("/category", category.List)
    })

    Не надо усложнять там, где не надо усложнять
    Если вы не зарегистрируете роут /internal/category, то хоть пообчищайтесь, этот роут не будет найден — то хэндлер для него не будет найден среди зарегистрированных
    Ответ написан
    1 комментарий
  • Как решить проблему X does not implement Y при работе с интерфесами?

    Maksclub
    @Maksclub
    maksfedorov.ru
    package main
    
    import "fmt"
    
    type RepositoryInterface interface {
    	GetSubrepo() SubrepoInterface
    }
    type SubrepoInterface interface {
    	HelloSubrepo()
    }
    
    func main() {
    	r := Repository{subrepo: Subrepo{}}
    	useRepository(&r)
    }
    
    // func touchRepository(c Repository) {
    func useRepository(r RepositoryInterface) {
    	sr := r.GetSubrepo()
    	sr.HelloSubrepo()
    }
    
    // ******************** Repository package ****************
    type Repository struct {
    	subrepo Subrepo
    }
    
    func (r *Repository) GetSubrepo() SubrepoInterface {
    	return &r.subrepo
    }
    
    type Subrepo struct {
    }
    
    func (sr *Subrepo) HelloSubrepo() {
    	fmt.Printf("hello subrepo\n")
    }
    Ответ написан
  • Как можно улучшить организацию дев окружения и деплоя при разработке библиотеки?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Данный вопрос не совсем относится к докерам или обновляениям папок через Шторм... а просто удобства с пакетом, который вы и саппортите

    Ошибки:
    - нужно писать тесты, чтобы предупредить ошибки :)

    Постоянные муки:
    - вообще, если библиотека супер-активно пишется и часто, то это немного отдаленно напоминает и нарушает принцип из чистой архитектуры "обращайтесь к стабильным зависимостям"

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

    Совет:
    сделайте не композер пакетом, а просто как сабрепозиторий, тогда любой из проектов просто как сабгит подтянет... при этом из каждого можно будет ее редактировать и не тянуть как вендор :) все равно она в рамках ваших репозиториев, зачем пакет? :)
    Ответ написан
    2 комментария
  • Как передать указатель на метод структуры в map?

    Maksclub
    @Maksclub
    maksfedorov.ru
    у вас расхождение типов methodPtr и методов

    скрин
    64864a9db60f0498967248.png
    Ответ написан
  • Как менять класс элемента html в зависимости от кнопок через ngClass?

    Maksclub
    @Maksclub
    maksfedorov.ru
    сделайте activeContact в компоненте
    при кнопке next меняйте активный this.activeContact = тут номер например активного таба, для активного таба добавляйте класс

    <div class="slaider_mobile">
    <ng-container *ngFor="let contact of contacts">
         <app-carousel 
               [class.contact_item]="true"
               [class.contact_item--active]="isActive(contact)"
    
               [title]="contact.title" 
               [text]="contact.text" 
               [img]="contact.img"
        ></app-carousel>
    <ng-container>
    </div>
    
    <button class="Slaider1_prev" (click)="prev()"  type="button"></button>
    <button class="Slaider1_next" (click)="next()"  type="button"></button>

    для класса .contact_item--active уже опишите стили

    в компоненте (код на коленке, плохой, на основании ваших данных):
    this.activeContact: Contact = this.contacts[0].title;
    
    isActive(contact: Contact): boolean {
         return contact.title === this.activeContact.titile;
    }
    
    next() {
         // ищем актуальный контакт
         const actualIdx = this.contacts.findIndex((c) => {
              this.activeContact.title === c.title;
         })
    
         // присваиваем следующий, или первый, если сейчас актуальный контакт — последний в списке
         const nextIdx = actualIdx + 1;
         this.activeContact = nextIdx === this.contacts.length - 1 
              ? this.contacts[0]
              : this.activeContact[nextIdx];
    }
    
    prev() {
         // ищем актуальный контакт
         const actualIdx = this.contacts.findIndex((c) => {
              this.activeContact.title === c.title
         })
    
         // присваиваем предыдущий, или первый, если сейчас первый из списка — к последнему в списке
         const prevIdx = actualIdx + 1;
         this.activeContact = prevIdx === 0; 
              ? this.contacts[this.contacts.length-1]
              : this.activeContact[prevIdx];
    }
    Ответ написан
    Комментировать
  • Какой тип обмена использовать в этом случае?

    Maksclub
    @Maksclub
    maksfedorov.ru
    да, fanout подходит, для каждого сервиса сделайте очереди, producer отправлят в exchange, а exchange раскидает по очередям сервисов
    Ответ написан
    Комментировать
  • Где хранить токены авторизации в браузере?

    Maksclub
    @Maksclub Куратор тега Веб-разработка
    maksfedorov.ru
    Ответ написан
    Комментировать