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

    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?

    winer
    @winer
    занимаюсь разработкой сайтов на 1c-bitrix
    В ядре убрана возможность использовать операции добавления/удаления/обновления для элементов ИБ (таблица \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.
    Ответ написан
    Комментировать
  • В чём преимущества и недостатки установок через apt и snap?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нужно понимать принципиальную разницу подхода:

    apt - установка из маленьких пакетов, вместе образующих большую и сложную систему, при этом софт может массово совместно использовать одни и те же файлы и библиотеки, благодаря чему экономится место на диске, оперативная память итд итп. Надо понимать, что apt - это пакетный менеджер для определённого вида пакетов (deb), хотя в своё время существовал вариант для rpm (может и сейчас существует, просто смысла в нём мало после появления yum).

    snap - установка большого приложения со всеми зависимостями, которые никак не использует остальной софт на этом же компьютере. Отсюда тратится лишнее место на диске и в оперативной памяти. Зато никаких проблем с зависимостями, плюс snap работает в любых системах и не завязан на конкретный менеджер пакетов и собственно пакетный формат.

    snap по большому счёту часто используют для установки тяжёлых приложений, которые может бысть сложно опакетить, особенно учитывая разнообразие присутствующих в мире дистрибутивов (debian/ubuntu и их клоны) разных версий. В то время как большинство штатного общеиспользуемого софта чаще распространяют в виде пакетов, идущих в составе дистрибутива или отдельно (в том числе в виде разных собранных под разные варианты систем пакетов).
    Ответ написан
    7 комментариев
  • Есть ли у Postman адекватные альтернативы написанные НЕ на electron?

    @Flying
    Не полноценно, конечно, но в какой-то степени в качестве замены можно рассматривать HTTP Client в IDE от JetBrains, к примеру в PHPStorm.
    Ответ написан
    3 комментария