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

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Давайте определим точную границу, где проходит увеличение объёма потребляемой памяти. Это 33554432 элементов.
    3355443210 = 200000016
    Поищем предыдущий скачок. Он происходит на 16777216 элементах.
    1677721610 = 100000016
    Проверим дальше. Получим следующие значения:
    838860810 = 80000016
    419430410 = 40000016
    209715210 = 20000016
    104857610 = 10000016
    ...
    810 = 816
    Вывод - PHP резервирует память округляя количество элементов вверх до ближайшей степени двойки.
    Ответ написан
    1 комментарий
  • Существует ли библиотека для трансляции php кода в node.js?

    neuotq
    @neuotq
    Прокрастинация
    Технически сам язык конечно же можно перевести в другой, я думаю даже простенькие функции будут работать.
    НО! Дальше будет куча но. Обычной трансляцией не обоёдешься, так как много подводных камней и особенностей самого API PHP, принципов работы многих встроенных библиотек, хаков, костылей и просто приёмов которые используют люди в своих проектах и тп.
    В таком огромном и сложном проекте как Wordpress этого всего просто нереальное количество.
    Вы же понимаете часто даже код больших проектов, в рамках одного языка(любого) тяжело переводить с версии на новую версию. А тут на другой язык/платформу исполнения кода.
    Это в любом случае ручной труд, а автоматический транслятор вам только будет помогать переводить конкретные конструкции, а так огромное количество ручного труда для каждого файла/класса/функций и тп.
    Технически это возможно, но займёт огромное количество человека-часов, легче с нуля написать.
    Второй вариант найти решение с условной виртуальной машиной, которая исполняет php код внутри js окружения. Были когда-то подобные пакеты, но спроса нет и всё заглохло. Это тоже трудоёмкий процесс, нужно бежать и развивать свою такую штуку.
    Поэтому сегодня есть только условные прокси на node.js, которые запускают php скрипты на php(тем или иным способом, но исполняет их именно php).
    Поэтому мы приходим к технологии WebAssembly, там есть например проект wasmer, с помощью которого можно запускать wasmer-php. Но снова таки, это не трансляция кода, а просто запуск php в среде браузера, js тут уже чисто для управления и запуска самого wasmer...
    Ответ написан
    Комментировать
  • Как реализовать страницу для тестирования учеников?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Здравствуйте!
    Во-первых, непонятно в каком объеме у вас на данный момент реализовано текущее приложение на Spring.

    Сайт на подобие визитки.

    И вообще странно, что если это просто сайт-визитка, то зачем она писалась на Spring + VueJS. Там банально CMS WordPress хватит с лихвой. Ну в крайнем случае можно было взять рнр фреймворк (Yii2, Laravel) - обошлось бы дешевле для школы)

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


    1) Эндпоинты для ЛК учителя и ученика должны быть разными.
    2) Эндпоинты аутентификации учителя и ученика тоже можно сделать разными.
    3) Тестирование бывает разным. Нужно для начала разобраться с тем, какое тестирование вам нужно и как его можно реализовать.

    Например, есть тестирование при котором проверяется правильность выбранного ответа. Т.е. пользователь выбрал ответ "а" и соответственно, проверяем корректный ответ, хранимый в БД. Этот тест можно усложнить тем, что каждый раз при прохождении теста изменять местами варианты ответов, чтобы ученики не запоминали ответы по буквам.

    Другой вид тестирования, когда каждому ответу присваивается определенный балл. Далее высчитывается набранная сумма и выдается ему некий результат (часто встречается в психологических тестах).
    Иной вид тестирования, когда проверяется количество выбранных ответов варианта "А", "В" и т.д. Т.е. пользователь выбрал "А" - 5 раз, "В" - 2 раза. И если например, А < 5 и B >2, то отдаем один результат, иначе другой и т.д.

    4)
    Особенно как лучше сделать саму логику обработки ответов и последующую их проверку?

    Например, по мере прохождения теста формируем массив ответов и записываем их в LS, чтобы в случае чего не потерять данные. Затем по сабмиту "отправить на проверку" отправляем массив на сервер и перебирая ответы сравниваем их со значениями в БД. Если предусматривается возможность изменение варианта ответа для того или иного вопроса, то при изменении ответа, вносим правки в массив и сохраняем LS.

    Как реализовать страницу для тестирования учеников?

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

    Либо попробуйте поискать готовые решения, которые потом можете встроить в сайт. Правда, не самое лучшее решение.
    Например, https://www.classmarker.com/online-testing/how-to-...
    https://quiz.proprofs.com/how-do-i-embed-a-quiz-on...
    https://www.riddle.com/blog/embed-online-quizzes-site/
    Google

    В общем, все зависит от ваших навыков программирования, от бюджета, от сроков и т.д.
    Самое быстрое решение возможно, использование CMS с готовыми плагинами.
    Например, WordPress + плагины
    https://ru.wordpress.org/plugins/quiz-master-next/
    https://ru.wordpress.org/plugins/wp-quiz/
    https://www.wpbeginner.com/showcase/best-quiz-plug...
    https://ru.wordpress.org/plugins/hd-quiz/
    https://ru.wordpress.org/plugins/quiz-maker/
    Google

    Для более объективного ответа нужно больше данных.
    Ответ написан
    2 комментария
  • Почему мелкие вставки в базу дают максимум 4мб/с на ssd?

    @vitaly_il1
    DevOps Consulting
    Два направления:
    1) innodb_flush_log_at_trx_commit=0 или 2 (https://dev.mysql.com/doc/refman/8.0/en/innodb-par...) и прочие базисные настройки
    2) bulkinsert как уже сказали и т.п., см. https://medium.com/@benmorel/high-speed-inserts-wi...
    Ответ написан
    1 комментарий
  • Как лучше верстать сайты с векторными элементами?

    Get-Web
    @Get-Web Куратор тега CSS
    Front-End Developer
    Если не лень, то можно сохранить каждую фигуру отдельно(желательно в svg) и позиционировать на фоне, таким образом у фигур будет плавающая позиция и на других экранах можно перестроить по другому, убрать половину на мобильных и т.д.. выглядеть это будет примерно так :
    background: url(../images/other/decor-figure-1.svg) no-repeat 53% 6%,
                url(../images/other/decor-figure-2.svg) no-repeat 45% 22%,
                url(../images/other/decor-figure-3.svg) no-repeat 82% 22%,
                url(../images/other/decor-figure-4.svg) no-repeat 45% 96%,
                url(../images/other/decor-figure-5.svg) no-repeat 83% 82%
    Ответ написан
  • Как работает DNS хостинг?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    Для поддержки любой DNS зоны стандартно нужно иметь минимум 2 DNS сервера с этой зоной.
    Если управление зоной делегировано на эти сервера, никто кроме них не сможет ответить на запросы о DNS записях в этой зоне.
    На DNS серверах уровнем выше будут только записи, куда делегирована ваша зона и все.

    И будьте добры, расставьте знаки препинания и поправьте ваш текст - он трудночитаем и понять его сложно.
    Ответ написан
    9 комментариев
  • На что можно переехать с сервиса 3D для товаров?

    @rPman
    такое вращение это просто набор из статичных картинок (именно это по ссылке), если они у вас есть, не нужно ничего особого разрабатывать, кода минимум.

    Статика не создает никакой нагрузки на сервер (она минимальна, только сетевой трафик) поэтому уходите от готовых решений на свои
    Ответ написан
    4 комментария
  • Почему не работает \Bitrix\Iblock\ElementTable::update?

    В ядре убрана возможность использовать операции добавления/удаления/обновления для элементов ИБ (таблица \Bitrix\Iblock\ElementTable) через ядро D7. При обновлении элемента ИБ нужно довольно много данных в других таблицах менять (поисковые индексы, фасеты и т.д.). Поэтому в коде bitrix/modules/iblock/lib/element.php можно увидеть такое :
    public static function add(array $data)
    	{
    		$result = new ORM\Data\AddResult();
    		$result->addError(new ORM\EntityError(
    			Loc::getMessage('ELEMENT_ENTITY_MESS_ADD_BLOCKED')
    		));
    		return $result;
    	}
    
    public static function update($primary, array $data)
    	{
    		$result = new ORM\Data\UpdateResult();
    		$result->addError(new ORM\EntityError(
    			Loc::getMessage('ELEMENT_ENTITY_MESS_UPDATE_BLOCKED')
    		));
    		return $result;
    	}
    
    	public static function delete($primary)
    	{
    		$result = new ORM\Data\DeleteResult();
    		$result->addError(new ORM\EntityError(
    			Loc::getMessage('ELEMENT_ENTITY_MESS_DELETE_BLOCKED')
    		));
    		return $result;
    	}


    В документации на метод прямо указано:
    Метод заблокирован. Используйте метод CIBlockElement::Update
    Ответ написан
    3 комментария
  • Можно ли использовать Bootstrap, JQuery и другие сторонние библиотеки в серьезном проекте?

    gbg
    @gbg
    Любые ответы на любые вопросы
    В идеале, заказчика не должно интересовать, что там под капотом - вы прописываете все требования в контракте на юридическом языке, так что если кто-то что-то перестанет поддерживать - это будут проблемы студии, а не ваши.

    А чтобы студия не сменила юрлицо и не пропала, выбирайте надежного партнера.

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

    @unseriously
    Можно с помощью GitHub actions - мануалов полно
    Можно с помощью Jenkins, тут уже надо будет этот самый Jenkins где-то развернуть и настроить
    Можно с помощью GitLab, его можно установить где-то у себя, а можно воспользоваться облачной версией
    Ответ написан
    Комментировать
  • Реализация неприрывной доставки приложений?

    @q2digger
    никого не трогаю, починяю примус
    GitLab, GitHub + Actions
    Ответ написан
    Комментировать
  • Как сделать фильтрацию по клику на Vue?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вы неправильно используете метод filter.
    Во-первых, его каллбэк должен возвращать не значение элемента массива, а логическое значение, указывающее, включать элемент в результат или нет.
    В-вторых filter не меняет исходный массив, а возвращает новый.
    this.items = this.items.filter(el => el < 10);
    Ответ написан
    Комментировать
  • Как сделать докер для тестирования кода на питоне с определенными библиотеками?

    @q2digger
    никого не трогаю, починяю примус
    я думаю, с такими вводными надо идти на фрилансер
    Ответ написан
    3 комментария
  • Почему кнопка вкл/выкл на корпусе срабатывает один раз?

    hint000
    @hint000
    у админа три руки
    Следственный эксперимент номер 1.
    нажал на кнопку – комп выключился, нажал на кнопку - он не включается
    В этом месте отсоединяем 24pin-коннектор от материнской платы (не выключая БП), для уверенности ждём полминуты, втыкаем коннектор на плату, пробуем запустить кнопкой.

    Следственный эксперимент номер 2.
    нажал на кнопку – комп выключился, нажал на кнопку - он не включается
    В этом месте отсоединяем 24pin-коннектор от материнской платы (не выключая БП), мультиметром в режиме до 20V смотрим напряжение между чёрным и пурпурным (фиолетовым) проводами на 24pin-коннекторе. Должно быть примероно 5V. Далее пробуем запустить БП народным методом скрепки (замыкаем зелёный и черный провода разогнутой скрепкой или любой пролочкой).
    Если БП не запустился скрепкой или нет дежурных 5V на пурпурном проводе - дело ясное, БП на помойку (или в ремонт умельцу с паяльником).
    Если запустился, то подозрения с БП ещё не снимаются, но главным подозреваемым становится материнка.
    Ответ написан
    3 комментария
  • Почему такая разница между Nginx и Apache в метрике "Content Download"?

    @rPman
    Скорее всего все зависит от того как приложения отдают http заголовки.

    Когда работает через apache, TTFB ждет долго потому что пока приложение не отработает до конца, даже заголовки не будут отправлены, т.е. время, которое занимает работа приложения это TTFB+content download

    Когда же работает через php fpm, за заголовки отправляются тут же, nginx не ждет когда закончится работа приложения для этого, а значит TTFB маленький (кстати 122мс это ДОЛГО что там происходит?) а уже генерация контента происходит пока идет content download
    Ответ написан
    3 комментария
  • SQL инъекция в UPDATE возможна ли?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Инъекция может быть через любой запрос.
    И защищать тоже надо любые запросы.
    Никогда не надо торговаться, "а можно я не буду защищать именно этот запрос? Ну мааааам!"
    Надо просто всегда следовать простым правилам - любая переменная попадает в запрос только через плейсхолдер

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

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

    То есть сама уязвимость никак не зависит ни от каких второстепенных факторов - типа запроса, передаваемых данных, способов их валидации, твоих знаний SQL. Это сам факт. Можно подставить свой код в запрос? Значит он уязвим. А как конкретно можно нагадить - это отдельная тема.

    Кроме того, любая уязвимость - это всегда ошибки. Если в $id будет пусто, то запрос вызовет ошибку. Если в $id будет слово select то запрос вызовет ошибку. Если будет слово "привет", то запрос вызовет ошибку. Оно тебе надо?

    При этом разных вариантов возможных ошибок и способов воспользоваться уязвимостью - тысячи, им посвящены целые учебники и статьи. Но для того чтобы защищаться, не надо знать ни одного. Потому что защищаться надо не от отдельных способов эксплуатации, а закрывать саму уязвимость. И сделать это очень просто:
    1. Любые данные должны добавляться в запрос только через плейсхолдеры
    2. Любые другие элементы запроса должны выбираться из белого списка - заранее прописанных в нашем коде значений.


    Если вопрос "а можно я не буду защищаться?" вызван ленью, то это тоже решаемо. В принципе, лень - это очень важное качество для программиста. Главное - направить её в нужное русло.

    Если каждый раз писать по три строчки долго
    $sql = "INSERT INTO users SET email = ?, password = ?"; // заменяем на знаки вопроса
    $stmt = $db->prepare($sql); // подготавливаем запрос, получаем stmt
    $stmt->bind_param("ss", $email, $hash); // два знака вопроса - две переменных - две буквы s
    $stmt->execute(); // выполняем запрос

    То надо воспользоваться такой вещью, как программирование. И написать функцию, которая возьмет на себя всю рутинную работу.
    function prepared_query($mysqli, $sql, $params, $types = "")
    {
        $types = $types ?: str_repeat("s", count($params));
        $stmt = $mysqli->prepare($sql);
        $stmt->bind_param($types, ...$params);
        $stmt->execute();
        return $stmt;
    }

    и в итоге предыдущие 4 строчки превратятся в одну:
    prepared_query($db, "INSERT INTO users SET email = ?, password = ?", [$email, $hash]);

    или твой запрос:
    prepared_query($db, "UPDATE table SET test WHERE id = ?", [$id]);

    - просто, быстро, удобно и безопасно
    Ответ написан
    26 комментариев
  • Как это понять?

    theobroma
    @theobroma
    javascript developer (ReactJS)
    1)let arr = str.split(' ');
    Возьмет строку, в данном случае 'aa bb cc aa bb aa', разобьет на части используя пробел как разделитель. В результате получим:
    let arr = ['aa', 'bb', 'cc', ' aa', 'bb', 'aa']
    2) Следующий кусок кода просто произведет подсчет одинаковых частей.
    return arr.reduce((acc, rec, index) => {
        return (typeof acc[rec] !== 'undefined')
          ? { ...acc, [rec]: acc[rec] + 1 }
          : { ...acc, [rec]: 1 }
      }, {});
    Рассмотрим его подробнее. Начнем с аргументов:
    acc – последний результат вызова функции, он же «промежуточный результат».
    rec – текущий элемент массива, элементы перебираются по очереди слева-направо.
    index – номер текущего элемента.

    Что собственно происходит:
    -typeof acc[rec] !== 'undefined' проверит есть ли в объекте 'acc' ключ 'rec'.
    - и если мы уже встречали такой( например когда "aa", но уже во второй раз ), тогда изменить значение этого ключа прибавив 1.{ ...acc, [rec]: acc[rec] + 1 }
    - если же такого ключа еще не было, то создадим его со значением 1, ибо он в первый раз попался{ ...acc, [rec]: 1 }
    Ответ написан
    6 комментариев
  • Как тестировать оптимизацию frontend?

    bingo347
    @bingo347
    Crazy on performance...
    796stwepspdbny_xqrwrrtvoor4.png
    Ответ написан
    Комментировать
  • Правильный подход к разработке на Bitrix?

    udjin123
    @udjin123
    PHP, Golang, React
    Vscode лучше заменить на PhpStorm.
    На локалке все прекрасно разворачивается, в том числе на openserver, только вот окружение надо создавать максимально близкое к боевому. По этому имхо под виндой лучший вариант docker в wsl2. Для докера готовое решение смотрите bitrixdoc.
    Ответ написан
    Комментировать