• Должен ли RESTful API возвращать 200 OK при запросе списка записей категории, если сама категория не существует?

    @Vitsliputsli
    Если 204, то тело должно быть пустое, следовательно нужно будет дополнительно обрабатывать код 204. Либо не писать дополнительную обработку, и сделать как автор и предположил. По-моему, нет смысла в погоне заиспользовать как можно больше http-кодов, усложняя код, пусть и незначительно.
    Касательно несуществующего ресурса, если он действительно несуществует как бизнесовая сущность, тогда 404. Если же мы просто не нашли подходящих строчек в базе, т.е. ресурс существует, но это пустой список, то удобнее ответить как и в предудущей ситуации.
    Ответ написан
    Комментировать
  • Как сокращенно записать условие в случае если значение не пустое?

    @Vitsliputsli
    Если someFunction возвращает bool, то
    if (someFunction(.....)) {
      doSomething();
    }

    Если не bool, то прописать условие.
    Ответ написан
    Комментировать
  • Есть ли смысл делить сеть на подсети, если она будет поделена на vlan-ы?

    @Vitsliputsli
    Если это физически одна сеть, делить на подсети смысла нет, ну может только ради широковещательных по ip. Найти машину хоть в своей, хоть не в своей не проблема.
    Если это сеть на обычных свитчах, вводить программно устанавливаемый vlan нет особого смысла по безопасности, только разве для приоритезации трафика.
    А вот если сеть с нормальными маршрутизаторами и они будут контролировать vlan, то да, это будет вполне безопасно.
    Ответ написан
    Комментировать
  • Ratchet WebSocket прошу посмотреть код с точки зрения нагрузки?

    @Vitsliputsli
    Проверьте, эмулируйте соединения.
    Скорее всего остановится в районе 1000. Тогда проверьте колво файловых дескрипторов на процесс. Либо увеличивайте их колво, либо запускайте несколько процессов, либо используйте другой язык.
    10к-20к - это много для одного процесса, если подразумевается, что они все одновременно ломанутся за подключением, то большинство будет долго ждать, и не секунды, а минуты.
    В коде логики практически нет, так что не должно из-за нее напрягаться. Хотя я особо не вчитывался, условия с неявными преобразованиями, ужасные названия переменных (типа $arrayCount[$items]) очень сильно мешают вникать.
    Ответ написан
    Комментировать
  • Почему возникает утечка памяти в php-fmp?

    @Vitsliputsli
    Утечка - это когда процесс не пользуется памятью, но и не высвобождает. По вашему описанию, php-fpm прекрасно использует память для других скриптов, а также высвобождает при необходимости. Т.е. это не утечка.

    Чтобы утечка проявила себя более явно установил memory_limit = 1G

    Выделение памяти операционкой это медленный процесс, поэтому при возможности выгоднее запросить побольше, вы выставили лимит в 1G, почему бы не зарезервировать сразу 18%.

    В общем, если без перезапуска php-fpm рано или поздно получите ошибку недостатка памяти, тогда можно будет говорить об утечке.
    Ответ написан
    6 комментариев
  • Как проверить, что прислан валидный отпечаток FingerprintJS?

    @Vitsliputsli
    Надим Закиров, никак, клиентские данные генерируются клиентом, а значит он может сгенерить все что ему вздумается. Если отправляемые данные будут генерироваться особым образом, то это лишь немного усложнит задачу, клиент сгенерирует и такие данные.
    Ответ написан
  • Как правильно организовать поиск по большому кол-во бд?

    @Vitsliputsli

    Есть несколько больших postgresql таблиц(по ≈ 1млн строк в каждой).

    Слейти их все в одну таблицу и не нужен вам никакой параллелизм.
    Ответ написан
    Комментировать
  • Как безопасно раздать пользователям веб-ресурс из частной сети?

    @Vitsliputsli
    1. Как раздать доступ к этому вебресурсу своим пользователям без установки "лишней мишуры" (типа VPN-клиента), чтобы от пользователя требовалось только перейти по ссылке в браузере.
    2. Как обезопасить подсеть организации от этого возможного вектора атак?

    Чтобы для пользователей подключение было прозрачно, чтобы не давать им креды от VPN, чтобы они не творили, что вздумается в этом VPN, а пользовтели с другой стороны в вашей сети, в любом случае нужен шлюз, который будет контролировать подключение. На нем:
    Запретите все входящие пакеты из подсети VPN по всем протоколам, кроме tcp (но не установление соединения), по icmp пусть отвечает только шлюз.
    Запретите все исходящие пакеты в эту сеть, кроме icmp и нужного ip по протоколу tcp на нужный порт (или даже протоколу http/https, если есть такая возможность).

    Есть ли решение элегантнее и проще?

    Проще, шлюз без форвардинга, на нем nginx как proxy. При желании и его можно закрыть от сети VPN.
    Ответ написан
    2 комментария
  • Как проверить параметр в объекте не нулл?

    @Vitsliputsli
    method_exists
    property_exists

    По-хорошему, объект определенного типа всегда должен иметь метод или свойство.
    Ответ написан
    Комментировать
  • Почему использование оператора '??' убирает ошибку об неопределенной переменной?

    @Vitsliputsli
    По мне так странное поведение, по логике оно должно обезопасить от index offset в массиве а не скрывать не определенные переменные

    Что в php, что в js, он делает одно и тоже, а именно проверяет, что левое выражение определено и отлично от null. Только вот в js, неопределено undefined бывает 2х видов, одно вызывает ошибку, а другое нет.
    Поэтому вся ваша логика строится на том, что вы так привыкли, при взгляде со стороны: 2 вида одного и того же, но с разным поведением - вот это действительно странно.
    Ответ написан
    Комментировать
  • Найти наиболее узкую* маску подсети для IP-адресов 1.2.3.4 и 5.6.7.8. *узкая маска – с максимально возможным префиксом подсети?

    @Vitsliputsli
    Все верно, если сомневаетесь откройте калькулятор для подсетей. Как и написано, считаете по битам, где начинаются изменения, получаем 5, а это и есть маска 248.0.0.0. Т.е. у нас подсеть 0.0.0.0/5
    Где первый адрес: 0.0.0.1 00000000.00000000.00000000.0000001
    Последний адрес: 7.255.255.254 00000111.11111111.11111111.11111110

    Быть может вы спутали маску с обратной маской, обратная здесь 7.255.255.255
    Ответ написан
    Комментировать
  • Откуда программа должна знать id для поиска обьекта c его помощью?

    @Vitsliputsli
    Именно поэтому поиск в бд возможен не только по id, но и по любому другому полю. Да и id необязательно суррогатен, он может быть натуральным, т.е. отображать идентификатор из реальной жизни.
    Ответ написан
    2 комментария
  • Как отправить сигнал из одного PHP процесса в другой без использования БД?

    @Vitsliputsli
    Все тоже как для любого процесса. Если это просто сигнал без данных, то можно использовать сигналы linux. Если нужно передавать данные, то разного рода сокеты tcp, udp, unix, web. Либо именнованные каналы-конвейеры linux.
    Если про специфичное, как уже сказали, есть shared memory.
    Все зависит от задачи, по вашим требованиям и запись в файл подойдет, если /tmp в оперативе.
    Ответ написан
    Комментировать
  • Калькулятор возвращает неправильный результат?

    @Vitsliputsli
    Для создания калькулятора самый простой и быстрый способ это перевести в обратную польскую нотацию и вычислять по ней. Это упростит парсинг в разы, и решит текущие проблемы. В том числе решит проблему разного приоритета операций.
    Ответ написан
  • Зависит ли производительность базы данных от количества записей?

    @Vitsliputsli
    Изменится, но не значительно. И дело не в сетевом лаге, это вообще другой вопрос, а в других расходах на запрос.
    Не понял, почему здесь пишут про использование/не использование индекса, в вопросе вы пишите про обращение по id, это надеюсь primary key, а значит в любом случае у нас поиск по этому индексу. Скорее всего как primary key вы используете число (int, bigint и т.п.), а значит у нас индекс BTree (с hash там вообще будет печально с производительностью). Сложность поиска по BTree - это log(n), где n - это порядок дерева. Только вот сложность и производительность не сильно коррелируют. Ведь когда вы будете менять высоту дерева это не просто обратиться к другому адресу в памяти, это нужно как минимум узнать загружена ли эта страница и получить ее адрес. Все это очень усложняет выбор дерева, теоретически не ответишь, нужно смотреть реализацию в MySQL.
    Ответ написан
    Комментировать
  • Как забрать все строки из таблицы?

    @Vitsliputsli
    Судя по слову current и доке, ваш $results - это итератор. Т.е. скорее всего, даже не нужно получать массив, просто идите foreach по $results, или используйте другие свойства итератора.
    Ответ написан
  • Получение запроса с php в python?

    @Vitsliputsli
    Передать данные на вход как аргументы запуска, либо прямо во входящий поток. Через внешнее хранилище, начиная с переменных окружения, заканчивая СУБД. Через отдельный канал, tcp, unix, web socket.
    Примерно так, с учетом как сформулирована задача. Потому как языки программирования это хорошо, но куда важнее как запускаются и работают процессы. И, если пишите не страшные костыли, то не нужно передавать весь массив post.
    Ответ написан
  • Как выглядит пример задачи по SCRUM?

    @Vitsliputsli
    Главное понять зачем вам Scrum, если потому что это "модно и молодежно", то тупо следуйте традициям. Как правило, Scrum внедряется именно для этого.
    Если же вам действительно нужно планироваться на некий интервал времени, т.е. бизнес должен быть уверен, что в большинстве случаев к концу спринта будет готов функционал, который был оговорен в начале спринта, то это правильный выбор.
    Если вам не принципиально четкое планирование на интервал спринта, то Scrum добавит лишь много накладных расходов, которые отсутствуют например в Kanban. С другой стороны, если вы не планируете краткие интервалы, то будет очень сложно проводить оценки для долговременного планирования.
    Все это лишь моя точка зрения, agile-coach продаст вам другое видение, но человек который не отвечает за результат, не входит в команду и бездумно внедряет лишь традиции приведет команду к краху. Scrum это про планирование, сам по себе он не увеличит производительность и стабильность работы проекты, но это дает любой Agile, подразумевающий что ваша команда самоорганизующаяся. Если же разработка только перекладывает вину на бизнес, тестирование на разработку, фронт на бек и т.д. все будет печально.
    пример

    Прям пример конкретный расписать очень затратно, но как некий базис, с опиcанием ошибок упрощения, пожалуйста.
    Product Owner (PO) заводит Epic для создания форума типа этого, с описанием нужного функционала (не обязательно ТЗ, достаточно функциональных требований).
    Проводится грумминг беклога проекта, не суть важно каким составом и как вы будете это делать, главное что в результате в беклоге проекта должны быть созданы Stories - это разбитый на подзадачи Epic, каждая Story - это законченная бизнес-ценность, т.е. никаких разработческих задач, только то, что можно будет "потрогать" бизнесу.
    Каждая Story должна быть оценена в Story Points (SP) (надеюсь, понятно, что SP - это не трудозатраты и не часы разработки). Декомпозиция на dev-задачи это уже развлекухи разработки, на доске Scrum они не нужны.
    "Страница логина пользователя" 3SP
    "Создание нового вопроса пользователем" 13SP
    "Отображение ленты вопросов для пользователя" 8SP
    "Создание ответов на вопросы" 8SP
    "Создание тегов-тем для вопросов" 21SP
    Следующий этап - планирование спринта. Зная velocity команды мы можем спланировать сколько задач поместится в планируемый спринт, разумеется задачи могут зависить друг от друга - это тоже надо учитывать. Например, при Velocity=30SP, мы можем взять в беклог спринта:
    "Страница логина пользователя" 3SP
    "Создание нового вопроса пользователем" 13SP
    "Отображение ленты вопросов для пользователя" 8SP
    Итого 24SP, остальные уже не помещаются. Здесь видно, что при velocity=24SP, задача в 21SP занимает почти целый спринт, это очень опасная ситуация. Когда у нас в спринте несколько десятков задач, то ошибка в их оценке может быть в плюс, а может в минус, в среднем одно другое компенсирует, а вот с нашим делением будут большие проблемы. Поэтому Story также нужно дробить сильнее, чтобы задач в спринте было много.
    На daily meeting кроме всего прочего не лишним будет смотреть на метрики спринта, одна из важнейших - график сгорания, отклонения в нем позволяют нам сделать вывод, что мы не успеваем реализовать все к концу спринта, а значит надо понять какие задачи не будут сделаны и предупредить бизнес. Стоит ли говорить, что если PO не появляется на ежедневных встречах и не следит за прогрессом, он не сможет вовремя скорректировать работу. Если PO не является реальным владельцем продукта и по каждому чиху будет брать время, чтобы уточнить у реального, то гибкость (agile) будет очень сомнительной.
    В конце спринта на проде у нас должны быть 3 вышепреечисленные задачи. Пользователь сможет зайти, создать вопрос и просмотреть созданные им и не только им вопросы. Т.е. вроде как мы доставили определенный бизнесовый функционал, но на MVP это не тянет, отвечать на вопросы еще нельзя, поэтому для использования проект не готов. Не всегда за 1 спринт получается выкатить MVP, но благодаря тому что мы уже чтото выкатили, на это можно посмотреть вживую и получить обратную связь с корректировками, а значит это agile.
    А далее, все тоже самое, регулярный грумминг, в начале спринта - планирование.
    Баги и неожиданные срочные задачи идут параллельным потоком, оценке подвергаются только business stories, т.к. важно сколько вы сделали бизнесового функционала в спринт. Поэтому баги нужно решать отдельно, крупные изменения в инфраструктуре отдельно, старайтесь это делать параллельно основным задачам в спринте, но кто-то прибегает даже к выделенным "техническим" спринтам.
    SP - это относительная величина, сравнивать их между командами бессмысленно, поэтому Velocity это тоже умозрительная эфимерная величина, она может меняться, подстраивайте ее исходя из того, сколько команда реально делает за последние спринты, а не год назад. Попытка улучшать производительность ориентируясь на Velocity печальна, как только мы вводим контроль на основе правильной метрики, метрика перестает быть таковой, поэтому введение KPI очень сложно и не везде осуществимо.
    Ответ написан
    Комментировать
  • Как работает блокировка в Postgresql?

    @Vitsliputsli
    Да, блокировка осуществляется только для выбранных записей, они блокируются до выполнения update. Пока они заблокированы, другие select for update skip locked их не увидят.
    Ответ написан
    Комментировать