Задать вопрос
  • Какую технологию выбрать?

    vabka
    @vabka Куратор тега Веб-разработка
    Самое главное не указал:
    1. Для чего именно ты собираешь окружение? Для разработки или для прода?
    2. Что такое "веб-ресурсы пользователей"?
    3. Для чего тебе к этому подключаться по ssh и ftp? (для каждого нужно отдельное пояснение)
    4. Что подразумевает под собой словосочетание "возможность работать с ..."?
    5. Кто такие "пользователи"?

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

    Если тебе всё-таки именно виртуальные машины нужны, то тогда и бери виртуальные машины и настраивай их при помощи ansible.

    Если тебе нужны контейнеры, то бери k8s, но тогда уже придётся отказаться от 1,2 и частично 4 с 5, тк:
    1. Контейнеры не должны иметь состояние. Так что сразу отлетает п2
    2. Контейнеры должны быть изолированы, а по тому сразу отлетает п1 с доступом внутрь контейнеров
    3. Обновление зависимостей (например базового образа) требует пересборки и перезапуска контейнера
    4. Один контейнер - одно приложение. Не будет такого, что у тебя в одном контейнере будет всё что ты описал в п3 одновременно работать.
    5. Никаких "папок" для пользователей не будет. Но у каждого пользователя-человека вполне может быть своя учётка для доступа в кластер, чтобы в нём создавать свои ресурсы. При этом на уровне учётки можно запретить одному пользователю доступ к ресурсам другого пользователя например.
    Ответ написан
  • Как сделать multipart загрузку WebDaw php?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Можете подключить другие адаптеры и совместить работу WebDav с ними
    Например AWS S3
    https://flysystem.thephpleague.com/docs/adapter/aw...

    То есть работать внутри flysystem и перемещать файлы, если вам нужно
    Ответ написан
    2 комментария
  • Как присоединить только 1 запись в запросе?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Users::select(
        'users.*', 
        DB::raw("IF(exist (select * from admin where admin.user_id = users.id), 'admin', (select name from rank where score<=users.points order by score desc limit 1)) as rank"))
    ->get();
    Ответ написан
  • Как создать меню в вложенностью из одного массива?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Решение, но так-себе.. Идти по элементам, складывая их в массив-результат.
    Держать доп. массив референсов на последние элементы каждого из уровней.
    В нём находить очередного родителя подходящего уровня.
    Не забывать разрушать референсы.
    В общем, явно переусложнил.
    код
    $array = [
        ["TITLE" => "Тест 1", "LEVEL" => 1,],
        ["TITLE" => "Тест 2", "LEVEL" => 2,],
        ["TITLE" => "Тест 3", "LEVEL" => 2,],
        ["TITLE" => "Тест 4", "LEVEL" => 3,],
        ["TITLE" => "Тест 5", "LEVEL" => 2,],
        ["TITLE" => "Тест 6", "LEVEL" => 3,],
    ];
    
    const TITLE = 'TITLE';
    const LEVEL = 'LEVEL';
    const CHILDREN = 'CHILDREN';
    
    $result = [];
    $refs = [];
    
    foreach ($array as $item) {
        $level = $item[LEVEL];
    
        if ($level === 1) {
            $result[] = $item;
            $refs = [&$result[count($result) - 1]];
        } else {
            for ($i = count($refs) - 1; $i >= 0; $i--) {
                $parent = &$refs[$i];
                if ($parent[LEVEL] === $level - 1) {
                    if (!isset($parent[CHILDREN])) {
                        $parent[CHILDREN] = [];
                    }
                    $parent[CHILDREN][] = $item;
    
                    array_splice($refs, $i + 1);
                    $refs[] = &$parent[CHILDREN][count($parent[CHILDREN]) - 1];
    
                    unset($parent);
                    break;
                } else {
                    unset($parent);
                    continue;
                }
            }
        }
    }
    
    echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
    результат
    [
      {
          "TITLE": "Тест 1",
          "LEVEL": 1,
          "CHILDREN": [
              {
                  "TITLE": "Тест 2",
                  "LEVEL": 2
              },
              {
                  "TITLE": "Тест 3",
                  "LEVEL": 2,
                  "CHILDREN": [
                      {
                          "TITLE": "Тест 4",
                          "LEVEL": 3
                      }
                  ]
              },
              {
                  "TITLE": "Тест 5",
                  "LEVEL": 2,
                  "CHILDREN": [
                      {
                          "TITLE": "Тест 6",
                          "LEVEL": 3
                      }
                  ]
              }
          ]
      }
    ]
    Ответ написан
    Комментировать
  • Как правильно написать запрос при помощи Query Builder?

    Fragster
    @Fragster
    помогло? отметь решением!
    Предлагаю переделать структуру и денормализовать данные. При получении ачивки записывать в какую-то таблицу признак необходимости пересчета для пользюка, асинхронно пересчитывать по расписанию раз в минуту или с помощью очередей. Хотя если пересчет делается меньше условной полусекунды, можно и синхронно при получении ачивки это делать. Хранить топ три можно в виде json поля в той самой таблице (как и баллы). Каждый раз при обновлении страницы делать столько джоинов ради этого слишком накладно, очень большое соотношение read/write.
    Ну а получать это все не через query builder, а с помощью eloquent и отношений.
    Ответ написан
    2 комментария
  • Подойдет ли Docker для следующих задач?

    https://www.docker.com/blog/containers-are-not-vms/
    Докер предназначен для развёртывания приложений, а не предоставления доступа к виртуальным машинам.

    1) Возможность подключаться по ssh, ftp с любого ПК в одной локальной сети.

    Просто любой гипервизор. Хоть hyper-v, хоть vmware
    2) Возможность сделать копию текущего состояния и развернуть на другом ПК со всеми файлами БД и.т.д. (Не в текущей локальной сети)

    Как в п1. С докером такое сложно будет организовать.
    3) Возможность работать с nginx, apache, npm, php, python, mysql (это если выбрать докер, то чтобы все это было в одном контейнере)

    Запихнуть всё в один докер контейнер - это достаточно серьёзные пляски с шелл-скриптами будут.
    А на виртуалке элементарно.
    4) Быстрое обновление до последних версий вышеуказанных модулей. (Как у докера. Указал в конфиге версии и собрал контейнер по новой)

    sudo apt update && sudo apt upgrade

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

    rozhnev
    @rozhnev Куратор тега PHP
    Fullstack programmer, DBA, медленно, дорого
    <?php
    $search = "Диагональ 17,6";
    
    echo preg_replace(
    		'/(\d),(\d)/', '$1.$2', 
    		$search
    ); //Диагональ 17.6


    PHP preg_replace
    Ответ написан
    Комментировать
  • Как правильно настроить email рассылку в Laravel?

    @spaceatmoon
    Вам в любом случае надо использовать специализированный сервис доставки писем. Ваше количество попадает только под бизнес аккаунты. Выбирайте необходимый тариф и шлите сразу 1000 писем, здесь проблем нет.
    Ответ написан
    Комментировать
  • Как правильно настроить email рассылку в Laravel?

    JhaoDa
    @JhaoDa
    LaravelRUS Team
    1. Если ты делаешь рассылку не через сервисы типа Mailchimp, Sparkpost etc, а с ящика а-ля voron1999@gmail.com, то тебя забанят с вероятностью 99% даже за 10 писем.

    2. Некоторые упомянутые сервисы так же имею лимит типа «N писем в минуту» или «N адресов в копии».

    3. Ограничение из п. 2 решается механизмом rate limiting (есть в ларавел с 6.х) или поиском сервиса с большими лимитами или повышением лимитов за деньги/через поддержку.
    Ответ написан
    1 комментарий
  • Как правильно написать регулярку?

    |^/test/[^/]+/$|

    |/test/[^/]+/$|
    Ответ написан
    Комментировать
  • Как правильно написать регулярку?

    @yourbatya
    Разрабатываю разработки
    /^\/test\/.+\/$/
    Ответ написан
    Комментировать
  • Как правильно написать регулярку для nginx?

    @dodo512
    location ~ ^/(test/[^/]+)/test2/$ {
        return 301 /$1/;
    }

    Или

    rewrite ^/(test/[^/]+)/test2/$ /$1/ permanent;
    Ответ написан
    2 комментария
  • Как правильно получить дату?

    @mletov

    Я отправляю post запросом дату в формате: Thu Oct 01 2020 00:00:00 GMT+0400 (+04)
    Вывожу $_POST приходит: 2020-09-30T20:00:00.000Z
    Форматы меня устраивают, но проблема в том, что всегда вычитается 1 день на сервере.


    В данном случае не 1 день, а 4 часа, посмотрите внимательно на время.

    Сказывается разница в часовых поясах между сервером и клиентом
    Условно говоря, человек из Тбилиси с часовым поясом GMT+0400 (+04) отправляет данные на сервер с часовым поясом Дублина GMT+000 (+0). И по дублинскому времени это будет на 4 часа меньше. Но по факту это будет одно и то же время.

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

    Введите в гугле "convert datetime from one timezone to another php"

    2020-09-30T20:00:00.000Z - это формат ISO 8601

    Если конвертнуть 2020-09-30T20:00:00.000Z в дату, то будет 2020-09-30T23:00:00+03:00 (по Москве) или 2020-10-01T00:00:00+04:00 (по Тбилиси)

    Поиграйтесь с конвертером
    https://dencode.com/en/date/iso8601
    Ответ написан
    9 комментариев
  • Как правильно написать запрос к БД?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Ну приджойньте table2 трижды под разными алиасами и будет вам разом три коэффициента.
    В чем проблема-то?
    Ответ написан
    2 комментария
  • Как правильно написать запрос к БД?

    @AndryG
    Если я правильно понял вот это все нагромождение id :)

    select 
     a.userId,
     sum(k1.val * k2.val * k3.val) points 
    from aciv a
     join users on u.userId = a.userId  -- эта строка вроде как и не нужна, если нут других ограничений по users
     join kof k1 on a.kof1 = k1.id
     join kof k2 on a.kof2 = k2.id
     join kof k3 on a.kof3 = k3.id
    group by a.userId
    order by 2 desc
    limit 5


    Запрос будет тяжелый, ибо без пересчета всех данных нужные не определить.
    Ответ написан
    1 комментарий
  • Какую библиотеку можно использовать для изменения ФИО по падежам?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Ответ написан
    Комментировать
  • Как добавить папку в gitignore?

    @moonbow
    QA
    Попробуйте таким способом: в командной оболочке гита - git rm --cached app
    используется для удаления файла (в данном случаи папки app) из индекса, оставляя его при этом в рабочем каталоге
    Ответ написан
    Комментировать
  • Как импортировать каталог с ТП в бириксе?

    rpsv
    @rpsv
    делай либо хорошо, либо никак
    ТП не связываются с товарами, потому что изменился ИД самих товаров, поэтому привязок нет.
    Пройдитесь скриптом приведите в соответствия идентификаторы (насколько помню внешний код после импорта хранит ид оригинального элемента, но это не точно). Если там хранятся гуиды (обменивались с 1С), то еще лучше по ним проще сопоставить
    -
    А вообще надежнее SQL дамп переносить, если другой сервер "голый"
    -
    Как вариант еще посмотрите в сторону https://github.com/andreyryabin/sprint.migration , в новых версиях появился импорт элементов
    Ответ написан
    Комментировать
  • Как защитить get маршруты?

    @jazzus
    Если закрыть сам переход юзера по маршруту и просмотр json то сделать middleware isAjax c проверкой
    if (!$request->ajax()) {
     abort(404);
    }
    return $next($request);

    При попытке зайти отдаст 404. Но это не "защита" т.к. содержимое в network всегда есть в полном составе. Лучшая защита это отдавать только те данные, которые юзер видит на странице и не больше. Т.е. использовать API Resources, protected $hidden в моделях и точно составлять json ответ
    Ответ написан
    Комментировать
  • Как правильно получать данные через axios?

    Kozack
    @Kozack Куратор тега Vue.js
    Thinking about a11y
    А как вы объявляете errorsAxois ?
    Ответ написан
    8 комментариев